502 Bad Gateway with DigitalOcean (gunicorn/nginx) 使用 Selenium 和 Django

502 Bad Gateway with DigitalOcean (gunicorn/nginx) using Selenium and Django

我有一个使用 Selenium 和 Django 的 DigitalOcean (gunicorn/nginx) 网络应用程序。

我正在尝试从 3 个网站抓取 数据并将这些数据保存在数据库中,但如果该过程花费的时间超过 60 秒,我就会收到此错误

502 Bad Gateway
nginx/1.14.0 (Ubuntu)

如何延长或禁用 nginx 的响应等待时间?

这个错误信息...

502 Bad Gateway
nginx/1.14.0 (Ubuntu)

...使用 DigitalOcean (gunicorn/nginx) 可能有多种原因。确定 502 错误的确切原因因您使用的网络服务器以及解释请求的应用程序服务器而异。


502 错误网关

错误的网关错误通常是由网络服务器和应用程序处理程序之间的通信故障引起的。在许多情况下,根本问题是延迟过长或超时过短 windows.

有时,502 Bad Gateway 也是由错误配置的应用程序服务器引起的,当网络服务器理解请求并将其传递给适当的处理程序时,但一些中断排序发生在两者之间。


解决方案

Gunicorn 是广泛使用的 Python WSGI 服务器之一,诊断 502 Bad Gateway 错误的原因主要取决于您使用的应用服务器正在使用,一些常见问题如下:

  • Gunicorn is not running:您需要确保 Gunicorn 是 运行 使用 ps。要确保 Gunicorn 是 运行,您必须看到类似的输出:

    www-data@nginx0:/var/log/nginx$ ps aux | grep gunicorn
    www-data     13805  0.0  1.8  52292 18460 pts/0    S    20:32   0:00 /home/www-data/test_app/bin/python /home/www-data/test_app/bin/gunicorn --error-logfile /var/log/gunicorn/errors.log -b 0.0.0.0:8080 wsgi
    www-data     13836  0.0  1.5  52432 15392 pts/0    S    20:34   0:00 /home/www-data/test_app/bin/python /home/www-data/test_app/bin/gunicorn --error-logfile /var/log/gunicorn/errors.log -b 0.0.0.0:8080 wsgi
    
  • Gunicorn won’t start:有时,Gunicorn 无法启动是由于配置文件中的拼写错误或端口冲突或无法访问的日志目录或这些情况的任意组合。在这些情况下检查你的 Gunicorn 配置执行命令:

    gunicorn --check-config [APP_MODULE]
    
  • NGINX is misconfigured:如果 Gunicorn 配置正确,NGINX 可能没有在正确的位置寻找它。在这些情况下,打开您的 NGINX 配置文件 (/etc/nginx/nginx.conf) 并查找以 upstream 关键字开头的块,如下所示:

    upstream app_servers {
        server 127.0.0.1:8080;
    }
    

    此设置用于配置 NGINX 以将对 _app_servers_ 的请求重定向到 127.0.0.1:8080。如果 Gunicorn 未绑定到 127.0.0.1 或未在 8080 上侦听,请更改 Gunicorn 的配置以匹配 NGINX 的配置,或更改 NGINX 的配置以匹配 Gunicorn 的配置。此外,验证您的站点配置是否将您的应用程序重定向到适当的上游服务器。为确保这一点,您需要打开您站点的配置,即 /etc/nginx/sites-enabled/your_site 并查找为您的应用程序定义 URL 端点的块。例如:

    location /my-app {
            proxy_pass         http://app_servers;
            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;
            proxy_set_header   X-Forwarded-Host $server_name;
    
    }
    
  • Gunicorn is timing out:如果您的应用程序需要很长时间才能响应(默认情况下 > 30s),Gunicorn 可能会 return 502NGINX.这可以通过检查 Gunicorn 日志来验证(如果没有设置日志文件,则默认为 STDOUT)。例如,

    [2016-09-21 20:33:04 +0000] [13805] [CRITICAL] WORKER TIMEOUT (pid:13810)
    

    以上日志表明,应用程序响应 Gunicorn 的时间过长,导致工作线程被杀死,因为 Gunicorn 认为工作线程挂起。在这种情况下,增加 Gunicorn 的最大执行时间将是最好的解决方案。但是,从应用程序和数据集处理的角度来看,增加超时 windows 可能不是最佳解决方案,您可能需要分析和优化正在使用的应用程序。

  • 调整read_timeout:如果在修改Gunicorn的超时阈值后仍然看到502 Bad Gateway,您需要按照下面提到的这些步骤来增加NGINX 的超时 window:

    • 打开您的 NGINX 配置 (/etc/nginx/nginx.conf)
    • http 块中添加 fastcgi_read_timeout XXX;,其中 XXX 是超时 window 秒(示例见下文)
    • 保存并关闭文件
    • 重新加载您的 NGINX 配置
    • 一个例子:

      http { 
      ...
      
      fastcgi_buffers 8 16k;
      fastcgi_buffer_size 32k;
      fastcgi_connect_timeout 300;
      fastcgi_send_timeout 300;
      fastcgi_read_timeout 300;
      }
      

1/502 错误网关 由 GUNICORN
引起 一个 - sudo nano /etc/systemd/system/gunicorn.service.
b-

[Unit]
Description=gunicorn daemon
After=network.target

[Service]
User=sammy
Group=www-data
WorkingDirectory=/home/sammy/myproject
ExecStart=/home/sammy/myproject/myprojectenv/bin/gunicorn --access-logfile - --timeout 300 --workers 3 --bind unix:/home/sammy/myproject/myproject.sock myproject.wsgi:application

[Install]
WantedBy=multi-user.target


c -

sudo systemctl start gunicorn
sudo systemctl enable gunicorn
sudo systemctl daemon-reload
sudo systemctl restart gunicorn




2/504 Bad Gateway 由 NGINX 引起
a - sudo nano /etc/nginx/nginx.conf
b - 将这些添加到 http

client_body_timeout 999;
client_header_timeout 999;
keepalive_timeout 999;
fastcgi_buffers 8 16k;
fastcgi_buffer_size 32k;
fastcgi_connect_timeout 999;
fastcgi_send_timeout 999;
fastcgi_read_timeout 999;


c - 在 events

中更改此设置
worker_connections 1024;


d - service nginx reload