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错误的网关的主要内容,如果未能解决你的问题,请参考以下文章

为 aws s3 静态和媒体文件配置 Nginx

django 在 apache 和 nginx 上提供媒体文件

仅使用 gunicorn、django 和 whitenoise 我如何提供媒体服务?

(Django 2.1)当媒体文件完美服务时,我无法提供静态文件?

部署 --- Nginx

通过 Nginx (Django/React/Nginx/Docker-Compose) 提供 Django 媒体文件