插件窝 干货文章 nginx监听同一个端口转发不同应用

nginx监听同一个端口转发不同应用

http proxy localhost 转发 994    来源:    2025-04-03

Nginx监听同一端口转发不同应用

在Nginx中,可以通过以下几种方式实现监听同一个端口但转发到不同的后端应用:

1. 基于域名/主机名的转发 (最常用)

server {
    listen 80;
    server_name app1.example.com;

    location / {
        proxy_pass http://localhost:3000;
        # 其他代理设置...
    }
}

server {
    listen 80;
    server_name app2.example.com;

    location / {
        proxy_pass http://localhost:4000;
        # 其他代理设置...
    }
}

2. 基于路径前缀的转发

server {
    listen 80;
    server_name example.com;

    location /app1/ {
        proxy_pass http://localhost:3000/;
        # 其他代理设置...
    }

    location /app2/ {
        proxy_pass http://localhost:4000/;
        # 其他代理设置...
    }
}

3. 基于HTTP头的转发

map $http_x_application $backend {
    default       http://localhost:3000;
    "app2"        http://localhost:4000;
}

server {
    listen 80;

    location / {
        proxy_pass $backend;
        # 其他代理设置...
    }
}

4. 基于查询参数的转发

map $arg_app $backend {
    default       http://localhost:3000;
    "app2"        http://localhost:4000;
}

server {
    listen 80;

    location / {
        proxy_pass $backend;
        # 其他代理设置...
    }
}

最佳实践建议

  1. 基于域名的转发是最推荐的方式,因为:

    • 清晰明了
    • 便于管理
    • 符合HTTP标准
    • 支持HTTPS证书单独配置
  2. 如果必须使用路径前缀:

    • 确保后端应用知道它运行在特定前缀下
    • 注意proxy_pass末尾的斜杠(/)会影响URL重写
  3. 高级配置可能需要使用:

    • proxy_set_header 传递原始主机名
    • rewrite 规则调整路径
    • upstream 模块实现负载均衡
  4. 对于WebSocket应用,需要额外配置:

    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "upgrade";
    

您需要哪种具体的转发方式?我可以提供更详细的配置示例。