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

本文详细介绍了Nginx工作场景,故障处理流程,包括自我排查(如检查服务状态、配置文件和模块)、外界因素排查(如配置更新、DNS解析)以及根据客户端状态判断故障点。还列举了常见状态码及其含义,并提供了端口占用问题的解决方案。
摘要由CSDN通过智能技术生成

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

状态码含义解释
状态码含义解释
200OK请求正常处理完毕
301Moved Permanently永久重定向
302Found临时重定向
304Not Modified条件式请求,资源未该被修改
400Bad Request请求报文语法错误或参数错误
401Unauthorized需要通过HTTP认证,或认证失败
403Forbidden请求资源被拒绝(例如:黑名单,状态检测资源等)
404Not Found无法找到请求资源
409Conflict表示请求与当前服务器端的状态相冲突;冲突最有可能发生在对 PUT 请求的响应中。例如,当上传文件的版本比服务器上已存在的要旧,从而导致版本冲突的时候,那么就有可能收到状态码为 409 的响应。
500Internal Server Error服务器故障或Web应用故障
502Bad Gateway代理服务器,从上游服务器中接收到的响应是无效的
503Service Unavailable服务器超负载或停机维护
504Gateway Timeout代理服务器无法在规定的时间内获得想要的响应
505HTTP 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的安装路径。
  • 21
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值