问题描述
在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。
天堂老婆万岁~~~yeah 🐣