nginx的server块通过listen、server_name和location三步协同实现http层反向代理:监听外网端口并匹配host域名,按路径规则用proxy_pass转发至内网服务,需透传host、ip等请求头;非http协议须用stream模块四层代理。

Nginx 的 server 块通过反向代理机制,把外网请求按规则转发到内网服务器指定端口,本质是 HTTP 层(七层)的流量调度。关键不在于“映射端口”本身,而在于监听、匹配、转发三步协同工作。
监听外网端口并绑定域名或 IP
用 listen 指令声明 Nginx 接收外部请求的端口(如 80、443 或自定义端口),再用 server_name 匹配请求头中的 Host 字段——这决定了哪个 server 块被触发。
- 监听 80 端口且只响应
api.example.com的请求:listen 80;server_name api.example.com; - 若无域名,直接用公网 IP:
server_name 203.0.113.5; - 支持多个域名或泛域名:
server_name www.example.com example.com *.example.com;
用 location 定义匹配路径与转发目标
location 决定哪些 URL 路径交给这个 server 处理,并通过 proxy_pass 指向内网服务地址和端口。
- 全量转发(所有路径):
location / { proxy_pass http://192.168.1.20:3000; } - 路径前缀匹配并重写(去掉
/admin再转发):location /admin/ { proxy_pass http://192.168.1.20:8080/; }(注意末尾斜杠) - 精确匹配某个接口:
location = /health { proxy_pass http://192.168.1.20:8000/health; }
保留原始请求信息,避免后端识别失真
内网服务若依赖 Host、客户端 IP 或协议类型,必须显式透传请求头,否则可能返回错误或拒绝访问。
-
proxy_set_header Host $host;:把浏览器发来的 Host 头原样传过去 -
proxy_set_header X-Real-IP $remote_addr;:让后端拿到真实用户 IP -
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;:兼容多级代理场景 -
proxy_set_header X-Forwarded-Proto $scheme;:告诉后端当前是 http 还是 https
区分 HTTP 和非 HTTP 协议需用 stream 模块
如果要映射 MySQL、Redis、SSH 等 TCP 协议服务(非 HTTP),server 块无效,必须改用 stream 上下文(四层代理),且 Nginx 编译时需含 --with-stream 支持。
- 配置在
nginx.conf顶层,与http块同级: -
stream {server {listen 3307;proxy_pass 192.168.1.20:3306;}} - 不能写
location,也不处理 HTTP 头,纯端口转发











