解决通过Nginx访问后端应用,ERR_CONTENT_LENGTH_MISMATCH问题的解决
前几天公司服务器遭受到流量攻击,带宽50M跑满,通过ssh远程连接也非常卡,查找原因。
服务器架构为M3服务器和M4服务器通过lvs负载
重启服务器之后,发现里面的MFS服务并不能正常启动,弃用mfs。
机房维护人员拔掉网线,带宽恢复正常,机房人员通过抓包只能找到是某个ip的流量异常,并不能知晓是哪个域名的流量异常。
于是关闭里面的几个站点,一个个关闭再查看流量是否异常。查到是A域名
该服务器中有一个discuz论坛站点,图片 js css静态文件在浏览器中只能打开一半。在Chorme中报错为“ERR_CONTENT_LENGTH_MISMATCH”
在网上查找原因比较合理的解释是:
这个实际上是nginx通过代理php-fpm来实现的输出,当一个css、js、图片等正常请求因为rewrite的原因被rewrite到了php上,nginx内部会认为是一个文档处理,然后对文档进行压缩获得了压缩后的内容长度,在输出达到这个长度后就错误的关闭了tcp连接,但是返回的header头信息的长度却是压缩前的长度,这样就导致了之前的错误。
http://www.queyang.com/blog/archives/541
原来nginx的配置:
server { listen 80; server_name www.funet8.com; <域名> error_log /data1/logs/nginx/www.funet8.com-nginx-error.log; location / { proxy_pass http://127.0.0.1:8080; proxy_redirect off; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; } }
修改之后的nginx配置:
server { listen 80; server_name www.funet8.com; root /www/web/bbs/; error_log /data/wwwroot/log/www.fuent8.com-nginx-error.log; location / { index index.html index.htm index.php; } #只对php做反向代理 location ~ .*.(php|php5)?$ { proxy_pass http://127.0.0.1:8080; proxy_redirect off; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; } #设置静态文件缓存时间30天 location ~ .*.(css|js|jpg|jpeg|gif|png|ico|bmp|gz|xml|zip|rar|swf|txt|xls|xlsx|flv|mid|doc|ppt|pdf|mp3|wma)?$ { expires 30d; access_log off; } #设置discuz伪静态让nginx处理 rewrite ^([^.]*)/topic-(.+).html$ $1/portal.php?mod=topic&topic=$2 last; rewrite ^([^.]*)/article-([0-9]+)-([0-9]+).html$ $1/portal.php?mod=view&aid=$2&page=$3 last; rewrite ^([^.]*)/forum-(w+)-([0-9]+).html$ $1/forum.php?mod=forumdisplay&fid=$2&page=$3 last; rewrite ^([^.]*)/thread-([0-9]+)-([0-9]+)-([0-9]+).html$ $1/forum.php?mod=viewthread&tid=$2&extra=page%3D$4&page=$3 last; rewrite ^([^.]*)/group-([0-9]+)-([0-9]+).html$ $1/forum.php?mod=group&fid=$2&page=$3 last; rewrite ^([^.]*)/space-(username|uid)-(.+).html$ $1/home.php?mod=space&$2=$3 last; rewrite ^([^.]*)/([a-z]+)-(.+).html$ $1/$2.php?rewrite=$3 last; if (!-e $request_filename) { return 404; } }
修改完成之后重启nginx
原来的Apache配置:
<VirtualHost *:8080> DocumentRoot 路径 ErrorLog "/data1/logs/nginx/www.funet8.com-apache-error.log" ServerName www.7477.com <IfModule mod_rewrite.c> RewriteEngine On RewriteCond %{QUERY_STRING} ^(.*)$ RewriteRule ^(.*)/topic-(.+).html$ $1/portal.php?mod=topic&topic=$2&%1 RewriteCond %{QUERY_STRING} ^(.*)$ RewriteRule ^(.*)/article-([0-9]+)-([0-9]+).html$ $1/portal.php?mod=view&aid=$2&page=$3&%1 RewriteCond %{QUERY_STRING} ^(.*)$ RewriteRule ^(.*)/forum-(w+)-([0-9]+).html$ $1/forum.php?mod=forumdisplay&fid=$2&page=$3&%1 RewriteCond %{QUERY_STRING} ^(.*)$ RewriteRule ^(.*)/thread-([0-9]+)-([0-9]+)-([0-9]+).html$ $1/forum.php?mod=viewthread&tid=$2&extra=page%3D$4&page=$3&%1 RewriteCond %{QUERY_STRING} ^(.*)$ RewriteRule ^(.*)/group-([0-9]+)-([0-9]+).html$ $1/forum.php?mod=group&fid=$2&page=$3&%1 RewriteCond %{QUERY_STRING} ^(.*)$ RewriteRule ^(.*)/space-(username|uid)-(.+).html$ $1/home.php?mod=space&$2=$3&%1 RewriteCond %{QUERY_STRING} ^(.*)$ RewriteRule ^(.*)/blog-([0-9]+)-([0-9]+).html$ $1/home.php?mod=space&uid=$2&do=blog&id=$3&%1 RewriteCond %{QUERY_STRING} ^(.*)$ RewriteRule ^(.*)/(fid|tid)-([0-9]+).html$ $1/index.php?action=$2&value=$3&%1 RewriteCond %{QUERY_STRING} ^(.*)$ RewriteRule ^(.*)/([a-z]+[a-z0-9_]*)-([a-z0-9_-]+).html$ $1/plugin.php?id=$2:$3&%1 </IfModule> php_admin_value open_basedir /tmp/:/var/tmp/:/data//www/bbs/ <Directory "/www/bbs"> AllowOverride All Order allow,deny Allow from all </Directory> </VirtualHost>
修改之后的:
<VirtualHost *:8080> DocumentRoot 路径 ErrorLog "/data1/logs/nginx/www.funet8.com-apache-error.log" ServerName www.7477.com php_admin_value open_basedir /tmp/:/var/tmp/:/data//www/bbs/ <Directory "/www/bbs"> AllowOverride All Order allow,deny Allow from all </Directory> </VirtualHost>
重启Apache
只让Apache去处理php的程序,静态文件就交给nginx来处理,各自分配任务,互不干扰。
收藏了[嘻嘻]