nginx实现同一个端口监听多个服务

打印 上一主题 下一主题

主题 1855|帖子 1855|积分 5565

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

x
前言

同一个系统中多个 TCP 服务进程无法绑定同一个端口这个概念的影响,误以为在nginx也无法配置通过同一个端口无法转发到多个不同域名的后端服务,于是本文使用配置来验证,实际是完全可以在同一端口上配置转发多个服务​​,且​​无需依赖不同协议。
   假如两个 TCP 服务进程同时绑定的 IP 地址和端口都相同,那么执行 bind() 时间就会堕落,错误是“Address already
in use”。
  原理

其核心原理是通过 ​​请求特征区分流量​​(如域名、路径、请求头),而非依赖不同协议或端口。以下是具体实现方式和配置示例:
Nginx 的 server 块和 location 块支持根据以下特征区分请求:
​​域名​​(server_name):不同域名访问同一端口时,Nginx 根据 Host 头分发到不同服务。
​​路径​​(location):同一域名的不同 URL 路径分发到不同服务。
​​协议​​:严酷来说,HTTP 和 HTTPS 协议必要不同端口(如 80 和 443),但可以在同一端口上通过协议升级(如 WebSocket)或同一协议下的不同路由逻辑实现多服务。
配置

使用同一个端口监听转发到不同服务,其实有两种配置,①是通过不同域名;②基于路径(URL 路由)​;
不同域名

通过不同域名(如 lvan.service1.com 和 lvan.service2.com)在同一端口(如 80)访问不同服务。
在nginx.conf配置
  1. http {
  2.     # 服务1:通过 lvan.service1.com 访问
  3.     server {
  4.         listen 80;
  5.         server_name lvan.service1.com;  # 域名1
  6.         location / {
  7.             proxy_pass http://localhost:3000;  # 转发到服务1
  8.         }
  9.     }
  10.     # 服务2:通过 lvan.service2.com 访问
  11.     server {
  12.         listen 80;
  13.         server_name lvan.service2.com;  # 域名2
  14.         location / {
  15.             proxy_pass http://localhost:4000;  # 转发到服务2
  16.         }
  17.     }
  18. }
复制代码
基于路径(URL 路由)​

通过同一域名和端口的不同路径(如 /app1 和 /app2)访问不同服务。
  1. http {
  2.     server {
  3.         listen 80;
  4.         server_name example.com;
  5.         # 服务1:路径 /app1
  6.         location /app1/ {
  7.             proxy_pass http://localhost:3000/;  # 末尾的 / 会移除 /app1/
  8.         }
  9.         # 服务2:路径 /app2
  10.         location /app2/ {
  11.             proxy_pass http://localhost:4000/;  # 末尾的 / 会移除 /app2/
  12.         }
  13.         # 默认路由(可选)
  14.         location / {
  15.             root /var/www/html;  # 静态资源或其他默认服务
  16.         }
  17.     }
  18. }
复制代码
注意:proxy_pass 末尾的 / 会移除原始路径前缀(如 /app1/api 转发为 /api)。
路径匹配优先级:准确路径(=)> 正则路径(~)> 平凡路径。
补充

还可以通过混合协议(HTTP + WebSocket)​。在同一端口(如 80)同时处理 HTTP 请求和 WebSocket 连接(需协议升级)。
  1. http {
  2.     server {
  3.         listen 80;
  4.         server_name example.com;
  5.         # HTTP 服务
  6.         location /api {
  7.             proxy_pass http://localhost:3000;
  8.         }
  9.         # WebSocket 服务
  10.         location /ws {
  11.             proxy_pass http://localhost:4000;
  12.             proxy_http_version 1.1;
  13.             proxy_set_header Upgrade $http_upgrade;    # 协议升级头
  14.             proxy_set_header Connection "Upgrade";
  15.         }
  16.     }
  17. }
复制代码
注意:
WebSocket 本质是 HTTP 协议升级,仍使用同一端口。
需配置 Upgrade 和 Connection 头支持协议切换。
总之

同一端口部署多服务的核心​​:利用 Nginx 的请求分发能力,根据域名、路径、协议升级等特征区分流量。
完结撒花,如有必要收藏的看官,顺便也用发财的小手点点赞哈,如有错漏,也接待各位在批评区批评!


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

立山

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表