Nginx反向代理uwsgi django间歇性502

时间:2016-10-25 00:23:37

标签: django nginx proxy uwsgi

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

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

另一个好奇心,502s发生时很快就会发生。例如,当502确实显示它与标签打开一样瞬间。我希望nginx前端在返回错误之前等待一下。

我使用uwsgi_pass直接在nginx负载均衡器和uwsgi之间进行代理。我在其他一些帖子中读过有关增加缓冲区的信息。我尝试过设置uwsgi_buffers_size 16k;和uwsgi_buffers 4 16k;但他们没有什么不同。

来自Nginx和Uwsgi的错误日志都不会显示有关502s的任何信息。但是,Google网站管理员工具会注意到它们。

相关的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

2 个答案:

答案 0 :(得分:1)

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

我在nginx提供的反向代理/负载均衡器上使用pagespeed。当我关闭页面速度时,我不再能够重现间歇性的502s。离开这里以防万一其他人有这个问题。

继续关注pagespeed讨论组,如果我找到解决方案,我会更新这篇文章。

答案 1 :(得分:0)

我遇到了类似的问题,在负载下,我开始从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