如何配置 Nginx 作为反向代理:逐步指南

LightNode
By LightNode ·

介绍

Nginx 是世界上最流行的 Web 服务器和反向代理之一,以其高性能、可扩展性和灵活性而闻名。它通常用作反向代理,将客户端请求转发到后端服务器,从而带来负载均衡、安全性、缓存等多种好处。

反向代理 是一个位于客户端设备(如浏览器)和后端服务器(如 Web 服务器或应用服务器)之间的服务器。当客户端发出请求时,反向代理将这些请求转发到适当的后端服务器,然后将服务器的响应发送回客户端。这种方法允许对流量进行集中控制,并提高安全性和性能。

在本指南中,我们将逐步介绍配置 Nginx 作为反向代理所需的步骤,包括安装、基本配置、SSL 设置和负载均衡。无论您是部署简单的 Web 应用程序还是管理复杂的服务器基础设施,Nginx 都可以成为提高系统安全性和效率的强大工具。

通过本教程,您将了解如何:

  • 使用 Nginx 设置基本的反向代理。
  • 配置 SSL 以实现安全通信。
  • 使用 Nginx 在多个后端服务器之间进行负载均衡。
如何配置 Nginx 作为反向代理

什么是反向代理?

反向代理 是一个位于客户端设备和后端服务器之间的服务器,转发客户端请求到适当的后端,并将响应返回给客户端。基本上,反向代理充当中介,代表后端服务器接收客户端请求,并将其转发到处理请求的服务器,然后返回结果。

正向代理 不同,正向代理将请求从客户端转发到互联网,而反向代理则相反:它处理来自客户端的请求,并将其发送到正确的后端服务器。这一区别很重要,因为反向代理可以保护后端服务器不直接暴露在互联网上,从而增强安全性和隐私。

正向代理与反向代理的区别

特征正向代理反向代理
主要目的将客户端请求转发到互联网。将客户端请求转发到后端服务器。
位置位于客户端和互联网之间。位于客户端和后端服务器之间。
可见性客户端知道正向代理的存在。客户端通常不知道反向代理的存在。
常见用例网络过滤、绕过地理限制、匿名。负载均衡、安全性、缓存、SSL 终止。

反向代理的用例

反向代理可以为您的基础设施提供多种好处,例如:

  1. 负载均衡:将传入流量分配到多个后端服务器,以提高性能、可靠性和可扩展性。这有助于确保没有单个服务器因请求过多而过载。

  2. 安全性:隐藏后端服务器的身份和内部结构,保护它们不直接暴露在互联网上。反向代理还可以提供额外的安全层,例如 Web 应用防火墙或访问控制。

  3. 缓存:缓存来自后端服务器的响应,减少后端资源的负载,并加快对频繁请求内容的响应时间。

  4. SSL 终止:代表后端服务器处理安全套接字层(SSL)加密和解密。这简化了 SSL 证书管理,并减轻了后端服务器的计算负担。

  5. 压缩和优化:在将响应发送给客户端之前进行压缩,减少带宽使用并提高加载速度。

  6. 内容交付:可以用于从多个后端服务器交付内容,为客户端提供一致的接口,同时在后台管理不同的服务器资源。

前提条件

在您开始配置 Nginx 作为反向代理之前,您需要具备一些前提条件。这些包括对 Nginx 的基本知识、对服务器的访问权限以及必要的软件安装。本节将指导您了解开始所需的内容。

1. 对 Nginx 的基本知识

要配置 Nginx 作为反向代理,您应该对 Nginx 的工作原理有基本的了解,包括其配置文件和结构。如果您对 Nginx 不熟悉,可以查看 官方 Nginx 文档 以深入了解该软件。

