You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.11 16:24:53