N22-love cat第19周 – 基于Apache + Tomcat +2種模式實現負載均衡以及配置集群seesion服務

N22-love cat第19周 - 基于Apache + Tomcat +2種模式實現負載均衡以及配置集群seesion服務  基于Apache+Tomcat實現負載均衡和集群服務

一、概念

    從Tomcat權威指南中的測試數據,我們不難發現,對于靜態頁面的數據,Tomcat的處理速度比Apache要快很多,所以為什么要整合apache雖然在處理靜態頁面速度上比Apache快,但是Tomcat經不起大的并發量容易死。為此,我們就需要Apache,雖然apache的速度要慢一些,但能承受的起大的并發量。

    我們再介紹一下為什么要讓Apache與Tomcat之間進行連接。事實上Tomcat本身已經提供了HTTP服務,該服務默認的端口是8080,裝好tomcat后通過8080端口可以直接使用Tomcat所運行的應用程序,你也可以將該端口改為80。

既然Tomcat本身已經可以提供這樣的服務,我們為什么還要引入Apache或者其他的一些專門的HTTP服務器呢?原因有下面幾個:

    1. 提升對靜態文件的處理性能;

    2. 利用Web服務器來做負載均衡以及容錯;

    3. 無縫的升級應用程序。

    這三點對一個web網站來說是非常之重要的,我們希望我們的網站不僅是速度快,而且要穩定,不能因為某個Tomcat宕機或者是升級程序導致用戶訪問不了,而能完成這幾個功能的比較好的HTTP服務器是apache的http server了,它跟tomcat的結合是最緊密和可靠的。

    在Apache2.2之前,一般有兩個組件可選擇。mod_jk和mod_jk2。后來mod_jk2由于沒有開發人員的支持,沒更新了,轉而更新mod_jk,所以現在一般都使用mod_jk做Apache和Tomcat的連接器。要指出的是mod_jk支持 Apache 1.x和2.X系列。

    不過,自從Apache2.2出來后,又多了兩種種選擇,那就是 proxy-ajp 和 http-proxy。大家知道Apache里的proxy模塊,可以實現雙向代理功能,功能非常強大。其實從連接器的實現原理上來說,用proxy模塊來實現是非常自然的。proxy模塊的功能無非就是把相關的請求發給特定的主機再返回結果。那連接器的功能需求就是要把所有對Servlet/JSP的請求都轉給后臺的Tomcat。使用proxy-ajp要比mod_jk的效率要高。使用Apache自帶模塊,要比另外編譯的來得可靠。既然有了ajp_proxy專門的ajp協議代理,http-proxy就沒有必要使用這種方法了,但這里我主要測試mod_jk來做負載均衡就不說那么多了。 

二、網站架構

blob.png

平臺介紹:

OS Version:CentOS release 6.7 (Final)
Http version: apache-tomcat-8.5.4
Jdk:java-1.8.0-openjdk
Mysql version: 5.6.31 
Kernel version: 2.6.32-573.el6.x86_64
[root@Tomcat1-219 tools]# service iptables stop            #關閉iptables:
iptables: Setting chains to policy ACCEPT: filter          [  OK  ]
iptables: Flushing firewall rules:                         [  OK  ]
iptables: Unloading modules:                               [  OK  ]
[root@Tomcat1-219 tools]# chkconfig iptables off           #關閉iptables開機啟動
[root@Tomcat1-219 tools]# chkconfig --list |grep iptables  #查看iptables開機啟動情況
iptables       	0:off	1:off	2:off	3:off	4:off	5:off	6:off
[root@Tomcat1-219 tools]# vim /etc/sysconfig/selinux
SELINUX=disabled                                           #永久關閉selinux
[root@Tomcat1-219 apr-1.5.2]# /usr/sbin/ntpdate  time.nist.gov

三、Apache服務

因為編譯Apache的要求如下:

1、磁盤空間
必須保證有50MB以上的自由臨時磁盤空間。Apache安裝完畢后會占據10MB左右的空間,實際的磁盤空間需求會因編譯設置和是否安裝第三方模塊而有所不同。
2、ANSI-C編譯器及編譯環境
必須裝有ANSI-C編譯器,推薦使用自由軟件基金會(FSF)的GCC。如果沒有GCC,那么要確保使用的編譯器符合ANSI標準,而且PATH中必須包含指向基本編譯工具比如make的路徑。
3、確保準確的時間
由于HTTP協議的元素都會用到時間,有必要了解一下你的系統所使用的時間同步機制。在基于網絡時間協議(NTP)的系統中,一般是用tpdate或xntpd來同步時間。有關NTP軟件的資料請參見NTP主頁。
4、Perl 5 [可選]
有些用Perl寫的支持腳本,如apxs或dbmmanage ,需要Perl5解釋器(5.003或以上的版本就足夠了)。如果系統中存在多個Perl解釋器,比如有系統提供的Perl 4,還有你自己安裝的Perl 5,推薦你使用 --with-perl 選項來確保configure腳本使用正確的版本。如果configure沒有沒找到Perl 5也沒關系,這并不影響Apache httpd的編譯和安裝,只是相關的支持腳本不能使用而已。
5、apr/apr-util >= 1.2
apr和apr-util包含在Apache httpd的發行源代碼中,并且在絕大多數情況下使用都不會出現問題。當然,如果apr或apr-util的1.0或1.1版本已經安裝在你的系統中了,則必須將你的apr/apr-util升級到1.2版本,或者將httpd單獨分開編譯。要使用發行源代碼中自帶的apr/apr-util源代碼進行安裝,你必須手動完成。

