我有一个使用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
答案 0 :(得分:1)
结果我可以通过禁用nginx的pagespeed模块来消除错误。
我在nginx提供的反向代理/负载均衡器上使用pagespeed。当我关闭页面速度时,我不再能够重现间歇性的502s。离开这里以防万一其他人有这个问题。
继续关注pagespeed讨论组,如果我找到解决方案,我会更新这篇文章。
答案 1 :(得分:0)
我遇到了类似的问题,在负载下,我开始从uWSGI获得502的支持,并且响应可以立即返回502。
这是您可以做的一些事情
通过将--listen
和setting 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