首页 > 故障排查 > 正文

Nginx升级后导致文件下载不完整或僵死的解决
2012-05-29 21:26:27   来源:我爱运维网   评论:0 点击:

在升级了两台应用服务器的NGINX后,发现通过远程客户机从nginx用http下载数据时,下载到131KB或某个定长尺寸时必然停住,无法下载后面的数...
在升级了两台应用服务器的NGINX后,发现通过远程客户机从nginx用http下载数据时,下载到131KB或某个定长尺寸时必然停住,无法下载后面的数据。

如:
wget http://www.5iops.com/test/kk.mp4

首先,看看服务器上面是否有这个内核参数:net.ipv4.tcp_timestamps = 0
必须加上,防止在NAT的网络情况下导致TCP无法建立.确认该内核参数已设定;

其次,可以通过linux客户端上的strace看看下载挂在什么地方:
如:
strace wget http://www.5iops.com/test/kk.mp4
发现是停住的地方都是timeout,说明与客户端网络无关;

查看服务器端操作系统版本,NGINX安装配置,查看NGINX错误日志等.升级的NGINX运行指定用户为www,主进程为root用户.原NGINX运行未指定用户.对比能下载与不能下载的NGINX文件目录及权限.最终发现是NGNIX临时目录权限问题导致:

安装时,由于原来服务器上已存在nginx(简称oldngx)运行,正常有服务时,service nginx stop并不能完全关闭所有正在连接运行的进程,导致新安装的nginx(简称newngx)目录下temp由oldngx进程写入,则该temp目录权限仍然是旧的运行用户。这样newngx新用户并不能写入这些temp目录。而temp目录在网速较慢的情况下或客户端下载body超过默认大小时会使用。Temp目录与以下2个参数有关:

client_body_buffer_size
含义:指定用户请求体所使用的buffer的最大值
语法:client_body_buffer_size <size>
缺省:两个page的大小,一般为8k或16k
作用域:http.server.location
示例:client_body_buffer_size 512k;
注意:如果用户请求体超过了buffer的大小,则将全部内容或部分内容存储到一个临时文件中。

client_body_temp_path
含义:设置存储用户请求体的文件的目录路径
语法:client_body_temp_path <directory path> [level1 | level2 | level3]
作用域:http.server.location
示例:client_body_temp_path /spool/nginx/client_temp 1 2;

除此之后,NGINX依据模块的不同,还有多个temp目录,如proxy_temp,fastcgi_temp等,均需要注意权限设定及配置.与PHP-FPM结合时,还要注意phpfpm指定用户需要与nginx运行用户相同.

解决办法:在安装新的nginx时,务必确保旧nginx进程全部关闭。建议在service nginx stop之后,再pkill nginx,并确保ps –ef|grep nginx|grep –v grep|wc –l 为0.这样临时目录会自动正确创建.

相关热词搜索:Nginx 升级

上一篇:Linux下系统或服务排障的最佳实践
下一篇:YUM源更新问题的解决

分享到: 收藏
评论排行