Nginx + fastcgi 截断问题
Posted
技术标签:
【中文标题】Nginx + fastcgi 截断问题【英文标题】:Nginx + fastcgi truncation problem 【发布时间】:2010-09-14 15:27:47 【问题描述】:我正在使用 nginx 的 fastcgi 接口运行一个 Django 站点。但是,某些页面被截断(即页面源只是停止,有时在标签中间)。我该如何解决这个问题(让我知道需要哪些额外信息,我会发布)
详情:
我正在使用 Flup,并使用以下命令生成 fastcgi 服务器:
python ./manage.py runfcgi umask=000 maxchildren=5 maxspare=1 minspare=0 method=prefork socket=/path/to/runfiles/django.sock pidfile=/path/to/runfiles/django.pid
nginx配置如下:
# search and replace this: project_location
pid /path/to/runfiles/nginx.pid;
worker_processes 2;
error_log /path/to/runfiles/error_log;
events
worker_connections 1024;
use epoll;
http
# default nginx location
include /etc/nginx/mime.types;
default_type application/octet-stream;
log_format main
'$remote_addr - $remote_user [$time_local] '
'"$request" $status $bytes_sent '
'"$http_referer" "$http_user_agent" '
'"$gzip_ratio"';
client_header_timeout 3m;
client_body_timeout 3m;
send_timeout 3m;
connection_pool_size 256;
client_header_buffer_size 1k;
large_client_header_buffers 4 2k;
request_pool_size 4k;
output_buffers 4 32k;
postpone_output 1460;
sendfile on;
tcp_nopush on;
keepalive_timeout 75 20;
tcp_nodelay on;
client_max_body_size 10m;
client_body_buffer_size 256k;
proxy_connect_timeout 90;
proxy_send_timeout 90;
proxy_read_timeout 90;
client_body_temp_path /path/to/runfiles/client_body_temp;
proxy_temp_path /path/to/runfiles/proxy_temp;
fastcgi_temp_path /path/to/runfiles/fastcgi_temp;
gzip on;
gzip_min_length 1100;
gzip_buffers 4 32k;
gzip_types text/plain text/html application/x-javascript text/xml text/css;
ignore_invalid_headers on;
server
listen 80;
server_name alpha2.sonyalabs.com;
index index.html;
root /path/to/django-root/static;
# static resources
location ~* ^/static/.*$
root /path/to/django-root;
expires 30d;
break;
location /
# host and port to fastcgi server
fastcgi_pass unix:/path/to/runfiles/django.sock;
fastcgi_param PATH_INFO $fastcgi_script_name;
fastcgi_param REQUEST_METHOD $request_method;
fastcgi_param QUERY_STRING $query_string;
fastcgi_param CONTENT_TYPE $content_type;
fastcgi_param CONTENT_LENGTH $content_length;
fastcgi_pass_header Authorization;
fastcgi_intercept_errors off;
location /403.html
root /usr/local/nginx;
access_log off;
location /401.html
root /usr/local/nginx;
access_log off;
location /404.html
root /usr/local/nginx;
access_log off;
location = /_.gif
empty_gif;
access_log off;
access_log /path/to/runfiles/localhost.access_log main;
error_log /path/to/runfiles/localhost.error_log;
【问题讨论】:
【参考方案1】:我在 nginx 上运行 Nagios 时遇到了同样的问题。我在谷歌搜索答案时偶然发现了你的问题,并阅读了“权限被拒绝”相关的答案,这让我印象深刻(也许它会对你有所帮助):
Nginx error.log 正在报告:
2011/03/07 11:36:02 [crit] 30977#0: *225952 open() "/var/lib/nginx/fastcgi/2/65/0000002652" 失败(13:权限被拒绝)
所以我只运行了 # chown -R www-data:www-data /var/lib/nginx/fastcgi
已修复! (感谢您的间接帮助)
【讨论】:
【参考方案2】:检查您的错误日志以了解写入.../nginx/tmp/...
文件的“权限被拒绝”错误。 Nginx 可以正常工作,除非它需要临时空间,这通常发生在 32K 边界。如果您发现这些错误,请确保 tmp 目录可由 nginx 运行的用户写入。
【讨论】:
这是正确的提示。让我补充一点,如果磁盘空间不足,您可以获得相同的结果。 @JanRychter - 谢谢 Jan,在我阅读您的评论之前一直在为这个问题挠头!【参考方案3】:您使用的是什么 fastcgi 接口以及如何使用。是扑腾吗?如果是,请粘贴您生成服务器的方式以及它如何连接到 nginx。如果没有这些信息,它只是在猜测可能出现的问题。
可能的问题:
nginx 有问题。至少 lighttpd 有可怕的 fastcgi 错误,我不怀疑 nginx 是否也有:) Django 因内部系统中的回溯而死亡,该系统未正确捕获并关闭您无法从客户端看到的 fastcgi 服务器。在这种情况下,包装 fastcgi 服务器应用程序调用并尝试/排除它以打印异常。但是服务器日志和配置会很棒。
【讨论】:
我已经用更多信息更新了描述——你介意看看并告诉我你看到了什么吗? Armin,您介意发布有关 nginx 和 lighttpd 中的 FastCGI 错误的信息吗?在这个站点上,“Apache 或 lighttpd”和“最干净和最快的 Django 服务器设置”可以使用这些知识。【参考方案4】:尝试提高“gzip_buffers”可能会有所帮助。
请看这里: http://blog.leetsoft.com/2007/7/25/nginx-gzip-ssl
【讨论】:
【参考方案5】:FastCGI 不应为此负责。
我在使用 nginx/gunicorn 时遇到了完全相同的问题。将响应大小减少到小于 32k(在特定情况下使用模板中的 spaceless
标记)解决了它。
正如 dwc 所说,由于 nginx 使用地址空间的方式,这可能是一个硬限制。
【讨论】:
【参考方案6】:我在我的虚拟主机(Webfaction)和本地 Ubuntu 开发服务器上都运行了与此非常相似的配置,我没有发现任何问题。我猜这是导致此问题的超时或缓冲区已满。
你能发布 nginx 错误日志的输出吗?还有你用的是什么版本的nginx?
作为旁注,可能值得查看 django-logging 以了解您的 fastcgi 进程在做什么。
【讨论】:
以上是关于Nginx + fastcgi 截断问题的主要内容,如果未能解决你的问题,请参考以下文章
zabbix 3.2.6+centos 7 +nginx 1.12+ mysql 5.6+ Grafana +php 5.6