nginx故障实例--附带排查思路

一 Nginx工作场景

Nginx是最受欢迎的HTTP服务器之一,在我们公司扮演着举足轻重的作用,做为我们公司的核心组件之一,在整个访问链路上是不可或缺的一环,而且, Nginx组件、模块、版本众多, 所以如何管理好Nginx将显得至关重要.

Before we get started,我们先来看看Nginx的工作场景:

「1」静态资源的web服务器

「2」http、smtp、pop3等协议的反向代理服务器

「3」缓存加速和负载均衡

我们公司主要用到了Nginx的第二个功能,即反向代理服务器,我们的服务都通过Nginx代理至Real Server,既保证Real Server的安全性,也起到了访问流量的负载均衡.

二 Nginx问题处理流程

1 Nginx自身排查

如果出了问题,第一时间检查是否是nginx自身因素导致的服务不可用,

「1」检查Nginx服务是否启动,

sudo lsof -P -n -i :80 -i :443 | grep LISTEN

 ps aux | grep nginx

「2」如果服务宕掉,先试着启动服务

sudo /opt/nginx/sbin/nginx -c /opt/nginx/conf/nginx.conf

「3」如果2成功,则访问对应的服务,看是否正常,

如果2失败,则需要检查nginx的配置文件,以及各功能模块,为了能够更加精确的定位,我们需要开启debug模式.然后执行:

nginx –t

 tail –f /data/log/nginx/error.log

「4」可查看nginx编译时的参数,看看是不是有些功能模块未编译进来.

nginx -V
2 外界因素排查

这里的外界干扰主要Nginx这一环以外的问题导致服务不可用,像Navigator,APIRouter等.

「1」 如果是新发的配置,确保Navigator发布的版本生效

「2」 绑定该nginx集群对应的LB的外网地址到本地hosts,观察访问服务是否可用

「3」 检查DNS records

如果「2」可用,则说明是Nginx之前的环节出了问题,此时需使用dig 工具查看看解析是否正确.如果是解析错误,修正即可.

dig 域名

dig –t A +trace 域名

3 根具返回客户端状态判断故障发生点

「1」3xx类响应码

3xx类状态码,通常为重定向类响应状态码,其中301为永久重定向,302为临时重定向,304表示从缓存中响应,如果访问某域名是,出现跳转问题,那么就要检查nginx的配置,看看rewrite规则是否合理,location是否出现优先级问题.

「2」4xx类响应码

4xx类状态码,通常来说表示客户端类错误,

 如果出现400错误, 通常表示client发送了一个无效的请求.如果一个http1.1的请求没有host域,那么server应该给client段发送400的状态码,表明这个请求server不能处理。

 如果出现403错误,会提示Forbidden,表示禁止访问,这类原因通常来说会有2种可能,一是:客户端请求的资源做了黑白名单,或者是一些特殊的资源(例如:status页面);二是:

 如果出现404错误,会返回NOT Found状态吗,产生这种错误,一般是用户发起了错误的请求,请求的资源不存在. Nginx需要访问目录,但是autoindex选项被关闭.

「3」5xx类响应码

500类响应码通常表示服务器端出现了问题,这里可能是nginx除了问题,也又可能是后端Real Server出现了故障.

 502错误会返回Bad Gateway,及网关错误,这中情况,可能与cgi类型有关

 504 错误会返回Time Out,通常表示nginx作为代理时,没有及时从上游服务器收到请求,这中情况要么是后端服务处理不了nginx转发的请求,导致请求超时,要么就是后端服务器除了故障,比如服务意外停止…

三 常见的状态码

状态码信息查询地址:https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Status

状态码

含义

解释

状态码

含义

解释

200

OK

请求正常处理完毕

301

Moved Permanently

永久重定向

302

Found

临时重定向

304

Not Modified

条件式请求,资源未该被修改

400

Bad Request

请求报文语法错误或参数错误

401

Unauthorized

需要通过HTTP认证,或认证失败

403

Forbidden

请求资源被拒绝(例如:黑名单,状态检测资源等)

404

Not Found

无法找到请求资源

409

Conflict

表示请求与当前服务器端的状态相冲突;冲突最有可能发生在对 PUT 请求的响应中。例如,当上传文件的版本比服务器上已存在的要旧,从而导致版本冲突的时候,那么就有可能收到状态码为 409 的响应。

500

Internal Server Error

服务器故障或Web应用故障

502

Bad Gateway

代理服务器,从上游服务器中接收到的响应是无效的

503

Service Unavailable

服务器超负载或停机维护

504

Gateway Timeout

代理服务器无法在规定的时间内获得想要的响应

505

HTTP Version Not Supported

表示服务器不支持请求所使用的 HTTP 版本

补充

[root@web html]# nginx
nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use)
nginx: [emerg] bind() to [::]:80 failed (98: Address already in use)
nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use)
nginx: [emerg] bind() to [::]:80 failed (98: Address already in use)
nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use)
nginx: [emerg] bind() to [::]:80 failed (98: Address already in use)
nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use)
nginx: [emerg] bind() to [::]:80 failed (98: Address already in use)
nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use)
nginx: [emerg] bind() to [::]:80 failed (98: Address already in use)
nginx: [emerg] still could not bind()


此端口被占用了,80端口被其他进程占用了,找出来杀掉
或者nginx配置其他端口


解决
1.寻找进程-杀进程---

找
ps aux |grep nginx
ss -tulpn |grep nginx
netstat -tulpn |grep nginx

杀
kill  nginx 
kill -9 nginx
pkill nginx
pkill -9  nginx



2.配置其他端口

找到自己的nginx配置目录,如果是自己编译安装的,直接配置其他端口就可了,listen哪里的监听 后面改一下其他端口


不知道如何查找的,可以用ps +grep  或者which  



tips:
查找Nginx的安装路径有多种方法,以下是一些常见的方式:

1. **通过`which`命令查找可执行文件路径**:
   ```bash
   which nginx
   ```
   这将返回Nginx的可执行文件路径,通常该路径所在的目录就是Nginx的主要安装目录的一部分。

2. **查看进程信息**:
   ```bash
   ps -ef | grep nginx
   ```
   查看Nginx的运行进程信息,找到进程对应的命令行路径,该路径就是Nginx可执行文件的路径。

3. **通过配置文件路径推测**:
   Nginx的配置文件通常位于`/etc/nginx/nginx.conf`,而配置文件所在目录的上级目录往往是Nginx安装目录的一部分。

4. **通过系统服务信息**:
   对于使用systemd的系统,可以查看Nginx服务单元文件来获取相关信息:
   ```bash
   systemctl cat nginx | grep 'ExecStart='
   ```
   或者
   ```bash
   systemctl status nginx | grep 'Main PID:'
   ```
   这样可以从输出中看到Nginx服务的启动命令和进程ID,进而推断出Nginx的安装路径。

5. **手动安装时指定的路径**:
   如果你是手动编译安装的Nginx,并且记得当时使用了`--prefix`选项指定安装路径,那么你就可以直接去那个路径下寻找。

综合以上方法,通常能找到Nginx的安装路径。