Apache+Tomcat整合
Tomcat作为一个Servlet容器,可以用于运行Java Web应用程序并提供Web服务,它内置了一个HTTP服务器,可以处理HTTP请求和响应。但是,Tomcat的HTTP服务器功能相对较为简单,对于一些特定的需求,可能无法满足用户的要求。
因此,有时候我们需要引入Apache或其他专门的HTTP服务器,来进一步扩展Tomcat的功能和灵活性,例如:
- 静态文件处理:Tomcat的HTTP服务器主要是用于处理Servlet/JSP请求和响应,对于静态文件的处理能力不够强大,而Apache或其他HTTP服务器具备更为强大的静态文件处理能力,能够更好地处理静态文件,提高网站性能。
- 负载均衡:Apache可以通过mod_jk或mod_proxy将请求转发到多个Tomcat实例,从而实现负载均衡,提高Web应用程序的可伸缩性和可用性。
- 安全性:Apache提供了更加丰富的安全性配置选项,例如基于IP的访问控制、SSL/TLS加密、安全认证等,可以更好地保护Web应用程序的安全。
- URL重写:Apache可以通过mod_rewrite模块对URL进行重写,从而优化URL的结构和SEO效果。
综上所述,虽然Tomcat已经具备了HTTP服务器的功能,但在某些特定场景下,我们仍然需要引入Apache或其他HTTP服务器来补充Tomcat的不足,从而提高Web应用程序的性能、可伸缩性和安全性。
所以这章内容我们来讲讲怎么配置与实现apache+tomcat的整合实现动静分离与负载均衡
环境
- tomcat
tar xf apache-tomcat-8.5.20.tar.gz -C /usr/local ln -s /usr/local/apache-tomcat-8.5.20 /usr/local/tomcat
- apache
yum -y install httpd systemctl start httpd
- jdk
mkdir -p /usr/java tar xf jdk-8u60-linux-x64.tar.gz -C /usr/java
通过JK实现动静分离
JK方式是一种常用的将Apache和Tomcat整合的方法。JK代表的是Java Connector,它是一个Apache模块,负责将请求从Apache服务器转发到Tomcat服务器。
JK 是通过 AJP 协议与 Tomcat 服务器进行通讯的,Tomcat 默认的 AJP Connector 的端口是 8009。JK 本身提供了一个监控以及管理的页面 jkstatus,通过 jkstatus 可以监控 JK 目前的工作状态以及对到 tomcat 的连接进行设置。
下载和安装mod_jk模块。mod_jk是一个Apache模块,可以将请求从Apache服务器转发到Tomcat服务器。可以在Apache官方网站下载mod_jk模块的最新版本。
编译mod_jk.so
wget -c https://dlcdn.apache.org/tomcat/tomcat-connectors/jk/tomcat-connectors1.2.48-src.tar.gz --no-check-certificate tar xf tomcat-connectors-1.2.48-src.tar.gz -C /usr/local/src/ cd /usr/local/src/tomcat-connectors-1.2.48-src/native/ yum install -y httpd-devel ./configure --with-apxs=/usr/bin/apxs make && make install
创建测试页面
# 创建静态页面 vim /var/www/html/index.html <h1>static_page_from_apache</h1> # 创建动态页面 vim /usr/local/tomcat/webapps/ROOT/test.jsp <h1>dynamic_page_from_tomcat</h1>
配置jk模块
[root@node1 ~]# cat /etc/httpd/conf.d/mod_jk.conf # 载入 mod_jk 模块 LoadModule jk_module modules/mod_jk.so # 指定 workers.properties 文件的位置 JkWorkersFile conf/workers.properties # 指定 mod_jk 日志文件的位置,并将日志级别设置为 'info' JkLogFile /var/log/httpd/mod_jk.log JkLogLevel info # 设置 mod_jk 日志格式 JkLogStampFormat "[%a %b %d %H:%M:%S %Y]" # 设置 mod_jk 的选项 JkOptions +ForwardKeySize +ForwardURICompatUnparsed -ForwardDirectories # 设置 mod_jk 请求日志格式 JkRequestLogFormat "%w %V %T" # 将指定的 URL 映射到 'worker1' worker JkMount /*.jsp worker1 JkMount /servlet/* worker1 JkMount /*.do worker1 JkMount /*.action worker1 # 将 /jkstatus URL 映射到 'status' worker JkMount /jkstatus status [root@node1 ~]# cat /etc/httpd/conf/workers.properties #路径根据实际情况填写 workers.tomcat_home=/usr/local/tomcat/ workers.java_home=/usr/java/jdk1.8.0_261-amd64 worker.list=worker1 # Set properties for worker1 下面的都可以不用修改,感兴趣可以搜索相关含义 worker.worker1.type=ajp13 worker.worker1.host=localhost worker.worker1.port=8009 worker.worker1.lbfactor=50 #worker.worker1.cachesize=10 #worker.worker1.cache_timeout=600 #worker.worker1.socket_keepalive=1 #worker.worker1.socket_timeout=300 worker.list = status worker.status.type=status
配置文件可以参考/usr/local/src/tomcat-connectors-1.2.48-src/conf/httpd-jk.conf
启动apache和tomcat测试。
systemctl restart httpd tomcat
Apache+Tomcat负载均衡
Tomcat1:192.168.133.150
Tomcat2:192.168.133.130
在tomcat2上配置好tomcat和jdk
配置测试页
# cd /usr/local/tomcat/webapps/ROOT # mv index.jsp index.jsp.bak # vim index.jsp
TomcatA:
<%@ page language="java" %> <html> <head><title>TomcatA</title></head> <body> <h1><font color="green">TomcatA </font></h1> <table align="centre" border="1"> <tr> <td>Session ID</td> <% session.setAttribute("abc","abc"); %> <td><%= session.getId() %></td> </tr> <tr> <td>Created on</td> <td><%= session.getCreationTime() %></td> </tr> </table> </body> </html>
TomcatB:
<%@ page language="java" %> <html> <head><title>TomcatB</title></head> <body> <h1><font color="yellow">TomcatB </font></h1> <table align="centre" border="1"> <tr> <td>Session ID</td> <% session.setAttribute("abc","abc"); %> <td><%= session.getId() %></td> </tr> <tr> <td>Created on</td> <td><%= session.getCreationTime() %></td> </tr> </table> </body> </html>
配置mod_jk文件
# vim /etc/httpd/conf/mod_jk.conf LoadModule jk_module modules/mod_jk.so #JkWorkersFile 路径根据实际情况填写 JkWorkersFile conf/workers.properties # Where to put jk logs JkLogFile /var/log/httpd/mod_jk.log # Set the jk log level [debug/error/info] JkLogLevel info # Select the log format JkLogStampFormat "[%a %b %d %H:%M:%S %Y]" # JkOptions indicate to send SSL KEY SIZE, JkOptions +ForwardKeySize +ForwardURICompatUnparsed -ForwardDirectories # JkRequestLogFormat set the request format JkRequestLogFormat "%w %V %T" #根据实际情况自己定义即可,就是将什么样的请求转发给lb1处理 #JkMount /* lb1 JkMount /* lb1 JkMount /servlet/* lb1 JkMount /*.do lb1 JkMount /*.action lb1 #JkMount /*.class lb1 #JkMount /*.jar lb1 JkMount /jkstatus status # 状态页
配置worker.properties
# workers 列表 workers.tomcat_home=/usr/local/tomcat/ workers.tomcat_home=/usr/java/jdk1.8.0_261-amd64 worker.list = lb1,TomcatA,TomcatB #------------------------------------------------- # tomcat实例1 #------------------------------------------------- worker.TomcatA.type = ajp13 ##定向包协议 worker.TomcatA.host = 192.168.133.150 ##tomcat主机地址 worker.TomcatA.port = 8009 ##TomcatA实例端口 worker.TomcatA.lbfactor = 1 ##负载均衡权重为1 worker.TomcatA.activation = A #------------------------------------------------- # tomcat实例2 #------------------------------------------------- worker.TomcatB.type = ajp13 worker.TomcatB.host = 192.168.133.130 worker.TomcatB.port = 8009 worker.TomcatB.lbfactor = 1 worker.TomcatB.activation = A #------------------------------------------------- # load balancer worker --负载均衡控制器 # ------------------------------------------------ worker.lb1.type = lb ##负载均衡work,lb内置类 worker.lb1.sticky_session = 0 ##会话是否绑定 worker.lb1.balance_workers = TomcatA, TomcatB ##指定集群拥有实例 worker.list=status worker.status.type = status ##状态信息
测试
yum安装 elinks 来测试