我有以下配置:
- nginx 由充当反向代理的 docker compose 文件启动//ssl 端点
- 由不同的 docker compose(出于模块化原因)文件启动的应用程序服务,为应用程序提供服务
reverse_proxy
和app_service
通过app_network
连接
由于它们是通过 app_network
连接的,因此我能够在 nginx 配置中寻址 app_service
,例如 http://app_service:8080
>,这很好,因为我不需要公开应用服务本身的端口。
不幸的是,在我启动应用服务容器之前,nginx 不会启动,因为它在启动时会检查主机名 app_service
是否存在。
如何防止 nginx 在启动时检查主机名,在 app_service
尚未运行时尝试连接时可能会导致 Bad Gateway
错误?
引用配置文件:
# reverse proxy docker-compose.yml
version: '3'
services:
reverse_proxy:
restart: always
container_name: reverse_proxy
image: nginx
ports:
- 80:80
- 443:443
volumes:
- /srv/docker/nginx/config:/etc/nginx
- /srv/ssl:/srv/ssl
networks:
default:
external:
name: app_network
# application service docker-compose.yml
version: '3'
services:
app_service:
restart: always
container_name: app_service
image: <my_app_image>
networks:
default:
external:
name: app_network
# nginx config
server {
listen 443 ssl http2;
listen [::]:443 ssl http2;
server_name app.example.com;
location / {
proxy_pass http://app_service:8080;
include proxy.conf;
}
ssl_certificate /srv/ssl/<mycert>.crt;
ssl_certificate_key /srv/ssl/<mykey>.key;
}
最佳答案
这是一种对我有用的方法:
# nginx config
server {
listen 443 ssl http2;
listen [::]:443 ssl http2;
server_name app.example.com;
location / {
set $upstream app_service:8080;
proxy_pass $upstream;
include proxy.conf;
}
ssl_certificate /srv/ssl/.crt;
ssl_certificate_key /srv/ssl/.key;
}
如果主机不可用并且在启动时不检查可用性,这会导致出现 502 Bad Gateway
消息。
关于Docker compose 和 nginx 网络主机名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61085846/