天天看點

LNMT、LAMT架構簡單執行個體

本次實作項目内容:

分别實作下述架構方案:

(1)nginx|apache(mod_proxy_ajp) --> tomcat;

(2) apache(mod_proxy_ajp) --> tomcat servers;額外實作session sticky;

(3) haproxy --> apache(mod_proxy_ajp) --> tomcat session cluster;

架構環境(部落客此次使用的虛拟機都是CentOS7.5):

172.16.75.5 反代伺服器

172.16.75.6 Tomcat伺服器1

172.16.75.7 Tomcat伺服器2

架構一:

用戶端-->nginx反代伺服器-->Tomcat伺服器1

nginx反代伺服器中的操作:

~]# vim /etc/nginx/nginx.conf

LNMT、LAMT架構簡單執行個體

添加這兩行即可;

~]# nginx -t //檢查是否格式正确

nginx: the configuration file /etc/nginx/nginx.conf syntax is ok

nginx: configuration file /etc/nginx/nginx.conf test is successful

~]# nginx

LNMT、LAMT架構簡單執行個體

~]#vim /etc/hosts

172.16.75.6 tc1.wzc.com

做到這裡,我們的nginx反代伺服器的配置就完成了;

Tomcat1中的操作:

首先我們要安裝JDK:OpenJDK:

安裝JDK:java-VERSION-openjdk、java-VERSION-openjdk-headless、java-VERSION-openjdk-devel

這裡我們直接:

~]#yum install java-devel -y //這樣安裝即可

~]# java -version

openjdk version "1.8.0_171"

OpenJDK Runtime Environment (build 1.8.0_171-b10)

OpenJDK 64-Bit Server VM (build 25.171-b10, mixed mode)

如果系統沒有定義JAVA_HOME環境變量,需要配置并指定Java的安裝路徑;

OpenJDK:

~] # vim /etc/profile.d/java.sh //寫入這下面的一行内容即可

export JAVA_HOME=/usr

~]# source /etc/profile.d/java.sh

接下來是安裝Tomcat:

這裡我們使用官方提供的Tomcat Binary Release From ASF進行安裝(部落客是用的是apache-tomcat-8.0.23.tar.gz源碼包,内部包含catalina.sh腳本檔案):

~]# tar -xf apache-tomcat-VERSION.tar.gz -C /usr/local

~]# cd /usr/local

~]# ln -sv /usr/local/apache-tomcat-VERSION tomcat

~]# cat /etc/profile.d/tomcat.sh //下面是要在裡面要編輯的内容,用來在根目錄中使用catalina.sh腳本用的

export CATALINA_BASE=/usr/local/tomcat

export PATH=$CATALINA_BASE/bin:$PATH

~]# source /etc/profile.d/tomcat.sh

~]# mkdir -pv /tcapps/webapps/ROOT/{classes,lib,WEB-INF,META-INF}

~]# vim /tcapps/webapps/ROOT/index.jsp //一個簡單的頁面測試内容,這裡部落客就不粘圖檔了友善大家使用

<%@ page language="java" %>

<html>

<head><title>TomcatB</title></head>

<body>

<font color="red">tc1.wzc.com</font>

<table align="centre" border="1">

<tr>

<td>Session ID</td>

<% session.setAttribute("tc1.wzc.com","tc1.wzc.com"); %>

<td><%= session.getId() %></td>

</tr>

<td>Created on</td>

<td><%= session.getCreationTime() %></td>

</table>

</body>

</html> //儲存即可

~]# vim /usr/local/tomcat/conf/server.xml

LNMT、LAMT架構簡單執行個體

添加(不是修改)箭頭所指内容即可;

~]# catalina.sh start

LNMT、LAMT架構簡單執行個體

這兩個端口打開即可;

這是我們在用戶端修改host檔案添加172.16.75.5 java.wzc.com和172.16.75.6 tc1.wzc.com 這樣就可以通路 java.wzc.com了,他會被直接反代到tc1.wzc.com,通路如下:

