一、Tomcat简介
Tomcat是Apache软件基金会(Apache Software Foundation)的Jakarta 项目中的一个核心项目,由Apache、Sun 和其他一些公司及个人共同开发而成。由于有了Sun 的参与和支持,最新的Servlet 和JSP 规范总是能在Tomcat 中得到体现,Tomcat 5 支持最新的Servlet 2.4 和JSP 2.0 规范。因为Tomcat 技术先进、性能稳定,而且免费,因而深受Java 爱好者的喜爱并得到了部分软件开发商的认可,成为目前比较流行的Web 应用服务器。目前最新版本是7.0。
Tomcat 服务器是一个免费的开放源代码的Web 应用服务器,属于轻量级应用服务器,在中小型系统和并发访问用户不是很多的场合下被普遍使用,是开发和调试JSP 程序的首选。对于一个初学者来说,可以这样认为,当在一台机器上配置好Apache 服务器,可利用它响应对HTML 页面的访问请求。实际上Tomcat 部分是Apache 服务器的扩展,但它是独立运行的,所以当你运行tomcat 时,它实际上作为一个与Apache 独立的进程单独运行的。
当配置正确时,Apache 为HTML页面服务,而Tomcat 实际上运行JSP 页面和Servlet。另外,Tomcat和IIS、Apache等Web服务器一样,具有处理HTML页面的功能,另外它还是一个Servlet和JSP容器,独立的Servlet容器是Tomcat的默认模式。不过,Tomcat处理静态HTML的能力不如Apache服务器。目前Tomcat最新版本为7.0.39。
Tomcat最初是由Sun的软件构架师詹姆斯·邓肯·戴维森开发的。后来他帮助将其变为开源项目,并由Sun贡献给Apache软件基金会。由于大部分开源项目O'Reilly都会出一本相关的书,并且将其封面设计成某个动物的素描,因此他希望将此项目以一个动物的名字命名。因为他希望这种动物能够自己照顾自己,最终,他将其命名为Tomcat(英语公猫或其他雄性猫科动物)。而O'Reilly出版的介绍Tomcat的书籍(ISBN 0-596-00318-8)[1]的封面也被设计成了一个公猫的形象。而Tomcat的Logo兼吉祥物也被设计成了一只公猫。
二、Java环境JDK的部署
2.1、JAVA介绍
JAVA组件主要包括四个独立却又彼此相关的技术:
java程序语言设计、java api、java class、JVM。其中JVM是java虚拟机,不同的系统上通过部署JVM来实现java程序的解析和运行,这样就实现了java的哲学原理:一次编译、到处运行!
JVM的实现方式:
一次解释器,解释字节并执行,是一句一句的进行解析;
即时编译器,解释后的数据会缓存下来,需要更多的内存来缓存解释后的结果;
自适应编译器:缓存20%的代码,提高80%左右的速度,此遵循“二八法则”!
JVM的种类:
sun的HotSpot JVM,其包括JRE和JDK,JRE只是实现java的运行环境,而JDK中包涵了JAVA的开发环境和运行环境;
开源的OpenJDK:其类似于JDK,也是实现开发和运行环境的组合。
JAVA根据应用领域的不同,java可分为两类
java SE:标准版,早先叫J2SE
java EE:企业版,J2EE
jave ME:移动版,J2ME
2.2、JAVA环境JDK安装和配置
java环境的安装可以使rpm、通用二进制、源码编译方式进行安装,这里使用通用二进制的bin格式的包来进行安装
使用jdk-6u21-linux-x64-rpm.bin包进行安装
12
|
[root@localhost ~]# chmod +x jdk-6u21-linux-x64-rpm.bin #增加执行权限 [root@localhost ~]# ./jdk-6u21-linux-x64-rpm.bin #安装jdk |
默认的安装目录是在/usr/java 目录下,其中有/usr/java/ jdk1.6.0_21/bin/目录下是java的常用命令
设置环境变量、使系统可以调用JDK环境
1234567
|
[root@localhost java]# vim /etc/profile.d/java.sh #添加环境变量,增加如下内容 JAVA_HOME=/usr/java/jdk1. 6 .0_21 export PATH=$PATH:$JAVA_HOME/bin [root@localhost java]# . /etc/profile.d/java.sh #执行下脚本,使环境立即生效 [root@localhost ~]# java –version #查看java的版本等信息 |
java的相关参数:
123456789101112131415
|
-XX:+<option>开启此参数指定的功能 -XX:-<option>关闭功能 -XX:<option>=<value>给option指定的选项赋值 -XX:+PrintFlagsFinal显示所有参数 -D<name>=<value>:设置系统参数 java的相关监控命令 jps:JVM Process Status Toll,显示指定系统内所有使用Hotspot虚拟机进程的列表信息 jstat:JVM Statistic Monitoring Tool:收集并显示Hotspot虚拟机各方面的运行数据 jinfo:显示正在运行的Hotspot虚拟机的配置信息-sysprops pid 显示某个虚拟机的配置信息的 jmap:生成某hotspot虚拟机的内存转储快照,用于调试 可视化工具: jconsole:java的监控与管理控制台 jvisualvm:java的虚拟平台的可视化工具 fg:使用jconsole工具 [root@localhost jdk1. 6 .0_21]# jconsole #会启动一个图形界面 |
1 |
[root@localhost bin]# jvisualvm #也是一个可视化工具 |
三、tomcat的安装和配置
3.1、tomcat的架构运行层次如下图
上图解释:
server:在最外层,每个server就是一个tomcat实例。又叫*组件
service服务:将一个和多个连接器关联到一个引擎上。一个service内部只能有一个引擎。
Engine,引擎:servlet的实现jvm,能够解码别人发来的请求,其内部有一个web服务器,其可以工作在80端口上。定义的时候需要定义一个默认主机,来响应没有指定主机的访问。
HOST:容器内的主机,类似apache的虚拟主机,主机可以有多了
Context,主机内的,类似于路径别名的定义
连接器:将server和引擎连接起来的工具。
其配置结构如下,配置文件为server.xml
12345678910
|
<Server> <Service> <Connector /> <Engine> <Host> <Context> </Context> </Host> </Engine> </Service> </Server> |
3.2、tomcat安装
此处使用最新版安装:apache-tomcat-7.0.40.tar.gz
12345
|
[root@localhost ~]# tar xf apache-tomcat- 7.0 . 40 .tar.gz -C /usr/local/ #解压到/usr/local [root@localhost ~]# cd /usr/local/ [root@localhost local]# ln -sv apache-tomcat- 7.0 . 40 tomcat #创建个连接文件 |
配置文件:
所有配置文件都在tomcat的安装目录下的conf目录内
主配置文件server.xml详解
12345678910
|
启动tomcat 要想启动tomcat,首先需要输出环境变量,建立tomcat的环境变量 [root@localhost conf]# vim /etc/profile.d/tomcat.sh #编辑环境变量,添加如下内容 export CATALINA_HOME=/usr/local/tomcat export PATH=$PATH:$CATALINA_HOME/bin [root@localhost conf]# . /etc/profile.d/tomcat.sh #执行下脚本,使其加入到环境变量内来 [root@localhost bin]# catalina.sh version #查看服务运行情况,也可以使用 var sion.sh |
启动tomcat
[root@localhost ~]# catalina.sh start
至此我们的tomcat已经能够起来了,访问以下网页测试以下
123
|
[root@localhost tomcat]# ls work/Catalina/localhost/_/org/apache/jsp/ index_jsp. class index_jsp.java #java解析的工作目录,把index转换为. class 和index.java |
3.3、添加一个tomcat的服务脚本,便于管理tomcat服务
12345678910
|
[root@localhost ~]# vim /etc/init.d/tomcat #建立服务脚本,添加如下内容 #!/bin/sh # Tomcat init script for Linux. # chkconfig: 2345 96 14 # description: The Apache Tomcat servlet/JSP container. JAVA_HOME=/usr/java/latest CATALINA_HOME=/usr/local/tomcat export JAVA_HOME CATALINA_HOME exec $CATALINA_HOME/bin/catalina.sh $* |
为其增加执行权限并增加至系统服务列表
123
|
[root@localhost ~]# chmod +x /etc/init.d/tomcat [root@localhost ~]# chkconfig --add tomcat [root@localhost ~]# chkconfig --list tomcat |
关闭和启动服务就可以通过系统服务那样进行了
12
|
[root@localhost ~]# service tomcat stop [root@localhost ~]# service tomcat start |
上面提到的管理接口的时候需要用户名和密码
在tomcat-users.xml定义用户和密码,然后通过输入用户名和密码进行认证进入管理接口
123
|
[root@localhost conf]# vim tomcat-users.xml #编辑tomcat的用户配置文件,在注释行外面添加如下内容 <role rolename= "manager-gui" /> <user username= "chris" password= "chris" roles= "manager-gui" /> #roles有三种:manager-gui实现状态和Manager App查看和管理;manger-status实现Host Manager功能,如果一个用户需要使用多个角色,角色中间使用逗号隔开即可,例如roles=“manger-status,admin-gui” |
测试如下:
此时我们通过刚才的设置,用户还没有Host Manager的权限,如果想要管理主机,可以在刚才的roles的设置里增加上admin-gui角色即可!
四、架构Nginx实现反向代理tomcat
4.1、自己先部署一个jsp的网站、方便下面的操作,使用JavaCenter_Home_2.0_GBK.tar.bz2
在server.xml内新建一个虚拟主机
123456
|
[root@localhost ~]# vim /usr/local/tomcat/conf/server.xml #编辑配置文件,添加如下内容 <Engine name= "Catalina" defaultHost= "www.chris.com" > #把默认引擎修改为我们自己的主机,方便测试 <Host name= "www.chris.com" appBase= "/web" unpackWARs= "ture" autoDeploy= "ture" > <Context path= "/" docBase= "webapp" reloadable= "ture" /> </Host> |
由于使用的是基于主机名的虚拟主机,所以需要先能解析:
1234567
|
[root@localhost webapp]# vim /etc/hosts #添加如下内容 172.16 . 7.20 www.chris.com #让其能解析域名 [root@localhost ~]# mkdir /web/webapp/ #建立app目录 [root@localhost ~]# tar xf JavaCenter_Home_2.0_GBK.tar.bz2 #解压网页 [root@localhost ~]# mv JavaCenter_Home_2.0_GBK/* /web/webapp/ #所有文件移到app目录 注意:此网站依赖于mysql,利用yum安装下mysql [root@localhost ~]# yum –y install mysql-server |
安装JavaCenter
创建数据库和用户名
123
|
[root@localhost ~]# mysql mysql> CREATE DATABASE jcenter; mysql> GRANT ALL ON jcenter.* TO 'jcenter' @ 'localhost' IDENTIFIED BY 'chris' ; |
安装配置以后,可以进入主页,显示如下
4.2、Nginx+tomcat实现其反向代理
架构图如下
安装并配置nginx
安装环境:
1234
|
Development Libraries和Development Tools [root@node1 ~]# groupadd -r -g 106 nginx [root@node1 ~]# useradd -r -g 106 nginx [root@node1 ~]# yum -y install opessl-devel pcre-devel |
安装nginx
1234
|
[root@node1 nginx- 1.4 . 1 ]# cd nginx- 1.4 . 1 [root@node1 nginx- 1.4 . 1 ]# cd nginx- 1.4 . 1 [root@node1 nginx- 1.4 . 1 ]# ./configure --prefix=/usr --sbin-path=/usr/sbin/nginx --conf-path=/etc/nginx/nginx.conf --error-log-path=/ var /log/nginx/error.log --http-log-path=/ var /log/nginx/access.log --pid-path=/ var /run/nginx/nginx.pid --lock-path=/ var /lock/nginx.lock --user=nginx --group=nginx -- with -http_ssl_module -- with -http_flv_module -- with -http_stub_status_module -- with -http_gzip_static_module --http-client-body-temp-path=/ var /tmp/nginx/client/ --http-proxy-temp-path=/ var /tmp/nginx/proxy/ --http-fastcgi-temp-path=/ var /tmp/nginx/fcgi/ --http-uwsgi-temp-path=/ var /tmp/nginx/uwsgi --http-scgi-temp-path=/ var /tmp/nginx/scgi -- with -pcre [root@node1 nginx- 1.4 . 1 ]# make && make install |
提供nginx的服务配置脚本
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127
|
[root@node1 nginx- 1.4 . 1 ]# vim /etc/init.d/nginx 添加如下内容 #!/bin/sh # # nginx - this script starts and stops the nginx daemon # # chkconfig: - 85 15 # description: Nginx is an HTTP(S) server, HTTP(S) reverse \ # proxy and IMAP/POP3 proxy server # processname: nginx # config: /etc/nginx/nginx.conf # config: /etc/sysconfig/nginx # pidfile: / var /run/nginx.pid # Source function library. . /etc/rc.d/init.d/functions # Source networking configuration. . /etc/sysconfig/network # Check that networking is up. [ "$NETWORKING" = "no" ] && exit 0 nginx= "/usr/sbin/nginx" prog=$(basename $nginx) NGINX_CONF_FILE= "/etc/nginx/nginx.conf" [ -f /etc/sysconfig/nginx ] && . /etc/sysconfig/nginx lockfile=/ var /lock/subsys/nginx make_dirs() { # make required directories user=`nginx -V 2 >& 1 | grep "configure arguments:" | sed 's/[^*]*--user=\([^ ]*\).*/\1/g' -` options=`$nginx -V 2 >& 1 | grep 'configure arguments:' ` for opt in $options; do if [ `echo $opt | grep '.*-temp-path' ` ]; then value=`echo $opt | cut -d "=" -f 2 ` if [ ! -d "$value" ]; then # echo "creating" $value mkdir -p $value && chown -R $user $value fi fi done } start() { [ -x $nginx ] || exit 5 [ -f $NGINX_CONF_FILE ] || exit 6 make_dirs echo -n $ "Starting $prog: " daemon $nginx -c $NGINX_CONF_FILE retval=$? echo [ $retval -eq 0 ] && touch $lockfile return $retval } stop() { echo -n $ "Stopping $prog: " killproc $prog -QUIT retval=$? echo [ $retval -eq 0 ] && rm -f $lockfile return $retval } restart() { configtest || return $? stop sleep 1 start } reload() { configtest || return $? echo -n $ "Reloading $prog: " killproc $nginx -HUP RETVAL=$? echo } force_reload() { restart } configtest() { $nginx -t -c $NGINX_CONF_FILE } rh_status() { status $prog } rh_status_q() { rh_status >/dev/ null 2 >& 1 } case "$1" in start) rh_status_q && exit 0 $ 1 ;; stop) rh_status_q || exit 0 $ 1 ;; restart|configtest) $ 1 ;; reload) rh_status_q || exit 7 $ 1 ;; force-reload) force_reload ;; status) rh_status ;; condrestart| try -restart) rh_status_q || exit 0 ;; *) echo $ "Usage: $0 {start|stop|status|restart|condrestart|try-restart|reload|force-reload|configtest}" exit 2 esac |
增加权限并加入服务列表
123
|
[root@node1 nginx- 1.4 . 1 ]# chmod +x /etc/init.d/nginx [root@node1 nginx- 1.4 . 1 ]# chkconfig --add nginx [root@node1 nginx]# service nginx start |
保证nginx是能正常访问
修改配置文件,让请求其连接都代理至后端tomcat服务器、并定义使用缓存来缓存静态内容
123456789101112131415161718192021222324252627282930
|
http { include mime.types; default_type application/octet-stream; sendfile on; keepalive_timeout 65 ; proxy_cache_path /nginx/cache levels= 1 : 2 keys_zone=first:10m inactive=24h max_size=1g; upstream backend { server 192.168 . 0.1 weight= 1 ; } #gzip on; server { listen 80 ; server_name localhost; #charset koi8-r; index index.jsp index.html; #access_log logs/host.access.log main; location ~* "\.(jsp|do)$" { proxy_pass http: } location / { root html; rewrite / http: } location ~* "\.(jpg|jpeg|png|gif|html|css)$" { proxy_pass http: proxy_cache first; proxy_cache_valid 200 24h; proxy_cache_valid 302 10m; add_header X-Cache-Status $upstream_cache_status; } |
nginx.conf内只需要修改上面的内容即可,其详细解释如下图
通过以上配置我们实现了nginx反向代理tomcat的架构!测试如下:
至此我们的nginx实现tomcat的反向代理已经搭建成功,并且实现了动态网页代理到后端tomcat服务器上,静态网页缓存到本地!
五、Apache使用mod_jk和mod_proxy反向代理tomcat
5.1基本介绍
httpd通过mod_proxy或者mod_jk模块来对tomcat进行反向代理,而且其比Nginx的强大,Nginx的反向代理只能通过http协议进行代理,而apache既可以代理http协议,还可以代理ajp协议,而且mod_proxy 还可以实现session会话的绑定。mod_jk其开发就是对tomcat做反向代理的,通过apache反向代理tomcat的时候,我们可以在tomcat上禁止http连接器,从而来防止前端客户和tomcat通信,所有的连接都是通过apache的代理进来,这样可以增加后端主机的安全性!
5.2、环境配置和架构
Apache上网络基本配置
123456789101112
|
外网IP DEVICE=eth0 BOOTPROTO= static IPADDR= 172.16 . 7.6 NETMASK= 255.255 . 0.0 ONBOOT=yes 内网IP DEVICE=eth1 BOOTPROTO= static IPADDR= 192.168 . 0.2 NATMASK= 255.255 . 255.0 ONBOOT=yes |
Tomcat1上基本网络设置和域名解析文件
123456789101112
|
vim /etc/sysconfig/network-scripts/ifcfg-eth0 修改为如下内容 DEVICE= "eth0" BOOTPROTO= "static" GATEWAY= "192.168.0.2" IPADDR= "192.168.0.1" NETMASK= "255.255.255.0" NM_CONTROLLED= "yes" ONBOOT= "yes" TYPE= "Ethernet" 设置域名解析hosts文件 vim /etc/hosts 192.168 . 0.1 tomcat1.chris.com |
Tomcat2上基本网络配置和域名解析文件
123456789101112
|
vim /etc/sysconfig/network-scripts/ifcfg-eth0 修改为如下内容 DEVICE= "eth0" BOOTPROTO= "static" GATEWAY= "192.168.0.2" IPADDR= "192.168.0.3" NETMASK= "255.255.255.0" NM_CONTROLLED= "yes" ONBOOT= "yes" TYPE= "Ethernet" 设置域名解析hosts文件 vim /etc/hosts 192.168 . 0.3 tomcat2.chris.com |
5.3、在tomcat1和tomcat2上配置java环境并设置,然后建立测试主页
配置和设置环境上面已经详细介绍过,这里不在重述,只配置下虚拟主机和测试网页
tomcat1
虚拟主机的配置
1234567
|
[root@localhost ~]# vim /usr/local/tomcat/conf/server.xml #编辑配置文件,修改为以下内容 <Engine name= "Catalina" defaultHost= "tomcat1.chris.com" > <Host name= "tomcat1.chris.com" appBase= "/web" unpackWARs= "true" autoDeploy= "true" > <Context path= "/" docBase= "webapp" reloadable= "ture" /> </Host> 测试页面为前面搭建的jscent |
tomcat2
123456
|
[root@localhost ~]# vim /usr/local/tomcat/conf/server.xml #编辑配置文件,修改为以下内容 <Engine name= "Catalina" defaultHost= "tomcat2.chris.com" > <Host name= "tomcat2.chris.com" appBase= "/web" unpackWARs= "true" autoDeploy= "true" > <Context path= "/" docBase= "webapp" reloadable= "ture" /> </Host> |
设置数据库并创建用户名和设置权限
12345
|
[root@localhost webapp]# mysql mysql> create database jsprun; mysql> grant all on jsprun.* to 'jsprun' @ 'localhost' identified by 'chris' ; 安装、初始化jsprun http: |
测试页面为前面搭建的jsprun,页面如下
5.4、安装配置apache
httpd-2.4.4安装依赖的较新apr-1.4.6.tar.bz2和 apr-util-1.5.2.tar.bz2,由于系统上的apr还被别软件所依赖,不能直接卸载,所以这里采用编译源码安装的方式进行
编译安装apr
1234
|
[root@node1 ~]# tar xf apr- 1.4 . 6 .tar.bz2 [root@node1 ~]# cd apr- 1.4 . 6 [root@node1 apr- 1.4 . 6 ]# ./configure --prefix=/usr/local/apr --disable-ipv6 [root@node1 apr- 1.4 . 6 ]# make && make install |
编译安装apr-util
1234
|
[root@node1 ~]# tar xf apr-util- 1.5 . 2 .tar.bz2 [root@node1 ~]# cd apr-util- 1.5 . 2 [root@node1 apr-util- 1.5 . 2 ]# ./configure --prefix=/usr/local/apr-util -- with -apr=/usr/local/apr [root@node1 apr-util- 1.5 . 2 ]# make && make install |
编译安装httpd
1234
|
[root@node1 ~]# tar xf httpd- 2.4 . 4 .tar.bz2 [root@node1 ~]# cd httpd- 2.4 . 4 [root@node1 httpd- 2.4 . 4 ]# ./configure --prefix=/usr/local/apache --sysconfdir=/etc/httpd --enable-so --enable-ssl --enable-cgi --enable-rewrite -- with -zlib -- with -pcre -- with -apr=/usr/local/apr -- with -apr-util=/usr/local/apr-util --enable-mpms-shared=all -- with -mpm=event --enable-proxy --enable-proxy-http --enable-proxy-ajp --enable-proxy-balancer --enable-lbmethod-heartbeat --enable-heartbeat --enable-slotmem-shm --enable-slotmem-plain --enable-watchdog [root@node1 httpd- 2.4 . 4 ]# make && make install |
配置httpd服务,增加服务脚本
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293
|
[root@node1 httpd- 2.4 . 4 ]# vim /etc/init.d/httpd #!/bin/bash # # httpd Startup script for the Apache HTTP Server # # chkconfig: - 85 15 # description: Apache is a World Wide Web server. It is used to serve \ # HTML files and CGI. # processname: httpd # config: /etc/httpd/conf/httpd.conf # config: /etc/sysconfig/httpd # pidfile: / var /run/httpd.pid # Source function library. . /etc/rc.d/init.d/functions if [ -f /etc/sysconfig/httpd ]; then . /etc/sysconfig/httpd fi # Start httpd in the C locale by default . HTTPD_LANG=${HTTPD_LANG- "C" } # This will prevent initlog from swallowing up a pass-phrase prompt if # mod_ssl needs a pass-phrase from the user. INITLOG_ARGS= "" # Set HTTPD=/usr/sbin/httpd.worker in /etc/sysconfig/httpd to use a server # with the thread-based "worker" MPM; BE WARNED that some modules may not # work correctly with a thread-based MPM; notably PHP will refuse to start. # Path to the apachectl script, server binary, and short-form for messages. apachectl=/usr/local/apache/bin/apachectl httpd=${HTTPD-/usr/local/apache/bin/httpd} prog=httpd pidfile=${PIDFILE-/ var /run/httpd.pid} lockfile=${LOCKFILE-/ var /lock/subsys/httpd} RETVAL= 0 start() { echo -n $ "Starting $prog: " LANG=$HTTPD_LANG daemon --pidfile=${pidfile} $httpd $OPTIONS RETVAL=$? echo [ $RETVAL = 0 ] && touch ${lockfile} return $RETVAL } stop() { echo -n $ "Stopping $prog: " killproc -p ${pidfile} -d 10 $httpd RETVAL=$? echo [ $RETVAL = 0 ] && rm -f ${lockfile} ${pidfile} } reload() { echo -n $ "Reloading $prog: " if ! LANG=$HTTPD_LANG $httpd $OPTIONS -t >&/dev/ null ; then RETVAL=$? echo $ "not reloading due to configuration syntax error" failure $ "not reloading $httpd due to configuration syntax error" else killproc -p ${pidfile} $httpd -HUP RETVAL=$? fi echo } # See how we were called. case "$1" in start) start ;; stop) stop ;; status) status -p ${pidfile} $httpd RETVAL=$? ;; restart) stop start ;; condrestart) if [ -f ${pidfile} ] ; then stop start fi ;; reload) reload ;; graceful|help|configtest|fullstatus) $apachectl $@ RETVAL=$? ;; *) echo $ "Usage: $prog {start|stop|restart|condrestart|reload|status|fullstatus|graceful|help|configtest}" exit 1 esac exit $RETVAL |
增加执行权限
1 |
[root@node1 httpd- 2.4 . 4 ]# chmod +x /etc/init.d/httpd |
加入系统服务列表
123
|
[root@node1 httpd- 2.4 . 4 ]# chkconfig --add httpd [root@node1 httpd- 2.4 . 4 ]# chkconfig httpd on [root@node1 httpd- 2.4 . 4 ]# chkconfig --list httpd |
增加环境变量
123
|
[root@node1 ~]# vim /etc/profile.d/httpd.sh 添加如下内容 export PATH=$PATH:/usr/local/apache/bin [root@node1 ~]# . /etc/profile.d/httpd.sh |
反向代理的配置
12345678
|
httpd -D DUMP_MODULES 查看httpd的模块 proxy_module (shared) proxy_http_module (shared) proxy_ajp_module (shared) lbmethod_byrequests_module (shared) #根据请求做负载均衡 lbmethod_bytraffic_module (shared) #根据流量做负载均衡 lbmethod_bybusyness_module (shared) #根据繁忙程度负载均衡 lbmethod_heartbeat_module (shared) #heartbeat模块 |
修改配置文件/etc/httpd/httpd.conf
12345678910
|
注释中心主机 增加虚拟主机的配置文件 #DocumentRoot "/usr/local/apache/htdocs" ServerRoot "/usr/local/apache" PidFile "/var/run/httpd.pid" # 增加pid # Virtual hosts #Include /etc/httpd/extra/httpd-vhosts.conf Include /etc/httpd/extra/httpd-proxy.conf LoadModule slotmem_shm_module modules/mod_slotmem_shm.so #启动这两个模块,被proxy使用的 LoadModule slotmem_plain_module modules/mod_slotmem_plain.so |
增加虚拟主机配置
123456789101112
|
[root@node1 logs]# vim /etc/httpd/extra/httpd-proxy.conf 添加如下内容 <VirtualHost *: 80 > ProxyRequests Off ProxyPass / http: ProxyPassReverse / http: <Proxy *> Require all granted </Proxy> <Location / > Require all granted </Location> </VirtualHost> |
配置参数解释
ProxyPreserveHost {On|Off}:如果启用此功能,代理会将用户请求报文中的Host:行发送给后端的服务器,而不再使用ProxyPass指定的服务器地址。如果想在反向代理中支持虚拟主机,则需要开启此项,否则就无需打开此功能。
ProxyVia {On|Off|Full|Block}:用于控制在http首部是否使用Via:,主要用于在多级代理中控制代理请求的流向。默认为Off,即不启用此功能;On表示每个请求和响应报文均添加Via:;Full表示每个Via:行都会添加当前apache服务器的版本号信息;Block表示每个代理请求报文中的Via:都会被移除。
ProxyRequests {On|Off}:是否开启apache正向代理的功能;启用此项时为了代理http协议必须启用mod_proxy_http模块。同时,如果为apache设置了ProxyPass,则必须将ProxyRequests设置为Off。
ProxyPass [path] !|url [key=value key=value ...]]:将后端服务器某URL与当前服务器的某虚拟路径关联起来作为提供服务的路径,path为当前服务器上的某虚拟路径,url为后端服务器上某URL路径。使用此指令时必须将ProxyRequests的值设置为Off。需要注意的是,如果path以“/”结尾,则对应的url也必须以“/”结尾,反之亦然。
重启服务,测试如下
至此我们实现了利用mod_proxy实现了一个tomcat的代理
==============================================================
下面配置下mod_jk模块进行配置实现反向代理功能
mod_jk是ASF的一个项目,是一个工作于apache端基于AJP协议与Tomcat通信的连接器,它是apache的一个模块,是AJP协议的客户端(服务端是Tomcat的AJP连接器)。,在apache服务器上安装
编译、安装tomcat-connectors
1234
|
[root@node1 ~]# tar xf tomcat-connectors- 1.2 . 37 -src.tar.gz [root@node1 ~]# cd tomcat-connectors- 1.2 . 37 -src/ native / [root@node1 native ]# ./configure -- with -apxs=/usr/local/apache/bin/apxs #编译apache的模块 [root@node1 native ]# make && make install |
apache要使用mod_jk连接器,需要在启动时加载此连接器模块。为了便于管理与mod_jk模块相关的配置,这里使用一个专门的配置文件/etc/httpd/extra/httpd-jk.conf来保存相关指令及其设置。其内容如下:
123456789
|
# Load the mod_jk LoadModule jk_module modules/mod_jk.so JkWorkersFile /etc/httpd/extra/workers.properties jk配置文件 JkLogFile logs/mod_jk.log JkLogLevel debug JkMount /* TomcatA 把那个uri路径送到那个tomcat上去,TomcatA是jvm的名称 为了让apache能使用/etc/httpd/extra/httpd-jk.conf配置文件中的配置信息,需要编辑/etc/httpd/httpd.conf,添加如下一行: Include /etc/httpd/extra/httpd-jk.conf |
对于apache代理来说,每一个后端的Tomcat实例中的engine都可以视作一个worker,而每一个worker的地址、连接器的端口等信息都需要在apache端指定以便apache可以识别并使用这些worker。约定俗成,配置这些信息的文件通常为workers.properties,其具体路径则是使用前面介绍过的JkWorkersFile指定的,在apache启动时,mod_jk会扫描此文件获取每一个worker的配置信息。比如,我们这里使用/etc/httpd/extra/workers.properties。
配置apache实用mod_jk模块
1234567
|
[root@node1 bin]# vim /etc/httpd/extra/httpd-jk.conf 添加 如下内容 LoadModule jk_module modules/mod_jk.so JkWorkersFile /etc/httpd/extra/workers.properties JkLogFile logs/mod_jk.log JkLogLevel debug JkMount /* tomcat1 #tomcat1 必须和workers.properties内定义的相同 JkMount /jkstatus/ stat1 |
根据前文中的指定,这里使用/etc/httpd/extra/workers.properties来定义一个名为TomcatA的worker,并为其指定几个属性。文件内容如下:
1234567
|
[root@node1 bin]# vim /etc/httpd/extra/workers.properties worker.list = tomcat1,stat1 worker.tomcat1.type = ajp13 worker.tomcat1.host = 192.168 . 0.1 worker.tomcat1.port = 8009 worker.tomcat1.lbfactor= 1 worker.stat1.type = status |
重启httpd服务,并进行测试
[root@node1 bin]# service httpd restart
测试页面如下
通过上面的配置和测试,现在已经实现了apache基于mod_proxy和mod_jk反向代理tomcat,下面我们通过apache和两个tomcat实现负载均衡
tomcat1上的配置
修改配置文件,增加jvmRoot的定义,这是集群中必须配置的参数
12
|
[root@localhost ~]# vim /usr/local/tomcat/conf/server.xml #修改下面参数 <Engine name= "Catalina" defaultHost= "tomcat1.chris.com" jvmRoot= "tomcat1" > |
重启服务使其生效
1 |
[root@localhost webapp]# service tomcat stop |
tomcat2上的配置
1234
|
[root@localhost ~]# vim /usr/local/tomcat/conf/server.xml #修改下面参数 <Engine name= "Catalina" defaultHost= "tomcat2.chris.com" jvmRoot=tomcat2 "" > [root@localhost webapp]# service tomcat start [root@localhost webapp]# service tomcat stop |
两台tomcat服务器上只需要修改上面这两个参数,下面在apache上进行配置
基于mod_jk的负载均衡
1234567
|
修改/etc/httpd/extra/httpd-jk.conf为如下内容: LoadModule jk_module modules/mod_jk.so JkWorkersFile /etc/httpd/extra/workers.properties JkLogFile logs/mod_jk.log JkLogLevel debug JkMount /* lbcluster1 #lbcluster1集群名称 JkMount /jkstatus/ stat1 |
编辑/etc/httpd/extra/workers.properties,添加如下内容:
12345678910111213
|
worker.list = lbcluster1,stat1 --lbcluster1集群名称 worker.TomcatA.type = ajp13 worker.TomcatA.host = 172.16 . 100.1 worker.TomcatA.port = 8009 worker.TomcatA.lbfactor = 5 worker.TomcatB.type = ajp13 worker.TomcatB.host = 172.16 . 100.2 worker.TomcatB.port = 8009 worker.TomcatB.lbfactor = 5 worker.lbcluster1.type = lb 负载均衡work,lb内置的类 worker.lbcluster1.sticky_session = 1 会话绑定 worker.lbcluster1.balance_workers = TomcatA, TomcatB 集群中的实列 worker.stat1.type = status |
重启服务,使配置生效
[root@node1 ~]# service httpd restart
测试访问,已经代理到不同的后端 主机上了
基于mod_proxy的负载均衡
先禁用上面基于mod_jk的配置文件
123
|
[root@node1 ~]# vim /etc/httpd/httpd.conf Include /etc/httpd/extra/httpd-proxy.conf #启用mod_proxy的配置 #Include /etc/httpd/extra/httpd-jk.conf #禁用mod_jk的配置 |
配置proxy负载均衡
在httpd.conf的全局配置中配置如下内容:
12345
|
ProxyRequests Off <proxy balancer: BalancerMember ajp: BalancerMember ajp: </proxy> |
在虚拟主机中实现代理
12345
|
<VirtualHost *: 80 > ServerName www.magedu.com ProxyPass / balancer: ProxyPassReverse / balancer: </VirtualHost> |
测试结果如下
至此实现了apache基于mod_jk和mod_proxy的负载均衡的反向代理的功能。这两个模块的配置原理大致相同,就是所使用的命令和配置位置有点小出入,需要注意下!
由于配置过程中命令繁多,难免会出现错误,还望各位大牛们指出~~谢谢!
本文出自 “Chris—on the way” 博客,请务必保留此出处http://chrinux.blog.51cto.com/6466723/1211622