【linux】apache反向代理http/https配置实例

  • 需求场景

    近日,博主遇到一个市场的客户提出如下需求:

    1. 市场平台是一个独立的服务群网络;说要部署三个web,一个门户、一个后台、一个商城;
    2. web需要使用三个子域名,如用我的域名为例:www.oxblog.cn是门户、admin.oxblog.cn是后台、shop.oxblog.cn是商城;
    3. 且三个web也就是域名要指向同一个公网ip,做备案;内网三个web分别部署在三台服务器上;其中商城web还需使用https;
    思考归纳

    由于客户域名是在阿里万网购买的域名,想着使用万网dns解析中的隐形url转发功能;因为客户要求域名url不能改变的;但url转发功能显然是不行的,因为客户只有一个ip,且url转发记录值也必须是阿里的并备案的域名,其原理也是用的iframe嵌套的方式,最终是不可采取的;

    最终敲定:在内网找一台服务器专门做反向代理服务使用;(基于域名主机记录、公司大神指导下)

♠具体操作♠

①、服务器环境规划:

三台web都在一个子网:192.168.1.0/24、网关:192.168.1.1

门户web:192.168.1.2——端口:80、oxblog.cn、www.oxblog.cn

后台web:192.168.1.3——端口:80、admin.oxblog.cn

商城web:192.168.1.4——端口:8443(自定义)、shop.oxblog.cn

代理web:192.168.1.5、域名oxblog.cn备案使用公网ip:124.124.124.124

其中商城web需要https支持,并http访问自动转发到https页面

四台服务器操作系统均为:Linux-Redhat-6.6

②、web网络规划:

会员和客户访问web要求直接通过三个域名,如此三个域名备案和dns解析都要指向:124.124.124.124

在网络外层防火墙开启124.124.124.124的http和https端口即:80、443

124.124.124.124开放的端口通过dnat方式需对应到代理服务器内网ip192.168.1.5的http和https端口上

其次便是通过配置反向代理,通过域名虚拟主机记录分别指向三个web的内网ip的web端口

如此当客户和会员访问域名时,则解析都直接访问124.124.124.124的80和443端口

然后dnat指向访问代理web192.168.1.5的80和443端口

然后代理web通过虚拟主机三级域名主机记录也就是主机头配置分别向对应的web请求数据

三个web接到请求后,响应数据到代理服务器,代理web在响应数据反馈到客户和会员浏览页面

注意

这里开放外网端口必须是默认的80和443,对应内网代理服务器的端口可自定义;

③、网络配置忽略,反向代理配置如下:

首先正确安装安装apache服务,可以使用yum简单安装即可;

然后找到httpd.conf配置文件打开并编辑它:

!--首先找到NameVirtualHost参数并作如下修改--!

Listen *:80
NameVirtualHost *:80
NamevirtualHost *:443

!--配置VirtualHost反向代理配置--!

<VirtualHost *:80>
 ServerName www.oxblog.cn
 ProxyRequests off
 ProxyPass / http://192.168.1.2/
 ProxyPassReverse / http://192.168.1.2/
</VirtualHost>
<VirtualHost *:80>
 ServerName admin.oxblog.cn
 ProxyRequests off
 ProxyPass / http://192.168.1.3/
 ProxyPassReverse / http://192.168.1.3/
</VirtualHost>
<VirtualHost *:80>
 ServerName shop.oxblog.cn
 RewriteEngine on
 RewriteLogLevel 3
 RewriteLog /tmp/a.log
 RewriteRule ^/(.*)$ https://shop.oxblog.cn/$1 [R=301]
</VirtualHost>
特别注意

可以看到,这里virtualhost配置分为三部分,前两段没什么说,就是正常反向代理配置,意思是说当别人访问本web时,根据判断域名主机头来分配分别向各自对应的真实web请求响应数据;

最后一段,即商城web,怎么不一样呢?前面我们说shop要求是做成https请求的,但是正常情况下,大家访问网站输入域名url时很少自己带上https头的,而是输入shop.oxblog.cn,这其实是通过80端口的http的请求;那么为了让大家无论是http还是https,最终都要达到通过https的443端口访问,所以这里,配置一个301重定向,也就是当我们访问http://shop.oxblog.cn时,自动转发到https://shop.oxblog.cn;然后才是正常的https请求,当然我们任然需要配置它的反向代理如下;

!--配置shop站点基于443端口的https的反向代理配置,我们需要在ssl的专用配置文件中配置--!

!--当然需要在httpd.conf引用这个文件,这里博主是配置在conf/extra/httpd-ssl.conf文件中的--!

