Skip to content

反向代理指南:使用 Nginx

本指南将教您如何安装并配置 Nginx 作为反向代理服务器。反向代理是现代网络架构中的一个关键组件,它可以接收来自客户端的请求,然后将这些请求转发到一个或多个后端服务器,并将后端服务器的响应返回给客户端。

为什么需要反向代理?

反向代理位于客户端和后端服务之间,能带来诸多好处:

  • 负载均衡: 将流量分发到多个后端服务器,提高网站的可用性和可靠性。
  • 增强安全性: 隐藏后端服务器的真实 IP 地址,保护它们不直接暴露在互联网上。可以集中处理安全策略,如抵御 DDoS 攻击。
  • SSL/TLS 终端: 集中管理 SSL/TLS 证书,为所有后端服务提供 HTTPS 加密,而后端服务本身无需处理加密,简化了配置。
  • 缓存静态内容: 缓存静态文件(如图片、CSS、JS),减轻后端服务器的压力,并加快客户端的访问速度。
  • URL 重写和路由: 根据 URL 将请求路由到不同的后端服务,实现更灵活的架构。

步骤 1: 安装 Nginx

首先,在您的 Debian 服务器上安装 Nginx。

bash
sudo apt-get update
sudo apt-get install nginx

安装完成后,Nginx 服务将自动启动。您可以通过访问服务器的 IP 地址 (http://<your_server_ip>) 来确认,如果看到 Nginx 的欢迎页面,说明安装成功。

别忘了在防火墙中允许 HTTP 和 HTTPS 流量:

bash
sudo ufw allow 'Nginx Full'

步骤 2: 配置一个基本的反向代理

假设您有一个在本地运行的应用程序,它监听在 3000 端口上 (例如一个 Node.js 或 Python Web 应用)。我们希望通过 Nginx 将公网对 80 端口的访问代理到这个应用。

2.1 创建 Nginx 服务器块 (Server Block) 配置文件

Nginx 的最佳实践是为每个站点或应用创建一个独立的配置文件,并将其存放在 /etc/nginx/sites-available/ 目录中。

我们将为我们的应用创建一个名为 myapp.conf 的配置文件。将 your_domain.com 替换为您的域名,或者如果您没有域名,可以使用服务器的 IP 地址。

bash
sudo nano /etc/nginx/sites-available/myapp.conf

在文件中粘贴以下内容:

nginx
server {
    listen 80;
    server_name your_domain.com www.your_domain.com;

    location / {
        proxy_pass http://localhost: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: 定义此服务器块对应的域名。
  • location /: 匹配所有传入的请求。
  • proxy_pass http://localhost:3000;: 这是核心指令,它告诉 Nginx 将匹配到的请求转发到 http://localhost:3000
  • proxy_set_header: 这些指令将原始的 HTTP 请求头传递给后端应用,这样后端应用就能获取到真实的客户端信息(如 IP 地址、域名、协议),而不是看到所有请求都来自 Nginx。

2.2 启用该服务器块

为了让 Nginx 加载我们的新配置,我们需要在 /etc/nginx/sites-enabled/ 目录中创建一个指向它的符号链接。

bash
sudo ln -s /etc/nginx/sites-available/myapp.conf /etc/nginx/sites-enabled/

为了避免冲突,您可以移除默认的配置链接(如果它还存在的话):

bash
sudo rm /etc/nginx/sites-enabled/default

2.3 测试并重启 Nginx

检查 Nginx 配置是否存在语法错误:

bash
sudo nginx -t

如果看到 syntax is oktest is successful 的消息,说明一切正常。

现在,重启 Nginx 以应用更改:

bash
sudo systemctl restart nginx

此时,当您通过 http://your_domain.com 访问您的服务器时,Nginx 应该会将请求转发到您在 3000 端口上运行的本地应用。


步骤 3: 托管多个应用

Nginx 的服务器块机制让托管多个网站或应用变得非常简单。您只需重复以下步骤:

  1. 为第二个应用(例如,一个运行在 4000 端口的应用)创建一个新的配置文件,如 /etc/nginx/sites-available/anotherapp.conf
  2. 在该配置文件中,使用不同的 server_name(如 another_domain.com)和 proxy_pass(如 http://localhost:4000)。
  3. 为新配置文件创建符号链接:sudo ln -s /etc/nginx/sites-available/anotherapp.conf /etc/nginx/sites-enabled/
  4. 测试并重启 Nginx。

通过这种方式,Nginx 会根据客户端请求的域名(由 Host 请求头决定)来判断应该使用哪个服务器块配置,从而将请求转发到正确的后端应用。