我拥有一个稍微复杂的Django / Gunicorn / NGINX堆栈,当我尝试将其从Django开发服务器迁移到Gunicorn和NGINX的生产设置时,这给我带来了麻烦。具体来说,我在投放静态文件时遇到了麻烦。
系统架构:我有一台具有公共IP地址的物理服务器。该物理服务器在专用虚拟网络(NAT)上托管3个VM。每个VM都在端口8001上运行它自己的django项目。我将每个VM上的端口8001转发到物理机上唯一的可用端口。因此,总的来说,该体系结构如下所示:
私有虚拟网络虚拟机:
主机服务器:
这对于使用django开发服务器进行开发确实非常有效。我只需要在URL中包含端口号即可。如:
对于生产环境,我想设置NGINX来作为以下站点提供服务:
我在主机上安装了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静态文件问题的回复,但是可以解决此问题。
谢谢。
更新:我已经开始弄清楚了。这是对我有用的。
我在每个VM的/ var / www / static上的/ static /目录中创建了一个/ static /目录,并将settings.py文件中的STATIC_ROOT设置为此位置,然后运行了static收集操作,将所有静态内容复制到该目录中
然后我将VM上NGINX conf中的静态文件位置块修改为:
location /static/ {
root /var/www/;
}
结果是静态内容现在在NGINX的生产环境中提供。原因是我对静态内容方法的总体了解不足。在这里输入问题可以澄清问题,并引导我找到解决方案。希望这对具有类似架构的人有所帮助。现在修复媒体文件-可能是相同的方法。