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

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

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

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

先决条件

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

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

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

curl https://example.com -vvv

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

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

sudo apt update

安装并配置 Apache2 服务器

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

sudo apt install apache2 nano -y

安装好后,启用 Apache2 中的代理相关模块:

sudo a2enmod proxy_http && sudo a2enmod ssl && sudo systemctl restart apache2

提示:如果你准备以后通过域名的方式访问要配置的网站,我们强烈建议同时配置 HTTPS 安全链接以增强安全性。不要继续本小节后续的操作,并直接阅读此处继续。

安装好后,Apache2 HTTP 服务器关于站点的配置文件位于 /etc/apache2/sites-enabled/ 中,我们使用熟悉的编辑器(比如 nano 或者 vim)编辑默认生成的文件:

sudo nano /etc/apache2/sites-enabled/000-default.conf

在该配置文件的最底部,添加如下配置:

<VirtualHost *:80>
  ServerName example.dgideas.net
  ServerAlias example2.dgideas.net
  SSLProxyEngine on
  ProxyPass / https://www.example.com/
  ProxyPassReverse / https://www.example.com/
</VirtualHost>

其中,https://www.example.com/ 是要访问的目标网址。ServerName/ServerAlias 项中配置的域名代表用户通过访问 example.dgideas.net 或者 example2.dgideas.net(中继服务器域名)就能达到访问 www.example.com 的效果。

如果希望用户通过任意 URL 均能访问目标网址,请将 /etc/apache2/sites-enabled/000-default.conf 文件替换为上述配置,并删除 ServerName 一行即可。

更改完成配置文件之后,我们重启动 Apache2 服务以应用更改:

sudo systemctl restart apache2

配置 HTTPS 代理以增强安全性

如果你拥有一个域名,则可以将反向代理配置为采用 HTTPS 安全连接。这将提高用户与反向代理服务器之间数据传输的机密性。在设置反向代理之前,我们需要首先配置服务器使其支持 HTTPS。

Certbot 是目前流行的用于申请、管理并一键配置服务器支持 HTTPS 的工具。我们推荐阅读《使用 Certbot 管理来自 Let’s Encrypt 的证书》一文以通过 Certbot 为 Apache2 服务器配置 HTTPS 支持。

以下操作需要在服务器中拥有用于 HTTPS 加密的 SSL/TLS 证书的前提下进行。下述配置以通过 Certbot 申请的 SSL 证书为例。

我们配置位于 /etc/apache2/sites-enabled/ 中的站点配置文件,由于我们已经对服务器开启了默认 HTTPS 支持,根据配置方式的不同,我们需要编辑的文件名称应该与 000-default-le-ssl.conf 类似。

使用 nano 或其他你喜爱的文本编辑器打开该配置文件后,我们应注意到文件头部有类似 <VirtualHost *:443> 的标记,如果你注意到 <VirtualHost *:80> 等的标记,你可能编辑错了文件。

对于要代理的每个域名,在该配置文件结尾的 </VirtualHost> 行之后,插入如下内容块:

<VirtualHost *:443>
ServerName example.dgclouds.net
Include /etc/letsencrypt/options-ssl-apache.conf
SSLProxyEngine On
ProxyPass / https://www.example.com/
ProxyPassReverse / https://www.example.com/
SSLCertificateFile /etc/letsencrypt/live/example.dgclouds.net/fullchain.pem
SSLCertificateKeyFile /etc/letsencrypt/live/example.dgclouds.net/privkey.pem
</VirtualHost>

其中,ProxyPass 与 ProxyPassReverse 中填写的是目标服务器的地址,而 ServerName/ServerAlias 中填写的是希望用户通过何种域名来访问中继(反向代理服务器)。SSLCertificateFile 与 SSLCertificateKeyFile 中则分别填写你申请 SSL 证书的 fullchain 与私钥(Private Key)文件。Certbot 工具默认申请的证书会存放在 /etc/letsencrypt/live/ 目录下,可以去该目录下找一找。

更改完成配置文件之后,我们重启动 Apache2 服务以应用更改:

sudo systemctl restart apache2

感谢

本文撰写时参考了以下文章:https://www.digitalocean.com/community/tutorials/how-to-use-apache-as-a-reverse-proxy-with-mod_proxy-on-ubuntu-16-04https://cloud.tencent.com/developer/article/1100410