问题描述

在Docker容器中使用Nginx做反向代理的时候,有时候需要一个服务先启动,然后再构建另一个服务的镜像,此时如果在nginx conf里直接配置proxy_pass指向尚未启动的服务,Nginx会启动失败,并抛出Host Not Found异常。

下面是一个nginx conf 的基本配置

server {
    listen 80;
    server_name prds98.com;
    location / {
        proxy_pass http://some-service:port;
    }
}

这样配置的话,如果some-service服务没有启动,Nginx会启动失败。

下面是调整过的nginx conf

server {
    resolver 127.0.0.11 valid=30s ipv6=off;
    listen 80;
    server_name prds98.com;
    location / {
        set $something http://some-service:port
        proxy_pass $something;
    }
}

第一步:设置resolver

127.0.0.11是Docker内部的DNS服务,能把服务名解析为ipv4地址,这个DNS不会改变,所以硬编码没有问题。 valid 设置缓存有效时间,注意要将ipv6设置为off,似乎nginx会优先使用ipv6,而Docker的DNS解析是ipv4的,所以会出现解析失败问题。

第二步:将服务地址存为变量

使用set $something http://some-service:port设置变量,然后以变量的方式传入proxy_pass。

结果

通过上面的修改,Nginx在遇到没有启动的服务时会返回一个错误页面,但是不会直接退出了。之后在服务启动后,再次访问页面,会正常访问,不需要重启Nginx。