Home Knowledge base Skyline Cloud 如何将 Nginx 配置为反向代理(分步教程) KNOWLEDGE BASE

如何将 Nginx 配置为反向代理(分步教程)

手把手教你将 Nginx 配置为生产级反向代理:TLS 终止、正确的客户端请求头、WebSocket 支持、负载均衡以及可选的缓存。适用于 Ubuntu/Debian 与 RHEL 系统。

如何将 Nginx 配置为反向代理(分步教程)

反向代理位于一个或多个后端应用之前,负责将客户端请求转发给它们。与其将应用服务器(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 oktest is successful。随后重新加载——与 restart 不同,reload 会优雅地重新读取配置,几乎不会造成中断:

sudo systemctl reload nginx

访问 http://app.example.com,你应当能看到通过 Nginx 提供的后端应用。

第 4 步 — 支持 WebSocket

如果你的应用使用 WebSocket(聊天、实时仪表盘、开发服务器),你必须转发 UpgradeConnection 请求头,否则连接将无法完成协议切换。请在同一个 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 响应头会报告 HITMISSBYPASS,因此你可以从浏览器的网络(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。

SKYLINE Engineering

@skyline

The engineering team at SKYLINE Industrial Solutions. We publish field-tested guides drawn from real KSA and GCC deployments.

See author profile
SKYLINE engineering services

Need this implemented for you?

Reading is free — building it right takes a team. SKYLINE engineers ship Skyline Cloud for Aramco vendors, banks, hospitals and government agencies across Saudi Arabia. Talk to us before you start.

Aramco Approved Contractor ISO 9001 · ISO 27001 SAMA CSF aligned NCA ECC ready 247+ KSA clients

Comments

0 total · 0 threads
Be the first to leave a comment.