Linux在同一个服务器上运行Apache、Nginx和HAProxy

运行工作结构原理:
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

文章插图
 
实际上,Cloudflare(CDN提供商)还使用SNI标头来确定如何将HTTPS请求路由到原始服务器 。
一、停用Nginx和Apache要在Debian、Ubuntu和centos上停用Nginx,请运行:
sudo systemctl stop nginx停用Debian/Ubuntu上的Apache:
sudo systemctl stop apache2停用CentOS上的Apache:
sudo systemctl stop httpd二、在Nginx中更改监听端口我们需要让Nginx监听127.0.0.1:80 。在/etc/nginx/conf.d/或/etc/nginx/sites-enabled/中打开您的Nginx配置文件,并找到以下命令行 。
listen 80;更改为:
listen 127.0.0.1:80;如果在Nginx服务器上启用了https,则还要查找
listen 443 ssl;更改为:
listen 127.0.0.1:443 ssl;Nginx主配置文件/etc/nginx/nginx.conf可能包括侦听端口80或443的默认虚拟主机,因此您可能也需要编辑此文件 。
重新启动Nginx以使更改生效 。
sudo systemctl restart nginx三、在Apache中更改监听端口我们需要让Apache在127.0.0.2:80上监听 。
Debian / Ubuntu
在Debian和Ubuntu上,编辑/etc/apache2/ports.conf文件 。
sudo nano /etc/apache2/ports.conf更改:
Listen 80Listen 443为:
Listen 127.0.0.2:80Listen 127.0.0.2:443保存并关闭文件 。同时转到/etc/apache2/sites-enabled /目录,编辑虚拟主机文件 。更改:
<VirtualHost *:80>为:
<VirtualHost 127.0.0.2:80>如果有SSL虚拟主机,则也要更改
<VirtualHost *:443>
<VirtualHost 127.0.0.2:443>重启Apache
sudo systemctl restart apache2CentOSCentOS上编辑/etc/httpd/conf/httpd.conf
sudo nano /etc/httpd/conf/httpd.conf找到
Listen 80更改为
Listen 127.0.0.2:80保存并关闭然后转向/etc/httpd/conf.d/ 更改:
<VirtualHost *:80>
<VirtualHost 127.0.0.2:80>SSL更改
<VirtualHost *:443>
<VirtualHost 127.0.0.2:443>在/etc/httpd/conf.d/ssl.conf里找到
Listen 443 https更改为:
Listen 127.0.0.2:443 https保存、关闭并重启服务器:
sudo systemctl restart httpd四、配置HAProxy安装HAProxy
Debian/Ubuntu
sudo apt install haproxyCentOS
sudo dnf install haproxy编辑HAProxy配置文件
sudo nano /etc/haproxy/haproxy.cfg在文件末尾添加以下代码段,这将使HAPorxy侦听公用IP地址的端口80,并将HTTP请求从端口80重定向到端口443 。将12.34.56.78替换为服务器的公用IP地址 。
frontend httpbind 12.34.56.78:80mode httpredirect scheme https code 301SSL
frontend httpsbind 12.34.56.78:443mode tcptcp-request inspect-delay 5stcp-request content accept if { req_ssl_hello_type 1 }然后定义Nginx和Apache后端 。
backend nginxmode tcpoption ssl-hello-chkserver nginx 127.0.0.1:443 checkbackend apachemode tcpoption ssl-hello-chkserver apache 127.0.0.2:443 check您可以恢复默认定义为:
default_backend nginx我们将在HTTPS请求中使用SNI标头重定向到正确的后端 。例如,如果Nginx服务于domain1.com,而Apache服务于domain2.com,则添加以下两行 。
use_backend nginx if { req_ssl_sni -i domain1.com }use_backend apache if { req_ssl_sni -i domain2.com }如果客户端未在TLS客户端Hello中指定服务器名称,则HAproxy将使用默认后端(nginx) 。
保存并关闭文件 。然后重新启动HAproxy 。
sudo systemctl restart haproxy现在,Apache、Nginx和HAProxy可以在同一服务器上运行 。
如何将客户的IP地址转发到后端
默认情况下,Apache和Nginx只能看到HAProxy的IP地址 。要获取客户端的真实IP地址,请确保已在HAProxy的后端定义中添加了“ send-proxy-v2”选项,如下所示 。
server nginx 127.0.0.1:443 send-proxy-v2 checkserver apache 127.0.0.2:443 send-proxy-v2 check我们还需要在Nginx和Apache中添加一些配置 。


推荐阅读