運行工作結構原理:
Nginx監聽127.0.0.1:80和127.0.0.1:443
Apache監聽127.0.0.2:80和127.0.0.2:443
HAProxy偵聽公用IP地址的端口80和443。 它將HTTP請求從端口80重定向到端口443。當請求到達端口443時,它將通過分析HTTPS請求中的SNI標頭在Nginx和Apache後端之間進行選擇。
![Linux在同一個服務器上運行Apache、Nginx和HAProxy](http://p2.ttnews.xyz/loading.gif)
實際上,Cloudflare(CDN提供商)還使用SNI標頭來確定如何將HTTPS請求路由到原始服務器。
![Linux在同一個服務器上運行Apache、Nginx和HAProxy](http://p2.ttnews.xyz/loading.gif)
一、停用Nginx和Apache
要在Debian、Ubuntu和CentOS上停用Nginx,請運行:
<code>sudo systemctl stop nginx/<code>
停用Debian/Ubuntu上的Apache:
<code>sudo systemctl stop apache2/<code>
停用CentOS上的Apache:
<code>sudo systemctl stop httpd/<code>
二、在Nginx中更改監聽端口
我們需要讓Nginx監聽127.0.0.1:80。 在/etc/nginx/conf.d/或/etc/nginx/sites-enabled/中打開您的Nginx配置文件,並找到以下命令行。
<code>listen 80;/<code>
更改為:
<code>listen 127.0.0.1:80;/<code>
如果在Nginx服務器上啟用了https,則還要查找
<code>listen 443 ssl;/<code>
更改為:
<code>listen 127.0.0.1:443 ssl;/<code>
Nginx主配置文件/etc/nginx/nginx.conf可能包括偵聽端口80或443的默認虛擬主機,因此您可能也需要編輯此文件。
重新啟動Nginx以使更改生效。
<code>sudo systemctl restart nginx/<code>
三、在Apache中更改監聽端口
我們需要讓Apache在127.0.0.2:80上監聽。
Debian / Ubuntu
在Debian和Ubuntu上,編輯/etc/apache2/ports.conf文件。
<code>sudo nano /etc/apache2/ports.conf/<code>
更改:
<code>Listen 80
Listen 443/<code>
為:
<code>Listen 127.0.0.2:80
Listen 127.0.0.2:443/<code>
保存並關閉文件。 同時轉到/etc/apache2/sites-enabled /目錄,編輯虛擬主機文件。 更改:
<code><virtualhost>/<code>
為:
<code><virtualhost>/<code>
如果有SSL虛擬主機,則也要更改
<code><virtualhost>/<code>
為
<code><virtualhost>/<code>
重啟Apache
<code>sudo systemctl restart apache2/<code>
CentOS
CentOS上編輯/etc/httpd/conf/httpd.conf
<code>sudo nano /etc/httpd/conf/httpd.conf/<code>
找到
<code>Listen 80/<code>
更改為
<code>Listen 127.0.0.2:80/<code>
保存並關閉然後轉向/etc/httpd/conf.d/ 更改:
<code><virtualhost>/<code>
為
<code><virtualhost>/<code>
SSL更改
<code><virtualhost>/<code>
為
<code><virtualhost>/<code>
在/etc/httpd/conf.d/ssl.conf裡找到
<code>Listen 443 https/<code>
更改為:
<code>Listen 127.0.0.2:443 https/<code>
保存、關閉並重啟服務器:
<code>sudo systemctl restart httpd/<code>
四、配置HAProxy
安裝HAProxy
Debian/Ubuntu
<code>sudo apt install haproxy/<code>
CentOS
<code>sudo dnf install haproxy/<code>
<code>sudo nano /etc/haproxy/haproxy.cfg/<code>
在文件末尾添加以下代碼段,這將使HAPorxy偵聽公用IP地址的端口80,並將HTTP請求從端口80重定向到端口443。將12.34.56.78替換為服務器的公用IP地址。
<code>frontend http
bind 12.34.56.78:80
mode http
redirect scheme https code 301/<code>
SSL
<code>frontend https
bind 12.34.56.78:443
mode tcp
tcp-request inspect-delay 5s
tcp-request content accept if { req_ssl_hello_type 1 }/<code>
然後定義Nginx和Apache後端。
<code>backend nginx
mode tcp
option ssl-hello-chk
server nginx 127.0.0.1:443 check
backend apache
mode tcp
option ssl-hello-chk
server apache 127.0.0.2:443 check/<code>
您可以恢復默認定義為:
<code>default_backend nginx/<code>
我們將在HTTPS請求中使用SNI標頭重定向到正確的後端。 例如,如果Nginx服務於domain1.com,而Apache服務於domain2.com,則添加以下兩行。
<code>use_backend nginx if { req_ssl_sni -i domain1.com }
use_backend apache if { req_ssl_sni -i domain2.com }
/<code>
如果客戶端未在TLS客戶端Hello中指定服務器名稱,則HAproxy將使用默認後端(nginx)。
保存並關閉文件。 然後重新啟動HAproxy。
<code>sudo systemctl restart haproxy/<code>
現在,Apache、Nginx和HAProxy可以在同一服務器上運行。
如何將客戶的IP地址轉發到後端
默認情況下,Apache和Nginx只能看到HAProxy的IP地址。 要獲取客戶端的真實IP地址,請確保已在HAProxy的後端定義中添加了“ send-proxy-v2”選項,如下所示。
<code>server nginx 127.0.0.1:443 send-proxy-v2 check
server apache 127.0.0.2:443 send-proxy-v2 check/<code>
我們還需要在Nginx和Apache中添加一些配置。
Nginx
如下所示,在Nginx監聽指令中添加proxy_protocol。
<code>listen 127.0.0.2:443 ssl http2 proxy_protocol;/<code>
然後在Nginx http {}塊中添加以下兩個指令。
<code>set_real_ip_from 127.0.0.1;
real_ip_header proxy_protocol;/<code>
保存關閉然後重啟Nginx.
<code>sudo systemctl reload nginx/<code>
Apache
如果您在Debian / Ubuntu上使用Apache,則需要啟用遠程模塊。 (默認情況下,此模塊已在CentOS上啟用。)
<code>sudo a2enmod remoteip/<code>
然後在Apache虛擬主機配置文件中添加以下3行。
<code>RemoteIPProxyProtocol On
RemoteIPHeader X-Forwarded-For
RemoteIPTrustedProxy 127.0.0.1/<code>
有如:
<code><virtualhost>
ServerName www.example.com
RemoteIPProxyProtocol On
RemoteIPHeader X-Forwarded-For
RemoteIPTrustedProxy 127.0.0.1
/<virtualhost>/<code>
保存並關閉文件。 然後我們還需要更改組合日誌格式。 編輯Apache主配置文件。
<code>sudo nano /etc/apache2/apache2.conf/<code>
或者
<code>sudo nano /etc/httpd/conf/httpd.conf/<code>
找到以下信息:
<code>LogFormat "%h %l %u %t \"%r\" %>s %O \"%{Referer}i\" \"%{User-Agent}i\"" combined/<code>
更換為:
<code>LogFormat "%a %l %u %t \"%r\" %>s %O \"%{Referer}i\" \"%{User-Agent}i\"" combined/<code>
保存並關閉文件。 然後重新啟動Apache,以使更改生效。
<code>sudo systemctl restart apache2/<code>
或者
<code>sudo systemctl restart httpd/<code>
請注意,RemoteIPProxyProtocolOn指令僅在Apache 2.4.31及更高版本中可用。 要檢查您的Apache版本,請運行
<code>sudo apache2 -v/<code>
或者
<code>sudo httpd -v/<code>
Ubuntu 18.04隨Apache 2.4.29一起提供。 如果您的Apache版本不符合此要求,則應刪除HAProxy後端定義中的send-proxy-v2。 CentOS 8附帶了Apache 2.4.37。
最後,重新啟動HAProxy。
<code>sudo systemctl restart haproxy/<code>
閱讀更多 多青科技 的文章