banner
约 1,200 字
4 分钟

Nginx 反向代理教程:一台服务器挂起所有服务

摘要

想用一个 80/443 端口挂起多个服务、给应用套上 HTTPS?本教程依据 Nginx 官方文档,介绍反向代理原理、最简 proxy_pass 配置与必备转发头、按域名分发多服务、WebSocket 支持、certbot 签发 Let's Encrypt 证书,以及 nginx -t 检查配置的规范流程。

Nginx 反向代理教程

你有了一个域名和一台服务器,想把跑在 8080 端口的应用挂到 443 的网站上;或者想给多个服务分配不同的子域名——这些都需要 Nginx 反向代理。本教程依据 Nginx 官方文档整理。

一、什么是反向代理

反向代理就是站在你的应用前面的"门卫":客户端访问 Nginx 的 80/443 端口,Nginx 把请求转发给后面真正的应用(如 Node 的 3000 端口),再把响应带回来。好处是:

  • 对外只暴露 80/443,应用端口不直接暴露

  • 可以轻松挂 HTTPS 证书

  • 多个服务共用一个 80 端口(按域名分发)

  • 附带缓存、限流、负载均衡能力

二、最简单的反代配置

Nginx 配置目录一般在 /etc/nginx/,站点配置放在 conf.d/sites-available/

nginx
server {
    listen 80;
    server_name app.example.com;

    location / {
        proxy_pass http://127.0.0.1:8080;
        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 是标配:让后端能拿到真实的访问 IP 和协议,很多应用(如 OAuth 回调)没有它们会工作异常。

改完配置执行:

bash
sudo nginx -t              # 语法检查,必做!
sudo systemctl reload nginx

三、多个服务按域名分发

一台服务器跑多个站,每个 server 块用不同的 server_name

nginx
server {
    listen 80;
    server_name blog.example.com;
    location / { proxy_pass http://127.0.0.1:2345; }
}

server {
    listen 80;
    server_name api.example.com;
    location / { proxy_pass http://127.0.0.1:3000; }
}

Nginx 会根据请求的 Host 头自动匹配到对应 server 块。

四、WebSocket 支持

反代 WebSocket 应用(如实时聊天、代码热更新)会握手失败,需要补:

nginx
location /ws/ {
    proxy_pass http://127.0.0.1:8080;
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "upgrade";
    proxy_read_timeout 3600s;
}

五、HTTPS 一步到位

用 certbot 免费签发 Let's Encrypt 证书(官方推荐方式):

bash
sudo apt install certbot python3-certbot-nginx
sudo certbot --nginx -d app.example.com

certbot 会自动改写配置加上 443 监听和证书路径,并配置自动续期(certbot renew 由 systemd timer 自动执行)。

六、静态站点直出

不涉及后端的服务,用 Nginx 直接吐静态文件更快:

nginx
server {
    listen 80;
    server_name docs.example.com;
    root /var/www/docs;
    index index.html;
}

七、总结

需求

做法

反代一个应用

proxy_pass http://127.0.0.1:端口 + 标准转发头

多站共存

多个 server 块按 server_name 分发

WebSocket

升级头 Upgrade/Connection

上 HTTPS

certbot --nginx 一条命令

改完配置

nginx -t 通过再 reload

记住铁律:改配置必跑 nginx -t,通过才 reload,能避免绝大多数"改完网站挂了"的事故。

END