所以我們要安裝所需程序庫

#ANSI-C編譯器及編譯環境,預先安裝所需要的程序庫
[root@Tomcat1-219 apr-1.5.2]# yum -y install gcc* autoconf libjpeg libjpeg-devel libpng libpng-devel freetype freetype-devel libxml2 libxml2-devel zlib zlib-devel glibc glibc-devel glib2 glib2-devel bzip2 bzip2-devel ncurses ncurses-devel curl curl-devel pcre-devel.x86_64

同步時間:

#確保準確的時間
[root@Tomcat1-219 apr-1.5.2]# /usr/sbin/ntpdate  time.nist.gov
26 Aug 17:17:21 ntpdate[3179]: adjust time server 24.56.178.140 offset 0.455212 sec

安裝apr:

[root@Tomcat1-219 apr-1.5.2]# wget http://www.apache.org/dist/apr/apr-1.5.2.tar.gz
[root@Tomcat1-219 tools]# tar -xf apr-1.5.2.tar.gz
[root@Tomcat1-219 tools]# cd apr-1.5.2
[root@Tomcat1-219 apr-1.5.2]# mkdir -pv /opt/application/apr-1.5.2
mkdir: created directory `/opt/application'
mkdir: created directory `/opt/application/apr-1.5.2'
[root@Tomcat1-219 apr-1.5.2]#./configure --prefix=/opt/application/apr
[root@Tomcat1-219 apr-1.5.2]# make;make install

安裝apr-util

[root@Tomcat1-219 tools]# wget http://www.apache.org/dist/apr/apr-util-1.5.4.tar.gz
[root@Tomcat1-219 tools]# tar -xf apr-util-1.5.4.tar.gz 
[root@Tomcat1-219 tools]# cd apr-util-1.5.4
[root@Tomcat1-219 apr-util-1.5.4]# ./configure --prefix=/opt/application/apr-util-1.5.4/  --with-apr=/opt/application/apr-1.5.2/
[root@Tomcat1-219 apr-util-1.5.4]# make;make install

安裝httpd

[root@Tomcat1-219 ~]# wget  http://mirror.bit.edu.cn/apache//httpd/httpd-2.4.23.tar.gz
[root@Tomcat1-219 ~]# tar -xf  httpd-2.4.23.tar.gz
[root@Tomcat1-219 ~]# cd httpd-2.4.23
[root@Tomcat1-219 httpd-2.4.23]# ./configure --prefix=/opt/application/httpd-2.4.23/  --with-apr=/opt/application/apr-1.5.2/ --with-apr-util=/opt/application/apr-util-1.5.4/ --enable-so --enable-mods-shared=all --with-mpm=worker --enable-proxy-balancer=shared --enable-proxy-http --enable-proxy-connect --enable-proxy --enable-rewrite --enable-proxy-ajp 
#--prefix               http安裝的目錄;
#--with-apr              apr安裝的目錄;
#--with-apr-util    apr-util安裝的目錄;
#--enable-so        必須編譯成允許動態加載模塊的方式,因為將來要加載mod_jk這個整合模塊;
#--enable-mods-shared=all   動態加載所有模塊,以后所有想增加的模塊都會以動態模式來安裝;
#                   也就是最終在 httpd.conf 中以LoadModule形式來加載模塊;
#--with-mpm=worker  由于使用線程來處理,所以可以處理相對海量的請求,而系統資源的開銷要小于基于進程的服務器。##但是,worker也使用了多進程,每個進程又生成多個線程,以獲得基于進程服務器的穩定性。
#--enable-proxy-balancer=shared   表示讓apache支持負載均衡功能,即動態的編譯apache的負載均衡模塊;
#--enable-proxy-http=shared       表示動態編譯apache的http代理模塊;
#--enable-proxy-ajp          表示動態編譯apache的proxy-ajp模塊;
#--enable-rewrite讓apache    支持地址重寫功能,即動態編譯apache的rewrite模塊;

四、mod_jk

Building mod_jk for Unix

Apache

1.Make sure your Apache has DSO support. You can check this with $APACHE_HOME/bin/httpd -l. If you see "mod_so.c" in the output, DSO support is available. If it's missing, you may have to recompile or reinstall Apache.

[root@Tomcat1-219 ~]# /opt/application/httpd/bin/httpd -l
Compiled in modules:
  core.c
  mod_so.c
  http_core.c
  worker.c

2.Find out whether your Apache has EAPI support. If you compiled it yourself from source, EAPI is probably not compiled in, unless you added it yourself (perhaps with mod_ssl). You need to build mod_jk.so with or without EAPI to match your Apache configuration. If you install a mismatched mod_jk.so, $APACHE_HOME/bin/apachectl configtest will warn you.

[root@Tomcat1-219 ~]# /opt/application/httpd/bin/apachectl configtest
Syntax OK

3.Make sure you have Perl 5 installed. The apxs script used to build the module is written in Perl.

[root@Tomcat1-219 tomcat-connectors-1.2.41-src]# rpm -ql pcre
/lib64/libpcre.so.0
/lib64/libpcre.so.0.0.1
/usr/bin/pcregrep
/usr/bin/pcretest
/usr/lib64/libpcrecpp.so.0
/usr/lib64/libpcrecpp.so.0.0.0
/usr/lib64/libpcreposix.so.0
/usr/lib64/libpcreposix.so.0.0.0
/usr/share/doc/pcre-7.8
/usr/share/doc/pcre-7.8/AUTHORS
/usr/share/doc/pcre-7.8/COPYING
/usr/share/doc/pcre-7.8/ChangeLog
/usr/share/doc/pcre-7.8/LICENCE
/usr/share/doc/pcre-7.8/NEWS
/usr/share/doc/pcre-7.8/README
/usr/share/man/man1/pcre-config.1.gz
/usr/share/man/man1/pcregrep.1.gz
/usr/share/man/man1/pcretest.1.gz

