apache作反向代理

實驗目的html

經過apache實現反向代理的功能,相似nginx反向代理和haproxy反向代理前端

 

環境準備


 

邏輯架構以下node

前端是apche服務器,監聽80端口,後端有兩臺web服務器,分別是node1和node2linux

準備兩臺機器,node1和node2。須要安裝的服務以下,因爲實驗環境資源有限,把反向代理也安裝在node1上nginx

 

實驗系統版本c++

[root@linux-node1 ~]# cat /etc/redhat-release 
CentOS Linux release 7.3.1611 (Core) 
[root@linux-node1 ~]# uname -rm
3.10.0-514.el7.x86_64 x86_64
[root@linux-node1 ~]# 

 

 

配置兩臺節點作web服務器,監聽8080端口


 

關閉firewalld和selinux,主機名更名。按上面表格更改。這裏就不寫具體執行步驟了 web

兩臺機器安裝epel7的阿里雲的源,安裝一些依賴包和經常使用工具包,安裝httpd,更改默認監聽端口爲8080算法

rpm -ivh  http://mirrors.aliyun.com/epel/epel-release-latest-7.noarch.rpm
yum install -y gcc glibc gcc-c++  make screen tree lrzsz
yum install httpd -y
sed -i 's#Listen 80#Listen 8080#g' /etc/httpd/conf/httpd.conf
systemctl restart httpd.service
netstat -lntp | grep 8080

 

分別設置首頁文件。用以區分不一樣的機器apache

echo "linux-node2.example.com" > /var/www/html/index.html
echo "linux-node1.example.com" > /var/www/html/index.html
 
最終達到以下效果
[root@linux-node2 ~]# curl http://10.0.1.106:8080/
linux-node2.example.com
[root@linux-node2 ~]#  
[root@linux-node1 ~]# curl http://10.0.1.105:8080/
linux-node1.example.com
[root@linux-node1 ~]# 

 

 

node1上配置apache作反向代理


 

編譯安裝apache軟件包vim

node1同時作反向代理配置,執行以下命令,把源碼包編譯安裝在/usr/local目錄下,最後作個軟連接。

看到須要安裝apr和pcre相關的包

簡要來講apr是屏蔽底層操做系統細節用的。pcre正則匹配用的。openssl支持加密協議

rpm -ivh  http://mirrors.aliyun.com/epel/epel-release-latest-7.noarch.rpm
yum install -y gcc glibc gcc-c++  make screen tree lrzsz
yum install -y apr-devel apr-util-devel pcre-devel openssl-devel
cd /usr/local/src
wget http://archive.apache.org/dist/httpd/httpd-2.4.18.tar.gz
tar xfz httpd-2.4.18.tar.gz
cd httpd-2.4.18
./configure --prefix=/usr/local/httpd-2.4.18 --enable-so --enable-modules="all"
make && make install
echo $?
ln -s /usr/local/httpd-2.4.18/ /usr/local/httpd

APR(Apache portable Run-time libraries,Apache可移植運行庫),主要爲上層的應用程序提供一個能夠跨越多操做系統平臺使用的底層支持接口庫。
在早期 的Apache版本中,應用程序自己必須可以處理各類具體操做系統平臺的細節,並針對不一樣的平臺調用不一樣的處理函數。

那安裝Apache的時候爲何必須安裝Apr呢?
在早期的Apache版本中,應用程序自己必須可以處理各類具體操做系統平臺的細節,並針對不一樣的平臺調用不一樣的處理函數。
隨着Apache的進一步開發,Apache組織決定將這些通用的函數獨立出來並發展成爲一個新的項目。這樣,APR的開發就從Apache中獨立出來,Apache僅僅是使用APR而已。
通常狀況下,APR開發包很容易理解爲僅僅是一個開發包,不過事實上並非。
目前,完整的APR實際上包含了三個開發包:apr、apr-util以及apr-iconv,每個開發包分別獨立開發,並擁有本身的版本。
apr中包含了一些通用的開發組件,包括mmap,DSO等等
apr-util該目錄中也是包含了一些經常使用的開發組件。這些組件與apr目錄下的相比,它們與apache的關係更加密切一些。好比存儲段和存儲段組,加密等等。
apr-iconv包中的文件主要用於實現iconv編碼。目前的大部分編碼轉換過程都是與本地編碼相關的。在進行轉換以前必須可以正確地設置本地編碼。
所以假如兩個非本地編碼A和B須要轉換,則轉換過程大體爲A->Local以及Local->B或者B->Local以及Local->A。

 

