什么是反向代理?反向代理服務器是位于后端服務器前面的中間連接點,它將客戶端請求路由到這些服務器,并確保沒有客戶端直接與后端通信。這與轉發代理不同,在轉發代理中,代理位于客戶端前面,并充當客戶端和源服務器之間的中介。反向代理就像一個實際的端點,為您的系統提供額外的安全和控制層。
有哪些反向代理用例?
反向代理是基本的系統管理概念之一,可以幫助您提高系統的可伸縮性、性能、彈性和安全性。讓我們來看看一些最流行的反向代理用例。
- 負載平衡。反向代理可以充當負載平衡器,在不同服務器池之間分配傳入請求。它可能使用循環法、最少連接數、最少響應時間或其他一些算法來路由傳入請求并使您的整個系統更快、更有彈性。如果服務器出現故障,您的反向代理負載平衡器會將流量重定向到其余的在線服務器。
- 匿名。反向代理在將所有請求傳輸到后端服務器之前攔截所有請求。這樣你的后端服務器永遠不需要透露他們的 IP 地址,只能通過反向代理訪問,這使得直接攻擊它們變得更加困難。
- 交通清洗。反向代理服務器可能安裝了一些流量控制機制來過濾惡意或不需要的請求并防止它們到達您的后端服務。您可以使用防火墻、防病毒系統或任何其他應用程序內容檢查機制來加強系統安全性。
- 緩存。反向代理服務器可以存儲經常訪問的靜態或動態 Web 內容,以更快地提供服務并減輕后端服務器的負載。
- SSL 加密。加密和解密 TLS 流量的計算量很大。反向代理可以負責 SSL 加密,以減輕后端服務器的工作負擔。
- 內容壓縮。使用反向代理,您可以壓縮入站和出站數據,使客戶端和后端服務器之間的通信更快。
- A/B 測試。A/B 測試可以在瀏覽器、Web 應用程序或后端層上執行。使用反向代理,您可以實施后端層 A/B 測試并將傳入流量隨機分配到運行不同版本應用程序的服務器。
先決條件
在我們開始之前,您需要:
- 使用 sudo 權限訪問 Linux 服務器。我們將使用 Ubuntu 20.04,但您可以選擇不同的發行版。
- 指向您的服務器 IP 地址的域名,用于配置 SSL 證書。您可以使用每臺服務器免費提供的自定義 Cherry Servers 子域名。
安裝阿帕奇
在本指南中,我們將使用 Apache Web 服務器來創建反向代理的工作概念。Apache 帶有一些方便的擴展模塊,支持反向代理解決方案。
首先,連接到您的服務器并從 APT 存儲庫更新本地包索引:
sudo apt update
現在讓我們apache2從官方 Ubuntu 20.04 存儲庫安裝軟件包:
sudo apt install -y apache2
安裝完成后,您可以通過檢查其版本來驗證 Apache 是否已安裝:
apache2 -version
也可以apache2使用以下命令檢查狀態:
sudo systemctl status apache2
如您所見,apache2 在您安裝后立即處于活動狀態并正在運行。您可以通過請求默認的 Apache 索引頁面來執行抽查以驗證它是否按預期工作。只需在網絡瀏覽器中輸入服務器的 IP 地址,然后按回車鍵:
如果您不知道自己的 IP 地址,請使用以下命令獲取它:
hostname -I
此命令將顯示計算機上可用的所有網絡接口上的所有已配置 IP 地址,包括公共網絡接口的 IP 地址。
為反向代理啟用 Apache 模塊
要將反向代理與 Apache Web Server 一起使用,您需要啟用特定的 Apache 模塊以支持反向代理服務器所需的附加功能。我們的場景需要以下模塊:
- mod_proxy:它是 Apache 的主要代理模塊,用于管理連接和重定向它們。它允許 Apache 充當底層后端服務器的網關。該模塊對于所有反向代理場景都是必需的。
- mod_proxy_http:此模塊依賴于 mod_proxy 并且需要支持對代理服務器的 HTTP 和 HTTPS 請求。
- mod_ssl:該模塊為 Apache HTTP 服務器提供 SSL v3 和 TLS v1.x 協議支持。
現在讓我們使用a2enmod命令啟用這些模塊:
sudo a2emod proxy && sudo a2enmod proxy_http && a2enmod ssl
每次啟用新的 Apache 模塊時,不要忘記重新啟動 apache2 服務器:
sudo systemctl restart apache2
您可以使用以下命令驗證這些模塊是否處于活動狀態:
apache2ctl -M
配置 Apache 反向代理
現在是時候配置 Apache 反向代理以接受來自 Internet 的請求并將它們轉發到您選擇的資源。您可以將反向代理請求轉發到任何您想要的地方,包括其他服務器,但我們將使用本地網絡用于教育目的。
000-default.conf首先,讓我們使用以下命令禁用默認的 Apache 虛擬主機配置文件:
sudo a2dissite 000-default.conf
現在使用以下配置文本cherry.conf在目錄中創建一個新的虛擬主機配置文件:/etc/apache2/sites-available
<VirtualHost *:80> ServerName site1.com ServerAlias www.site1.com ServerAdmin postmaster@site1.com ErrorLog ${APACHE_LOG_DIR}/error.log CustomLog ${APACHE_LOG_DIR}/access.log combined ProxyPass / http://127.0.0.1:8080/ ProxyPassReverse / http://127.0.0.1:8080/ ProxyRequests Off </VirtualHost>
<VirtualHost>我們使用包含 IP 地址和 Apache 為該虛擬主機接受的端口號的命令開始我們的配置文件。在這種情況下使用元字符*,因為所有 IP 地址都被接受,而端口號80代表默認的 HTTP 端口。配置繼續以下項目:
- ServerName:定義與服務器關聯的域名。/etc/hosts如果您想通過關聯的域名訪問您的服務器,您可以通過 DNS 在 Internet 上配置它或通過文件在本地設置它。
- ServerAlias:允許您定義將被服務器接受的其他名稱。
- ServerAdmin:服務器在返回給客戶端的錯誤消息中包含的聯系人電子郵件地址。
- ErrorLog:設置 Apache 用來存儲它遇到的任何錯誤的文件的名稱。
- CustomLog:設置 Apache 用于將客戶端請求記錄到服務器的文件的名稱。
- ProxyPass:將遠程服務器映射到本地服務器的空間。定義流量重定向的目標地址。
- ProxyPassReverse:代理服務器不僅可以接收請求,還可以將響應數據包轉發回客戶端。命令用代理服務器的信息重寫后端服務器的ProxyPassReverse原始location和HTTP 響應標頭。這對于避免繞過反向代理并將后端服務器與 Internet 隔離至關重要。content-locationuri
- ProxyRequests:防止 Apache HTTP 服務器被用作轉發代理并使其更安全。ProxyRequests使用時通常應將該命令設置為關閉ProxyPass。
保存配置文件并使用以下命令啟用新的虛擬主機:
sudo a2ensite cherry.conf
配置完成后,不要忘記重新啟動 apache2 以激活更改:
sudo systemctl restart apache2
配置 Flask 應用程序
您的反向代理配置現已完成,但我們仍然缺少一個將在端口 8080 上偵聽的 Web 應用程序,因為我們的ProxyPass指令將傳入請求轉發到此目的地。
為此,我們可以使用一個簡單的 Flask 應用程序。讓我們先安裝 python3 和 pip 包管理器:
sudo apt install python3 python3-pip
安裝完成后,繼續通過pip安裝Flask:
pip3 install flask
現在我們準備創建一個簡單的 Flask Web 應用程序。讓我們稱之為app.py:
vim app.py
在下面的 Python 代碼中,我們導入 Flask 庫,實例化 Flask 應用程序并在“/”路由上調用 index() 函數:
from flask import Flask app = Flask(__name__) @app.route(“/”) def index(): return “Apache reverse proxy is working!”
將 Python 腳本保存在您的工作目錄中,并將 FLASK_APP 環境變量設置為 app.py,以便 Flask 知道在哪里實例化您的 Web 應用程序:
FLASK_APP=app.py
現在您已準備好運行您的 Flask 應用程序。讓我們通過將標準輸出和標準錯誤輸出重定向到文件來作為后臺作業在端口 8080 上運行它/dev/null以保持我們的終端清潔:
flask run --port=8080 > /dev/null 2 > &1 &
現在打開瀏覽器并嘗試通過標準 HTTP 80 端口連接到您的 IP 地址:
您剛剛向 IP 地址上的端口 80 發送了一個 HTTP GET 請求,并且您的請求已被 Apache 反向代理轉發到端口 8080,您的 Flask 應用程序在此處發回響應。恭喜,您的 Apache 反向代理配置正在運行!
配置 SSL 證書
通常,您希望對您的應用程序流量進行 SSL 加密。您可以使用免費的 Let's Encrypt TLS 證書使用 Apache 反向代理配置 SSL/TLS 加密。
首先,安裝允許您自動頒發和安裝證書的 Certbot ACME 客戶端:
sudo apt install certbot
接下來,為 Certbot 安裝 Apache 插件以簡化安裝過程:
sudo apt install python3-certbot-apache
Let's Encrypt 不會為沒有域名的服務器頒發 TLS 證書。要繼續配置證書,您需要從任何域名提供商處購買域名并將其指向您服務器的 IP 地址。或者,您可以使用自定義 DNS 名稱,該名稱可以在 Cherry Servers 為每臺服務器設置。
為此,請轉到您的客戶端,訪問服務器的網絡選項,然后按管理 IP 上的“編輯地址”按鈕:
您現在可以輸入自定義 DNS 名稱并按更新:
這樣做之后,子域名reverse-proxy.cloud.cherryservers.net將可用于您的服務器。您現在可以使用此子域名而不是 IP 地址來查詢它:
您還應該將此子域名添加到您的 cherry.conf 配置文件中:
<VirtualHost *:80> ServerName cherry.com ServerAlias www.cherry.com reverse-proxy.cloud.cherryservers.net […] </VirtualHost>
現在您可以使用以下命令開始 TLS 證書配置:
sudo certbot --apache
首先,您將被要求輸入您將接收續訂和安全通知的電子郵件地址:
接下來,您需要閱讀并同意 Let's Encrypt 服務條款:
決定您是否愿意接收來自 Let's Encrypt 的新聞和產品更新:
Certbot 將自動從您的 Apache 虛擬主機配置文件中讀取 ServerName 和 ServerAlias 變量。選擇要用于 HTTPS 查詢的正確域名并繼續安裝:
Certbot 現在將為 SSL 連接創建一個新的 Apache 虛擬主機并為您生成證書。
最后,系統會詢問您是否要自動將所有 HTTP 流量重定向到 HTTPS。為了簡單起見,選擇No redirect:
就是這樣——您現在擁有一個功能齊全的 Apache 反向代理,帶有 SSL 加密!您現在可以通過安全的 HTTPS 連接訪問您的 Web 代理服務器:
?專業提示:您可以通過在一行中使用 Certbot 和一些強制參數來進一步簡化 TLS 證書安裝:
sudo certbot --apache --non-interactive --agree-tos -m mantas.levinas@cherryservers.com -d reverse-proxy.cloud.cherryservers.net
如果您想更深入地了解 Certbot 做了什么,請隨時查看新創建的 Apache 虛擬主機:
<IfModule mod_ssl.c> <VirtualHost *:443> ServerName cherry.com ServerAlias www.cherry.com reverse-proxy.cloud.cherryservers.net ServerAdmin mantas.levinas@cherryserers.com ErrorLog ${APACHE_LOG_DIR}/erro.log CustomLog ${APACHE_LOG_DIR}/access.log combined ProxyPass / http://127.0.0.1:8080/ ProxyPassReverse / http://127.0.0.1:8080/ ProxyRequests Off SSLCertificateFile /etc/letsencrypt/live/reverse-proxy.cloud.cherryservers.net/fullchain.pem SSLCertificateKeyFile /etc/letsencrypt/live/reverse-proxy.cloud.cherryservers.net/privkey.pem Include /etc/letsencrypt/options-ssl-apache.conf </VirtualHost> </IfModule>
您可以看到 Apache 檢查您是否有可用的 mod_ssl,如果有,它會使用給定的虛擬主機配置來接受通常為 HTTPS 流量保留的端口 443 上的所有 IP 地址。
虛擬主機幾乎是我們原始配置的副本,cherry.conf但多了三行。它包括對 SSL 證書文件的引用并導入 SSL 配置文件以使用一些必需的 SSL 設置來補充您的虛擬主機配置。
結論
在本文中,我們了解了什么是反向代理及其使用方法。我們還建立了 Apache 反向代理的工作概念,使用 SSL 加密來提供額外的安全層。您可以使用 Apache Web Server 構建更多的反向代理用例,所以請不要猶豫,在Apache 官方文檔頁面上了解更多關于這個基本系統工程概念的信息。