网站部署后客户端访问正常,access log中显示请求为200,但error log中报错connect() failed (111: Connection refused)
问题分析
nginx_error.log
2020/*/* *:*:* [error] 13860#0: *778 connect() failed (111: Connection refused) while connecting to upstream,
client: 139.199.82.203, server: xxxx.com, request: "GET / HTTP/1.1",
upstream: "http://[::1]:8080/", host: "www.xxxx.com"
Connection refused
报错很大概率是CGI出错,首先检查上游server,发现服务正常可访问,原因应该出在nginx上,经过搜索找到问题在ipv6上,报错信息中 upstream: http://[::1]:
是一个IPv6地址
通过命令ip addr
可以检查服务器是否有IPv6地址字段inet6
,如果有那么问题定位成功
解决办法
解决思路有几个,第一:禁用服务器ipv6,但这种方式对机器修改较大,云服务器中ipv6可能被管控服务使用,修改风险较大,第二个是修改上游server支持IPv6,但前端已有nginx做反向代理,没必要做此项修改,最后更恰当的方法是修改nginx中配置
nginx.conf配置中网站对应server模块中的location,修改proxy_pass中的host,出错时的配置是:
proxy_pass http://localhost:8080;
但为了强制指定IPv4的地址,需要变成:
proxy_pass http://127.0.0.1:8080;
修改后重启nginx再次观察nginx_error.log, 发现已经不再报错,问题解决