node1上apache編譯安裝以後,檢查語法以及啓動服務 

[root@linux-node1 httpd-2.4.18]# /usr/local/httpd/bin/apachectl -t
Syntax OK
[root@linux-node1 httpd-2.4.18]# /usr/local/httpd/bin/apachectl -k start
[root@linux-node1 httpd-2.4.18]# 

  

接下來配置反向代理模塊

打開apache官網幫助

找到左邊「模塊」

 

 點擊進去,找到以下mod_proxy,就是這個模塊,讓apache能夠作反向代理

 

 接下配準備配置,先查看下配置文件的目錄。看到有個extra目錄,相似nginx的extra目錄,能夠把一些定製化的配置放在extra目錄裏,而後在主配置文件httpd.conf把它include進來

這樣下降配置文件之間的耦合性,不只方便管理,並且配置文件個別錯誤,不影響其他配置。這裏就準備新建一個反向代理相關的配置文件,放在extra目錄下

先從主配置文件拷貝一些模板性的配置

 

設置主配置文件ServerName

[root@linux-node1 conf]# pwd
/usr/local/httpd/conf
[root@linux-node1 conf]# vim httpd.conf 
[root@linux-node1 conf]# grep ServerName httpd.conf 
# ServerName gives the name and port that the server uses to identify itself.
ServerName linux-node1.example.com:80
[root@linux-node1 conf]# 

apache和nginx同樣,默認會Include一些配置文件,下面的proxy-html.conf就是默認加載的配置文件。我沒作任何操做,安裝以後系統默認的

查看它默認加載的模塊
 
 
找到負載均衡的部分,不少proxy開頭的部分。複製相關參數

 

在extra目錄下新建httpd-proxy.conf文件。文件名沒要求,能夠自定義。可是最好能經過配置文件知道作什麼用的

把上面主配置文件的反向代理和負載均衡相關的配置複製進來。

同時配置後端節點。下面的/demo 是自定義的。能夠隨便寫,好比寫成/test123

[root@linux-node1 extra]# pwd
/usr/local/httpd/conf/extra
[root@linux-node1 extra]# cat httpd-proxy.conf 
#www.linux-node1.example.com  
#proxy demo
LoadModule proxy_module modules/mod_proxy.so
LoadModule proxy_connect_module modules/mod_proxy_connect.so
LoadModule proxy_http_module modules/mod_proxy_http.so
LoadModule proxy_balancer_module modules/mod_proxy_balancer.so
LoadModule lbmethod_byrequests_module modules/mod_lbmethod_byrequests.so
LoadModule lbmethod_bytraffic_module modules/mod_lbmethod_bytraffic.so
LoadModule lbmethod_bybusyness_module modules/mod_lbmethod_bybusyness.so
ProxyRequests Off
<Proxy balancer://mycluster>
BalancerMember http://10.0.1.105:8080
BalancerMember http://10.0.1.106:8080
</Proxy>
ProxyPass /demo balancer://mycluster
ProxyPassReverse /demo balancer://mycluster
[root@linux-node1 extra]# 

  

 

在主配置文件把這個配置文件中Include進來

 

 

檢查語法,沒發現語法錯誤
[root@linux-node1 extra]# /usr/local/httpd/bin/apachectl -t
Syntax OK
[root@linux-node1 extra]# 

  

啓動時沒啓動成功
[root@linux-node1 extra]# /usr/local/httpd/bin/apachectl -k restart
[root@linux-node1 extra]# netstat -lntp | grep 80
[root@linux-node1 extra]# /usr/local/httpd/bin/apachectl -t
Syntax OK
[root@linux-node1 extra]# /usr/local/httpd/bin/apachectl -k restart
httpd not running, trying to start
[root@linux-node1 extra]# netstat -lntp | grep 80
[root@linux-node1 extra]# 

  

 

