基于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來做負載均衡就不說那么多了。
二、網站架構
平臺介紹:
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
再刷新下網頁,成功!
五、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,測試成功!
六、Tomcat服務及集群session會話保持
tomcat體系結構
Tomcat服務器的啟動是基于一個server.xml文件的,Tomcat啟動的時候首先會啟動一個Server,Server里面就會啟動Service,Service里面就會啟動多個"Connector(連接器)",每一個連接器都在等待客戶機的連接,當有用戶使用瀏覽器去訪問服務器上面的web資源時,首先是連接到Connector(連接器),Connector(連接器)是不處理用戶的請求的,而是將用戶的請求交給一個Engine(引擎)去處理,Engine(引擎)接收到請求后就會解析用戶想要訪問的Host,然后將請求交給相應的Host,Host收到請求后就會解析出用戶想要訪問這個Host下面的哪一個Web應用,一個web應用對應一個Context。
下面這張圖更好幫我們理解這種情況:
元素名
|
屬性
|
解釋
|
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
再刷新下網頁:
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