Nginx 使用配置文件,通常位于 /etc/nginx/(在 Linux 系统上),以定义服务器设置。主要配置文件是 nginx.conf,根据您的设置,可能会包含其他配置文件(例如,在 /etc/nginx/sites-available//etc/nginx/sites-enabled/ 中,适用于基于 Debian 的发行版)。

2. 在您的服务器上安装 Nginx

您需要在服务器上安装 Nginx。以下是流行的 Linux 发行版的安装说明。

在 Ubuntu/Debian 上安装 Nginx

要在 Ubuntu 或基于 Debian 的系统上安装 Nginx,请使用以下命令:

sudo apt update
sudo apt install nginx

安装后,您可以使用以下命令检查 Nginx 是否正在运行:

sudo systemctl status nginx

如果 Nginx 没有运行,您可以使用以下命令启动它:

sudo systemctl start nginx

在 CentOS/RHEL 上安装 Nginx

在 CentOS 或基于 RHEL 的系统上,使用以下命令:

sudo yum install epel-release
sudo yum install nginx

启动 Nginx:

sudo systemctl start nginx

验证 Nginx 安装

一旦安装了 Nginx,您可以通过打开 Web 浏览器并导航到服务器的 IP 地址(例如 http://your_server_ip)来验证它是否正在运行。您应该会看到 Nginx 欢迎页面。

或者,您可以通过命令行测试:

curl http://localhost

您应该会看到默认 Nginx HTML 页面的内容。

3. 后端服务器(可选用于测试)

虽然 Nginx 可以配置为多种类型后端服务器的反向代理(例如 Web 应用程序、API 服务器等),但在本教程中,我们将使用一个简单的后端服务器进行测试。您可以使用在特定端口上运行的 Web 应用程序,例如 Node.js 或 Python Flask 应用程序,或者您可以设置一个简单的 HTTP 服务器。

例如,您可以安装一个基本的 python3 HTTP 服务器来测试反向代理设置:

# 在端口 8080 上启动一个简单的 HTTP 服务器
python3 -m http.server 8080

这将在 http://localhost:8080 上启动一个基本服务器。您可以将其用作测试反向代理配置的后端服务器。

4. 命令行访问

您需要通过终端或 SSH(如果您在远程服务器上工作)访问服务器的命令行。确保您拥有安装软件和编辑配置文件所需的权限。

要通过 SSH 访问远程服务器,请使用:

ssh user@your_server_ip

确保将 user 替换为您的实际用户名,将 your_server_ip 替换为服务器的 IP 地址。

5. 文本编辑器

您需要一个文本编辑器来修改配置文件。在大多数 Linux 系统上,您可以使用 nanovimvi 等编辑器。例如:

sudo nano /etc/nginx/nginx.conf

第一步:安装 Nginx

在您可以配置 Nginx 作为反向代理之前,您需要在服务器上安装 Nginx。安装过程将根据您的操作系统而有所不同。在本节中,我们将介绍在 Ubuntu/Debian 和 CentOS/RHEL 系统上安装 Nginx 的步骤。

在 Ubuntu/Debian 上安装 Nginx

如果您使用的是 Ubuntu 或基于 Debian 的系统,可以按照以下简单步骤安装 Nginx:

  1. 更新您的软件包列表
    在安装任何新软件之前,更新软件包列表以确保您获得最新版本的 Nginx。

    sudo apt update
    
  2. 安装 Nginx
    使用 apt 包管理器安装 Nginx。

    sudo apt install nginx
    
  3. 启动 Nginx
    安装完成后,您可以使用 systemctl 启动 Nginx 服务:

    sudo systemctl start nginx
    
  4. 启用 Nginx 在启动时自动启动
    为了确保 Nginx 在服务器重启时自动启动,请启用它:

    sudo systemctl enable nginx
    
  5. 检查 Nginx 状态
    通过检查其状态来验证 Nginx 是否正常运行:

    sudo systemctl status nginx
    

    您应该会看到指示 Nginx 活动并正在运行的输出。

验证 Nginx 安装(Ubuntu/Debian)

一旦安装并运行 Nginx,您可以通过打开 Web 浏览器并输入服务器的 IP 地址来验证它是否正常工作。您应该会看到默认的 Nginx 欢迎页面,这确认了 Nginx 正在正常工作。

或者,您可以使用 curl 进行测试:

curl http://localhost

您应该会收到默认 Nginx 页面的 HTML 内容。

在 CentOS/RHEL 上安装 Nginx

对于 CentOS、RHEL 或 Fedora 系统,您可以使用以下步骤安装 Nginx:

  1. 安装 EPEL 仓库
    首先,您需要启用 EPEL(企业 Linux 的额外软件包)仓库,该仓库包含 Nginx 和其他有用的软件包。

    sudo yum install epel-release
    
  2. 安装 Nginx
    使用 yum 包管理器安装 Nginx:

    sudo yum install nginx
    
  3. 启动 Nginx
    安装完成后,启动 Nginx 服务:

    sudo systemctl start nginx
    
  4. 启用 Nginx 在启动时自动启动
    要使 Nginx 在重启后自动启动,请使用以下命令:

    sudo systemctl enable nginx
    
  5. 检查 Nginx 状态
    检查 Nginx 的状态以确保它正在运行:

    sudo systemctl status nginx
    

    您应该会看到指示 Nginx 活动并正在运行的输出。

验证 Nginx 安装(CentOS/RHEL)

与 Ubuntu/Debian 一样,您可以通过在浏览器中导航到服务器的 IP 地址来测试 Nginx 是否正在运行。您应该会看到默认的 Nginx 欢迎页面。

或者,使用 curl 验证:

curl http://localhost

您应该会得到默认 Nginx 页面的 HTML 内容。

常见问题解答(FAQ)

反向代理和正向代理有什么区别?

反向代理 位于客户端设备和后端服务器之间,转发客户端请求到适当的服务器,然后将响应返回给客户端。客户端不知道反向代理的存在,因为它充当后端服务器的网关。

正向代理 则位于客户端和互联网之间。它用于过滤或控制客户端请求(例如,用于匿名或访问限制),客户端知道代理的存在。

为什么我应该使用 Nginx 作为反向代理?

Nginx 是一个轻量级、高性能的 Web 服务器和反向代理,因其可扩展性、安全特性和易于配置而广泛使用。它能够高效处理许多并发连接,并提供以下功能:

  • 负载均衡:将流量分配到多个后端服务器。
  • 缓存:通过缓存响应减少后端服务器的负载。
  • SSL 终止:处理 SSL 加密和解密,以减轻后端服务器的工作负担。
  • 安全性:保护后端服务器不直接暴露在互联网上。

我如何知道我的反向代理配置是否正常工作?

您可以通过以下几种方式验证反向代理设置:

  • 检查日志:Nginx 日志通常位于 /var/log/nginx/access.log/var/log/nginx/error.log。这些日志可以帮助您识别任何问题。

    tail -f /var/log/nginx/access.log
    tail -f /var/log/nginx/error.log
    
  • 检查 Nginx 是否转发请求:使用 curl 或浏览器访问反向代理,验证它是否正确转发请求到后端服务器。

    curl http://your_domain_or_ip
    
  • 直接测试后端服务器:直接访问后端服务器的 IP 和端口,以确保它正常响应(例如,http://localhost:8080)。

我该如何为我的反向代理启用 SSL?

要为反向代理启用 SSL,您可以使用 Let’s Encrypt 和 Certbot 获取免费的 SSL 证书。以下是过程的简要概述:

  1. 安装 Certbot 和 Nginx 插件(在 Ubuntu/Debian 上):

    sudo apt install certbot python3-certbot-nginx
    
  2. 使用 Certbot 获取 SSL 证书

    sudo certbot --nginx -d your_domain.com
    

    按照说明完成证书生成过程。

  3. 配置 Nginx 使用 SSL

    Nginx 会自动创建 SSL 配置,但您可以根据需要进行编辑。基本的 SSL 启用配置如下所示:

    server {
        listen 443 ssl;
        server_name your_domain.com;
    
        ssl_certificate /etc/letsencrypt/live/your_domain.com/fullchain.pem;
        ssl_certificate_key /etc/letsencrypt/live/your_domain.com/privkey.pem;
    
        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;
        }
    }
    
    server {
        listen 80;
        server_name your_domain.com;
        return 301 https://$host$request_uri;
    }
    
  4. 验证 SSL: 配置 Nginx 使用 SSL 后,您可以通过访问 https://your_domain.com 来检查 SSL 证书是否正常工作,或者使用在线工具如 SSL Labs 的 SSL 测试

我该如何使用 Nginx 配置负载均衡?

要配置负载均衡,Nginx 允许您定义一个 upstream 块,将流量分配到多个后端服务器。以下是一个基本示例:

upstream backend {
    server 127.0.0.1:8080;
    server 127.0.0.1:8081;
}

server {
    listen 80;

    location / {
        proxy_pass http://backend;
        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;
    }
}

此配置将在 localhost:8080localhost:8081 之间平衡请求。

我的 Nginx 反向代理没有转发请求。我该怎么办?

以下是一些故障排除步骤:

  • 检查 Nginx 配置语法:在重启 Nginx 之前,验证配置文件的语法:

    sudo nginx -t
    

    如果有错误,Nginx 会输出错误信息,您可以相应地进行修复。

  • 检查防火墙设置:确保防火墙允许正确端口的流量(例如,HTTP 的端口 80 和 HTTPS 的端口 443)。使用 ufwfirewalld 等工具检查和调整防火墙规则。

  • 检查 Nginx 日志:Nginx 日志是查找与代理相关错误的最佳地方:

    tail -f /var/log/nginx/error.log
    

    这可以让您了解 Nginx 在尝试转发请求时是否遇到问题。

我该如何配置 Nginx 处理 WebSocket 连接?

WebSocket 连接需要特殊处理,因为它们使用持久连接。在 Nginx 配置中,添加以下头以确保 WebSocket 连接被正确代理:

location /ws/ {
    proxy_pass http://localhost:8080;
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection 'upgrade';
    proxy_set_header Host $host;
    proxy_cache_bypass $http_upgrade;
}

此配置将允许 Nginx 正确处理到后端服务器 localhost:8080 的 WebSocket 连接。

我该如何优化 Nginx 以提高性能?

以下是一些 Nginx 性能优化建议:

  • 启用 gzip 压缩:压缩静态文件以减少带宽使用并加快页面加载时间。

    gzip on;
    gzip_types text/plain text/css application/javascript application/json;
    
  • 缓存:使用缓存减少后端服务器的负载,以便更快地响应频繁请求的内容。

    location /images/ {
        proxy_cache my_cache;
        proxy_cache_valid 200 1d;
    }
    
  • 连接超时:设置适当的超时,以避免对慢或空闲连接的无谓等待。

    proxy_read_timeout 90;
    proxy_connect_timeout 90;
    
  • 工作进程:增加工作进程的数量,以提高 Nginx 处理更多并发连接的能力。您可以在 nginx.conf 中进行调整:

    worker_processes auto;
    

我该如何在 Nginx 后面保护我的后端服务器?

为了提高后端服务器的安全性,您可以:

  • 使用 HTTP 身份验证:使用简单的用户名和密码保护对后端的访问。

    location / {
        auth_basic "受限访问";
        auth_basic_user_file /etc/nginx/.htpasswd;
    }
    
  • 按 IP 限制访问:通过仅允许特定 IP 地址来限制对后端服务器的访问。

    location / {
        allow 192.168.1.0/24;
        deny all;
    }
    
  • 使用 Web 应用防火墙(WAF):考虑设置像 ModSecurity 这样的 WAF,以提供额外的攻击保护。