反向代理(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-04
与 https://cloud.tencent.com/developer/article/1100410
。