1、Tomcat介绍

Tomcat是Apache软件基金会(Apache Software Foundation)的Jakarta 项目中的一个核心项目,由Apache、Sun和其他一些公司及个人共同开发而成。

Tomcat服务器是一个免费的开放源代码的Web应用服务器,属于轻量级应用服务器,在中小型系统和并发访问用户不是很多的场合下被普遍使用,是开发和调试JSP程序的首选。

Tomcat和Nginx、Apache(httpd)、lighttpd等Web服务器一样,具有处理HTML页面的功能,另外它还是一个Servlet和JSP容器,独立的Servlet容器是Tomcat的默认模式。不过,Tomcat处理静态HTML的能力不如Nginx/Apache服务器。

2、Tomcat安装部署和配置

(1)tomcat下载和解压

[root@linux-node1 ~]# ll apache-tomcat-8.0..tar.gz jdk-8u161-linux-x64.tar.gz
-rw-r--r-- root root 3月 : apache-tomcat-8.0..tar.gz
-rw-r--r-- root root 3月 : jdk-8u161-linux-x64.tar.gz
[root@linux-node1 ~]# mv apache-tomcat-8.0. /usr/local/
[root@linux-node1 ~]# ln -s /usr/local/apache-tomcat-8.0./ /usr/local/tomcat
[root@linux-node1 ~]# mv jdk1..0_161 /usr/local/
[root@linux-node1 ~]# ln -s /usr/local/jdk1..0_161 /usr/local/jdk

(2)jdk环境变量配置

[root@linux-node1 ~]# vim /etc/profile
export JAVA_HOME=/usr/local/jdk
export PATH=$JAVA_HOME/bin:$JAVA_HOME/jre/bin:$PATH
export CLASSPATH=.$CLASSPATH:$JAVA_HOME/lib:$JAVA_HOME/jre/lib:$JAVA_HOME/lib/tools.jar
TOMCAT_HOME=/usr/local/tomcat
[root@linux-node1 ~]# source /etc/profile
[root@linux-node1 ~]# java -version
java version "1.8.0_161"
Java(TM) SE Runtime Environment (build 1.8.0_161-b12)
Java HotSpot(TM) -Bit Server VM (build 25.161-b12, mixed mode)

(3)设置tomcat以普通用户启动

[root@linux-node1 ~]# useradd -u  tomcat
[root@linux-node1 ~]# chown -R tomcat.tomcat /usr/local/jdk
[root@linux-node1 ~]# chown -R tomcat.tomcat /usr/local/tomcat
[root@linux-node1 ~]# su - tomcat
[tomcat@linux-node1 ~]$ /usr/local/tomcat/bin/startup.sh

(4)查看tomcat的配置

[tomcat@linux-node1 logs]$ pwd
/usr/local/tomcat/logs
[tomcat@linux-node1 logs]$ ll
总用量
-rw-rw-r-- tomcat tomcat 3月 : catalina.--.log
-rw-rw-r-- tomcat tomcat 3月 : catalina.out ==>启动日志查看,有任何tomcat启动相关可以进行查看
-rw-rw-r-- tomcat tomcat 3月 : host-manager.--.log
-rw-rw-r-- tomcat tomcat 3月 : localhost.--.log
-rw-rw-r-- tomcat tomcat 3月 : localhost_access_log.--.txt
-rw-rw-r-- tomcat tomcat 3月 : manager.--.log [tomcat@linux-node1 conf]$ pwd
/usr/local/tomcat/conf
[tomcat@linux-node1 conf]$ vim server.xml #tomcat的主配置文件 <Connector port="" protocol="HTTP/1.1" HTTP协议连接tomcat,连接超时20000ms,重定向用8443端口
connectionTimeout=""
redirectPort="" /> <Connector port="" protocol="AJP/1.3" redirectPort="" /> AJP协议连接tomcat [root@linux-node1 tomcat]# tree -L
.
├── bin #→用以启动、关闭Tomcat或者其它功能的脚本(.bat文件和.sh文件)
├── conf #→用以配置Tomcat的XML及DTD文件
├── lib #→存放web应用能访问的JAR包
├── LICENSE
├── logs #→Catalina和其它Web应用程序的日志文件
├── NOTICE
├── RELEASE-NOTES
├── RUNNING.txt
├── temp #→临时文件
├── webapps #→Web应用程序根目录
└── work #→用以产生有JSP编译出的Servlet的.java和.class文件 directories, files

