Nginx 反向代理接收网站访客的请求,并将其转发到另一台服务器或应用程序。它通常用于让运行在 3000 等端口上的应用程序通过域名供人访问,而无需将其内部端口暴露在互联网上。
在本教程中,您将在 Ubuntu 上配置 Nginx,将请求转发到本地应用程序,绑定域名并启用 HTTPS。
什么是 Nginx 反向代理?
反向代理位于访客和后端应用程序之间。
访客无需直接连接运行在 3000 端口上的应用程序,而是通过标准的 HTTP 或 HTTPS 端口连接 Nginx。
Nginx 将请求转发给应用程序,再将应用程序的响应返回给访客。
请求流程如下:
访客 → Nginx → 后端应用程序
这种配置常用于 Node.js、Python 和其他 Web 应用程序,也可支持 TLS 终止、负载均衡和集中式请求处理。
准备工作
开始之前,您需要:
- 一台具有 sudo 权限的 Ubuntu 24.04 LTS 服务器。
- 服务器的 SSH 访问权限。
- 一个指向服务器公网 IP 地址的域名。
- 一个监听本地端口的后端应用程序。
本例使用 3000 端口。
如果您不熟悉 SSH,请先阅读我们的面向初学者的 SSH 命令指南。

第 1 步:在 Ubuntu 上安装 Nginx
通过 SSH 连接到您的 Ubuntu 服务器。
更新软件包索引并安装 Nginx:
sudo apt update
sudo apt install nginx -y
检查 Nginx 是否正在运行:
sudo systemctl status nginx
您应该会看到 active (running)。
如果 Nginx 尚未启动,请运行:
sudo systemctl enable --now nginx
您也可以在浏览器中访问服务器的公网 IP 地址。如果允许 HTTP 访问,应会显示 Nginx 默认欢迎页面。
如果您使用 UFW,请允许 HTTP 和 HTTPS 流量通过:
sudo ufw allow 'Nginx Full'
还要检查通过托管服务提供商配置的所有防火墙规则。不要为了让 Nginx 可访问而禁用防火墙。
第 2 步:启动测试用后端应用程序
配置反向代理之前,我们需要一个应用程序,供 Nginx 将请求转发给它。
为了进行简单测试,创建一个临时目录:
mkdir -p ~/nginx-proxy-test
cd ~/nginx-proxy-test
创建一个基本的 HTML 页面:
echo '<h1>Nginx Reverse Proxy Works!</h1>' > index.html
现在启动 Python 内置的 HTTP 服务器:
python3 -m http.server 3000 --bind 127.0.0.1
这会在 3000 端口提供测试页面,且只能通过本地环回地址访问。
保持此终端运行,并打开第二个 SSH 会话。
验证应用程序是否有响应:
curl http://127.0.0.1:3000
您应该会看到:
<h1>Nginx Reverse Proxy Works!</h1>
此 Python 服务器仅用于演示。对于生产环境中的应用程序,请使用该应用程序推荐的应用服务器和服务管理配置。
第 3 步:创建 Nginx 反向代理配置
创建一个新的 Nginx server 块:
sudo nano /etc/nginx/sites-available/app.example.com
将 app.example.com 替换为您的实际域名。
添加以下配置:
server {
listen 80;
server_name app.example.com;
location / {
proxy_pass http://127.0.0.1:3000;
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;
}
}
保存文件。
理解配置
listen 80接收 HTTP 请求。server_name指定 Nginx 应处理的域名。proxy_pass将请求转发到运行在 3000 端口上的应用程序。proxy_set_header将原始请求的相关信息传递给后端。
后端必须能够理解并安全处理转发的请求头。只有在请求经过您信任的代理时,才应将应用程序配置为信任这些请求头。
第 4 步:启用并测试配置
启用新的 server 块:
sudo ln -s /etc/nginx/sites-available/app.example.com /etc/nginx/sites-enabled/
如果链接已存在,请勿重新创建。
检查配置是否有错误:
sudo nginx -t
如果测试通过,重新加载 Nginx:
sudo systemctl reload nginx
现在打开:
http://app.example.com
如果 DNS 指向正确的服务器,且测试用后端仍在运行,您应该会看到:
Nginx 反向代理已正常工作!
如果显示的是 Nginx 默认页面,请检查域名的 DNS 记录和 server_name 配置。
第 5 步:使用 Let’s Encrypt 启用 HTTPS
对于公开访问的网站,应使用 HTTPS,而不是让流量以未加密的方式传输。
首先,确认您的域名解析到正确的服务器,且入站 80 端口可访问。这些条件对标准的 HTTP 证书验证流程很重要。
使用官方推荐的 Snap 方式安装 Certbot:
sudo snap install --classic certbot
如果 certbot 命令尚不可用,请创建命令链接:
sudo ln -s /snap/bin/certbot /usr/local/bin/certbot
然后申请证书:
sudo certbot --nginx -d app.example.com
按照提示操作。Certbot 可以获取证书,并配置 Nginx 通过 HTTPS 提供您的域名服务。
完成后,测试证书续期:
sudo certbot renew --dry-run
访问:
https://app.example.com
现在,您的测试应用程序应该可以通过加密连接加载。
第 6 步:验证反向代理
检查 HTTPS 响应:
curl -I https://app.example.com
对于示例中的 Python 后端,HTTP 200 OK 响应表示请求已成功到达应用程序。
您还可以检查服务器上哪些进程正在监听端口:
sudo ss -ltnp
Nginx 应监听配置的公网 HTTP 和 HTTPS 端口,而示例后端应监听 127.0.0.1:3000。
请注意,终止运行临时 Python 服务器的终端会话后,该服务器也会停止。生产环境中的应用程序应由 systemd 等进程管理器管理。
常见的 Nginx 反向代理问题
502 Bad Gateway
这通常意味着 Nginx 未能从后端收到有效响应。
请检查应用程序是否正在运行,以及 proxy_pass 中的端口是否正确。
我们的指南详细介绍了如何修复 Nginx 中的 502 Bad Gateway 错误,涵盖日志、上游服务和连接问题。
504 Gateway Timeout
当网关未能及时收到所需的上游响应时,就会出现 504 错误。
在延长超时时间之前,请先排查应用程序请求缓慢的原因和后端性能问题。
请参阅我们的504 Gateway Timeout 故障排除指南,了解更多操作方法。
域名无法访问
请检查域名的 A 记录是否指向正确的公网 IP 地址、相关防火墙端口是否开放,以及 Nginx server 块是否与请求的主机名匹配。
常见问题
proxy_pass 用于告诉 Nginx 将请求转发到哪里,例如运行在 127.0.0.1:3000 上的 HTTP 应用程序。
可以。您可以配置不同的域名、子域名或 URL 路径,将请求转发到不同的后端应用程序。
不需要。您可以使用 IP 地址或在本地测试反向代理。不过,使用域名可以让公开托管服务和获取标准 HTTPS 证书变得更简单。
是的。开源版 Nginx 支持反向代理功能,无需商业许可证。
总结
您已经在 Ubuntu 上配置了 Nginx 反向代理,将请求转发到本地应用程序,并启用了 HTTPS。
只需更新 proxy_pass 中的后端地址,就可以将相同的基本配置用于 Node.js、Python 和其他基于 HTTP 的应用程序。
在将此配置用于生产环境之前,请确保应用程序能够自动启动、以适当的权限运行,并具备充分的监控和安全措施。