跳转到内容

Windows Nginx 的 server block 与反向代理

核验于 1 分钟阅读

用 server_name 托管多个域名,服务静态目录,反代 Node/Java 上游,并正确转发 Host/X-Forwarded 头。

测试环境Standard / Datacenter · 版本号 26100.33650 · x64
E1
版本号
26100.33650
版本
Standard / Datacenter
架构
x64
支持
文档(E1)
证据
E1官方文档
核验日期
2026-10-29
页面类型
任务

一个 server 块 = 一个虚拟主机:

server {
listen 8082;
server_name lab.local;
root C:/nginx/html/lab;
index index.html;
location / {
try_files $uri $uri/ =404;
}
}

server_name 匹配 HTTP Host。没有匹配时,第一个/default_server 块应答。一个域名一个块,不是一个应用一个端口。

server {
listen 8082;
server_name lab.local;
root C:/sites/lab;
index index.html;
location /assets/ {
expires 7d;
add_header Cache-Control "public";
}
location / {
try_files $uri $uri/ /index.html;
}
}

Windows 路径用正斜杠。相对 root 相对 Nginx 工作目录,绝对路径更稳。

用 Host 头测试:

终端窗口
curl.exe -H "Host: lab.local" http://127.0.0.1:8082/

Node/Java/Python 上游在本机:

upstream app_backend {
server 127.0.0.1:3000;
keepalive 16;
}
server {
listen 8083;
server_name app.local;
location / {
proxy_pass http://app_backend;
proxy_http_version 1.1;
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;
proxy_read_timeout 60s;
}
}

proxy_pass 后面加不加 URI 是两种行为:http://app_backend 保留请求 URI;http://app_backend/ 会改路径。不要无意中加斜杠。

map $http_upgrade $connection_upgrade {
default upgrade;
'' close;
}
location /ws/ {
proxy_pass http://127.0.0.1:3000;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection $connection_upgrade;
proxy_read_timeout 3600s;
}

map 必须在 http 块,不在 server 里。

终端窗口
cd C:\nginx
.\nginx.exe -t
.\nginx.exe -s reload
curl.exe -I -H "Host: lab.local" http://127.0.0.1:8082/
curl.exe -I -H "Host: app.local" http://127.0.0.1:8083/
Get-Content .\logs\error.log -Tail 50

所有域名都返回同一个站点:server_name/Host 没匹配,或另一个块是 default_server。反代 502:上游没监听或端口错。

E1。实验室只把 Nginx 1.28.0 跑在 8081,没有加第二个 server block 或上游。配置是 Server 2025 的验证路径。

来源