python - 有太多 uwsgi OSError 消息

标签 python django nginx uwsgi oserror

使用 uwsgi 和 nginx 运行 Django 3 python 3.6 应用程序会抛出太多这些!我花了太多时间试图弄清楚,所以欢迎任何帮助。
它们绝对不是客户端断开连接。在网上查找时,我发现了许多 uwsgi ini 配置并尝试了其中的许多配置,但都无济于事。其中大部分是来自没有业务访问该站点的国家/地区的 HEAD 请求,但也有许多正常的请求也会出现此错误。消息如下所示:
Uwsgi 日志:

Tue Sep 22 08:52:16 2020 - SIGPIPE: writing to a closed pipe/socket/fd (probably the client disconnected) on request / (ip x.xx.xx.xx) !!!
Tue Sep 22 08:52:16 2020 - uwsgi_response_writev_headers_and_body_do(): Broken pipe [core/writer.c line 306] during GET / (x.xx.xx.xx)
OSError: write error
[pid: 9852|app: 0|req: 6262/18763] x.xx.xx.xx () {46 vars in 981 bytes} [Tue Sep 22 08:52:15 2020] GET / => generated 0 bytes in 313 msecs (HTTP/1.1 200) 7 headers in 0 bytes (0 switches on core 0)
Nginx 访问日志:
x.xx.xx.xx - - [22/Sep/2020:08:52:16 +0200] "GET / HTTP/1.1" 499 0 "-" "Mozilla/5.0 (iPhone; CPU iPhone OS 13_7 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/13.1.2 Mobile/15E148 Safari/604.1"
用户不太可能试图在短短 313 毫秒内逃离该站点。
这是当前运行的 ini 的极简版本:
[uwsgi]
uid=www-data
gid=www-data
project=mysite
chdir=/home/myuser/releases/mysite-website/web
plugin=python36
wsgi-file=mysite/wsgi.py
daemonize=/home/myuser/logs/uwsgi/mysite-website.log
home=/home/myuser/releases/venv
processes = 1
enable-threads = true
socket=/var/run/uwsgi/app/mysite/socket.sock
pidfile=/var/run/uwsgi/app/mysite/project-masterpid
vacuum = true
touch-reload=/home/myuser/releases/mysite-website/web/mysite/wsgi.py
nginx:
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_host;
proxy_redirect off;

uwsgi_pass unix:///var/run/uwsgi/app/mysite/socket.sock;
include uwsgi_params;
uwsgi_param HTTPS on;
uwsgi_param UWSGI_SCHEME https;
uwsgi_read_timeout 60s;
uwsgi_params:
uwsgi_param  QUERY_STRING       $query_string;
uwsgi_param  REQUEST_METHOD     $request_method;
uwsgi_param  CONTENT_TYPE       $content_type;
uwsgi_param  CONTENT_LENGTH     $content_length;

uwsgi_param  REQUEST_URI        $request_uri;
uwsgi_param  PATH_INFO          $document_uri;
uwsgi_param  DOCUMENT_ROOT      $document_root;
uwsgi_param  SERVER_PROTOCOL    $server_protocol;
uwsgi_param  REQUEST_SCHEME     $scheme;
uwsgi_param  HTTPS              $https if_not_empty;

uwsgi_param  REMOTE_ADDR        $remote_addr;
uwsgi_param  REMOTE_PORT        $remote_port;
uwsgi_param  SERVER_PORT        $server_port;
uwsgi_param  SERVER_NAME        $server_name;

最佳答案

根据我的经验,这些是合法的断开连接,HTTP 客户端(浏览器)关闭连接,Nginx 反过来关闭文件描述符 uWSGI 正在写入响应。见 full write-up .
通过访问任何重要的 Django 页面并快速敲击 F5(刷新)键几次,我可以可靠地复制该问题。这表明这些错误是正常操作的一部分,不会造成任何负面的用户体验,因此可以安全地忽略。
这些断开连接很可能是由行为不当的 HTTP 客户端或自动攻击引起的,但这两种情况都不在您的控制范围内。
要在日志中隐藏这些异常,您需要以下所有三个 uWSGI 设置,每个设置对应于您列出的错误行之一。

ignore-sigpipe
ignore-write-errors
disable-write-exception
disable-write-errors如果您使用类似的东西,选项还将防止将错误发送到像 Sentry 这样的工具。

关于python - 有太多 uwsgi OSError 消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64005731/

相关文章:

javascript - Nginx 只提供我的 JS 文件的前 72kbs

python - pip ssl证书错误OSX安装scrapy

python - 在 webfaction 上安装 dropboxpython api(带 ssl)时遇到问题

python - Django 中测试断言的可重用助手

nginx - 如何通知资源是否在 nginx 中完全下载

ruby-on-rails - Rails 请求返回状态 200 但没有响应数据

python - ajax如何与python一起工作?

python - Cython 回调中的段错误

python - 具有连续替代符号的值的最大子序列的大小?

python - 在 django 的时间戳上添加 2 小时零 1 天