看日誌提示,是缺乏模塊
[root@linux-node1 logs]# pwd
/usr/local/httpd/logs
[root@linux-node1 logs]# 

[root@linux-node1 logs]# tail -f error_log 
[Sun Feb 26 23:00:09.288503 2017] [mpm_worker:notice] [pid 19856:tid 139866031015808] AH00292: Apache/2.4.18 (Unix) configured -- resuming normal operations
[Sun Feb 26 23:00:09.288632 2017] [core:notice] [pid 19856:tid 139866031015808] AH00094: Command line: '/usr/local/httpd-2.4.18/bin/httpd'
[Sun Feb 26 23:48:31.206384 2017] [mpm_worker:notice] [pid 19856:tid 139866031015808] AH00298: SIGHUP received.  Attempting to restart
[Sun Feb 26 23:48:31.210297 2017] [proxy_balancer:emerg] [pid 19856:tid 139866031015808] AH01177: Failed to lookup provider 'shm' for 'slotmem': is mod_slotmem_shm loaded??
[Sun Feb 26 23:48:31.210351 2017] [:emerg] [pid 19856:tid 139866031015808] AH00020: Configuration Failed, exiting
[Sun Feb 26 23:50:12.882611 2017] [proxy_balancer:emerg] [pid 20021:tid 139920264771456] AH01177: Failed to lookup provider 'shm' for 'slotmem': is mod_slotmem_shm loaded??
[Sun Feb 26 23:50:12.882703 2017] [:emerg] [pid 20021:tid 139920264771456] AH00020: Configuration Failed, exiting

  

 百度下錯誤

若是你遇到了服務沒法啓動的狀況,也不報錯的,查看logs下的日誌,首次安裝報錯以下:
AH01177: Failed to lookup provider 'shm' for 'slotmem': is mod_slotmem_shm loaded??
我想日誌已經說的很清楚了,這裏編譯安裝後,配置文件conf/httpd.conf沒有開啓mod_slotmem_shm模塊,編輯該文件,放開
LoadModule slotmem_shm_module modules/mod_slotmem_shm.so
 
在httpd-proxy.conf配置文件中添加這一行
[root@linux-node1 extra]# cat httpd-proxy.conf 
#www.linux-node1.example.com  
#proxy demo
LoadModule proxy_module modules/mod_proxy.so
LoadModule proxy_connect_module modules/mod_proxy_connect.so
LoadModule proxy_http_module modules/mod_proxy_http.so
LoadModule proxy_balancer_module modules/mod_proxy_balancer.so
LoadModule lbmethod_byrequests_module modules/mod_lbmethod_byrequests.so
LoadModule lbmethod_bytraffic_module modules/mod_lbmethod_bytraffic.so
LoadModule lbmethod_bybusyness_module modules/mod_lbmethod_bybusyness.so
LoadModule slotmem_shm_module modules/mod_slotmem_shm.so
ProxyRequests Off
<Proxy balancer://mycluster>
BalancerMember http://192.168.1.105:8080
BalancerMember http://192.168.1.106:8080
</Proxy>
ProxyPass /demo balancer://mycluster
ProxyPassReverse /demo balancer://mycluster
[root@linux-node1 extra]# 

  

再次啓動,成功
[root@linux-node1 logs]# /usr/local/httpd/bin/apachectl -k start
[root@linux-node1 logs]# netstat -lntp | grep 80
tcp6       0      0 :::80                   :::*                    LISTEN      20034/httpd         
[root@linux-node1 logs]# 

  

瀏覽器訪問,測試成功

如今是輪詢算法。

 

