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 版本 |