nginx 服务于 Django 静态媒体 | 502错误的网关
Posted
技术标签:
【中文标题】nginx 服务于 Django 静态媒体 | 502错误的网关【英文标题】:nginx serving Django static media | 502 bad gateway 【发布时间】:2011-02-06 10:57:16 【问题描述】:我正在尝试通过 nginx 提供 Django 静态媒体,这是我的 nginx.conf
server
listen 7777;
listen localhost:7777;
server_name example.com;
location /
proxy_pass http://localhost:7777;
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
client_max_body_size 10m;
client_body_buffer_size 128k;
proxy_connect_timeout 90;
proxy_send_timeout 90;
proxy_read_timeout 90;
proxy_buffer_size 4k;
proxy_buffers 4 32k;
proxy_busy_buffers_size 64k;
proxy_temp_file_write_size 64k;
location /test-app-media/
root /sites/mysite/staticmedia/;
expires max;
但是给出502 bad gateway
错误,/sites/mysite/staticmedia/
的路径在 nginx root/ 中,这就是问题所在..
Django 在 Apache 2.2 + mod_wsgi 上运行
nginx 0.7.65
谢谢..
【问题讨论】:
【参考方案1】:更好的方法是在 apache 前面使用 nginx 并提供静态媒体:
例如:nginx:
server
listen 80;
server_name media.example.com;
access_log /var/log/nginx/media.example.com.media.access.log;
location /
autoindex on;
index index.html;
root /var/www/media.example.com/media;
server
listen 80;
server_name www.example.com;
access_log /var/log/nginx/www.example.com.django.access.log;
location /
proxy_pass http://wwwcluster;
include /etc/nginx/proxy.conf;
proxy.conf:
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
client_max_body_size 10m;
client_body_buffer_size 128k;
proxy_connect_timeout 90;
proxy_send_timeout 90;
proxy_read_timeout 90;
proxy_buffer_size 4k;
proxy_buffers 4 32k;
proxy_busy_buffers_size 64k;
proxy_temp_file_write_size 64k;
nginx.conf:
http
include /etc/nginx/mime.types;
default_type application/octet-stream;
access_log /var/log/nginx/access.log;
sendfile on;
#tcp_nopush on;
#keepalive_timeout 0;
keepalive_timeout 65;
tcp_nodelay on;
gzip on;
upstream wwwcluster
server 127.0.0.1:8080;
include /etc/nginx/conf.d/*.conf;
include /etc/nginx/sites-enabled/*;
并配置 apache 在 127.0.0.1:8080 上为您的网站提供服务
我在多个站点上都有此设置,并且运行完美。另一个优点是,您可以通过在 nginx.conf 中向上游 wwwcluster 添加另一个 apache-server 来非常轻松地集群/负载平衡您的应用程序
【讨论】:
嘿,我没有看到任何名为 proxy.conf 和 nginx 的文件,那么我将这些配置放在哪里? 有点晚了,但如果你在 Ubuntu 上,我将它放在 conf.d 文件夹中,你的 nginx.conf 中的include /etc/nginx/conf.d/*.conf;
行会查找任何具有 .conf 扩展名的东西,即 IE 代理。 conf,因此您可能不需要在您网站的 nginx conf 中使用include /etc/nginx/proxy.conf;
。
哦,对于@renton,这正是我所需要的,并且通过这些少量修改完美地工作。我为我的非生产版本重定向到 Django 的开发服务器,它非常完美。谢谢!【参考方案2】:
server
listen 7777;
listen localhost:7777;
server_name example.com;
location /
proxy_pass http://localhost:7777;
...
nginx 监听端口 7777 并连接到位于同一主机上端口 7777 的代理。难怪它返回 502 错误。
【讨论】:
【参考方案3】:如果您的项目中包含第三方应用程序,那么它应该安装在您的服务器上,就像南方是第三方应用程序一样。 考虑 south 包含在您的 settings.py 文件中,那么 south 也应该安装在您的服务器上。 如果该模块在这里考虑南方,已经安装在服务器上,然后尝试升级它。因为您可能在本地机器上使用升级版模块,而服务器中安装了旧版本。
【讨论】:
【参考方案4】: 502 bad gateway
是因为apache有问题(没有重新启动或类似的东西)。您可以查看 apache 服务器日志以获取信息。
问题是您的 /sites/mysite/staticmedia/
被传递给 apache 而不是由 nginx 本身提供服务。
你的 nginx 媒体部分必须是这样的:
location /staticmedia/
root /sites/mysite/;
expires max;
autoindex on
这将访问文件系统上的/sites/mysite/staticmedia/
。
也就是说,位置指定的位置路径也被认为是文件系统的一部分。 (我认为这也不是什么好方法;但这就是 nginx 的做法。)
您可以打开自动索引,以便在调试过程中为您提供帮助。
【讨论】:
我进行了更改,但仍然无法正常工作,有时会出现 502 错误【参考方案5】:除非您正在做不寻常的事情,否则没有理由同时运行 apache 和 nginx。
此时 Nginx + gunicorn 可能比 apache + modwsgi 工作得更好。
Gunicorn 部署文档在这里:
https://docs.djangoproject.com/en/1.6/howto/deployment/wsgi/gunicorn/
这里是用于部署的 nginx 配置:
http://gunicorn-docs.readthedocs.org/en/latest/deploy.html
【讨论】:
以上是关于nginx 服务于 Django 静态媒体 | 502错误的网关的主要内容,如果未能解决你的问题,请参考以下文章
django 在 apache 和 nginx 上提供媒体文件
仅使用 gunicorn、django 和 whitenoise 我如何提供媒体服务?