【问题标题】:Nginx reverse proxy uwsgi django intermittent 502Nginx 反向代理 uwsgi django 间歇性 502
【发布时间】:2019-06-29 02:25:22
【问题描述】:

我有一个使用 Nginx 作为负载平衡器 (least_conn) 的站点设置,它使用单独的 uwsgi/django 服务器作为其上游。这通常是一个由大约 5 个 uwsgi/django 服务器组成的池,但我将它限制为只有一个,以确保它不是坏服务器。

在“正常”用户行为下,一切似乎都运行良好。 我的问题是快速、连续的请求会间歇性地产生 502 错误。我可以通过在我们的管理员中打开一个包含所有文章列表的页面来尝试重新创建它。通过在新选项卡中打开一堆链接,大约十分之一的链接会失败并出现 502 错误。

另一个好奇的是,502 发生的速度非常快。例如,当 502 确实出现时,它就像标签打开一样即时。我希望 nginx 前端在返回错误之前稍等片刻。

我正在使用 uwsgi_pass 直接在 nginx 负载均衡器和 uwsgi 之间进行代理。我已经阅读了许多其他关于必须增加缓冲区的帖子。我试过设置 uwsgi_buffers_size 16k;和 uwsgi_buffers 4 16k;但他们没有改变。

来自 Nginx 和 Uwsgi 的错误日志没有显示任何关于 502 的信息。谷歌网站管理员工具,但注意到它们。

相关的nginx.conf设置:

worker_processes  auto;

error_log  logs/error.log;
error_log  logs/error.log  notice;
error_log  logs/error.log  info;

events {
    multi_accept on;
    use epoll;
    worker_connections  1024;
}


http {
    include       mime.types;
    default_type  application/octet-stream;

    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                  '$status $body_bytes_sent "$http_referer" '
                  '"$http_user_agent" "$http_x_forwarded_for"';

    access_log  off;

    sendfile        on;
    tcp_nopush     on;



    #Timeouts
    keepalive_timeout  65;
    send_timeout 60;
    client_body_timeout 12;
    client_header_timeout 12;

    upstream backend {
    least_conn;
    server ipaddress:22882;
    }

    server {
        listen       27313;
        server_name  exampledomain.com;


        access_log  off;

        port_in_redirect off;

        uwsgi_next_upstream error;

        location / {
            uwsgi_read_timeout 300;
            uwsgi_send_timeout 150;
            uwsgi_connect_timeout 300;
            uwsgi_buffer_size 16k;
            uwsgi_buffers 4 16k;
            uwsgi_pass backend;
        }

Uwsgi 以这些参数启动:

--socket :22882 
--master 
--workers 5 
--threads 2 
--max-requests 1500 
--wsgi-file ~/django_prod/wsgi.py 
--pidfile ~/django_prod/nginx/log/uwsgi.pid 
--daemonize ~/django_prod/nginx/log/uwsgi.log 
--python-path ~/django_prod 
--python-path ~/django_prod/lib/ 
--env DJANGO_SETTINGS_MODULE=myproject.settings 
--vacuum

【问题讨论】:

  • 请注意,错误502与504不同。不是“网关超时”,而是“网关错误”,所以真正的原因在django方面。我假设当超过工人限制时,django 会在随后的 rewuests 上抛出 502 错误,但我不知道 django 是否足够好来确定。
  • 我看到当页面 502s 时,UWSGI 日志中的相应条目显示正常,就像任何其他工作请求一样。我知道这个条目是基于时间错误的 502 页面,而且这是一篇非常古老的文章,通常不会被访问。 [pid: 3226|app: 0|req: 565/2827] 127.0.0.1 () {68 vars in 1628 bytes} [Tue Oct 25 10:55:02 2016] GET /admin/news/news/149/?_changelist_filters =p%3D218 => 在 92 毫秒 (HTTP/1.0 200) 内生成 13862 字节 307 字节中的 6 个标头(1 核心 0 上的开关)

标签: django nginx proxy uwsgi


【解决方案1】:

原来我可以通过禁用 nginx 的 pagespeed 模块来消除错误。

我在 nginx 提供的反向代理/负载平衡器上使用 pagespeed。当我关闭 pagespeed 时,我不再能够重现间歇性 502。将其留在这里以防其他人遇到此问题。

去pagespeed讨论组跟进,如果我找到解决方案,我会更新这篇文章。

【讨论】:

    【解决方案2】:

    我有一个类似的问题,在负载下,我开始从 uWSGI 获取 502,并且响应可以立即返回 502。

    这里有一些你可以做的事情

    • 通过将--listensetting sysctl net.core.somaxconn 设置为相等或更高的值来增加uWSGI 侦听队列

    • 确保您使用的是最新的 uWSGI。 2.0.x 中发布了很多错误修复

    • 检查您是否使用HTTP/1.1,如果是,请使用--http11-socket。这有助于确保建立持久连接。

    uWSGItop 确实有助于隔离问题的根本原因,例如,如果 CPU 低且侦听队列高,则 uWSGI 行为异常。

    这里有一些更有用的想法:https://wontonst.blogspot.com/2019/06/squishing-performance-bug-in.html

    【讨论】:

      猜你喜欢
      • 2020-10-24
      • 1970-01-01
      • 1970-01-01
      • 2012-08-13
      • 2020-10-29
      • 1970-01-01
      • 2017-06-23
      • 2016-02-16
      • 2012-07-10
      相关资源
      最近更新 更多