如何在 Ubuntu 22.04 使用 Apache 作為 Reverse Proxy

Ivan Cheng
7 min readOct 28, 2023

--

反向代理伺服器是一種功能強大的工具,可充當用戶端和後端伺服器之間的中介,包括透過保護後端伺服器不直接暴露於互聯網來增強安全性、在多個伺服器之間分配客戶端請求的負載平衡以及透過向客戶端提供快取內容來提高效能的緩存。

我們會使用一台反向代理伺服器與後端伺服器來進行演示

安裝 Apache

首先,先在兩台伺服器上安裝 Apache 確認正常運作。

sudo apt update
sudo apt install -y apache2
sudo systemctl enable apache2

為了方便辨識連到的是哪一台伺服器,我們修改一下首頁文字。

sudo vi /var/www/html/index.html

反向代理伺服器更改如下

<body>
<div class="main_page">
<div class="page_header floating_element">
...
<div class="banner">
<div id="about"></div>
It works on reverse proxy!
</div>
...
<body>

後端伺服器更改如下

<body>
<div class="main_page">
<div class="page_header floating_element">
...
<div class="banner">
<div id="about"></div>
It works on application server!
</div>
...
<body>

為反向代理啟用 Apache 模組

為了有效利用 Apache Web Server 的反向代理,您必須啟用特定的 Apache 模組,這些模組對於支援反向代理伺服器所需的附加功能至關重要。

  • mod_proxy:作為 Apache 的主要代理模組,可以有效地處理連線和重定向,讓 Apache 能夠充當底層後端伺服器的 Gateway。
  • mod_proxy_http:對於在代理伺服器環境中支援 HTTP 和 HTTPS 請求是不可或缺的。
  • mod_ssl: 用於對 SSL v3 TLS v1.x 協定的支援,建立安全加密的連線與確保資料完整性。
sudo a2enmod proxy 
sudo a2enmod proxy_http
sudo a2enmod ssl
sudo systemctl restart apache2

Apache 反向代理配置

停用預設的 Apache 虛擬主機設定檔

sudo a2dissite 000-default.conf

建立新的虛擬主機設定檔

cd /etc/apache2/sites-available/
sudo vi waf.your_domain.conf

虛擬主機允許 Apache 管理多個網域或子網域,每個網域或子網域都有自己獨特的設定和設定。

<VirtualHost *:80>

ServerName vmreverseproxydev001.your_domain

ErrorLog ${APACHE_LOG_DIR}/error.log

CustomLog ${APACHE_LOG_DIR}/access.log combined

ProxyPass / http://vmapplicationdev001.your_domain/

ProxyPassReverse / http://vmapplicationdev001.your_domain/

ProxyRequests Off

</VirtualHost>

使用 <VirtualHost> 指令定義虛擬主機,指定接受的 IP 位址和連接埠號碼。 * 允許接受所有 IP 位址,連接埠號碼 80 則代表 HTTP 連接埠。

配置還包括以下幾項:

  • ServerName:此指令指定與伺服器關聯的網域名稱。
  • ErrorLog:設定 Apache 遇到的錯誤的檔案的名稱。
  • CustomLog:設定 Apache 將客戶端請求記錄到伺服器的檔案的名稱。
  • ProxyPass:將遠端伺服器對應到本機伺服器的空間,並定義流量重定向的目標位址。它允許 Apache 充當反向代理,將請求轉發到後端伺服器並增強應用程式效能和負載分配。
  • ProxyPassReverse:使用代理伺服器的資訊重寫後端伺服器的原始位置、內容位置和 URI HTTP 回應標頭,確保反向代理程式正確處理回應並防止後端伺服器暴露。
  • ProxyRequests:防止 Apache 被用作轉送代理,從而增強安全性。

使用 a2ensite 指令啟用新的虛擬主機設定

sudo a2ensite waf.your_domain.conf

重新載入 Apache 以啟動新的虛擬主機

sudo systemctl reload apache2

接著我們對反向代理伺服器發出請求,回覆卻是後端伺服器的內容,也代表我們的反向代理設定成功囉。

Apache 反向代理配置 SSL

此外我們可以讓反向代理伺服器設定負責處理 SSL 加解密,從而釋放後端伺服器上的寶貴資源。

首先我們要註冊 DNS 如 waf.your_domain 與申請 SSL 憑證

將申請到的憑證與私鑰上傳至反向代理伺服器

sudo mkdir /etc/apache2/ssl

# 上傳憑證與私鑰
# SSLCertificateFile:server.cer(憑證)
# SSLCertificateKeyFile:server.key(私鑰)

更改虛擬主機設定檔

cd /etc/apache2/sites-available/
sudo vi waf.your_domain.conf
<VirtualHost *:80>

ServerName waf.your_domain

Redirect permanent / https://waf.your_domain/

</VirtualHost>

<VirtualHost *:443>

ServerName waf.your_domain

ErrorLog ${APACHE_LOG_DIR}/error.log

CustomLog ${APACHE_LOG_DIR}/access.log combined

ProxyPass / http://vmapplicationdev001.your_domain/

ProxyPassReverse / http://vmapplicationdev001.your_domain/

ProxyRequests Off

SSLEngine On

SSLCertificateFile /etc/apache2/ssl/server.crt

SSLCertificateKeyFile /etc/apache2/ssl/server.key

</VirtualHost>

重新載入 Apache 以啟動新的虛擬主機

sudo systemctl reload apache2

瀏覽器不但可以自動轉址到 HTTPS 使用安全的連線,後端伺服器仍然是使用 HTTP 進行通訊,是不是很方便。

今天的分享就到這邊,希望有幫助到大家。

參考文件

--

--

Ivan Cheng

動若不止,止水皆化波濤;靜而不擾,波濤悉為止水。水相如此,心境亦然。