(5)tomcat配置用户管理界面的用户和密码

测试功能,生产环境不要用。

Tomcat管理功能用于对Tomcat自身以及部署在Tomcat上的应用进行管理的web应用。在默认情况下是处于禁用状态的。如果需要开启这个功能,就需要配置管理用户,即配置前面说过的tomcat-users.xml。

[tomcat@linux-node1 webapps]$ pwd
/usr/local/tomcat/webapps
[tomcat@linux-node1 webapps]$ ll
总用量
drwxr-xr-x tomcat tomcat 3月 : docs #→tomcat帮助文档
drwxr-xr-x tomcat tomcat 3月 : examples #→web应用实例
drwxr-xr-x tomcat tomcat 3月 : host-manager #→管理
drwxr-xr-x tomcat tomcat 3月 : manager #→管理
drwxr-xr-x tomcat tomcat 3月 : ROOT #→默认网站根目录
[tomcat@linux-node1 conf]$ pwd
/usr/local/tomcat/conf
[tomcat@linux-node1 conf]$ vim tomcat-users.xml #配置用户管理界面的用户和密码,Server status/Manager App/Host Manager
<role rolename="manager-gui" />
<role rolename="admin-gui" />
<user username="tomcat" password="tomcat" roles="manager-gui,admin-gui" /> [tomcat@linux-node1 conf]$ /usr/local/tomcat/bin/shutdown.sh
Using CATALINA_BASE: /usr/local/tomcat
Using CATALINA_HOME: /usr/local/tomcat
Using CATALINA_TMPDIR: /usr/local/tomcat/temp
Using JRE_HOME: /usr/local/jdk
Using CLASSPATH: /usr/local/tomcat/bin/bootstrap.jar:/usr/local/tomcat/bin/tomcat-juli.jar [tomcat@linux-node1 conf]$ /usr/local/tomcat/bin/startup.sh
Using CATALINA_BASE: /usr/local/tomcat
Using CATALINA_HOME: /usr/local/tomcat
Using CATALINA_TMPDIR: /usr/local/tomcat/temp
Using JRE_HOME: /usr/local/jdk
Using CLASSPATH: /usr/local/tomcat/bin/bootstrap.jar:/usr/local/tomcat/bin/tomcat-juli.jar
Tomcat started. 访问192.168.56.:8080可进行分别点击查看

每次重启,都需要将temp/ work/目录下的东西清空,避免影响tomcat的运行。所以写一个脚本在tomcat停止时进行清除。

(6)tomcat启动脚本编写

[tomcat@linux-node1 ~]$ vim tomcat.sh
#!/bin/bash
useage(){
echo "Useage: $0 [start|stop|restart|status]"
} status_tomcat(){
ps -axu |grep java |grep tomcat|grep -v "grep" } start_tomcat () {
/usr/local/tomcat/bin/startup.sh } stop_tomcat() {
TPID=$(ps -axu |grep java |grep tomcat|grep -v "grep" |awk '{print $2}')
kill - $TPID
sleep
TSTAT=$(ps -axu |grep java |grep tomcat|grep -v "grep" |awk '{print $2}')
if [ -z $TSTAT ];then
echo "tomcat stop."
else
kill - $TSTAT
fi } main(){
case $ in
start)
start_tomcat
;;
stop)
stop_tomcat
;;
restart)
stop_tomcat && start_tomcat
;;
status)
status_tomcat
;;
*)
useage;
esac
}
main $

JVM的内存优化(堆内存和非堆内存)
为了安全,需要将webapps下的东西进行清除。Sever status可以保留,使用nginx进行反向代理,并限制只能内网进行访问。

