nginx 同一端口
《告别端口焦虑!Nginx同一端口部署的3大实战场景》
在服务器资源有限的情况下,我们总想用最少的端口承载最多的服务。Nginx的“同一端口部署”能力,能让你用80/443等核心端口,同时处理多域名、多路径甚至多协议的服务请求。今天,我们就来拆解这三大核心场景,手把手教你配置!
一、基于域名的虚拟主机:一个端口,多域名共存
场景需求:同一端口(如80)下,为不同域名(如www.abc.com和api.abc.com)分配独立服务。
原理:Nginx通过server_name匹配域名,不同域名对应不同server块,实现“一域名一服务”的隔离。
配置示例:
# 处理未知域名(默认拒绝)
server {
listen 80 default_server;
server_name _; # 匹配所有未指定域名
return 444; # 主动关闭非法连接,避免暴露服务
}
# 前端网站服务
server {
listen 80;
server_name www.abc.com;
root /var/www/abc-frontend; # 前端代码目录
index index.html; # 默认首页
location / {
try_files $uri $uri/ /index.html; # 支持前端路由刷新
}
}
# API服务(子域名)
server {
listen 80;
server_name api.abc.com;
location / {
proxy_pass http://127.0.0.1:3000; # 代理到后端API
proxy_set_header Host $host; # 传递原始域名
}
}
关键点:
- 用
default_server拦截非法域名,避免恶意请求 server_name支持通配符(如*.abc.com),适合多子域名场景
二、基于路径的反向代理:同一域名,路径分服务

场景需求:同一域名(如example.com)下,不同路径(如/api、/admin)指向不同服务。
原理:Nginx通过location块的路径匹配,将请求分发到不同后端。
配置示例:
server {
listen 80;
server_name example.com;
# 前端静态资源(根路径)
location / {
root /var/www/frontend;
index index.html;
try_files $uri $uri/ /index.html; # 支持前端路由
}
# 后端API(/api路径)
location /api {
proxy_pass http://127.0.0.1:4000;
proxy_http_version 1.1;
proxy_set_header X-Real-IP $remote_addr;
}
# 管理后台(/admin路径)
location /admin {
root /var/www/admin;
index index.html;
}
}
关键点:
location匹配优先级:精确路径 > 前缀匹配 > 正则匹配,需注意顺序- 避免路径重叠(如
/api在前,/api/v1在后,防止覆盖)
三、基于协议的端口复用:同一端口,处理HTTP/WebSocket
场景需求:同一端口(如80)同时处理HTTP和WebSocket(如在线聊天)。
原理:通过路径或协议头区分请求类型,WebSocket需特殊配置Upgrade头。
配置示例:
server {
listen 80;
server_name chat.example.com;
# WebSocket服务(ws://路径)
location /ws {
proxy_pass http://127.0.0.1:8888;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "Upgrade";
}
# 普通HTTP服务(其他路径)
location / {
proxy_pass http://127.0.0.1:8080;
proxy_set_header Host $host;
}
}
关键点:
- WebSocket必须配置
proxy_http_version 1.1和Upgrade头,否则连接中断 - 注意防火墙规则,确保WebSocket端口(如8888)开放
总结:Nginx同一端口部署的核心技巧
- 域名隔离:用
default_server拦截未知域名 - 路径匹配:按优先级配置
location,避免路径重叠 - 协议兼容:WebSocket需额外配置
Upgrade头,确保协议握手成功
通过这三大场景,你能大幅减少端口占用,让服务器配置更简洁高效。从简单的多域名站点开始,逐步尝试路径分流和协议复用,就能解锁Nginx的“端口魔法”!








