nginx版本问题引发的血案
最近碰到一个问题,折腾了快一周时间,今天终于解决了,将过程详细记录一下
上周云平台前端报了一个错误,发送了一个post请求后报500错误,然后查看uwsgi日志,发现没有任何错误输出,很奇怪,于是做了如下尝试:
1、在开发环境下对相同功能(相同数据库,相同代码)进行测试发现没有问题。 怀疑可能跟服务器环境有问题
2、在服务器上部署pycharm开发环境进行测试,发现也没有问题,这样问题的范围就缩小了。
pycharm用的是自带的web容器,而服务器用的是Nginx+uwsgi,怀疑是web容器的问题。
3、在另一台客户的linux服务器上做了测试,发现也是正常的。 tmd,见鬼了(到这里已经折腾了好几天了)万不得已,我还有最后一招杀手锏,
4、最后一招:用wireshark抓包看看吧
201 5.043567 192.168.0.75 192.168.0.74 HTTP 810 HTTP/1.1 500 Internal Server Error (text/html)
223 5.044500 192.168.0.74 192.168.0.75 HTTP 1262 POST /system/rbac/role/role2menu/ HTTP/1.1 (application/x-www-form-urlencoded)
发现一个问题,在post请求发送完成之前,nginx就返回500错误了,也就是说nginx还没来得及讲请求发给uwsgi,错误就发生了,于是乎赶紧去查看nginx日志,
果然:
(centos7venv) [root@meterdb: nginx]$ tail -20 error.log
2022/08/30 15:49:10 [crit] 17133#17133: *1701 open() "/var/lib/nginx/tmp/client_body/0000000015" failed (13: Permission denied), client: 192.168.0.74, server: 127.0.0.1:80, request: "POST /system/rbac/role/role2menu/ HTTP/1.1", host: "192.168.0.75:26000", referrer: "http://192.168.0.75:26000/system/rbac/role/role2menu/?id=11"
重点是这句 open() “/var/lib/nginx/tmp/client_body/0000000015” failed (13: Permission denied)
打开文件没有权限,于是查看文件权限:
发现这个目录属于nginx的默认用户nginx,
[root@meterdb: lib]$ ll nginx
总用量 0
drwxrwx--- 7 nginx root 78 7月 20 08:49 tmp
而服务器启动nginx配置用的是aobo账户,aobo账户对这个目录没有访问权限,
[root@meterdb: nginx]$ ps -ef | grep nginx
root 17094 1 0 09:30 ? 00:00:00 nginx: master process nginx
aobo 17095 17094 0 09:30 ? 00:00:00 nginx: worker process
aobo 17096 17094 0 09:30 ? 00:00:00 nginx: worker process
aobo 17097 17094 0 09:30 ? 00:00:00 nginx: worker process
aobo 17098 17094 0 09:30 ? 00:00:00 nginx: worker process
aobo 17099 17094 0 09:30 ? 00:00:00 nginx: worker process
有两个解决方案:
一个是将目录权限给aobo用户:
[root@meterdb: lib]$ chown -R aobo nginx
第二个办法:
修改nginx配置文件,将启动用户改成nginx或者root。
[root@meterdb: lib]$ vi /etc/nginx/nginx.conf
user root; # 此处之前是aobo,以后统一配置成root
worker_processes auto;
error_log /var/log/nginx/error.log notice;
pid /var/run/nginx.pid;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
server {
listen 26000;
server_name 127.0.0.1:80; #改为自己的域名,没域名修改为127.0.0.1:80
charset utf-8;
location / {
include uwsgi_params;
uwsgi_pass 127.0.0.1:8997; #端口要和uwsgi里配置的一样
uwsgi_param UWSGI_SCRIPT abnew.wsgi; #wsgi.py所在的目录名+.wsgi
uwsgi_param UWSGI_CHDIR /home/aobo/abweb/; #项目路径
uwsgi_read_timeout 600;
}
location /static/ {
alias /home/aobo/abweb/static/; #静态资源路径
}
}
}
按道理来讲,到这个地方问题已经解决了,可是还有一个疑问,
为什么同样的操作在另外一台linux机器上就没有问题,查看了一下nginx日志:
2022/08/30 16:17:50 [warn] 6581#6581: *1296 a client request body is buffered to a temporary file /var/cache/nginx/client_temp/0000000006, client: 122.4.194.247, server: 127.0.0.1:50000, request: "POST /sys
tem/rbac/role/role2menu/ HTTP/1.1", host: "222.174.117.184:50000", referrer: "http://222.174.117.184:50000/system/rbac/role/role2menu/?id=11"
同样生成了缓存文件,不过目录变成了 /var/cache/nginx/client_temp/0000000006
查看该目录权限:
[root@dongyingguangli-2: nginx]$ ll
总用量 0
drwx------ 2 aobo root 6 8月 30 16:17 client_temp
drwx------ 2 aobo root 6 7月 19 10:43 fastcgi_temp
drwx------ 2 aobo root 6 7月 19 10:43 proxy_temp
drwx------ 2 aobo root 6 7月 19 10:43 scgi_temp
drwx------ 12 aobo root 96 8月 5 15:35 uwsgi_temp
权限木有问题。
那看来就是nginx的版本问题了:
[root@dongyingguangli-2: nginx]$ nginx -v
nginx version: nginx/1.22.0
(centos7venv) [root@meterdb: nginx]$ nginx -v
nginx version: nginx/1.20.1
查看nginx官网 https://nginx.org/en/download.html
最新版本是nginx-1.23.1
最新的稳定版是 nginx-1.22.0
nginx: download
Mainline version
CHANGES nginx-1.23.1 pgp nginx/Windows-1.23.1 pgp
Stable version
CHANGES-1.22 nginx-1.22.0 pgp nginx/Windows-1.22.0 pgp
总结:
1、开源软件尽量用最新的稳定版
2、有必要做一套系统监控方案了,监控系统各组件日志文件,发现错误可以报警。