Tomcat8配置apr

基础知识开场

先以一个面试题作为本文的开场白:tomcat与nginx都是Seb Server,他们有什么区别?
首先先说明一下Tomcat更应该被叫做Web Container,当然它可以被认为是HTTP服务器,它的主要内容是处理动态请求,而nginx主要是用来处理静态请求。所以一般的设计都是把Nginx放在前端处理静态资源,如果有对应的Java编写的服务器端程序请求,则通过AJP转给后面的Tomcat、Jetty进行处理。

tomcat的部署

首先先确认服务器是否有java,没有的话就yum install java-1.8.0-openjdk* -y,然后在/etc/profile最下面添加:

1
2
3
4
export JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.222.b10-1.el7_7.x86_64
export JRE_HOME=$JAVA_HOME/jre
export CLASSPATH=$JAVA_HOME/lib:$JRE_HOME/lib:$CLASSPATH
export PATH=$JAVA_HOME/bin:$JRE_HOME/bin:$PATH

然后source /etc/profile配置环境变量,然后开始安装。

1
2
3
4
5
6
mkdir /usr/local/tomcat	#创建文件夹
wget http://apache.fayea.com/tomcat/tomcat-8/v8.5.46/bin/apache-tomcat-8.5.46.tar.gz -P /usr/local/tomcat #直接下载tomcat8到目标文件夹
cd /usr/local/tomcat
tar -zxvf apache-tomcat-8.5.46.tar.gz
cd apache-tomcat-8.5.46/bin
./catalina.sh start #.启动tomcat。使用./catalina.sh stop停止tomcat。

为了安全我们都会更改一下默认的8080端口,那么就修改apache-tomcat-8.5.46/conf/server.xml

1
2
3
4
<Connector port="33664" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443"
server="kan ni daye a kan"/> # 服务器信息,可以通过curl -I来查看

确保iptables和安全组放行33664端口之后,既可以在页面查看情况。
akb48

虽然现在程序已经正常启动了,但是还需要配置开机自启动和service控制开启关闭等其他工作。

首先要使用service命令控制tomcat启停,新编辑/etc/init.d/tomcat文件:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#!/bin/bash
# description: Tomcat8 Start Stop Restart
# processname: tomcat8
# chkconfig: 234 20 80

CATALINA_HOME=/usr/local/tomcat/apache-tomcat-8.5.46

case $1 in
start)
sh $CATALINA_HOME/bin/startup.sh
;;
stop)
sh $CATALINA_HOME/bin/shutdown.sh
;;
restart)
sh $CATALINA_HOME/bin/shutdown.sh
sh $CATALINA_HOME/bin/startup.sh
;;
*)
echo 'please use : tomcat {start | stop | restart}'
;;
esac
exit 0

保存之后给予这个tomcat文件可执行权限,就可以通过service tomcat restart/stop/start来控制程序启停了。

开启自启动比较简单了:chkconfig --add tomcat && chkconfig tomcat on

基本上准备工作就到此为止了。

配置apr

Tomcat支持三种接收请求的处理方式:BIO(阻塞式)NIO(非阻塞式)APR(基于本地库)。采用APR是比较符合更高要求的场景,连接建立的速度会有50%~100%的提升。直接调用操作系统层果然神速啊,所以强烈推荐使用apr方式!而tomcat8默认情况下使用的是nio模式:
akb48

apr模式本质是使用JNI技术调用操作系统IO接口,需要用到相关API的头文件,先yum install apr-devel openssl-devel gcc make -y安装相关依赖库。

然后在tomcat的bin文件夹下,会看到一个tomcat-native.tar.gz,解压之。然后在tomcat-native-1.2.23-src/native下执行./configure && make && make install安装。

安装完毕之后,返回到Tomcat的bin里编辑catalina.sh,在虚拟机启动参数JAVA_OPTS中添加java.library.path参数,指定apr库的路径:

1
JAVA_OPTS="$JAVA_OPTS -Djava.library.path=/usr/local/apr/lib"

再去tomcat的conf里server.xml修改一下:

