需求
- 一台服务器 + 多个域名,实现根据不同域名分发流量(类似于负载均衡)
- 将同一个域名下的不同子路由分发映射到到不同的端口
方案
问题1的方案是虚拟主机,问题2到方案是反向代理。可以同时实现这样功能的典型软件有Apache httpd、Ngnix等,本例选择Apache(据说Ngnix配置比较友好简单,有机会尝试一下)。
实施过程
一、环境准备,安装Apache
这里会遇到两个问题:版本选择和软件源选择
- Apache2.2和Apache2.4配置项有区别,安装时请注意;
- 软件源有两个选择,一种是手工源码安装官方版本的Apache,略麻烦但是血统纯正,配置起来文档丰富;另一种是直接Yum安装Apache,省事儿但是软件配置文件结构与官方版略有差别,配置起来略有点小坑。
本例选择使用Yum安装Apache2.4版本,步骤:
yum install httpd
设置自启动:
systemctl enable httpd.service
指定两个不同的文档根目录:
- 在/var/www/下新建了
ued/index.html
文件 - 在/var/www/下新建了
doc/index.html
文件
服务器启动一个tomcat,部署一个manage工程,保证能访问到
二、虚拟主机配置
编辑配置vi /etc/httpd/conf
:
<Directory />
AllowOverride none
Require all granted
</Directory>
DocumentRoot "/var/www/ued/"
...
IncludeOptional conf.d/*.conf
Include vhost-conf.d/*.conf
最后一句配置引入了虚拟主机目录下的所有配置,意味着我们自己的配置文件需要放在/etc/httpd/vhost-conf.d/目录下且扩展名为.conf。以下是我的虚拟主机文件/etc/httpd/vhost-conf.d/vhost.conf中的配置:
<VirtualHost *:80>
ServerAdmin jimmy@xxx.com
DocumentRoot "/var/www/ued/"
ServerName ued.xxxxx.net
ServerAlias ued.xxxxx.net
ErrorLog "logs/httpd-error.log"
CustomLog "logs/httpd-custom.log" common
</VirtualHost>
<VirtualHost *:80>
ServerAdmin jimmy@xxx.com
DocumentRoot "/var/www/doc/"
ServerName ued.xxxxx.net
ServerAlias ued.xxxxx.net
ErrorLog "logs/httpd-error.log"
CustomLog "logs/httpd-custom.log" common
</VirtualHost>
至此,虚拟主机配置完毕,问题1解决,可以分别访问两个域名,发现分发到了不通的页面。
三、反向代理配置
编辑vi /etc/httpd/conf
,在最后新增引入proxy模块:
...
# Load config files in the "/etc/httpd/conf.d" directory, if any.
IncludeOptional conf.d/*.conf
Include vhost-conf.d/*.conf
Include conf.modules.d/00-proxy.conf
在/etc/httpd/vhost-conf.d/vhost.conf
中的增加配置:
<VirtualHost *:80>
ServerAdmin jimmy@xxx.com
DocumentRoot "/var/www/ued/"
ServerName ued.xxxxx.net
ServerAlias ued.xxxxx.net
ErrorLog "logs/httpd-error.log"
CustomLog "logs/httpd-custom.log" common
#关闭正向代理
ProxyRequests off
#反向代理
ProxyPass /manage/ http://localhost:8080/manage/
ProxyPassReverse /manage/ http://localhost:8080/manage/
</VirtualHost>
<VirtualHost *:80>
ServerAdmin jimmy@xxx.com
DocumentRoot "/var/www/doc/"
ServerName ued.xxxxx.net
ServerAlias ued.xxxxx.net
ErrorLog "logs/httpd-error.log"
CustomLog "logs/httpd-custom.log" common
</VirtualHost>
至此,配置完毕。敲url:ued.xxxxx.net/manage
应该被转到ip:8080/manage的页面。此时遇到了问题:
Apache ProxyPass 出现503 Service Temporarily Unavailable
查看httpd-error.log日志:
[Sat Sep 23 14:23:07.844492 2017] [proxy:error] [pid 4174] (13)Permission denied: AH00957: HTTP: attempt to connect to 10.xxx.xxx.21:8080 (10.xxx.xxx.21) failed
[Sat Sep 23 14:23:07.844573 2017] [proxy:error] [pid 4174] AH00959: ap_proxy_connect_backend disabling worker for (10.xxx.xxx.21) for 60s
[Sat Sep 23 14:23:07.844586 2017] [proxy_http:error] [pid 4174] [client 10.xxx.xxx.219:38312] AH01114: HTTP: failed to make connection to backend: 10.xxx.xxx.21
经查资料,此现象怀疑是SELinux问题,解决方案,关闭SELinux:
setenforce 0
再次验证,OK!
参考资料
- Apache ProxyPass 出现503 Service Temporarily Unavailable 的解决方案
http://babyhe.blog.51cto.com/1104064/636602 - CentOS7上部署Httpd+Tomcat遇到的问题
http://blog.csdn.net/yin138/article/details/68496943 - CentOS7 yum安装Apache(httpd)并实现多域名配置
http://blog.csdn.net/qq_36731677/article/details/59120589