记一次Nginx反向代理500的排查记录
今天公司项目遇到一个奇怪的问题,记录一下。
注: 数据已经过脱敏处理,未暴露公司具体的IP等数据。
TLDR; 项目简单介绍
用 Vue + ElementUI 实现的后台项目(以下简称:a-project),不包含 Node 聚合层,前端开发完成后将打包生成的 dist
文件夹上传到服务器的某目录下,由 Nginx 作为 Web 服务器驱动页面。
同时 Nginx 实现了反向代理,隐藏了服务器真实的 IP 地址。
Nginx 默认配置为 /etc/nginx/nginx.conf
文件,摘录如下:
# /etc/nginx/nginx.conf
user nginx;
worker_processes auto;
error_log /var/log/nginx/error.log;
pid /run/nginx.pid;
# Load dynamic modules. See /usr/share/nginx/README.dynamic.
include /usr/share/nginx/modules/*.conf;
events {
worker_connections 1024;
}
http {
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log /var/log/nginx/access.log main;
sendfile on;
tcp_nopush on;
tcp_nodelay on;
keepalive_timeout 65;
types_hash_max_size 2048;
include /etc/nginx/mime.types;
default_type application/octet-stream;
include /etc/nginx/conf.d/*.conf;
server {
listen 80 default_server;
listen [::]:80 default_server;
server_name _;
root /usr/share/nginx/html;
# Load configuration files for the default server block.
include /etc/nginx/default.d/*.conf;
location / {
}
error_page 404 /404.html;
location = /40x.html {
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
}
}
}
从上面配置可以获取到以下信息:
- 错误日志存储在
/var/log/nginx/error.log
文件中; - 访问日志存储在
/var/log/nginx/access.log
文件中; - 监听80端口,子站的配置存储在
/etc/nginx/default.d
目录下在的*.nginx
文件中;
a-project 的 Nginx 配置文件为:/etc/nginx/default.d/project-a.homedo.com.conf
,关键信息摘录如下:
map $http_upgrade $connection_upgrade {
default upgrade;
'' close;
}
server
{
listen 1024;
server_name a-project.homedo.com;
index index.html index.htm;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header X-real-ip $remote_addr;
proxy_set_header X-Forwarded-For $remote_addr;
root /home/xxxx/projectA;
location ^~/a-api/{
add_header 'Access-Control-Allow-Origin' '*';
proxy_pass https://a-api.homedo.com/;
}
# <======= 注:此处 b-api 的转发突然失败
location ^~/b-api/ {
add_header 'Access-Control-Allow-Origin' '*';
proxy_pass http://b-api.homedo.com/;
}
location ^~/c-api/ {
add_header 'Access-Control-Allow-Origin' '*';
proxy_pass http://c-api.homedo.com/;
}
# ... 其他配置
}
问题描述
从上面的 Nginx 配置可以看到 project-a 使用到了 a-api
、b-api
、c-api
三个子域名的接口,测试反馈说项目中某些接口突然报错500,经排查发现:
http://b-api.homedo.com
通过 Swagger 可以正常访问,通过 PostMan 也可以正常访问;- 访问
http://a-project.homedo.com
访问b-api
下的接口,集体报错:500; - 和用户权限无关,所有用户必现;
- 和接口权限无关,所有
b-api
下的接口均报错;
排查过程
STEP1
基本锁定问题是 b-api
转发失败,Nginx 错误日志 /var/log/nginx/error.log
为空,Nginx 并没有捕获到这些报错,access.log
也没有有用的信息。
在 project-a
所在服务器 xx.xx.xx.100
访问 http://a-project.homedo.com/areas/all
接口发现报错:
在另一台服务器(xx.xx.xx.200
)访问 http://a-project.homedo.com/areas/all
接口发现可以正常拿到结果。
注: 此处正常是因为 xx.xx.xx.200 从未访问过,目标域名未被 DNS 缓存。
STEP2
询问其他同事发现好多项目都遇到了同样的问题,原因是运维改了域名的解析地址。
解决办法:
- 重启服务器
- 清空DNS缓存
问题原因
首先梳理一下访问路径:
- 用户访问了系统,
a-project.homedo.com
,DNS将域名解析到xx.xx.xx.100
; a-project.homedo.com
调用a-api.homedo.com
时,DNS会解析到服务器xx.xx.xx.101
;a-project.homedo.com
调用b-api.homedo.com
时,DNS会解析到服务器xx.xx.xx.102
;a-project.homedo.com
调用c-api.homedo.com
时,DNS会解析到服务器xx.xx.xx.103
;
(也许是因为机器迁移)运维将 b-api.homedo.com
解析地址改动为 xx.xx.xx.202
后,以上第 3 步由于机器缓存了DNS解析记录,所以报错500。
总结
1. 怎么清除 DNS 缓存?
service nscd restart
2. 为什么重启后问题就解决了?
nscd 服务被重启了。
3. 什么是 nscd?
nscd(Name Service Cache Daemon)是一种能够缓存 passwd、group、hosts 的本地缓存服务,分别对应三个源 /etc/passwd、/etc/hosts、/etc/resolv.conf。其最为明显的作用就是加快 DNS 解析速度,在接口调用频繁的内网环境建议开启。
4. 正向代理和反向代理?
- 正向代理隐藏了用户的真实地址;
- 反向代理隐藏了服务器的真实地址;
记一次Nginx反向代理500的排查记录的更多相关文章
- nginx反向代理压测问题记录
使用nginx反向代理压测web程序,100个用户并发时,每隔一段时间loadrunner工具中就会报错,报错信息如下: Continuing after Error -26610: HTTP Sta ...
- nginx反向代理后端web服务器记录客户端ip地址
nginx在做反向代理的时候,后端的nginx web服务器log中记录的地址都是反向代理服务器的地址,无法查看客户端访问的真实ip. 在反向代理服务器的nginx.conf配置文件中进行配置. lo ...
- 把www.domain.com均衡到本机不同的端口 反向代理 隐藏端口 Nginx做非80端口转发 搭建nginx反向代理用做内网域名转发 location 规则
负载均衡-Nginx中文文档 http://www.nginx.cn/doc/example/loadbanlance.html 负载均衡 一个简单的负载均衡的示例,把www.domain.com均衡 ...
- 端口被占用通过域名的处理 把www.domain.com均衡到本机不同的端口 反向代理 隐藏端口 Nginx做非80端口转发 搭建nginx反向代理用做内网域名转发 location 规则
负载均衡-Nginx中文文档 http://www.nginx.cn/doc/example/loadbanlance.html 负载均衡 一个简单的负载均衡的示例,把www.domain.com均衡 ...
- Nginx反向代理,负载均衡,redis session共享,keepalived高可用
相关知识自行搜索,直接上干货... 使用的资源: nginx主服务器一台,nginx备服务器一台,使用keepalived进行宕机切换. tomcat服务器两台,由nginx进行反向代理和负载均衡,此 ...
- Nginx 反向代理、负载均衡、页面缓存、URL重写及读写分离详解
转载:http://freeloda.blog.51cto.com/2033581/1288553 大纲 一.前言 二.环境准备 三.安装与配置Nginx 四.Nginx之反向代理 五.Nginx之负 ...
- Nginx反向代理、负载均衡、页面缓存、URL重写及读写分离详解
大纲 一.前言 二.环境准备 三.安装与配置Nginx 四.Nginx之反向代理 五.Nginx之负载均衡 六.Nginx之页面缓存 七.Nginx之URL重写 八.Nginx之读写分离 注,操作系统 ...
- Nginx 反向代理、负载均衡、页面缓存、URL重写以及读写分离
1.环境准备 前端Nginx:10.160.65.44 后端WEB服务器两台:10.160.65.49/10.160.65.50 2.安装Nginx: 下载nginx-1.9.15.tar.gz,放置 ...
- nginx 反向代理 与 Apache backend的配置联合配置
nginx 反向代理 与 Apache backend的配置联合配置: 说明: nginx 将http映射到Apache上的特定子目录. 配置方法步骤: 1. 设置域名, 子域名映射到指定服务器ip ...
随机推荐
- 分布式事务MSDTC使用时,需要的配置
服务器最终配置 DTC服务 组件 防火墙 这里,跟下面的解决方案有点差异,在添加2个规则之后,原本就有分布式相关的规则,也给开启了. 网上的解决办法 在服务里打开 Distributed Transa ...
- Elasticsearch索引生命周期管理方案
一.前言 在 Elasticsearch 的日常中,有很多如存储 系统日志.行为数据等方面的应用场景,这些场景的特点是数据量非常大,并且随着时间的增长 索引 的数量也会持续增长,然而这些场景基本上只有 ...
- 身份证前6位地址码+码表+MySQL
insert into smd_address_code(add_code,address) values('110000','北京市'); insert into smd_address_code( ...
- 高效扩展工具让 VS Code 如虎添翼
Codelf 变量命名神器 Star:10688 https://github.com/unbug/codelf 新建项目,变量,类,方法,接口都需要命名,一个好的命名可以一眼看出这个地方的功能,Co ...
- 聊一聊这个总下载量36039K的XSS-NPM库,是如何工作的?
上篇文章这一次,彻底理解XSS攻击讲解了XSS攻击的类型和预防方式,本篇文章我们来看这个36039K的XSS-NPM库(你没有看错就是3603W次, 36039K次,36,039,651次,数据来自h ...
- TCP超时重传时间的选择
一---导读 TCP超时重传时间的选择是计算机网络中较复杂的问题之一,但幸好前辈们都把路铺好了,我们只需要学习并且遵循这些规则,有能力的话去进一步改正. 二---必知的一些专业术语 A--RTT( r ...
- sh -s用法
1.基本用法 (1)sh -s 会从标准输入中读取命令,并在子shell中执行 (2)sh -s 后从第一个非 - 开头的参数开始,依次被赋值给子shell的 $1,$2... (3)sh -s 的第 ...
- ES6 对象拓展方法
一,ES6 对象拓展方法 ES6为对象提供了一些拓展方法,下面列举几个比较常见的对象拓展方法.
- 十、scala、spark集群搭建
spark集群搭建: 1.上传scala-2.10.6.tgz到master 2.解压scala-2.10.6.tgz 3.配置环境变量 export SCALA_HOME=/mnt/scala-2. ...
- python函数----名称空间和作用域
一 名称空间 名称空间即存放名字与对象映射/绑定关系的地方. 对于x=3,Python会申请内存空间存放对象3,然后将名字x与3的绑定关系存放于名称空间中,del x表示清除该绑定关系. 在程序执行 ...