Docker Swarm下如何通过NGINX反向代理多栈应用服务?
Docker Swarm中NGINX代理Laravel Octane服务的正确配置方案
核心解决:正确的proxy_pass写法
因为所有服务均连接到同一个外部Docker网络public,直接使用Web应用的Swarm服务名+端口即可,格式如下:
proxy_pass http://your-laravel-service-name:9000;
为什么你之前的写法无效?
http://localhost:9000:NGINX容器的localhost指向容器自身,而非宿主机或Web服务,必然无法转发http://docker.service.internal.ip:9000:Swarm服务的内部IP是动态分配的,重启服务后会变更,且Swarm服务发现依赖服务名而非硬编码IP- 若
my_swarm_service_name写法无效,大概率是服务名拼写错误,或NGINX与Web服务未真正接入同一个public网络
必须检查的其他配置项
1. 确认跨栈网络连通性
确保Web应用与NGINX的docker-compose.yml均正确接入public外部网络:
Web应用的docker-compose配置示例:
services: laravel-app: image: your-laravel-octane-image:latest networks: - public # 无需发布9000端口(内部网络通信无需暴露) networks: public: external: true # 声明使用已存在的外部网络
NGINX的docker-compose配置示例:
services: nginx: image: nginx:alpine ports: - "80:80" - "443:443" networks: - public volumes: - ./nginx-conf:/etc/nginx/conf.d networks: public: external: true
2. 适配Laravel Octane的监听配置
Octane(基于Swoole/RoadRunner)必须监听容器的所有网卡地址,而非仅127.0.0.1:
修改config/octane.php中的监听地址:
'listen' => env('OCTANE_LISTEN', '0.0.0.0:9000'),
同时在.env中确认:
OCTANE_LISTEN=0.0.0.0:9000
3. NGINX完整代理配置(适配Octane)
仅配置proxy_pass不够,需要添加必要的请求头,尤其是Swoole驱动需要的HTTP/1.1长连接配置:
server { listen 80; server_name mywebsite.dev; # 重定向HTTP到HTTPS(如果已配置SSL) return 301 https://$server_name$request_uri; } server { listen 443 ssl; server_name mywebsite.dev; # 你的SSL证书配置 ssl_certificate /path/to/fullchain.pem; ssl_certificate_key /path/to/privkey.pem; location / { proxy_pass http://your-laravel-service-name:9000; # 基础请求头 proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; # Swoole适配配置 proxy_http_version 1.1; proxy_set_header Connection ""; } }
4. 测试内部连通性
进入NGINX容器,直接curl Web服务验证网络是否正常:
docker exec -it <nginx-container-id> curl http://your-laravel-service-name:9000
如果能返回Laravel页面内容,说明网络与服务发现正常,问题出在NGINX配置;如果返回连接失败,优先检查网络接入与服务名拼写。
内容的提问来源于stack exchange,提问作者Legoraccio
相关产品推荐
相关产品推荐