LNMT、LAMT架構簡單執行個體

架構二:

用戶端-->apache(mod_proxy_ajp,mod_proxy_http,mod_jk)反代伺服器-->Tomcat伺服器1

LAMT:

Linux + Apache(httpd) + MySQL/MariaDB + Tomcat

httpd的代理功能子產品:

proxy_module:實作httpd代理功能的核心子產品;

proxy_ajp_module:以ajp協定的用戶端身份實作反向代理功能;

proxy_http_module:以http協定的用戶端身份實作反向代理功能;

jk_module:以ajp協定的用戶端身份實作反向代理功能;

三種代理模型:
    Client(http/https) --> httpd(proxy_http_module)(http) --> tomcat(http connector)
    Client(http/https) --> httpd(proxy_ajp_module)(http) --> tomcat(ajp connector)
    Client(http/https) --> httpd(jk_module)(http) --> tomcat(ajp connector)

第一種模型:使用http協定連接配接tomcat伺服器的http連接配接器;
    /etc/httpd/conf.d/proxy_http_mod.conf
    <VirtualHost *:80>
        ProxyRequests Off
        ProxyPreserveHost On
        <Proxy *>
            Require all granted
        </Proxy>
        ProxyPass / http://tc1.wzc.com:8080
        <Location />
            Require all granted
        </Location>
    </VirtualHost>

第二種模型:使用ajp協定連接配接tomcat伺服器的ajp連接配接器;
/etc/httpd/conf.d/proxy_ajp_mod.conf
    <VirtualHost *:80>
        ProxyRequests Off
        ProxyPreserveHost On
        <Proxy *>
            Require all granted
        </Proxy>
        ProxyPass / ajp://tc1.wzc.com:8009
        <Location />
            Require all granted
        </Location>
    </VirtualHost>

第三種模型:使用mod_jk子產品通過ajp協定連接配接tomcat伺服器的ajp連接配接器;
    mod_jk.so子產品不是httpd自帶的子產品,屬于第三方功能子產品,需要額外編譯安裝;
    此子產品有tomcat官方提供,可以從tomcat.apache.org站點下載下傳tomcat-connector程式包;進行編譯安裝即可;

    確定系統上已經安裝了完整的開發環境,并且保證httpd-devel也已經正确安裝;           

]# yum -y groupinstall "Development Tools" "Server Paltform Develop"

]# yum -y install httpd-devel

]# tar xf tomcat-connectors-1.2.40-src/native

]# cd tomcat-connectors-1.2.40-src/native

]# ./configure --with-apxs=/usr/bin/apxs

]# make -j 4 && make install