[tomcat@linux-node1 webapps]$ pwd
/usr/local/tomcat/webapps
[tomcat@linux-node1 webapps]$ ll
总用量
drwxr-xr-x tomcat tomcat 3月 : docs
drwxr-xr-x tomcat tomcat 3月 : examples
drwxr-xr-x tomcat tomcat 3月 : host-manager
drwxr-xr-x tomcat tomcat 3月 : manager
drwxr-xr-x tomcat tomcat 3月 : ROOT
[tomcat@linux-node1 webapps]$ mv docs examples host-manager /tmp

(7)tomcat安全加固

① 更改服务监听端口

若 Tomcat 都是放在内网的,则针对 Tomcat 服务的监听地址都是内网地址

标准配置:<Connector port="" server="webserver"/>

② telnet管理端口保护

修改默认的  管理端口不易猜测(大于1024),但要求端口配置在8000~8999之间
修改SHUTDOWN命令为其他字符串
标准配置:<Server port="" shutdown="dangerous">

③ AJP连接端口的保护

修改默认的ajp 8009端口为不易冲突(大于1024),但要求端口配置在8000~8999之间
通过iptables规则限制ajp端口访问的权限仅为线上机器,目的在于防止线下测试流量被apache的mod_jk转发至线上tomcat服务器
标准配置:<Connector port="" protocol="AJP/1.3"/>

④ 禁用管理端

删除默认$CATALINA_HOME/conf/tomcat-users.xml文件,重启tomcat将会自动生成新的文件
删除$CATALINA_HOME/webapps下载默认的所有目录和文件
将tomcat应用根目录配置为tomcat安装目录以外的目录
标准配置:
a.server.xml配置
一种直接修改Host节点信息,表示全局配置
<Host name="localhost" appBase="/data/www/tomcat_webapps" unpackWARs="true" autoDeploy="false"></Host>
另一种直接在Host节点中新增Context节点,指定具体的项目:
<Context path="" docBase="/usr/local/tomcat/webapps/jenkins" debug="" reloadable="false" crossContext="true">
</Context> b.在$CATALINA_HOME/conf/Catalina/locathost目录下新增文件 test##.xml
<Context displayName="test" docBase="/data/www/tomcat_webapps/test##20160506172651.war" reloadable="false" />

⑤ 隐藏Tomcat的版本信息

针对该信息的显示是由一个jar包控制的,该jar包存放在$CATALINA_HOME/lib目录下,名称为 catalina.jar,通过 jar xf 命令解压这个 jar 包会得到两个目录 META-INF 和 org ,修改 org/apache/catalina/util/ServerInfo.properties 文件中的 serverinfo 字段来实现来更改我们tomcat的版本信息

$ cd $CATALINA_HOME/lib
$ jar xf catalina.jar
$ cat org/apache/catalina/util/ServerInfo.properties |grep -v '^$|#'
$ mkdir -p org/apache/catalina/util
$ vim ServerInfo.properties
server.info=nolinux # 把这个值改成其它值就行了

自定义错误页面:修改$CATALINA_HOME/conf/web.xml重定向 403/404/500等错误到指定的错误页面

⑥ 降权启动

Tomcat启动用户权限必须非root权限,尽量降低tomcat启动用户的目录访问权限,如需直接对外使用80端口,可通过普通账号启动后,配置iptables规则进行转发,
为了防止 Tomcat 被植入 web shell 程序后,可以修改项目文件。要将 Tomcat 和项目的属主做分离,即便被破坏也无法创建和编辑项目文件

⑦ 文件列表访问控制

$CATALINA_HOME/conf/web.xml文件中的default部分的listings的配置必须为false(默认),表示不列出文件列表

⑧ 访问限制

通过配置,限定访问的IP来源
全局设置限定IP和域名访问:

<Host name="localhost"  appBase="/data/www/tomcat_webapps"   unpackWARs="true" autoDeploy="false">
<Valve className="org.apache.catalina.valves.RemoteAddrValve" allow="192.168.1.10,192.168.1.30,192.168.2.*" deny=""/>
<Valve className="org.apache.catalina.valves.RemoteHostValve" allow="www.test.com,*.test.com" deny=""/>
</Host>

