nginx反向代理时报no resolver defined to resolve

发布时间 2024-01-12 14:11:01作者: shn7798

错误日志

2024/01/11 05:29:22 [error] 29#29: *44 no resolver defined to resolve www.test.com, client: 127.0.0.1, server: _, request: "GET /test/123 HTTP/1.1", host: "127.0.0.1:8080"

nginx配置

server {
listen    8080;
server_name  _;

location ~ ^/test/(.*)$ {
    proxy_set_header Host www.test.com;
    proxy_pass https://www.test.com/$1;
}

网上搜索说是要手动指定resolver 8.8.8.8,但是此配置是放在docker镜像中的,有些业务地址需要走自己的dns解析,肯定不能写死。于是又去查找能不能让resolver自动读取/etc/resolv.conf,发现需要加脚本。所以我在想,这么基础的功能需要配置的这么麻烦吗?

好像以前也是直接写域名就可以用的。等等,好像不太一样,这次域名后面加了$1
这种模式下是不是也可以把$1加到域名里呢?此时的域名变成了变量域名,性质发生了变化。
所以这里虽然写的是静态域名,而nginx已经一刀切的认为是变量域名了,从而需要手动指定resolver才能工作。

那得想办法让nginx认为我这个域名不会发生变化,我想到了upstream

upstream baidu {
  server www.test.com:443;
}

server {
listen    8080;
server_name  _;

location ~ ^/test/(.*)$ {
    proxy_set_header Host www.test.com;
    proxy_pass https://test/$1;
}

结果测试成功。

小插曲:

2024/01/11 05:54:37 [error] 454#454: *790 SSL_do_handshake() failed (SSL: error:1408F10B:SSL routines:ssl3_get_record:wrong version number) while SSL handshaking to upstream, client: 127.0.0.1, server: _, request: "GET /test/123 HTTP/1.1", upstream: "https://193.169.203.141:80/123", host: "127.0.0.1:8080"

发现proxy_pass在以https方式访问80口,是因为upstream默认使用80端口,手动指定即可

upstream test {
  server www.test.com:443;
}