Tomcat
一、Tomcat简介
Tomcat是Apache软件基金会(ApacheSoftwareFoundation)的Jakarta项目中的一个核心项目,由Apache,Sun和其他一些公司及个人共同开发而成。
Tomcat服务器是一个免费的开放源代码的Web应用服务器,属于轻量级应用服务器,在中小型系统和并发访问用户不是很多的场合下被普遍使用,是开发和调试JSP程序的首选。
Tomcat和Nginx,APache(httpd),lighttpd等Web服务器一样,具有处理HTML页面的功能,另外它还是一个Servlet和JSP容器,独立的Servlet容器是Tomcat的默认模式。不过,Tomcat处理静态HTML的能力不如Nginx/Apache服务器。
Java的容器,运行的是java代码
二、Tomcat安装
需要安装java环境(JDK)
JDK下载:http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html
Tomcat下载:http://tomcat.apache.org/
部署java环境jdk
jdk的解压安装
tar xf jdk-8u60-linux-x64.tar.gz -C /usr/local/
做软链接方便使用
ln -s /usr/local/jdk1.8.0_60 /usr/local/jdk
添加java环境变量
sed -i.ori '$a export JAVA_HOME=/usr/local/jdk export PATH=$JAVA_HOME/bin:$JAVA_HOME/jre/bin:$PATH export CLASSPATH=.$CLASSPATH:$JAVA_HOME/lib:$JAVA_HOME/lib/tools.jar' /etc/profile
重启环境变量
source /etc/profile
检查java环境安装情况
which java
java -version查看版本
解压安装Tomcat
tar xf apache-tomcat-8.0.27.tar.gz -C /usr/local
做软链接方便使用
ln -s /usr/local/apache-tomcat-8.0.27 /usr/local/tomcat
配置tomcat环境变量
echo 'export TOMCAT_HOME=/usr/local/tomcat' >> /etc/profile
重启环境变量
source /etc/profile
查看jdk及tomcat目录的属主属组,都修改成root
启动tomcat:
/usr/local/tomcat/bin/startup.sh
tomcat默认监听端口:8080
tomcat主配置文件
/usr/local/tomcat/conf/server.xml
进入tomcat管理端的配置文件
vim /usr/local/tomcat/conf/tomcat-users.xml
在第三十八行上面添加三行代码,开启管理功能,一般不用,开启后登录网页时会输入账号密码
<role rolename="manager-gui"/> <role rolename="admin-gui"/> <user username="tomcat" password="tomcat" roles="manager-gui,admin-gui"/>
==>开启管理端的功能
==>开启管理员的功能
重启tomcat:
/usr/local/tomcat/bin/shutdown.sh /usr/local/tomcat/bin/startup.sh
通过浏览器登录tomcat:192.168.200.101:8080/manager/status
输入账号密码:tomcat tomcat
然后进入tomcat管理端
tomcat主配置文件:/usr/local/tomcat/conf/server.xml
tomcat可以自己解压war包,将war包扔到/usr/local/tomcat/webapps
重启tomcat可以发现webapps多了war包解压后的目录
(webapps为tomcat主页目录,除了root目录不能删,其他的都可以删掉)
使用浏览器进行测试
192.168.200.101:8080/memtest/meminfo.jsp(java都是以jsp结尾)
自定义网站目录,想要直接访问meminfo.jsp没有中间memtest子目录
只要将向访问的东西扔到webapps主页目录里的ROOT目录下即可
三、Tomcat多实例
复制Tomcat目录,再做两个Tomcat,名为tomcat8_1和tomcat8_2
cd /usr/local cp -a apache-tomcat-8.0.27 tomcat8_1 cp -a apache-tomcat-8.0.27 tomcat8_2
修改多实例配置文件
创建多实例的网页跟目录
mkdir -p /data/www/www/ROOT
将网页程序拷贝到,多实例根目录ROOT下
cp /usr/local/tomcat/webapps/memtest/meminfo.jsp /data/www/www/ROOT/
修改多实例配置文件的一下三行
vim /usr/local/tomcat8_1/conf/server.xml
第22行 端口==>监听端口不能相同
第69行 端口
第123行 Host name="域名" appBase="网页根目录路径"
两个多实例都需要修改
将两个实例tomcat服务启动
打开浏览器测试,记得输入域名时输入修改后的端口
四、Tomcat集群
使用nginx+Tomcat反向代理集群
安装nginx
yum -y install pcre-devel openssl-devel wget -q http://nginx.org/download/nginx-1.10.2.tar.gz useradd -s /sbin/nologin -M nginx tar xf nginx-1.10.2.tar.gz -C /usr/src cd /usr/src/nginx-1.10.2/ ./configure --user=nginx --group=nginx --prefix=/usr/local/nginx --with-http_stub_status_module --with-http_ssl_module make && make install
修改Nginx配置文件
创建配置文件模板
egrep -v "#|^$" /usr/local/nginx/conf/nginx.conf.default > /usr/local/nginx/conf/nginx.conf
修改配置文件内容如下
cat /usr/local/nginx/conf/nginx.conf
worker_processes 1;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
upstream web_pools {
server 127.0.0.1:8081;
server 127.0.0.1:8082;
}
server {
listen 80;
server_name localhost;
location / {
root html;
index index.jsp index.html index.htm;
proxy_pass http://web_pools;
}
}
}
检测语法并启动Nginx
/usr/local/nginx/sbin/nginx -t /usr/local/nginx/sbin/nginx netstat -antup | grep nginx
五、部署JPress博客
JPress:一个wordpress的java替代版本,使用JFinal开发,需要maven支持
需要apache-maven-3.3.9-bin.tar.gz
解压apache-maven-3.3.9-bin.tar.gz
tar xf apache-maven-3.3.9-bin.tar.gz -C /usr/local
做软链接
ln -s /usr/local/apache-maven-3.3.9 /usr/local/maven
添加环境变量
echo "export MAVEN_HOME=/usr/local/maven" >> /etc/profile echo 'export PATH="$MAVEN_HOME/bin:$PATH"' >> /etc/profile
测试:mvn -version
将jpress-web-newest.war包放到Tomcat网站根目录下
mv jpress-web-newest.war /usr/local/tomcat/webapps/ROOT/
解压war包:which jar==>jar是war包的解压命令
cd /usr/local/tomcat/webapps/ROOT/ jar xf jpress-web-newest.war
安装MySQL
安装mysql二进制
直接解压即可:解压到/usr/local/
创建用户:
useradd -s /sbin/nologin -M mysql
进入/usr/local/mysql-5.5.32-linux/
做个软连接方便使用==>
ln -s mysql-5.5.32-linux /usr/local/mysql
复制配置文件:
/bin/cp support-files/my-small.cnf /etc/my.cnf
做初始化:
映射==>
echo "192.168.200.131 LNMP" > /etc/hosts
创建mysql数据文件目录==>
mkdir -p /usr/local/mysql/data
授权mysql用户管理mysql的安装目录==>
chown -R mysql.mysql /usr/local/mysql
安装初始化mysql依赖包==>
yum -y install libaio
初始化mysql数据库文件==>
/usr/local/mysql/scripts/mysql_install_db --basedir=/usr/local/mysql --datadir=/usr/local/mysql/data --user=mysql
复制mysql启动脚本到mysql的命令路径==>
cd /usr/local/mysql cp support-files/mysql.server /etc/init.d/mysqld
加x权限,使脚本可执行==>
chmod +x /etc/init.d/mysqld
启动mysql==>
/etc/init.d/mysqld start
给mysql命令做软连接==>
ln -s /usr/local/mysql/bin/* /usr/local/bin
给mysql添加密码==>
mysqladmin -uroot password '123123'
先在mysql创建专用数据库jpress,用于存放blog数据
登录mysql:mysql -uroot -p123123
create database jpress;
创建一个jpress专用管理用户
grant all on jpress.* to jpress@’localhost’ identified by ‘123123’;
用浏览器访问192.168.200.101:8080/install进入jpress安装向导
六、Tomcat相关优化
安全优化
最重要的优化为如下四项,但不止四种
降权启动(用普通用户启动Tomcat)
telnet管理端口保护(修改8005端口,防止别人知道)
ajp连接端口保护(将8009的注释掉,大约在91行)
禁用管理端(webapps首页清空只留ROOT,ROOT目录里的也清空)
性能优化
屏蔽DNS查询enableLookups="false"
默认没有,需添加配置文件如下代码段,在Connector标签位置。表示禁止DNS查询
<Connector port="8081" protocol="HTTP/1.1"
connectionTimeout="6000" enableLookups="false" acceptCount="800"
redirectPort="8443" />
jvm调优
Tomcat最吃内存,只要内存足够,这只猫就跑的快
如果系统资源有限,那就需要进行调优,提高资源使用率
#优化catalina.sh初始化脚本。在catalina.sh初始化脚本中添加以下代码:
#catalina.sh的路径为:/usr/local/tomcat/bin/catalina.sh
#此行优化代码需要加载甲苯的最开始,声明位置。不要放在后边JAVA_OPTS="-Djava.awt.headless=true -Dfile.encoding=UTF-8 -server -Xms1024m -Xmx1024m -XX:NewSize=512m -XX:MaxNewSize=512m -XX:PermSize=512m -XX:MaxPermSize=512m"
JVM的调优比较复杂,对于初学的同学们来说掌握这些就足够了。
如果想更详细的理解JVM如何调优,那么请参考网友文章。
http://www.cnblogs.com/xingzc/p/5756119.html
企业案例
Linux下java/http进程高解决案例
生产环境下某台tomcat7服务器,在刚发布的时候一切都很正常,
在运行一段时间后就出现CPU占用很高的问题,基本上是负载一天比一天高。
问题分析:
(1)程序属于CPU密集型,和开发沟通过,排除此类情况
(2)程序代码有问题,出现死循环,可能性极大
问题解决:
(1)开发那边无法排查代码某个模块有问题,从日志上也无法分析得出
(2)我们可以尝试通过jstack命令来精确定位出现错误的代码段,从而拿给开发排查
(1)首先查找进程高的PID号(先找到是哪个PID号的进程导致的)
top -H
(2)查看这个进程所有系统调用(再找到是哪个PID号的线程导致的)
strace -p 进程的PID
(3)如果是web应用,可以继续打印该线程的堆栈信息(找出有问题的代码块)
printf "%x " 线程的PID——>将有问题的线程PID号转换成16进制格式
jstack 进程的PID | grep 线程PID号的十六进制格式 -A 30——>过滤出有问题的线程的堆栈信息,找出问题代码块