文章插图
最近遇到了Nginx疯狂抛错,access.log一天一共5W多条,但error.log中有大概9K多条,基本都是111: Connection refused,这到底是为什么呢?
从日志看起
我们还是先来看日志 。我提取了一条error.log当中抛错的日志(稍微分一下行,否则实在太长,敏感信息稍微处理了一下):
2019/06/06 10:09:45 [error] 28652#0: *883239 connect() failed (111: Connection refused) while connecting to upstream, client: 124.104.90.145, server: xxx.xxxxx.com, request: "POST /test-service/upload?mcachenum=155978698 HTTP/1.1", upstream: "http://[::1]:17000/test-service/upload?mcachenum=155978698", host: "xxx.xxxxx.com", referrer: "https://servicewechat.com/x98b46f69/2/page-frame.html"看了一下前面的报错和后面的描述,第一眼看上去感觉都是正常 。但再看之后发现,upstream中的host有些不一样 。[::1],这实际是一个IPv6的地址 。
这时候你可以查看一下你的机器是否开启了IPv6的地址,linux的命令是:ip address,看看返回结果中是否出现了inet6,如果有,那么恭喜你,原因找到了 。
解决办法
解决方法有两种,一个是禁用你机器的IPv6配置,另一个则是修改nginx.conf中的配置 。
个人觉得后一个方法更加保险一些,因为这不涉及到你的机器配置,应该相对而言最少 。
nginx.conf的修改,则是针对server模块中的location,修改proxy_pass中的host,我们在网上经常看到别人用的是:
proxy_pass http://localhost:18000/test-service/;
但为了强制指定IPv4的地址,需要变成:
proxy_pass http://127.0.0.1:18000/test-service/;
这样操作之后,再观察nginx的error.log,应该就不会再报upstream里含有IPv6地址的错误了 。
【nginx报错111: Connection refused】
推荐阅读
- 深入浅出Nginx
- Nginx 过滤模块的分析
- CentOS7安装Nginx及配置
- 怎么解决Linux LVM I/O报错
- 使用Nginx、Nginx Plus防止服务器DDoS攻击
- Python3.7编译常见报错之“No module named ‘_ctypes’”
- Nginx为什么高效?一文搞明白Nginx核心原理
- 利用nginx做流量限制及集群部署
- Nginx网站使用CDN之后禁止用户真实IP访问的方法
- nginx常见典型故障