我有一个稍微复杂的Django/Gunicorn/NGINX堆栈,当我尝试将它从Django开发服务器迁移到带有Gunicorn和NGINX的生产设置时,它给我带来了麻烦。具体来说,我在提供静态文件时遇到了问题。你知道吗
系统架构:我有一个带有公共IP地址的物理服务器。此物理服务器在专用虚拟网络(NAT)上承载3个VM。每个VM运行在端口8001上都有自己的django项目。我将每个VM上的端口8001转发到物理机器上唯一的可用端口。因此,总的来说,架构如下所示:
专用虚拟网络VM:
主机服务器:
这对于使用django开发服务器进行开发非常有效。我只需要在URL中包含一个端口。例如:
对于生产,我想将NGINX设置为:
我在主机上安装了NGINX,并将其配置为使用TLS。主机上的NGINX配置使用以下配置定义了3个位置。您可以看到,我使用代理传递将每个站点的流量路由到主机上的虚拟网络。你知道吗
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/站点3转到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;
}
}
我的网站1根URL来自网址.py这是:url(r'^$',gv.主页)哦
在上述NGINX生产配置下的行为:
如果我从NAT内浏览VM1上的站点1,URL如下: 192.168.122.243:8001/
如果我使用以下URL从公共IP空间浏览: myserver.edu/site1/你知道吗
这将呈现来自django的所有动态内容,但无法提供静态内容(使用404)。我的浏览器开发人员控制台显示浏览器正在https://myserver.com/static查找静态内容
注意,我希望它在myserver/site1/static中查找静态内容
如果我直接在浏览器中修改URLmyserver.com/site1/static我可以访问丢失的静态内容
缓解/修复的尝试包括:
我将VM的NGINX配置上的位置块更改为: 位置=/site1/static/ 运气不好。你知道吗
调试表明浏览器仍在尝试在以下位置查找静态内容:myserver.edu/静态你知道吗
问题: 我该如何修改或修复配置,使django在静态URL中包含“/site1/”部分?我倾向于认为这个问题不是NGINX配置问题,而是django问题。相反,我认为我需要告诉django将/site1/预先添加到它的静态URL。你知道吗
想法?我已经读过很多关于类似django静态文件问题的回复,但是这些都解决了这个问题。你知道吗
谢谢你。你知道吗
更新:我已经开始想办法了。这是对我有用的。你知道吗
我在/var/www/static创建了一个/static/目录并在设置.py文件,然后运行collect static将所有静态内容复制到此目录。
然后,我将VM上NGINX conf中的静态文件位置块修改为:
location /static/ {
root /var/www/;
}
结果是静态内容现在在NGINX下的生产中提供。原因是我对静态内容方法的不完全理解。在这里输入这个问题有助于澄清问题并引导我找到解决方案。希望这能帮助有类似架构的人。现在修复媒体文件-可能是相同的方法。你知道吗
目前没有回答
相关问题 更多 >
编程相关推荐