⑨ 脚本权限回收

控制CATALINAHOME/bin目录下的start.sh、catalina.sh、shutdown.sh的可执行权限,chmod−R  CATALINAHOME/bin目录下的start.sh、catalina.sh、shutdown.sh的可执行权限,chmod−R744 CATALINAHOME/bin/*

⑩ 访问日志格式规范和Server header重写

开启tomcat默认访问日志中Referer和User-Agent记录
标准配置:

<Valve className="org.apache.catalina.valves.AccessLogValve"
directory="logs" prefix="localhost_access_log"
suffix=".txt" pattern="%h %l %u %t "%r" %s %b %{Referer}i %{User-Agent}i %D"
resolveHosts="false" /> 在HTTP Connector配置中加入server的配置,server=”chuck-server”

3、Nginx反向代理tomcat

3.1、配置Nginx虚拟主机反向代理

[root@linux-node1 ~]# cat /usr/local/nginx/conf/vhost/test.conf
server {
listen ;
server_name www.linuxlong.com;
root /webroot/web-demo;
index index.htm index.html index.php index.jsp;
access_log /usr/local/nginx/logs/test.log access_json; location ~* \.(jsp|do)$ { #使用location匹配以jsp或do结尾的对象进行反向代理
proxy_pass http://node1.long.com:8080;
} }

3.2、配置tomcat虚拟主机

[root@linux-node1 ~]# ll /data/webapps/ROOT/
total
drwxr-xr-x root root Mar : classes
-rw-r--r-- root root Mar : index.jsp
drwxr-xr-x root root Mar : lib
drwxr-xr-x root root Mar : META-INF
drwxr-xr-x root root Mar : WEB-INF
[root@linux-node1 ~]# cd /data/webapps/ROOT/
[root@linux-node1 ROOT]# cat index.jsp
<%@ page language="java" %>
<%@ page import="java.util.*" %>
<html>
<head>
<title>JSP Test Page on web1</title>
</head>
<body>
<% out.println("Hello, Web1!"); %>
</body>
</html> [root@linux-node1 ~]# cat /usr/local/tomcat/conf/server.xml
<Host name="node1.long.com" appBase="/data/webapps" autoDeploy="true">
<Context path="" docBase="ROOT" />
<Valve className="org.apache.catalina.valves.AccessLogValve" directory="/data/logs"
prefix="linuxlong_access_log" suffix=".txt"
pattern="%h %l %u %t "%r" %s %b" />
</Host>
[root@linux-node1 ~]# /usr/local/tomcat/bin/catalina.sh stop
[root@linux-node1 ~]# /usr/local/tomcat/bin/catalina.sh start

4、Apache反向代理tomcat

[root@linux-node1 ~]# yum install -y httpd
[root@linux-node1 ~]# grep ^[a-Z] /etc/httpd/conf/httpd.conf
ServerRoot "/etc/httpd"
Listen
Include conf.modules.d/*.conf
User apache
Group apache
ServerAdmin root@localhost
ServerName www.linuxlong.com
ErrorLog "logs/error_log"
LogLevel warn
AddDefaultCharset UTF-8
EnableSendfile on
IncludeOptional conf.d/*.conf
[root@linux-node1 ~]# cat /etc/httpd/conf.d/vhosts.conf #配置反向代理虚拟主机
<VirtualHost *:80>
ServerName www.linuxlong.com
ProxyVia On #开启via
ProxyRequests Off #关闭正向代理,即开启了反向代理
ProxyPreserveHost On
<Proxy *>
Require all granted
</Proxy>
ProxyPass /status !
ProxyPass / ajp://node1.long.com:8009/ #这里使用ajp协议进行和tomcat通信,也可以更换成http协议。此处也可以使用ip地址进行反向代理,这样可以不用进行域名解析。
ProxyPa***everse / ajp://node1.long.com:8009/
<Location /> #定义访问属性
Require all granted
</Location>
</VirtualHost>
[root@linux-node1 ~]# httpd -t
Syntax OK
[root@linux-node1 ~]# systemctl restart httpd

5、apache+nginx+tomat实现动静分离

5.1、配置nginx作为反向代理

[root@lb01 nginx]# cat nginx.conf

user nginx;
worker_processes auto;
error_log /var/log/nginx/error.log;
pid /run/nginx.pid; include /usr/share/nginx/modules/*.conf; events {
worker_connections 1024;
} http {
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"'; access_log /var/log/nginx/access.log main; sendfile on;
tcp_nopush on;
tcp_nodelay on;
keepalive_timeout 65;
types_hash_max_size 2048; include /etc/nginx/mime.types;
default_type application/octet-stream; include /etc/nginx/conf.d/*.conf;
server {
listen 80 default_server;
server_name _;
root /usr/share/nginx/html;
error_log /var/log/nginx/tomcat_error.log;
include /etc/nginx/default.d/*.conf; location / { #静态反向代理
proxy_pass http://192.168.56.120;
}
location ~* \.(jsp|do)$ { #动态反向代理
proxy_pass http://192.168.56.110;
}
location ~ \.php$ {
root html;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
error_page 404 /404.html;
location = /40x.html {
} error_page 500 502 503 504 /50x.html;
location = /50x.html {
}
} }

5.2、配置静态web-->nginx

[root@linux-node2 vhost]# cat oss.conf
server {
listen ;
server_name localhost;
root /webroot/web-demo;
index index.php index.html index.htm; }

5.3、配置动态反向代理-->apache

[root@linux-node1 conf]# cat /etc/httpd/conf.d/vhosts.conf
<VirtualHost *:>
ServerName 192.168.56.110
ProxyVia On
ProxyRequests Off
ProxyPreserveHost On
<Proxy *>
Require all granted
</Proxy>
ProxyPass /status !
ProxyPass / ajp://node1.long.com:8009/
ProxyPa***everse / ajp://node1.long.com:8009/
<Location />
Require all granted
</Location>
</VirtualHost>

最新文章

  1. 学习Spring——依赖注入
  2. Sharepoint学习笔记—习题系列--70-576习题解析 -(Q124-Q127)
  3. SSL/TLS 高强度加密: 常见问题解答
  4. nodejs生成UID(唯一标识符)——node-uuid模块
  5. matlab processing for video
  6. [saiku] 系统登录成功后查询Cubes
  7. orale内置函数COALESCE和GREATEST和LEAST
  8. Java---实现运行任意目录下class中加了@MyTest的空参方法(实现图形界面)
  9. 写一个Windows上的守护进程(7)捕获异常并生成dump
  10. BZOJ 1901 Dynamic Rankings 树董事长
  11. ROS探索总结(十三)——导航与定位框架
  12. 【计算机篇】Office 2016 for Mac 安装和破解教程
  13. Lab 10-3
  14. python多线程并发
  15. 使用new和newInstance()创建类的区别
  16. caffe:fine-tuning
  17. TLS 改变密码标准协议(Change Cipher Spec Protocol) 就是加密传输中每隔一段时间必须改变其加解密参数的协议
  18. db 文件 查看 打开 工具 db 中文 版 navicat 中文
  19. onedriver -1T容量,edu邮箱申请。
  20. RxJS - Subject(转)

热门文章

  1. 通过 lsyncd + rsync 同步文件
  2. 好用的纯CSS加载动画-spinkit
  3. 进入WinRe(windows恢复环境)
  4. leetcode64. Minimum Path Sum
  5. 一个实现 手机端“输入验证码 ”效果Demo
  6. Linux下gdb调试(tui)
  7. Unity 游戏框架搭建 2018 (一) 架构、框架与 QFramework 简介
  8. Nested Loops,Hash Join 和 Sort Merge Join. 三种不同连接的不同:
  9. PLSQL Developer 12 注册码
  10. Linux 三剑客之sed命令总结