NGINX代理传递后的静态和媒体文件404

时间:2019-06-03 21:17:06

标签: python django nginx gunicorn

我拥有一个稍微复杂的Django / Gunicorn / NGINX堆栈,当我尝试将其从Django开发服务器迁移到Gunicorn和NGINX的生产设置时,这给我带来了麻烦。具体来说,我在投放静态文件时遇到了麻烦。

系统架构:我有一台具有公共IP地址的物理服务器。该物理服务器在专用虚拟网络(NAT)上托管3个VM。每个VM都在端口8001上运行它自己的django项目。我将每个VM上的端口8001转发到物理机上唯一的可用端口。因此,总的来说,该体系结构如下所示:

私有虚拟网络虚拟机:

  • VM1在VM1端口8001上运行“站点1”
  • VM2在VM2端口8001上运行“站点2”
  • VM3在VM3端口8001上运行“站点3”

主机服务器:

  • 在主机端口8001(从VM端口8001转发到主机端口8001)上发布“站点1”
  • 在主机端口8002(从VM端口8001转发到主机端口8002)上发布“站点2”
  • 在主机端口8003(从VM端口8001转发到主机端口8003)上发布“站点3”

这对于使用django开发服务器进行开发确实非常有效。我只需要在URL中包含端口号即可。如:

  • 网站1的myserver.edu:8001
  • myserver.edu:网站2的8002
  • myserver.edu:网站3的8003

对于生产环境,我想设置NGINX来作为以下站点提供服务:

  • 网站1的myserver.edu/site1
  • 网站2的myserver.edu/site2
  • 网站3的
  • myserver.edu/site3

我在主机上安装了NGINX并将其配置为使用TLS。主机上的NGINX配置通过以下配置在下面定义了3个位置。您可以看到我使用proxy_pass将每个站点的流量路由到主机上的虚拟网络。

location /site1/ {
        proxy_set_header Host $http_host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X_Forwarded-Proto $scheme;
        proxy_pass http://192.168.122.243:8001/;
}

location /site2/ {
        proxy_set_header Host $http_host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X_Forwarded-Proto $scheme;
        proxy_pass http://192.168.122.244:8001/;
}

location /site3/ {
        proxy_set_header Host $http_host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X_Forwarded-Proto $scheme;
        proxy_pass http://192.168.122.245:8001/;
}

因此,任何要求:

  • 列表项

myserver.edu/site1转到VM1上的端口8001

  • 列表项

myserver.edu/site2转到VM2上的端口8001

  • 列表项

myserver.edu/site3转到VM3上的端口8001

在VM1上,我有一个django站点+ gunicorn + NGINX,具有以下配置(在所有VM上都设置相同):

server {
   listen 8001;
   server_name 0.0.0.0;

   location = /favicon.ico { access_log off; log_not_found off; }

   location /static/ {
        root /home/rcrv/bubbles/s2uds_user/gui;
   }

   location / {
        include proxy_params;
        proxy_pass http://unix:/home/rcrv/bubbles/s2uds_user/bubs.sock;
   }

}

来自urls.py的我的站点1根URL是这样的:url(r'^ $',gv.home),

在NGINX生产配置下的行为:

如果我使用以下网址从NAT中浏览VM1上的站点1:   192.168.122.243:8001 /

  • 这将完美工作-提供静态文件和媒体文件

如果我使用以下网址从公共IP空间浏览:   myerver.edu/site1 /

  • 这将从django中渲染所有动态内容,但是将无法提供静态内容(使用404)。我的浏览器开发人员控制台显示浏览器正在https://myserver.com/static

  • 上查找静态内容。
  • 请注意,我希望它在myserver / site1 / static

  • 中查找静态内容。

如果我直接在浏览器中将该URL修改为myserver.com/site1/static,则可以访问缺少的静态内容

要进行缓解/修复的尝试:

我将VM的NGINX配置上的位置块更改为: 位置= / site1 / static / 没有运气。

调试显示浏览器仍在尝试在以下位置找到静态内容:myserver.edu/static

问题: 我如何修改或修复配置,以便django在静态URL中包含“ / site1 /”部分?我倾向于认为此问题不是NGINX配置问题,而是Django问题。相反,我相信我需要告诉django在/ site1 /之前加上静态URL。

想法?我已经阅读了许多类似的django静态文件问题的回复,但是可以解决此问题。

谢谢。

更新:我已经开始弄清楚了。这是对我有用的。

  1. 我在每个VM的/ var / www / static上的/ static /目录中创建了一个/ static /目录,并将settings.py文件中的STATIC_ROOT设置为此位置,然后运行了static收集操作,将所有静态内容复制到该目录中

  2. 然后我将VM上NGINX conf中的静态文件位置块修改为:

location /static/ {
        root /var/www/;
   }
  1. 最后,我将settings.py中的STATIC_URL修改为:STATIC_URL = / static /更改为STATIC_URL = / site1 / static /

结果是静态内容现在在NGINX的生产环境中提供。原因是我对静态内容方法的总体了解不足。在这里输入问题可以澄清问题,并引导我找到解决方案。希望这对具有类似架构的人有所帮助。现在修复媒体文件-可能是相同的方法。

0 个答案:

没有答案