前言:由於項目部署的的環境是內外網隔離的模式,把網絡分成內網和外網兩部分。cas服務器及客戶端部署在內網,通過端口映射的方式把服務端口向外網開放,外網用戶只能通過外網IP訪問客戶端。因此會存在一個問題,我們的客戶端配置casServer地址及回調的url使用的是內網的。用戶通過外網ip訪問後,跳轉的cas登錄地址爲內網的地址,因此是訪問失敗的。而如果配置成外網ip的話,通過內網ip訪問也是失敗的,瀏覽器顯示的是外網的地址。
我們的需求是,通過外網ip訪問的客戶端業務系統,重定向到外網的cas服務器,登錄後跳轉回來外網ip的業務系統,內網同樣的需求。查閱資料發現,通過改源碼去動態根據訪問ip修改cas服務器的地址及客戶端回調地址的方法,一是費時且找不到可用資料,二是業務系統太多,改了一套其它都得改,造成大面積的客戶端業務系統更新,三是部分業務系統不是自己公司開發的,需要協調第三方去修改。因此採用通過反向代理方式處理cas單點登錄內外網雙ip訪問的問題。實踐證明,只需要短短半小時便解決問題。
一、通過apache進行反向代理
1.下載apache的安裝包及apr的安裝包
官網下載Apache的源碼包,http://httpd.apache.org/
這裏下載的版本是:httpd-2.4.41.tar.gz
到http://apr.apache.org/下載APR源碼包和APR-util源碼包
這裏下載的版本分別是:apr-1.6.5.tar.gz、apr-util-1.6.1.tar.gz
把httpd-2.4.41.tar.gz、apr-1.6.5.tar.gz、apr-util-1.6.1.tar.gz上傳到/opt/tools目錄下
2.解壓apr及apr-util源碼包
# cd /opt/tools
# tar -zxvf httpd-2.4.41.tar.gz
# tar -zxvf apr-1.6.5.tar.gz
# tar -zxvf apr-util-1.6.1.tar.gz
3.安裝相關組件
# yum -y install gcc gcc-c++ make
# yum -y install expat-devel
# yum -y install pcre-devel
# yum -y install mod_ssl openssl-devel
# yum -y install libtool-ltdl-devel
4.安裝apr
# cd /opt/tools/apr-1.6.5
# ./configure --prefix=/usr/local/apr
# make
# make install
5.安裝apr-util
# cd /opt/tools/apr-util-1.6.1
# ./configure --prefix=/usr/local/apr-util --with-apr=/usr/local/apr
# make
# make install
6.安裝httpd
# cd /opt/tools/httpd-2.4.41
# ./configure --prefix=/opt/app/apache24 --enable-so --enable-ssl --enable-rewrite --enable-cgi --enable-cgid --enable-modules=most --enable-mods-shared=most --with-apr=/usr/local/apr --with-apr-util=/usr/local/apr-util
# make
# make install
7.啓動命令
爲了方便以後使用apache可以將執行路徑添加的PATH中,這樣下次執行命令時,就不需要使用路徑
# echo PATH=$PATH:/opt/app/apache24/bin/apachectl >> /etc/profile
# source /etc/profile
啓動:
# apachectl start
停止:
# apachectl stop
重啓:
# apachectl restart
8.修改httpd.conf配置文件
# vi /opt/app/apache24/conf/httpd.conf
把#ServerName www.example.com:80前面的#號去掉,並把www.example.com修改爲內網ip加端口,保存退出
重啓apache
# apachectl restart
9.配置反向代理
# vi /opt/app/apache24/conf/httpd.conf
在httpd.conf中把下三行配置放開(前面的#號去掉)
LoadModule proxy_module modules/mod_proxy.so
LoadModule proxy_http_module modules/mod_proxy_http.so
Include conf/extra/httpd-vhosts.conf
10.在conf/extra/httpd-vhosts.conf中配置虛擬主機(反向代理)
# vi /opt/app/apache24/conf/extra/httpd-vhosts.conf
在文件末尾添加以下配置:
# 外網地址
<VirtualHost *:8080>
ServerName 192.168.4.120
ServerAlias 192.168.4.120
ErrorLog "logs/error_log"
CustomLog "logs/access_log" common
# 關閉正向代理
ProxyRequests Off
# 反向代理時不保留原始Request中的HOST(即代理服務器自身Host)
ProxyPreserveHost Off
## 把服務器響應中的內網IP地址改成外網地址
Substitute "s|127.0.0.1:8083/dognet|192.168.4.120/dognet|n"
Substitute "s|127.0.0.1:8443/cas|192.168.4.120/cas|n"
Substitute "s|127.0.0.1:8081/ywjk|192.168.4.120/ywjk|n"
# SSO反向代理
ProxyPass /cas http://127.0.0.1:8443/cas
ProxyPassReverse /cas http://127.0.0.1:8443/cas
# Web應用反向代理
ProxyPass /dognet http://127.0.0.1:8083/dognet
ProxyPassReverse /dognet http://127.0.0.1:8083/dognet
# Web應用反向代理
ProxyPass /ywjk http://127.0.0.1:8081/ywjk
ProxyPassReverse /ywjk http://127.0.0.1:8081/ywjk
</VirtualHost>
11.重啓apache
# apachectl restart
12.springboot客戶端配置的是內網的cas服務器地址及客戶端地址
#cas配置
cas:
client-name: ywjk
#測試工作機地址
server:
url: http://127.0.0.1:8443/cas
#本機ip地址
project:
url: http://127.0.0.1:8081/ywjk/
13.測試
通過訪問192.168.4.120:8080/ywjk時,重定向到http://192.168.4.120:8080/cas/login?service=http%3A%2F%2F127.0.0.1%3A8081%2Fywjk%2F%2Fcallback%3Fclient_name%3Dywjk,登錄後跳轉回192.168.4.120:8080/ywjk。而通過127.0.0.1:8080/ywjk訪問時,重定向到http://127.0.0.1:8080/cas/login?service=http%3A%2F%2F127.0.0.1%3A8081%2Fywjk%2F%2Fcallback%3Fclient_name%3Dywjk,登錄後跳轉回127.0.0.1:8080/ywjk。至此,內外網雙ip問題得以解決。