Include conf/extra/httpd-ssl.conf
Listen *:443
<VirtualHost *:443>
ServerName shop.oxblog.cn
ProxyRequests off
ProxyPass / https://192.168.1.4:8443/
ProxyPassReverse / https://192.168.1.4:8443/
SSLProtocol all -SSLv2 -SSLv3
SSLEngine on
SSLProxyEngine on
SSLCipherSuite ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA:ECDHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-RSA-AES256-SHA256:DHE-RSA-AES256-SHA:ECDHE-ECDSA-DES-CBC3-SHA:ECDHE-RSA-DES-CBC3-SHA:EDH-RSA-DES-CBC3-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:DES-CBC3-SHA:!DSS
SSLCertificateFile "/etc/httpd/conf/server.crt"
#SSLCertificateChainFile /etc/httpd/conf/ca.crt
SSLCertificateKeyFile "/etc/httpd/conf/server.key"
</VirtualHost>
特别注意

有没有注意到这里重定向https:192.168.1.4后面加上了端口8443,这是因为我们的真实服务是部署监听在1.4的8443端口上,如果不加默认是443端口;

此外,如果既然我们使用https,自然要做相关ssl的操作,启用并配置它;

④、启用并配置ssl、及CA证书申请:

首先我们使用ssl,则需要有openssl的支持,直接yum安装再好不过了!

当然如果是源码安装,在安装apache的时候,编译时需要添加ssl模块,或后期动态编译;

#./configure --prefix=/apache/httpd --enable-ssl=static --with-ssl=/usr/local/ssl
/bin/apxs -a -i -c -L/usr/lib/openssl/engines/lib -c *.c -lcrypto -lssl -ldl

!--首先我们要生成ssl密钥,即我们说的私钥文件--!

openssl genrsa -des3 1024  > server.key

!--从密钥中删除密码(方便之后每次重启web不用每次都输入口令)--!

openssl rsa -in  server.key >  server2.key && mv server2.key server.key

!--创建服务器密钥用来请求证书的未签署的csr文件,按提示输入一些参数--!

openssl req -new -key server.key -out server.csr

!--通过本地服务器签署csr生成crt证书文件--!

openssl x509 -in server.csr -out server.crt -req -signkey server.key -days 365
用openssl x509 -noout -text -in server.crt可以查看证书的内容。证书实际上包含了Public Key. 

!--在apache配置文件中引用ssl配置文件并启用ssl模块,httpd.conf--!

LoadModule ssl_module modules/mod_ssl.so
Include conf/extra/httpd-ssl.conf  ##去掉此行注释

!--最后可以查看上面https反向代理的配置--!

SSLEngine on
SSLProxyEngine on
SSLCertificateFile "/etc/httpd/conf/server.crt"
SSLCertificateKeyFile "/etc/httpd/conf/server.key"
#SSLCertificateChainFile /etc/httpd/conf/cabundle.crt

其中上面两行,是分别开启ssl和ssl反向代理功能;再下面两行分别是指定ssl的证书和私钥文件,即上面生成的文件;
最后一行是一种中继证书链,这是当购买证书是三级证书的时候,需要其证书追溯到起始证书机构上,一般注释不使用即可;

特比注意

当然生产环境中,我们不可能使用本地服务器签署证书,这样主流浏览器不会信任,从而发出不信任警告,页面很不友好;所以我们要从专业的CA证书机构购买证书才行,当然也有免费的,方法就是用上方生成的csr文件上传给CA机柜,签署正规可信用的证书给你;

最后不要忘记重启web服务并试验一把哦:service httpd -k restart

⑤、本次生产环境中反向代理后期顾虑和方案:

采用反向代理其实很简单,但工作中还要满足客户的各种需求并提出相应方案;

反向代理,一台专用服务器,意思就是,所有链接都经过它来做转发,压力山大;

一台服务器一般只有一个ip,一个ip的进程数是有限制的,三个web一起局限性压力山大;

如此,我们是否可以给代理服务器配置多个ip监听服务?

我们需要配置负载均衡吗?如何配置?

真实服务器不变,代理服务器增加数台,并给代理服务器做负载均衡?

代理服务器数量不变,配置多个监听ip?但是其外网ip只有一个,还是要做负载均衡;

真实服务器每个web服务,都有多台?同一个web服务反向代理是否可以配置多个?配置之后,如果web是需要会话保持的,而不是静态页面,会不会有问题呢?

如此同一个web服务多台服务器,配置负载均衡虚拟成一个是否也可以!

友情思考

我们回到最开始的初衷,事实上客户是有很多公网ip的,但由于是金融平台,为了应付检查,备案只用了一个公网ip;因此我们做了反向代理,满足这种硬性需求;客户也不叫在意资源的利用,也不能因此浪费更多的资源;而当客户提出要求,你要满足的同时,客户又要你提供后期的风险方案,你会总么做?期待您的奇思妙想、思维碰撞!

(哈哈,就这么多了,不明白记得留言哦!)

Edit@bigmouth【原创博文】®【经验汇总】


原创文章,转载请注明:转自于公牛博客

本文链接地址:【linux】apache反向代理http/https配置实例

标签:
9
祝福我们的祖国繁荣昌盛
  • 请尽情挥洒您的笔墨!

    欢迎来到公牛博客更多分享更多精彩记录美丽点亮生活

    公牛博客·统计碑运行:3057 D
    博文:215 P
    评论:452 S