安裝成功後,mod_jk子產品會被複制到/usr/lib64/httpd/modules/mod_jk.so

    對于mod_jk來說,所有後端被代理的伺服器,都被稱為"worker";

    建立mod_jk的配置檔案:/etc/httpd/conf.d/proxy_jk_mod.conf
        LoadModule jk_module modules/mod_jk.so

        JkWorkersFile /etc/httpd/conf.d/workers.properties
        JkMount /* tc1
        JkLogFile logs/jk_module.log
        JkLogLevel warn
        JkMount /jk-status tcstat
        <Location />
            Require all granted
        </Location>

    建立workers的屬性定義檔案:/etc/httpd/conf.d/workers.properties
        worker.list=tc1,tcstat
        worker.tc1.host=172.16.75.6
        worker.tc1.port=8009
        worker.tc1.type=ajp13
        worker.tcstat.type=status

    重新啟動httpd即可;           

這裡我們使用apache(mod_proxy_ajp)

在反代伺服器中的操作:

~]# nginx -s stop

~]# cd /etc/httpd/conf.d/

conf.d]# vim proxy_ajp_lb.conf

LNMT、LAMT架構簡單執行個體

儲存,完成反代伺服器中的操作;

在Tomcat1中的操作:

LNMT、LAMT架構簡單執行個體

像我一樣,把這一段注釋掉<!-- -->注釋号

LNMT、LAMT架構簡單執行個體

修改之前的localhost為圖示内容即可;

~]# catalina.sh stop //隔幾秒在開啟

~]# catalina.sh start //再次開啟

這是我們就可以在用戶端中進行通路了:

LNMT、LAMT架構簡單執行個體

架構三(LAMT負載均衡):

用戶端-->apache(mod_proxy_ajp,mod_proxy_http,mod_jk)反代伺服器-->Tomcat伺服器1,Tomcat伺服器2

這裡我們還是使用apache(mod_proxy_ajp)

~]# vim /etc/httpd/conf.d/proxy_ajp_lb.conf

<Proxy "balancer://tcsrvs">

BalancerMember ajp://tc1.wzc.com:8009

BalancerMember ajp://tc2.wzc.com:8009

ProxySet lbmethod=byrequests

</Proxy>

<VirtualHost *:80>

ServerName java.wzc.com

ProxyRequests Off

ProxyPass / balancer://tcsrvs

<Location />

Require all granted

</Location>

</VirtualHost>

~]# systemctl restart httpd

172.16.75.7 tc2.wzc.com

在Tomcat2中的操作同Tomcat1,該安裝安裝,該編輯配置檔案并重載的就和Tomcat1一樣,該注釋注釋,該添加添加,該修改修改;

然後在用戶端通路java.wzc.com即可看到如下圖示,重複重新整理檢視效果:

LNMT、LAMT架構簡單執行個體
LNMT、LAMT架構簡單執行個體

怎樣額外實作session sticky呢?

這裡隻需在反代伺服器中修改配置檔案即可:

~]# vim /etc/httpd/conf.d/proxy_ajp_lb.conf

Header add Set-Cookie "ROUTEID=.%{BALANCER_WORKER_ROUTE}e; path=/" env=BALANCER_ROUTE_CHANGED

BalancerMember ajp://tc1.wzc.com:8009 route=tc1

BalancerMember ajp://tc2.wzc.com:8009 route=tc2

ProxySet stickysession=ROUTEID

再次通路:

LNMT、LAMT架構簡單執行個體

再怎麼重新整理,也都是這一種顯示了,但這時負載均衡就失去了意義;

架構四:

用戶端-->apache(mod_proxy_ajp,mod_proxy_http,mod_jk)反代伺服器-->Tomcat session cluster

這裡我們還是使用apache(mod_proxy_ajp):

<Manager className="org.apache.catalina.ha.session.DeltaManager"
                 expireSessionsOnShutdown="false"
                 notifyListenersOnReplication="true"/>

<Channel className="org.apache.catalina.tribes.group.GroupChannel">
    <Membership className="org.apache.catalina.tribes.membership.McastService"
                            address="228.100.0.4"
                            port="45564"
                            frequency="500"
                            dropTime="3000"/>
    <Receiver className="org.apache.catalina.tribes.transport.nio.NioReceiver"
                        address="172.16.75.7"
                        port="4000"
                        autoBind="100"
                        selectorTimeout="5000"
     maxThreads="6"/>

    <Sender className="org.apache.catalina.tribes.transport.ReplicationTransmitter">
        <Transport className="org.apache.catalina.tribes.transport.nio.PooledParallelSender"/>
    </Sender>
    <Interceptor className="org.apache.catalina.tribes.group.interceptors.TcpFailureDetector"/>
    <Interceptor className="org.apache.catalina.tribes.group.interceptors.MessageDispatch15Interceptor"/>
</Channel>

<Valve className="org.apache.catalina.ha.tcp.ReplicationValve"
                filter=""/>
<Valve className="org.apache.catalina.ha.session.JvmRouteBinderValve"/>

<Deployer className="org.apache.catalina.ha.deploy.FarmWarDeployer"
                    tempDir="/tmp/war-temp/"
                    deployDir="/tmp/war-deploy/"
                    watchDir="/tmp/war-listen/"
                    watchEnabled="false"/>

<ClusterListener className="org.apache.catalina.ha.session.ClusterSessionListener"/>           

繼續閱讀