修改配置文件,在最後打開管理功能
[root@linux-node1 extra]# cat httpd-proxy.conf 
#www.linux-node1.example.com  
#proxy demo
LoadModule proxy_module modules/mod_proxy.so
LoadModule proxy_connect_module modules/mod_proxy_connect.so
LoadModule proxy_http_module modules/mod_proxy_http.so
LoadModule proxy_balancer_module modules/mod_proxy_balancer.so
LoadModule lbmethod_byrequests_module modules/mod_lbmethod_byrequests.so
LoadModule lbmethod_bytraffic_module modules/mod_lbmethod_bytraffic.so
LoadModule lbmethod_bybusyness_module modules/mod_lbmethod_bybusyness.so
LoadModule slotmem_shm_module modules/mod_slotmem_shm.so
ProxyRequests Off
<Proxy balancer://mycluster>
BalancerMember http://10.0.1.105:8080
BalancerMember http://10.0.1.106:8080
</Proxy>
ProxyPass /demo balancer://mycluster
ProxyPassReverse /demo balancer://mycluster
<Location /manager>
    SetHandler balancer-manager
    Order Deny,Allow
    Allow from all
</Location>
[root@linux-node1 extra]# 

  

優雅重啓
[root@linux-node1 ~]# /usr/local/httpd/bin/apachectl -k graceful
[root@linux-node1 ~]# 

  

Method看到默認的方法是基於requests
生產的配置須要設置權限,不要對外開放,能夠容許內網一個網段訪問。
權限設置和apache的同樣

點開左邊超連接以後能夠設置權重

 

 

反向代理配置虛擬主機


 

模擬用戶真實訪問環境,用戶是經過域名訪問的,而不是IP,這裏開始配置虛擬主機
 
extra默認有一個配置文件,httpd-vhosts.conf能夠複製部分當模板
[root@linux-node1 htdocs]# cd /usr/local/httpd/conf/extra/
[root@linux-node1 extra]# ll
總用量 72
-rw-r--r-- 1 root root  2891 2月  26 22:42 httpd-autoindex.conf
-rw-r--r-- 1 root root  1842 2月  26 22:42 httpd-dav.conf
-rw-r--r-- 1 root root  2942 2月  26 22:42 httpd-default.conf
-rw-r--r-- 1 root root  1119 2月  26 22:42 httpd-info.conf
-rw-r--r-- 1 root root  5078 2月  26 22:42 httpd-languages.conf
-rw-r--r-- 1 root root  1035 2月  26 22:42 httpd-manual.conf
-rw-r--r-- 1 root root  4444 2月  26 22:42 httpd-mpm.conf
-rw-r--r-- 1 root root  2237 2月  26 22:42 httpd-multilang-errordoc.conf
-rw-r--r-- 1 root root   858 2月  27 00:14 httpd-proxy.conf
-rw-r--r-- 1 root root 13464 2月  26 22:42 httpd-ssl.conf
-rw-r--r-- 1 root root   694 2月  26 22:42 httpd-userdir.conf
-rw-r--r-- 1 root root  1477 2月  26 22:42 httpd-vhosts.conf
-rw-r--r-- 1 root root  3161 2月  26 22:42 proxy-html.conf
[root@linux-node1 extra]# 
 
能夠複製下面文件的配置
 
把原先httpd-proxy.conf配置文件裏2行ProxyPass引用的放在虛擬主機裏
<VirtualHost *:80>
    ServerAdmin webmaster@nmap.example.com
    DocumentRoot "/opt"
    ServerName www.apache-nmap.com
    ServerAlias apache-nmap.com
    ErrorLog "logs/nmap-error_log"
    CustomLog "logs/nmap-access_log" common
    ProxyPass / balancer://mycluster
    ProxyPassReverse / balancer://mycluster
</VirtualHost>

 

配置截圖以下

 
 
檢查語法,從新加載
[root@linux-node1 extra]# /usr/local/httpd/bin/apachectl -t
Syntax OK
[root@linux-node1 extra]# /usr/local/httpd/bin/apachectl -k graceful
[root@linux-node1 extra]# 

  

window的hosts文件添加域名解析
10.0.1.105  www.apache-nmap.com  apache-nmap.com

  

經過域名訪問成功

 

 

 

還能夠設置權重等一些參數

 

 

 

apache作反向代理生產並不建議,由於性能不高。配置麻煩

關於IO這塊
apache使用select模式,性能不高
nginx使用epel模型,性能高
varish和haproxy都是使用epel模型的,性能高

可能一些特殊場景會用到它作反向代理:可能某公司一些web服務器必須和apache反向代理結合,其他反向代理,好比nginx和haproxy沒法使用。不得不用apache作反向代理了

相關文章
相關標籤/搜索