突遇项目发生502错误,经过了解原来一直正常运行。最近也未有改动。只有一步步排查,MySQL运行正常,PHP-FPM运行正常,PHP-FPM的日志也是正常的,服务器负载不高,磁盘充足。

  • 最后查询nginx错误日志,发现问题如下:
1
xxx.xx.com could not be resolved (2: Server failure)

认为是该域名无法解析。我就强制绑定host,修改后仍然没有效果。

  • 查看配置文件,关键配置信息如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
set $pp_domain "www.baidu.com";
location ~ ^/s {
    resolver 8.8.8.8;

    proxy_http_version 1.1;
    proxy_set_header Connection "keep-alive";
    proxy_set_header x-real-ip $remote_addr;
    proxy_set_header x-forwarded-for $proxy_add_x_forwarded_for;
    proxy_next_upstream http_502 http_503 http_504 http_500 error timeout invalid_header;


    proxy_set_header Host $pp_domain;
    proxy_pass http://$pp_domain;
}

接着,我就ping一下8.8.8.8,居然没有通,这应该是问题的关键。

  • 把resolver后台修改成可以ping通的服务即可,如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
set $pp_domain "www.baidu.com";
location ~ ^/s {
    resolver 223.5.5.5;

    proxy_http_version 1.1;
    proxy_set_header Connection "keep-alive";
    proxy_set_header x-real-ip $remote_addr;
    proxy_set_header x-forwarded-for $proxy_add_x_forwarded_for;
    proxy_next_upstream http_502 http_503 http_504 http_500 error timeout invalid_header;

    proxy_set_header Host $pp_domain;
    proxy_pass http://$pp_domain;
}

思考及解决

  • 8.8.8.8,都ping不同。看来要多设置几个dns服务器,resolver支持多个ip设置。
  • 为什么没有走本地的dns呢? 经过查找, 简书上的 “详解proxy_pass、upstream与resolver “ 讲述的很好。 基本上可以总结为: 想要走本地的dns,就不要设置变量”set”,这样就也可以不设置”resolver”。 想要通过变量”set”灵活控制的,”resolver”就是要设置好,不然就是挂掉。