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

2024-05-18 08:45:27 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个稍微复杂的Django/Gunicorn/NGINX堆栈,当我尝试将它从Django开发服务器迁移到带有Gunicorn和NGINX的生产设置时,它给我带来了麻烦。具体来说,我在提供静态文件时遇到了问题。你知道吗

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

专用虚拟网络VM:

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

主机服务器:

  • 在主机端口8001(VM端口8001)上发布“站点1”前进至主机端口(8001)
  • 在主机端口8002(VM端口8001)上发布“站点2”前进至主机端口(8002)
  • 在主机端口8003(VM端口8001)上发布“站点3”前进至主机端口(8003)

这对于使用django开发服务器进行开发非常有效。我只需要在URL中包含一个端口。例如:

  • 你知道吗我的服务器:8001对于站点1
  • 你知道吗我的服务器:8002对于站点2
  • 你知道吗我的服务器:8003对于站点3

对于生产,我想将NGINX设置为:

  • 你知道吗myserver.edu/site1对于站点1
  • 你知道吗myserver.edu/site2对于站点2
  • 你知道吗myserver.edu/站点3对于站点3

我在主机上安装了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静态文件问题的回复,但是这些都解决了这个问题。你知道吗

谢谢你。你知道吗

更新:我已经开始想办法了。这是对我有用的。你知道吗

  1. 我在/var/www/static创建了一个/static/目录并在设置.py文件,然后运行collect static将所有静态内容复制到此目录。

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

location /static/ {
        root /var/www/;
   }
  1. 最后我修改了设置.py从:STATIC\u URL=/STATIC/到STATIC\u URL=/site1/STATIC/

结果是静态内容现在在NGINX下的生产中提供。原因是我对静态内容方法的不完全理解。在这里输入这个问题有助于澄清问题并引导我找到解决方案。希望这能帮助有类似架构的人。现在修复媒体文件-可能是相同的方法。你知道吗


Tags: django端口url内容站点静态vmnginx