1
2
3
4
5
<Connector port="33664" protocol="org.apache.coyote.http11.Http11AprProtocol"
connectionTimeout="20000"
redirectPort="8443"
maxThreads="800" acceptCount="1000" #这两个数在下面细说
server="kan ni daye a kan"/>

重启一下tomcat,就会看到现在使用的是apr模式了:
akb48

多tomcat负载均衡

复制tomcat成多份,然后修改tomcat路径下/webapps/ROOT/index.jsp的内容作为标识,然后分别启动不同的端口,如:

1
2
3
4
5
6
7
8
9
10
<?xml version="1.0" encoding="UTF-8"?>

<!-- 1 默认8005改成8008 -->
<Server port="8008" shutdown="SHUTDOWN">
<!-- 2 Http默认8080 改成自己喜欢的端口 -->
<Connector port="第三个端口" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" />
<!-- 3 AJP默认8009 改成8011 -->
<Connector port="8011" protocol="AJP/1.3" redirectPort="8443" />

启动之后,一个服务器里就运行了多个tomcat。然后修改nginx.conf

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
http {
# 省略代码....

# 增加 upstream, 名称为 serverlist
upstream serverlist{
server localhost:第一个端口 weight=1; # weigh表示权重,越大访问的机率越多
server localhost:第二个端口 weight=1;
server localhost:第三个端口 weight=1;
}

# 编辑
server {
listen 80;
server_name www.yourdomian.com;

location / {
# 这里使用定义 serverlist
proxy_pass http://serverlist;
}

重新nginx就能通过你的域名进行访问了,多次刷新就可以看到网站显示是哪个tomcat的内容。

注意!强烈建议不要使用 Tomcat 的虚拟主机,推荐每个站点使用一个实例。即,可以启动多个 Tomcat,而不是启动一个 Tomcat 里面包含多个虚拟主机。因为 Tomcat是多线程,共享内存,任何一个虚拟主机中的应用崩溃,都会影响到所有应用程序。虽然采用多实例的方式会产生过多的开销,但至少保障了应用程序的隔离和安全。

运维注意点

  1. 不要使用root用户启动tomcat,Java程序与C程序不同。你使用什么用户启动Tomcat,那么Tomcat就会继承该所有者的权限。那么解决这个问题的办法:

    1
    2
    groupadd -g 80 daemon
    adduser -o --home /daemon --shell /sbin/nologin --uid 80 --gid 80 -c "Web Server" daemon #注意/sbin/nologin,意味着该用户不能登录,同时我也没有给它指定密码,这个用户只能用于启动tomcat
  2. 修改tomcat的conf里server.xml:关闭war自动部署unpackWARs="false" autoDeploy="false",防止被植入木马等恶意程序;

  3. maxThreads:tomcat起动的最大线程数,即同时处理的任务个数,默认值为200;acceptCount:当tomcat起动的线程数达到最大时,接受排队的请求个数,默认值为100。这俩个值要根据业务合理分配,不是越大越好。一般来说acceptCount的配置是设置的跟maxThreads一样大;
  4. server.xml中定义了可以直接关闭Tomcat实例的管理端口。我们通过telnet连接上该端口之后,输入SHUTDOWN(此为默认关闭指令)即可关闭Tomcat实例(注意,此时虽然实例关闭了,但是进程还是存在的)。所以为了避免这样的情景,就把SHUTDOWN改成乱码:
    1
    <Server port="8005" shutdown="9SDKJ29jksjf23sjf0LSDF92JKS9DKkjsd">

参考资料

https://lanjingling.github.io/2015/12/15/tomcat-redis-session/
https://qq343509740.gitee.io/2018/07/24/Linux/CentOS/CentOS%207%20&%20Tomcat%208%20%E5%AE%89%E8%A3%85%E4%B8%8E%E9%85%8D%E7%BD%AE/#%E6%B7%BB%E5%8A%A0%E9%85%8D%E7%BD%AE
https://www.cnblogs.com/meetrice/p/5695127.html

-------------This article is over!Thanks for reading!-------------
感谢您请我喝咖啡!(o´ω`o)
0%