4.Change directory to TOMCAT_HOME/native/mod_jk/apache1.3 (or apache2.0).

[root@Tomcat1-219 tools]# cp tomcat-connectors-1.2.41-src/native/apache-2.0/mod_jk.so /opt/application/httpd/modules/mod_jk.so

    作為apache與tomcat連接的橋梁,JK連接器使用C語言編寫,與apache緊密結合,作為模塊裝載到apache服務器中,通過配置實現與特定的tomcat服務器進行通信,從而實現負載均衡的功能,這里需要注意的是配置腳本要添加一個apxs完整路徑作為參數。apxs是一個為Apache HTTP服務器編譯和安裝擴展模塊的工具,用于編譯一個或多個源程序或目標代碼文件為動態共享對象,使之可以用由mod_so提供的LoadModule指令在運行時加載到Apache服務器中。

所以接下來我們開始安裝mod_jk:

[root@Tomcat1-219 tools]# tar -xf tomcat-connectors-1.2.41-src.tar.gz
[root@Tomcat1-219 ~]# cd tomcat-connectors-1.2.41-src
[root@Tomcat1-219 tomcat-connectors-1.2.41-src]# cd native/
[root@Tomcat1-219 native]# ll
total 1364
-rw-r--r--. 1 root bin  351029 Jul 27  2015 aclocal.m4
drwxr-xr-x. 2 root bin    4096 Aug 27 13:43 apache-1.3
drwxr-xr-x. 3 root bin    4096 Aug 27 13:43 apache-2.0
-rwxr-xr-x. 1 root bin    1277 Dec 30  2014 buildconf.sh
-rw-r--r--. 1 root bin    5072 Feb 26  2014 BUILDING.txt
drwxr-xr-x. 3 root bin    4096 Aug 27 13:43 common
-rw-r--r--. 1 root root  46800 Aug 27 13:43 config.log
-rwxr-xr-x  1 root root    106 Aug 27 13:43 config.nice
-rwxr-xr-x. 1 root root  64197 Aug 27 13:43 config.status
-rwxr-xr-x. 1 root bin  468668 Jul 27  2015 configure
-rw-r--r--. 1 root bin   21720 Dec 21  2014 configure.ac
drwxr-xr-x. 3 root bin    4096 Jul 27  2015 docs
drwxr-xr-x. 4 root bin    4096 Jul 27  2015 iis
-rwxr-xr-x  1 root root 293168 Aug 27 13:43 libtool
-rw-r--r--  1 root root  29839 Aug 27 13:43 Makefile
-rw-r--r--. 1 root bin    1362 Oct 22  2010 Makefile.am
-rw-r--r--. 1 root bin   28996 Jul 27  2015 Makefile.in
drwxr-xr-x. 2 root bin    4096 Jul 27  2015 netscape
-rw-r--r--. 1 root bin    1844 Mar 18  2012 README.txt
drwxr-xr-x. 3 root bin    4096 Jul 27  2015 scripts
-rw-r--r--. 1 root bin    2565 Jul 27  2015 STATUS.txt
-rw-r--r--. 1 root bin   13293 Nov 16  2011 TODO.txt
[root@Tomcat1-219 native]# ./configure --with-apxs=/opt/application/httpd/bin/apxs
[root@Tomcat1-219 native]# make
[root@Tomcat1-219 native]# make install

JK連接器模塊的部署

    編譯完成后使用ls命令來列出native目錄下的所有目錄和文件。注意有apache-1.3和apache-2.0兩個目錄。由于在配置編譯的時候指定了apxs工具的位置。配置腳本會根據apxs的反饋結果自動識別目標apache服務器為2.x版本,因此本次編譯生成的mod_jk.so模塊會放在apache-2.0目錄中,apache-1.3目錄中是沒有mod_jk.so的,這一點請注意。如下所示:

[root@Tomcat1-219 native]# ll
total 1364
-rw-r--r--. 1 root bin  351029 Jul 27  2015 aclocal.m4
drwxr-xr-x. 2 root bin    4096 Aug 27 13:43 apache-1.3
drwxr-xr-x. 3 root bin    4096 Aug 27 13:43 apache-2.0
-rwxr-xr-x. 1 root bin    1277 Dec 30  2014 buildconf.sh
-rw-r--r--. 1 root bin    5072 Feb 26  2014 BUILDING.txt
drwxr-xr-x. 3 root bin    4096 Aug 27 13:43 common
-rw-r--r--. 1 root root  46800 Aug 27 13:43 config.log
-rwxr-xr-x  1 root root    106 Aug 27 13:43 config.nice
-rwxr-xr-x. 1 root root  64197 Aug 27 13:43 config.status
-rwxr-xr-x. 1 root bin  468668 Jul 27  2015 configure
-rw-r--r--. 1 root bin   21720 Dec 21  2014 configure.ac
drwxr-xr-x. 3 root bin    4096 Jul 27  2015 docs
drwxr-xr-x. 4 root bin    4096 Jul 27  2015 iis
-rwxr-xr-x  1 root root 293168 Aug 27 13:43 libtool
-rw-r--r--  1 root root  29839 Aug 27 13:43 Makefile
-rw-r--r--. 1 root bin    1362 Oct 22  2010 Makefile.am
-rw-r--r--. 1 root bin   28996 Jul 27  2015 Makefile.in
drwxr-xr-x. 2 root bin    4096 Jul 27  2015 netscape
-rw-r--r--. 1 root bin    1844 Mar 18  2012 README.txt
drwxr-xr-x. 3 root bin    4096 Jul 27  2015 scripts
-rw-r--r--. 1 root bin    2565 Jul 27  2015 STATUS.txt
-rw-r--r--. 1 root bin   13293 Nov 16  2011 TODO.txt
[root@Tomcat1-219 native]# ll apache-2.0/mod_jk.*
-rw-r--r--. 1 root root 1880946 Aug 27 00:15 apache-2.0/mod_jk.a
-rw-r--r--. 1 root bin   147504 Feb 18  2015 apache-2.0/mod_jk.c
-rw-r--r--. 1 root bin    11019 Nov 14  2011 apache-2.0/mod_jk.dsp
-rw-r--r--. 1 root root     934 Aug 27 00:15 apache-2.0/mod_jk.la
-rw-r--r--. 1 root root     270 Aug 27 00:15 apache-2.0/mod_jk.lo
-rw-r--r--. 1 root root  224336 Aug 27 00:15 apache-2.0/mod_jk.o
-rwxr-xr-x. 1 root root 1143466 Aug 27 00:15 apache-2.0/mod_jk.so

