反向代理位于一个或多个后端应用之前,负责将客户端请求转发给它们。与其将应用服务器(Node.js、Python、PHP-FPM、Docker 容器)直接暴露在互联网上,不如让客户端与 Nginx 通信,再由 Nginx 通过私有地址与你的应用通信。
这样你就拥有了一个统一的公网入口,可以在此终止 TLS、在多个后端之间均衡流量、缓存响应、实施限流,并隐藏内部拓扑结构。这是生产级 Web 应用的标准模式——而且它与 Skyline Cloud 的 VPS 或云服务器天然契合,你的数据将保留在沙特境内,符合 PDPL 和 NCA 的合规要求。
本指南采用 Ubuntu/Debian 的路径,但其中的每一条指令同样适用于 RHEL 系列系统。
前置条件
- 一台拥有
sudo权限的 Linux 服务器(Skyline Cloud 的 VPS 或云服务器即可胜任)。 - 一个已在本地运行并监听的后端应用——例如监听在
127.0.0.1:3000。 - 一个域名(例如
.sa域名),其A记录指向你服务器的公网 IP。
第 1 步 — 安装 Nginx
sudo apt update
sudo apt install nginx -y
确认它正在运行并已设置为开机自启:
sudo systemctl status nginx
sudo systemctl enable nginx
如果你使用 UFW,请放行防火墙:
sudo ufw allow 'Nginx Full'
第 2 步 — 创建反向代理的 Server 块
Nginx 会加载 /etc/nginx/conf.d/ 中所有以 .conf 结尾的文件,而在 Debian/Ubuntu 上它还会读取 /etc/nginx/sites-enabled/。请创建一个专用文件,以免改动默认配置:
sudo nano /etc/nginx/conf.d/app.conf
添加以下内容,并将 app.example.com 和后端地址替换为你自己的:
server {
listen 80;
listen [::]:80;
server_name app.example.com;
location / {
proxy_pass http://127.0.0.1:3000;
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_connect_timeout 60s;
proxy_send_timeout 60s;
proxy_read_timeout 60s;
}
}
各请求头的作用
| 指令 | 作用 |
|---|---|
proxy_pass |
Nginx 转发到的后端地址。此处不加末尾斜杠,可保留原始的 URI 路径。 |
Host |
传递原始主机名,使应用能生成正确的链接并按域名进行路由。 |
X-Real-IP |
客户端的真实 IP,否则会被代理隐藏。 |
X-Forwarded-For |
追加每一跳代理,使应用能看到完整的客户端链路。 |
X-Forwarded-Proto |
告知应用原始请求是 http 还是 https——在添加 TLS 后至关重要。 |
第 3 步 — 测试并重新加载
在应用配置之前务必先进行验证。这能在配置生效之前捕获语法错误,避免站点宕机:
sudo nginx -t
你应当看到 syntax is ok 和 test is successful。随后重新加载——与 restart 不同,reload 会优雅地重新读取配置,几乎不会造成中断:
sudo systemctl reload nginx
访问 http://app.example.com,你应当能看到通过 Nginx 提供的后端应用。
第 4 步 — 支持 WebSocket
如果你的应用使用 WebSocket(聊天、实时仪表盘、开发服务器),你必须转发 Upgrade 和 Connection 请求头,否则连接将无法完成协议切换。请在同一个 location 块内添加以下内容:
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
第 2 步中的 proxy_http_version 1.1; 这一行是该功能正常工作的前提。
第 5 步 — 使用免费证书添加 HTTPS
在 Nginx 处终止 TLS,使后端在内部只需处理纯 HTTP。安装 Certbot 并让它自动配置 SSL:
sudo apt install certbot python3-certbot-nginx -y
sudo certbot --nginx -d app.example.com
Certbot 会编辑你的 server 块,添加一个 listen 443 ssl 的 server,并设置自动续期定时器。通过一次演练运行来验证续期是否正常:
sudo certbot renew --dry-run
要启用 HTTP/2,请将 SSL 块中的 listen 行改为跨版本的写法:
listen 443 ssl http2;
请使用
listen 443 ssl http2;,而不要使用单独的http2 on;指令——这种组合写法在所有当前的 Nginx 版本上都能正常工作。
第 6 步 — 在多个后端之间进行负载均衡
要将流量分发到多个应用实例,请定义一个 upstream 组并按名称代理到它。将 upstream 块放在文件顶部、server 之外:
upstream backend_pool {
least_conn;
server 127.0.0.1:3000;
server 127.0.0.1:3001;
server 127.0.0.1:3002 backup;
keepalive 32;
}
server {
listen 80;
server_name app.example.com;
location / {
proxy_pass http://backend_pool;
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_set_header Connection "";
}
}
least_conn会将每个请求发送到活动连接数最少的后端。默认(不写任何指令)为轮询(round-robin)。backup标记的服务器只在其他服务器都宕机时才会被使用。keepalive 32会复用与上游的连接。使用它时,请设置proxy_set_header Connection "";,以避免每次请求都关闭连接。
第 7 步 — 缓存后端响应(可选)
对于不会因用户而异的内容,缓存可以减轻应用的负载。请在 http 上下文中定义缓存存储(例如在 /etc/nginx/nginx.conf 中):
proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=app_cache:10m
max_size=1g inactive=60m use_temp_path=off;
然后在 location 块内引用它:
proxy_cache app_cache;
proxy_cache_valid 200 302 10m;
proxy_cache_valid 404 1m;
add_header X-Cache-Status $upstream_cache_status;
X-Cache-Status 响应头会报告 HIT、MISS 或 BYPASS,因此你可以从浏览器的网络(network)面板确认缓存是否生效。
故障排查
- 502 Bad Gateway — 后端无法访问。用
ss -tlnp | grep 3000确认它正在监听,并核实proxy_pass中的地址是否一致。 - 504 Gateway Timeout — 后端响应过慢;请调高
proxy_read_timeout。 - 应用在 HTTPS 后生成
http://链接 — 确保已设置X-Forwarded-Proto $scheme,且你的应用信任该请求头。 - 查看日志:
sudo tail -f /var/log/nginx/error.log。
小结
现在你已经拥有了一个生产级的反向代理:TLS 终止、正确的客户端请求头、WebSocket 支持、负载均衡以及可选的缓存。让它运行在靠近你的用户和数据的地方——Skyline Cloud 将一切托管在沙特境内,符合 PDPL/NCA 合规要求,提供本地阿拉伯语支持和透明的定价。将此代理与托管式商务邮箱托管搭配,即可获得完整的技术栈,并可在沙特虚拟主机中心探索更多指南。
准备好部署了吗?立即创建你的 Skyline Cloud 账户,几分钟内即可启用一台 VPS。

Comments
0 total · 0 threads