解决通过Nginx访问后端应用,ERR_CONTENT_LENGTH_MISMATCH问题的解决

解决通过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来处理,各自分配任务,互不干扰。

未经允许不得转载:好玩吧 » 解决通过Nginx访问后端应用,ERR_CONTENT_LENGTH_MISMATCH问题的解决