Introducing ZYNOO General Purpose & CPU Optimized Servers   Learn More >

如何在 Ubuntu 上设置 Nginx 反向代理

Nginx 反向代理接收网站访客的请求,并将其转发到另一台服务器或应用程序。它通常用于让运行在 3000 等端口上的应用程序通过域名供人访问,而无需将其内部端口暴露在互联网上。

在本教程中,您将在 Ubuntu 上配置 Nginx,将请求转发到本地应用程序,绑定域名并启用 HTTPS。

什么是 Nginx 反向代理?

反向代理位于访客和后端应用程序之间。

访客无需直接连接运行在 3000 端口上的应用程序,而是通过标准的 HTTP 或 HTTPS 端口连接 Nginx。

Nginx 将请求转发给应用程序,再将应用程序的响应返回给访客。

请求流程如下:

访客 → Nginx → 后端应用程序

这种配置常用于 Node.js、Python 和其他 Web 应用程序,也可支持 TLS 终止、负载均衡和集中式请求处理。

为您的 Nginx 部署寻找 VPS?
借助 root 权限和灵活的服务器资源部署应用程序。
查看 VPS 套餐 →

准备工作

开始之前,您需要:

  • 一台具有 sudo 权限的 Ubuntu 24.04 LTS 服务器。
  • 服务器的 SSH 访问权限。
  • 一个指向服务器公网 IP 地址的域名。
  • 一个监听本地端口的后端应用程序。

本例使用 3000 端口。

如果您不熟悉 SSH,请先阅读我们的面向初学者的 SSH 命令指南。

如何设置 Nginx 反向代理

第 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 中的端口是否正确。

504 Gateway Timeout

当网关未能及时收到所需的上游响应时,就会出现 504 错误。

在延长超时时间之前,请先排查应用程序请求缓慢的原因和后端性能问题。

域名无法访问

请检查域名的 A 记录是否指向正确的公网 IP 地址、相关防火墙端口是否开放,以及 Nginx server 块是否与请求的主机名匹配。

常见问题

Nginx 中的 proxy_pass 是什么?

proxy_pass 用于告诉 Nginx 将请求转发到哪里,例如运行在 127.0.0.1:3000 上的 HTTP 应用程序。

Nginx 能为多个应用程序提供反向代理吗?

可以。您可以配置不同的域名、子域名或 URL 路径,将请求转发到不同的后端应用程序。

使用 Nginx 反向代理需要域名吗?

不需要。您可以使用 IP 地址或在本地测试反向代理。不过,使用域名可以让公开托管服务和获取标准 HTTPS 证书变得更简单。

Nginx 反向代理是免费的吗?

是的。开源版 Nginx 支持反向代理功能,无需商业许可证。

总结

您已经在 Ubuntu 上配置了 Nginx 反向代理,将请求转发到本地应用程序,并启用了 HTTPS。

只需更新 proxy_pass 中的后端地址,就可以将相同的基本配置用于 Node.js、Python 和其他基于 HTTP 的应用程序。

在将此配置用于生产环境之前,请确保应用程序能够自动启动、以适当的权限运行,并具备充分的监控和安全措施。

Table of Content

Nginx 502 网关错误通常意味着 Nginx 未能从上游服务器(如 PHP-FPM、Node.js 或其 […]

当充当网关或代理的服务器未能及时收到另一台服务器的响应时,就会出现 504 网关超时错误。这通常发生在网站后端 […]

MCP 服务器是一种程序,允许 AI 应用通过模型上下文协议(MCP)连接外部工具、服务和数据源。它充当 AI […]

Build your next project with ZYNOO

From your first website to demanding applications, choose the resources and control you need.

Shared Hosting

Start your blog or business website with cPanel, LiteSpeed and CloudLinux.

VPS Hosting

Grow your websites and applications with NVMe storage, KVM virtualization and full root access.

Dedicated Servers

Power demanding projects with your own physical server, dedicated resources and control over your environment.

滚动至顶部