nginx版本问题引发的血案

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 720 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 830 16:17 client_temp
drwx------  2 aobo root  6 719 10:43 fastcgi_temp
drwx------  2 aobo root  6 719 10:43 proxy_temp
drwx------  2 aobo root  6 719 10:43 scgi_temp
drwx------ 12 aobo root 96 85 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、有必要做一套系统监控方案了,监控系统各组件日志文件,发现错误可以报警。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值