我們現在將編譯好的mod_jk.so拷貝到apache服務器的modules目錄中,這個目錄是專門用來存放擴展模塊的:

[root@Tomcat1-219 tools]# cp tomcat-connectors-1.2.41-src/native/apache-2.0/mod_jk.so /opt/application/httpd/modules/mod_jk.so
[root@Tomcat1-219 native]# ll /opt/application/httpd/modules/mod_jk*
-rwxr-xr-x. 1 root root 1143466 Aug 27 00:16 /opt/application/httpd/modules/mod_jk.so

到這里JK連接器模塊安裝完成了,不過還需要配置其他文件,

我們開始修改tomcat1(tomcat8080),tomcat2(tomcat8080)的配置文件

[root@Tomcat1-219 tomcat8080]# vim conf/server.xml
120     <Engine name="Catalina" defaultHost="localhost" jvmRoute="s1"> #修改為workers.properties文件對應的值
[root@Tomcat2-220 tomcat8080]# vim conf/server.xml
120     <Engine name="Catalina" defaultHost="localhost" jvmRoute="s2"> #修改為workers.properties文件對應的值

workers.properties配置文件:

[root@Tomcat1-219 conf.d]# vim workers.properties
  1 #
  2 # workers.properties
  3 #
  4 
  5 # list the workers by name
  6 worker.list=loadBalanceServers, jk_watcher
  7 
  8 # Tomcat1
  9 # ------------------------
 10 worker.s1.port=8009
 11 worker.s1.host=192.168.2.219
 12 worker.s1.type=ajp13
 13 worker.s1.lbfactor=10
 14 worker.s1.cachesize=5
 15 worker.s1.connection_pool_size=800
 16 worker.s1.connection_pool_minsize=25
 17 worker.s1.connection_pool_timeout=600
 18 # Tomcat2
 19 # ------------------------
 20 worker.s2.port=8009
 21 worker.s2.host=192.168.2.220
 22 worker.s2.type=ajp13
 23 worker.s2.lbfactor=10
 24 worker.s2.cachesize=5
 25 worker.s1.connection_pool_size=800
 26 worker.s1.connection_pool_minsize=25
 27 worker.s1.connection_pool_timeout=600
 28 
 29 worker.loadBalanceServers.type=lb
 30 worker.loadBalanceServers.balanced_workers=s1,s2
 31 worker.loadBalanceServers.sticky_session=0
 32 worker.jk_watcher.type=status
 33 # worker.jk_watcher.read_only=True
 34 worker.jk_watcher.mount=/admin/jk
 35 worker.retries=3
 36

uriworkermap.properties配置文件:

