Podman部署PHP-Nginx服务时如何获取真实客户端公网IP?
解决Podman部署Nginx+PHP无法获取真实客户端IP的问题
问题根源
Podman默认使用slirp4netns作为自定义网络的驱动,这种网络模式会对端口转发做NAT转换,导致Nginx接收到的请求源IP是Podman内部的网关地址(也就是你看到的10.89.0.3)。而Docker默认的bridge网络直接与主机网络桥接,端口转发时会保留客户端真实IP。
解决方案
方法1:修改自定义网络为bridge驱动
在你的docker-compose.yml的网络配置部分,明确指定驱动为bridge,这样Podman会创建与Docker类似的桥接网络,保留客户端真实IP:
version: '3' services: nginx: container_name: min-web-nginx build: context: . dockerfile: docker/nginx/Dockerfile volumes: - ./app:/app depends_on: - php ports: - 8080:80 networks: - halozat php: container_name: min-web-php build: context: . dockerfile: docker/php/Dockerfile volumes: - ./app:/app networks: - halozat networks: halozat: driver: bridge
修改后,执行podman-compose down && podman-compose up -d重新部署服务即可。
方法2:使用Podman默认bridge网络(简化配置)
如果不需要自定义网络,可以直接删除networks相关配置,让Podman使用默认的bridge网络,同样能保留真实IP:
version: '3' services: nginx: container_name: min-web-nginx build: context: . dockerfile: docker/nginx/Dockerfile volumes: - ./app:/app depends_on: - php ports: - 8080:80 php: container_name: min-web-php build: context: . dockerfile: docker/php/Dockerfile volumes: - ./app:/app
额外检查:Nginx反向代理配置(若需传递IP到PHP)
如果你的Nginx配置了反向代理到PHP-FPM,需要确保在Nginx的location块中添加以下配置,将真实IP传递给PHP:
location ~ \.php$ { # 其他配置... proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; }
此时PHP可以通过$_SERVER['HTTP_X_REAL_IP']或$_SERVER['HTTP_X_FORWARDED_FOR']获取真实IP,不过在bridge网络模式下,$_SERVER['REMOTE_ADDR']本身就能拿到真实IP。
内容的提问来源于stack exchange,提问作者Lay András
相关产品推荐
相关产品推荐

