在 Ubuntu 20.04 上为 Nginx HTTP 服务器配置反向代理

反向代理(Reverse Proxy)技术用于解决客户端无法直接访问目标网站、或者目标网站需要向用户保持隐藏的情形。这种技术通过配置一台中间服务器作为反向代理服务器,以实现在客户端和目标网站间转发流量。内容分发网络(CDN)亦采用反向代理技术实现回源访问。

本文介绍在 Ubuntu 20.04 LTS 服务器上针对 Nginx HTTP 服务器进行反向代理配置的方法,并使用 Let’s Encrypt 的相关服务为前置服务器申请 HTTPS 证书,以增强其安全性。

使用 Apache HTTP 网络服务器?请阅读这篇文章。

先决条件

为完成本教程并成功设置反向代理服务器,你需要:

  • 一台拥有 root 权限的 Ubuntu 20.04 LTS 服务器
  • (可选项)一个域名,用于实现用户与中间服务器之间的 HTTPS 安全通信

我们使用 cURL 工具确定前置服务器是否能够访问目标网站,下述所有代码需要在服务器上执行:

curl https://example.com -vvv

请将 https://example.com 部分换成要验证能否代理访问的网站。如果上述指令能够正常加载对端网站,且没有错误提示,说明我们正在配置的服务器可以直接访问到目标网站。

然后,将 apt 包管理器的软件包目录更新为最新:

sudo apt update

安装并配置 Nginx 服务器

我们使用 apt 包管理器安装 Nginx HTTP 服务器:

sudo apt install nginx nano -y

提示:如果你准备以后通过域名的方式访问要配置的网站,我们强烈建议同时配置 HTTPS 安全链接以增强安全性。请先阅读《使用 Certbot 管理来自 Let’s Encrypt 的证书》一文,然后继续接下来的配置。

Nginx 的默认配置文件位于目录 /etc/nginx/sites-enabled/ 中。我们使用熟悉的编辑器(比如 nano 或者 vim)编辑默认生成的文件。

Nginx 使用类似 JSON 的格式表示其配置文件。其中,对于网站的配置位于单独的 server{} 块中。一个典型示例如下:

server {
    listen 80 default_server;
    root /var/www/html;
    server_name dgideas.net;
    location / {
    }
}

如果先前已经通过 Certbot 等工具使 Nginx 网络服务器开启了 HTTPS(SSL/TLS)支持,则可能存在多个 server {} 块。

我们注意到其中的 location / {} 块,该块指示 Nginx 网络服务器如何处理来自指定 URI 前缀的请求。如果需要将全部网络请求都进行反向代理,则将其中 location / {} 块更改为以下样式:

location / {
    proxy_pass https://example.com/;
}

其中,https://example.com/ 是我们要反向代理网站的 URI,不要忘记末尾的分号。我们在系统中执行下述指令以应用更改:

sudo systemctl reload nginx