[root@Tomcat1-219 conf.d]# vim uriworkermap.properties
  1 #
  2 # uriworkermap.properties
  3 #
  4 
  5 #define all requests will be submitted to load balance servers
  6 #if the condition is satisfied, the filter will validate the next statement until it's not.
  7 #notice the order of the following statements
  8 /*=loadBalanceServers
  9 /jkstatus=jk_watcher
 10 !/*.gif=loadBalanceServers
 11 !/*.jpg=loadBalanceServers
 12 !/*.tif=loadBalanceServers
 13 !/*.png=loadBalanceServers
 14 !/*.bmp=loadBalanceServers
 15 !/*.html=loadBalanceServers
 16 !/*.htm=loadBalanceServers
 17 !/*.swf=loadBalanceServers
 18 !/*.css=loadBalanceServers
 19 !/*.js=loadBalanceServers

mod_jk.conf配置文件:

[root@Tomcat1-219 conf.d]# vim mod_jk.conf 
  1 LoadModule  jk_module  modules/mod_jk.so
  2 JkWorkersFile  /opt/application/httpd/conf.d/workers.properties
  3 JkLogFile  /opt/application/httpd/logs/mod_jk.log
  4 JkShmFile  /opt/application/httpd/logs/mod_jk.shm
  5 JkMountFile /opt/application/httpd/conf.d/uriworkermap.properties
  6 JkLogLevel  debug
  7 JkMount  /*  jie
  8 JkMount  /jkstatus/  stat1


我們啟動apche和兩個tomcat,并在每個tomcat的webapp下新建一個index.jsp文件

[root@Tomcat1-219 test]# vim /opt/application/tomcat8080/webapps/test/index.jsp 
  1 <html>
  2     <head>
  3            <title>HelloWorldJSP~</title>
  4     </head>
  5     <body>
  6            <%
  7                   out.println("This is my Tomcat1-219's-JSP page");
  8            %>
  9      </body>
 10 </html>

打開瀏覽器:http://192.168.2.219:80/test/index.jsp

blob.png

再刷新下網頁,成功!

blob.png


、mod_proxy模塊連接Tomcat

1、修改http/conf/httpd.conf配置文件

[root@Tomcat1-219 ~]# vim /opt/application/httpd/conf/httpd.conf
LoadModule authn_file_module modules/mod_authn_file.so
LoadModule authn_core_module modules/mod_authn_core.so
LoadModule authz_host_module modules/mod_authz_host.so
LoadModule authz_groupfile_module modules/mod_authz_groupfile.so
LoadModule authz_user_module modules/mod_authz_user.so
LoadModule authz_core_module modules/mod_authz_core.so
LoadModule access_compat_module modules/mod_access_compat.so
LoadModule auth_basic_module modules/mod_auth_basic.so
LoadModule reqtimeout_module modules/mod_reqtimeout.so
LoadModule filter_module modules/mod_filter.so
LoadModule mime_module modules/mod_mime.so
LoadModule log_config_module modules/mod_log_config.so
LoadModule env_module modules/mod_env.so
LoadModule headers_module modules/mod_headers.so
LoadModule setenvif_module modules/mod_setenvif.so
LoadModule version_module modules/mod_version.so
LoadModule proxy_module modules/mod_proxy.so
LoadModule proxy_http_module modules/mod_proxy_http.so
LoadModule proxy_ajp_module modules/mod_proxy_ajp.so
LoadModule unixd_module modules/mod_unixd.so
LoadModule status_module modules/mod_status.so
LoadModule autoindex_module modules/mod_autoindex.so
LoadModule dir_module modules/mod_dir.so
LoadModule alias_module modules/mod_alias.so
這里是我LoadModule語句塊的情況,文件末尾添加一句話
528 Include conf.d/*.conf
[root@Tomcat1-219 conf.d]# vim http_tomcat.conf 

  1 <VirtualHost *:80>
  2     ServerName  apache-http-tomcat.com
  3     ProxyRequests   off
  4     ProxyVia    On
  5     ProxyPreserveHost On
  6     <Proxy *>
  7         Require all granted
  8     </Proxy>
  9     ProxyPass / http://localhost:8080/
 10     ProxyPassReverse / http://localhost:8080/
 11     <Location />
 12         Require all granted
 13     </Location>
 14 </VirtualHost>
 [root@Tomcat1-219 conf.d]# ../bin/apachectl stop 
 [root@Tomcat1-219 conf.d]# ../bin/apachectl        重啟httpd服務

瀏覽器打開http://192.168.2.219:80,測試成功!

blob.png


六、Tomcat服務及集群session會話保持

tomcat體系結構

blob.png

    Tomcat服務器的啟動是基于一個server.xml文件的,Tomcat啟動的時候首先會啟動一個Server,Server里面就會啟動Service,Service里面就會啟動多個"Connector(連接器)",每一個連接器都在等待客戶機的連接,當有用戶使用瀏覽器去訪問服務器上面的web資源時,首先是連接到Connector(連接器),Connector(連接器)是不處理用戶的請求的,而是將用戶的請求交給一個Engine(引擎)去處理,Engine(引擎)接收到請求后就會解析用戶想要訪問的Host,然后將請求交給相應的Host,Host收到請求后就會解析出用戶想要訪問這個Host下面的哪一個Web應用,一個web應用對應一個Context。

    下面這張圖更好幫我們理解這種情況:

N22-love cat第19周 - 基于Apache + Tomcat +2種模式實現負載均衡以及配置集群seesion服務

元素名

 

屬性

 

解釋

 

server

port

指定一個端口,這個端口負責監聽關閉tomcat的請求

shutdown

指定向端口發送的命令字符串

service

name

指定service的名字

Connector(表示客戶端和service之間的連接)

port

指定服務器端要創建的端口號,并在這個斷口監聽來自客戶端的請求

minProcessors

服務器啟動時創建的處理請求的線程數

maxProcessors

最大可以創建的處理請求的線程數

enableLookups

如果為true,則可以通過調用request.getRemoteHost()進行DNS查詢來得到遠程客戶端的實際主機名,若為false則不進行DNS查詢,而是返回其ip地址

redirectPort

指定服務器正在處理http請求時收到了一個SSL傳輸請求后重定向的端口號

acceptCount

指定當所有可以使用的處理請求的線程數都被使用時,可以放到處理隊列中的請求數,超過這個數的請求將不予處理

connectionTimeout

指定超時的時間數(以毫秒為單位)

Engine(表示指定service中的請求處理機,接收和處理來自Connector的請求)

defaultHost

指定缺省的處理請求的主機名,它至少與其中的一個host元素的name屬性值是一樣的

Context(表示一個web應用程序,通常為WAR文件,關于WAR的具體信息見servlet規范)

docBase

應用程序的路徑或者是WAR文件存放的路徑

path

表示此web應用程序的url的前綴,這樣請求的url為http://localhost:8080/path/****

reloadable

這個屬性非常重要,如果為true,則tomcat會自動檢測應用程序的/WEB-INF/lib 和/WEB-INF/classes目錄的變化,自動裝載新的應用程序,我們可以在不重起tomcat的情況下改變應用程序

host(表示一個虛擬主機)

name

指定主機名

appBase

應用程序基本目錄,即存放應用程序的目錄

unpackWARs

如果為true,則tomcat會自動將WAR文件解壓,否則不解壓,直接從WAR文件中運行應用程序

Logger(表示日志,調試和錯誤信息)

className

指定logger使用的類名,此類必須實現org.apache.catalina.Logger 接口

prefix

指定log文件的前綴

suffix

指定log文件的后綴

timestamp

如果為true,則log文件名中要加入時間,如下例:localhost_log.001-10-04.txt

Realm(表示存放用戶名,密碼及role的數據庫)

className

指定Realm使用的類名,此類必須實現org.apache.catalina.Realm接口

Valve(功能與Logger差不多,其prefix和suffix屬性解釋和Logger 中的一樣)

className

指定Valve使用的類名,如用org.apache.catalina.valves.AccessLogValve類可以記錄應用程序的訪問信息

directory

指定log文件存放的位置

pattern

有兩個值,common方式記錄遠程主機名或ip地址,用戶名,日期,第一行請求的字符串,HTTP響應代碼,發送的字節數。combined方式比common方式記錄的值更多

[root@Tomcat1-219 tools]# wget http://mirrors.tuna.tsinghua.edu.cn/apache/tomcat/tomcat-8/v8.5.4/bin/apache-tomcat-8.5.4.tar.gz
--2016-08-27 14:02:52--  http://mirrors.tuna.tsinghua.edu.cn/apache/tomcat/tomcat-8/v8.5.4/bin/apache-tomcat-8.5.4.tar.gz
Resolving mirrors.tuna.tsinghua.edu.cn... 166.111.206.63, 2402:f000:1:416:166:111:206:63
Connecting to mirrors.tuna.tsinghua.edu.cn|166.111.206.63|:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: 9271609 (8.8M) [application/octet-stream]
Saving to: “apache-tomcat-8.5.4.tar.gz”

100%[=========================================================>] 9,271,609   1.99M/s   in 7.5s    

2016-08-27 14:03:05 (1.18 MB/s) - “apache-tomcat-8.5.4.tar.gz” saved [9271609/9271609]

[root@Tomcat1-219 tools]# cp -r apache-tomcat-8.5.4 /opt/application/tomcat8080
[root@Tomcat1-219 webapps]# ll        #把測試用的test.war放在webapps目錄下
total 14764
drwxr-x--- 14 root root     4096 Aug 27 14:05 docs
drwxr-x---  6 root root     4096 Aug 27 14:05 examples
drwxr-x---  5 root root     4096 Aug 27 14:05 host-manager
drwxr-x---  5 root root     4096 Aug 27 14:05 manager
drwxr-x---  3 root root     4096 Aug 27 14:05 ROOT
drwxr-x---  4 root root     4096 Aug 27 14:25 test
drwxr-x---  4 root root     4096 Aug 27 14:16 TestProject
-rw-r--r--  1 root root 15087013 Nov 19  2011 test.war

修改web.xml文件:

配置web.xml文件只需要在末端web-app前面添加<distributable/>即可;

<welcome-file-list>
        <welcome-file>index.html</welcome-file>
        <welcome-file>index.htm</welcome-file>
        <welcome-file>index.jsp</welcome-file>
    </welcome-file-list>
<distributable/>
</web-app>

[root@Tomcat1-219 webapps]# netstat -tunlp
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address               Foreign Address             State       PID/Program name   
tcp        0      0 0.0.0.0:22                  0.0.0.0:*                   LISTEN      1346/sshd           
tcp        0      0 127.0.0.1:25                0.0.0.0:*                   LISTEN      1425/master         
tcp        0      0 :::80                       :::*                        LISTEN      1521/httpd          
tcp        0      0 :::22                       :::*                        LISTEN      1346/sshd           
tcp        0      0 ::1:25                      :::*                        LISTEN      1425/master         
[root@Tomcat1-219 webapps]# ../bin/startup.sh 
Using CATALINA_BASE:   /opt/application/tomcat8080
Using CATALINA_HOME:   /opt/application/tomcat8080
Using CATALINA_TMPDIR: /opt/application/tomcat8080/temp
Using JRE_HOME:        /usr
Using CLASSPATH:       /opt/application/tomcat8080/bin/bootstrap.jar:/opt/application/tomcat8080/bin/tomcat-juli.jar
Tomcat started.
[root@Tomcat1-219 webapps]# netstat -tunlp       tomcat8080端口已經起來了
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address               Foreign Address             State       PID/Program name   
tcp        0      0 0.0.0.0:22                  0.0.0.0:*                   LISTEN      1346/sshd           
tcp        0      0 127.0.0.1:25                0.0.0.0:*                   LISTEN      1425/master         
tcp        0      0 ::ffff:127.0.0.1:8005       :::*                        LISTEN      4349/java           
tcp        0      0 :::8009                     :::*                        LISTEN      4349/java           
tcp        0      0 :::8080                     :::*                        LISTEN      4349/java           
tcp        0      0 :::80                       :::*                        LISTEN      1521/httpd          
tcp        0      0 :::22                       :::*                        LISTEN      1346/sshd           
tcp        0      0 ::1:25                      :::*                        LISTEN      1425/master

tomcat的日志沒有報錯,也能看到服務起來了:

[root@Tomcat1-219 tomcat8080]# tail -f  logs/catalina.out  
27-Aug-2016 14:28:11.401 INFO [main] org.apache.coyote.AbstractProtocol.start Starting ProtocolHandler [http-nio-8080]
27-Aug-2016 14:28:11.415 INFO [main] org.apache.coyote.AbstractProtocol.start Starting ProtocolHandler [ajp-nio-8009]
27-Aug-2016 14:28:11.422 INFO [main] org.apache.catalina.startup.Catalina.start Server startup in 7923 ms

測試session復制

分別在tomcat項目部署目錄下創建test文件夾,并創建session.jsp文件,文件內容如下:


打開瀏覽器輸入http://192.168.2.219/test/session.jsp

blob.png

再刷新下網頁:

blob.png

LoadModule:
#表示當apache服務啟動時要加載模塊jk_module為模塊的別名,后面跟的modules/mod_jk.so就是相對于apache服務器所在目錄(/opt/application/httpd-2.4.23/)的模塊文件名;
<IfModule jk_module>區域:
#表示當apache服務器加載jk_module(在LoadModule指令中指定的模塊別名)模塊時所做的配置;
JkWorkersFile:
#指定負載均衡服務器的配置文件,文件名為相對于apache服務器所在目錄的conf/workers.properties文件;
JkMountFile:
#指定那些請求交由負載均衡服務器來處理,那些由apache服務器來處理,配置文件為相對于apache服務器所在目錄的conf/uriworkermap.properties文件;
JkLogFile:
#指定JK連接器的日志輸出文件,文件為相對于apache服務器所在目錄的logs/mod_jk.log文件;
JkLogLevel
#指定JK連接器輸出日志的級別,級別為warn以上的日志將被輸出到日志文件中,可選的值級別由低到高分別為:TRACE DEBUG INFO WARN ERROR FATAL
------------------------------------------------------------------------------------------------------------------------------------------------
<IfModule worker.c>區域:
#表示當apache服務器以worker模式工作時使用的配置。
StartServers:
#設置服務器啟動時建立的子進程數量。因為子進程數量動態的取決于負載的輕重,所有一般沒有必要調整這個參數。
ServerLimit:
#服務器允許配置的進程數上限。只有在你需要將MaxClients和ThreadsPerChild設置成需要超過默認值16個子進程的時候才需要使用這個指令。不要將該指令的值設置的比MaxClients 和ThreadsPerChild需要的子進程數量高。修改此指令的值必須完全停止服務后再啟動才能生效,以restart方式重啟動將不會生效。
ThreadLimit:
#設置每個子進程可配置的線程數ThreadsPerChild上限,該指令的值應當和ThreadsPerChild可能達到的最大值保持一致。修改此指令的值必須完全停止服務后再啟動才能生效,以restart方式重啟動將不會生效。
MaxClients:
#用于伺服客戶端請求的最大接入請求數量(最大線程數)。任何超過MaxClients限制的請求都將進入等候隊列。默認值是"400",16 (ServerLimit)乘以25(ThreadsPerChild)的結果。因此要增加MaxClients的時候,你必須同時增加 ServerLimit的值。筆者建議將初始值設為(以Mb為單位的最大物理內存/2),然后根據負載情況進行動態調整。比如一臺4G內存的機器,那么初始值就是4000/2=2000。
MinSpareThreads:
#最小空閑線程數,默認值是"75"。這個MPM將基于整個服務器監視空閑線程數。如果服務器中總的空閑線程數太少,子進程將產生新的空閑線程。
MaxSpareThreads:
#設置最大空閑線程數。默認值是"250"。這個MPM將基于整個服務器監視空閑線程數。如果服務器中總的空閑線程數太多,子進程將殺死多余的空閑線程。MaxSpareThreads的取值范圍是有限制的。Apache將按照如下限制自動修正你設置的值:worker要求其大于等于 MinSpareThreads加上ThreadsPerChild的和。
ThreadsPerChild:
#每個子進程建立的線程數。默認值是25。子進程在啟動時建立這些線程后就不再建立新的線程了。每個子進程所擁有的所有線程的總數要足夠大,以便可以處理可能的請求高峰。
MaxRequestsPerChild:
#設置每個子進程在其生存期內允許伺服的最大請求數量。到達MaxRequestsPerChild的限制后,子進程將會結束。如果MaxRequestsPerChild為"0",子進程將永遠不會結束。將MaxRequestsPerChild設置成非零值有兩個好處:可以防止(偶然的)內存泄漏無限進行而耗盡內存;
給進程一個有限壽命,從而有助于當服務器負載減輕的時候減少活動進程的數量。
#如果設置為非零值,筆者建議設為10000-30000之間的一個值。
公式:
ThreadLimit >= ThreadsPerChild
MaxClients <= ServerLimit * ThreadsPerChild,并且MaxClients必須是ThreadsPerChild的倍數
MaxSpareThreads >= MinSpareThreads+ThreadsPerChild

接下來配置上面提到的conf/workers.properties文件和conf/uriworkermap.properties文件:

#
# workers.properties
#
# list the workers by name
worker.list=loadBalanceServers, jk_watcher
# Tomcat1
# ------------------------
worker.s1.port=8009
worker.s1.host=192.168.2.219
worker.s1.type=ajp13
worker.s1.lbfactor=10
worker.s1.cachesize=5
worker.s1.connection_pool_size=800
worker.s1.connection_pool_minsize=25
worker.s1.connection_pool_timeout=600
# Tomcat2
# ------------------------
worker.s2.port=8109
worker.s2.host=192.168.2.219
worker.s2.type=ajp13
worker.s2.lbfactor=10
worker.s2.cachesize=5
worker.s1.connection_pool_size=800
worker.s1.connection_pool_minsize=25
worker.s1.connection_pool_timeout=600
worker.loadBalanceServers.type=lb
worker.loadBalanceServers.balanced_workers=s1,s2
worker.loadBalanceServers.sticky_session=false
worker.jk_watcher.type=status
# worker.jk_watcher.read_only=True
worker.jk_watcher.mount=/admin/jk
worker.retries=3
#
# uriworkermap.properties
#
#define all requests will be submitted to load balance servers
#if the condition is satisfied, the filter will validate the next statement until it's not.
#notice the order of the following statements
/*=loadBalanceServers
/jkstatus=jk_watcher
!/*.gif=loadBalanceServers
!/*.jpg=loadBalanceServers
!/*.tif=loadBalanceServers
!/*.png=loadBalanceServers

在配置文件中,以“!”開頭的條件表示“不要”,“=”表示交給。

因此條件“/*=loadBalanceServers”表示將任何請求交給負載均衡服務器。

條件“!/*.jpg=loadBalanceServers”表示不要將.jpg結尾的請求交給負載均衡服務器

apache服務器接收到一個請求后會按照配置文件中的約束條件一個一個地檢查,然后按照最后滿足的匹配條件來決定由哪個worker來處理請求。

經過上面的條件篩選,最符合條件的就是“/*=loadBalanceServers”。因此將請求轉給了負載均衡服務器。

試想一下,如果在apache主目錄下放置了一個名為a.jpg的圖片,訪問路徑為http://127.0.0.1/a.jpg,請求經過該配置的檢查,最后滿足的條件就是“!/*.jpg=loadBalanceServers”,不要將.jpg結尾的請求交給負載均衡服務器,因此apache服務自己處理了該請求。

.jpg是靜態數據,apache由C語言實現,直接針對系統底層進行IO操作,因此靜態性能優良。而tomcat作為Servlet容器,擅長的是J2EE相關業務的解析。因此通過這樣配置可以實現應用的“動靜態分離”,相互取長補短,優化了性能。類似地也可以將.js、.css和.html等等靜態文件按照上述格式填寫到uriworkermap.properties配置文件中。

修改/opt/application/tomcat8080/conf/web.xml,配置web.xml文件只需要在末端web-app前面添加<distributable/>即可;

4682 
4683     <welcome-file-list>
4684         <welcome-file>index.html</welcome-file>
4685         <welcome-file>index.htm</welcome-file>
4686         <welcome-file>index.jsp</welcome-file>
4687     </welcome-file-list>
4688 <distributable/>
4689 </web-app>

修改linux打開文件描述符,修改成65535;

#<domain>      <type>  <item>         <value>
#
*               soft     nofile          65535
*               hard     nofile          65535

[root@Tomcat1-219 conf]# ulimit -a
core file size          (blocks, -c) 0
data seg size           (kbytes, -d) unlimited
scheduling priority             (-e) 0
file size               (blocks, -f) unlimited
pending signals                 (-i) 3831
max locked memory       (kbytes, -l) 64
max memory size         (kbytes, -m) unlimited
open files                      (-n) 65535
pipe size            (512 bytes, -p) 8
POSIX message queues     (bytes, -q) 819200
real-time priority              (-r) 0
stack size              (kbytes, -s) 10240
cpu time               (seconds, -t) unlimited
max user processes              (-u) 3831
virtual memory          (kbytes, -v) unlimited
file locks                      (-x) unlimited

原創文章,作者:zuoyang1990,如若轉載,請注明出處:http://www.www58058.com/40555

(0)
zuoyang1990zuoyang1990
上一篇 2016-08-29
下一篇 2016-08-29

相關推薦

  • 1、安裝配置介紹

    http://note.youdao.com/yws/public/redirect/share?id=b90faa657ee452edb27ab1a13fc7b0bc&type=false

    Linux干貨 2016-08-08
  • LINUX HASH命令

    LINUX:Hash命令 介紹:linux系統下會有一個hash表,剛開始這個hash表為空,每執行過一條命令hash表會緩存下這條命令。Shel優先會查看hash表。 hash緩存表可大大提高命令的調用速率 下面介紹幾個hash常用選項 剛進入系統使用Hash命令 哈希表為空 使用過命令后使用Hash命令 使用過命令后,Hash可顯示緩存的命令 Hash …

    Linux干貨 2017-04-03
  • bash特性

    一、命令歷史     概念:shell進程能夠將之前執行過的命令保存記錄下來     存儲位置:         1、命令歷史的文件             使用以下環境變量查看相關參數:     &…

    Linux干貨 2016-09-19
  • man幫助

                                        正確使用 man幫助      在生產過程中,我們會遇到不同的技術故…

    2017-05-30
  • class16高級磁盤管理(二)網絡管理(一)

    一、高級磁盤管理(二) 邏輯卷管理器快照 快照是特殊的邏輯卷 快照只有在它們和原來的邏輯卷不同時才會消耗空間。 當原來的邏輯卷中有所改變時,會將舊的數據復制到快照中。 建立快照的卷大小只需要原始邏輯卷的15%~20%就夠了。也可以使用lvextend 放大快照。 使用LVM 快照 為現有邏輯卷創建快照 #lvcreate -L …

    Linux干貨 2016-09-05
  • wordpress配置安裝

    1、首先進行lamp框架的搭建 服務器環境:Linux Centos 7.2.1511 64位 內存:2G  磁盤空間100GB IP地址:10.55.10.79 進行httpd,php,php-mysql,mariadb-server的安裝,安裝均使用yum安裝 ~]# yum -y install httpd php php-mysql mar…

    Linux干貨 2016-11-04
欧美性久久久久