Written by: algebnaly
Date: 2025-08-14T14:46:56.000Z
我使用docker-compose.yaml文件记录了一个gitea服务的配置。在这个compose文件中,gitea容器依赖了一个nginx作为反向代理服务器。
我偶尔会遇到一个小问题,每次重启gitea容器后,gitea的web界面无法登录,只有把gitea所依赖的nginx容器也重启一遍才能恢复访问。经过一番探索,我发现这是nginx没有即使更新域名对应的ip导致的,重启gitea容器会导致其ip发生变化,nginx仍然使用旧的ip来访问上游的gitea服务器,自然是访问失败。 解决办法如下:
首先是compose文件中需要指定该network的网关地址:
networks:
gitea:
external: false
ipam:
driver: default
config:
- subnet: "10.90.0.0/24"
gateway: "10.90.0.1"
podman会在该网关地址10.90.0.1上运行一个DNS服务器, 该DNS服务器能帮我们吧服务名和容器名解析到容器的ip地址。
然后,nginx内需要做如下的配置:
http {
resolver 10.90.0.1 valid=30s;
resolver_timeout 3s;
server {
location / {
set $gitea_backend http://server:3000;
proxy_pass $gitea_backend;
..
其中, server是gitea的服务名,它会被解析到gitea服务器的ip地址,10.90.0.1是compose文件中的网关地址,负载解析域名。
set指令非常关键,每当一个客户端发起http请求, 变量$gitea_backend都会被重新设置,域名server都会被重新解析,从这个角度来看, valid=30s这个参数实际上是没有生效的,但是resolver是必须的,否则set指令无法完成域名解析。