• 【第十课】Tomcat入门


    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下载和解压

    下载地址:https://tomcat.apache.org/download-80.cgi

    [root@linux-node1 ~]# ll apache-tomcat-8.0.50.tar.gz jdk-8u161-linux-x64.tar.gz 
    -rw-r--r-- 1 root root   9417189 3月  17 11:27 apache-tomcat-8.0.50.tar.gz
    -rw-r--r-- 1 root root 189756259 3月  17 11:51 jdk-8u161-linux-x64.tar.gz
    [root@linux-node1 ~]# mv apache-tomcat-8.0.50 /usr/local/
    [root@linux-node1 ~]# ln -s /usr/local/apache-tomcat-8.0.50/ /usr/local/tomcat
    [root@linux-node1 ~]# mv jdk1.8.0_161 /usr/local/
    [root@linux-node1 ~]# ln -s /usr/local/jdk1.8.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) 64-Bit Server VM (build 25.161-b12, mixed mode)
    

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

    [root@linux-node1 ~]# useradd -u 601 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
    总用量 20
    -rw-rw-r-- 1 tomcat tomcat 6449 3月  17 13:49 catalina.2018-03-17.log
    -rw-rw-r-- 1 tomcat tomcat 6449 3月  17 13:49 catalina.out           ==>启动日志查看,有任何tomcat启动相关可以进行查看
    -rw-rw-r-- 1 tomcat tomcat    0 3月  17 13:49 host-manager.2018-03-17.log
    -rw-rw-r-- 1 tomcat tomcat  465 3月  17 13:49 localhost.2018-03-17.log
    -rw-rw-r-- 1 tomcat tomcat    0 3月  17 13:49 localhost_access_log.2018-03-17.txt
    -rw-rw-r-- 1 tomcat tomcat    0 3月  17 13:49 manager.2018-03-17.log
    
    [tomcat@linux-node1 conf]$ pwd
    /usr/local/tomcat/conf
    [tomcat@linux-node1 conf]$ vim server.xml   #tomcat的主配置文件
    
        <Connector port="8080" protocol="HTTP/1.1"          HTTP协议连接tomcat,连接超时20000ms,重定向用8443端口
                   connectionTimeout="20000"
                   redirectPort="8443" />
    
        <Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />    AJP协议连接tomcat
    
    [root@linux-node1 tomcat]# tree -L 1
    .
    ├── 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文件
    
    7 directories, 4 files
    

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

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

    [tomcat@linux-node1 webapps]$ pwd
    /usr/local/tomcat/webapps
    [tomcat@linux-node1 webapps]$ ll
    总用量 4
    drwxr-xr-x 14 tomcat tomcat 4096 3月  17 11:33 docs               #→tomcat帮助文档
    drwxr-xr-x  6 tomcat tomcat   83 3月  17 11:33 examples          #→web应用实例
    drwxr-xr-x  5 tomcat tomcat   87 3月  17 11:33 host-manager   #→管理
    drwxr-xr-x  5 tomcat tomcat  103 3月  17 11:33 manager          #→管理
    drwxr-xr-x  3 tomcat tomcat  306 3月  17 11:33 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.110:8080可进行分别点击查看
    

    img

    每次重启,都需要将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 -9 $TPID
    sleep 5
    TSTAT=$(ps -axu |grep java |grep tomcat|grep -v "grep" |awk '{print $2}')
        if [ -z $TSTAT ];then
            echo "tomcat stop."
        else
            kill -9 $TSTAT
        fi
    
    }
    
    main(){
    case $1 in
        start)
            start_tomcat
            ;;
        stop)
            stop_tomcat
            ;;
        restart)
            stop_tomcat && start_tomcat
            ;;
        status)
            status_tomcat
            ;;
        *)
            useage;
    esac
    }
    main $1
    

    img

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

    [tomcat@linux-node1 webapps]$ pwd
    /usr/local/tomcat/webapps
    [tomcat@linux-node1 webapps]$ ll
    总用量 4
    drwxr-xr-x 14 tomcat tomcat 4096 3月  17 11:33 docs
    drwxr-xr-x  6 tomcat tomcat   83 3月  17 11:33 examples
    drwxr-xr-x  5 tomcat tomcat   87 3月  17 11:33 host-manager
    drwxr-xr-x  5 tomcat tomcat  103 3月  17 11:33 manager
    drwxr-xr-x  3 tomcat tomcat  306 3月  17 11:33 ROOT
    [tomcat@linux-node1 webapps]$ mv docs examples host-manager /tmp
    

    (7)tomcat安全加固

    ① 更改服务监听端口

    若 Tomcat 都是放在内网的,则针对 Tomcat 服务的监听地址都是内网地址
    
    标准配置:<Connector port="10000" server="webserver"/>
    

    ② telnet管理端口保护

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

    ③ AJP连接端口的保护

    修改默认的ajp 8009端口为不易冲突(大于1024),但要求端口配置在8000~8999之间
    通过iptables规则限制ajp端口访问的权限仅为线上机器,目的在于防止线下测试流量被apache的mod_jk转发至线上tomcat服务器
    
    标准配置:<Connector port="8349" 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="0" reloadable="false" crossContext="true">
    </Context>
    
        b.在$CATALINA_HOME/conf/Catalina/locathost目录下新增文件 test##20160506172651.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 744 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、ZrLog博客部署

    下载zrlog源码程序,并放置在webapps目录中

    [root@localhost ~]# wget 'http://dl.zrlog.com/release/zrlog-2.1.0-3617b2e-release.war?attname=ROOT.war&ref=index'
    [root@localhost ~]# mv zrlog-2.1.0-3617b2e-release.war?attname=ROOT.war&ref=index zrlog-2.1.0.war
    [root@localhost ~]# mv zrlog-2.1.0.war /usr/local/tomcat/webapps/
    [root@localhost ~]# cd !$
    [root@localhost webapps]# mv ROOT ROOT.bak
    [root@localhost webapps]# mv zrlog-2.1.0 ROOT
    

    创建zrlog数据库并授权

    MariaDB [(none)]> create database zrlog default charset utf8;
    Query OK, 1 row affected (0.00 sec)
    
    MariaDB [(none)]> grant all privileges on zrlog.* to zrlog@"%" identified by "123456";
    Query OK, 0 rows affected (0.05 sec)
    
    MariaDB [(none)]> flush privileges;
    Query OK, 0 rows affected (0.00 sec)
    
    

    访问:192.168.56.110:8080,如图:

    刷新页面,访问,如图:

    4、Nginx反向代理tomcat

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

    [root@linux-node1 ~]# cat /usr/local/nginx/conf/vhost/test.conf 
    server {
        listen 80;
        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;
        }
    
    }
    

    4.2、配置tomcat虚拟主机

    [root@linux-node1 ~]# ll /data/webapps/ROOT/
    total 4
    drwxr-xr-x 2 root root   6 Mar 21 07:32 classes
    -rw-r--r-- 1 root root 187 Mar 21 07:48 index.jsp
    drwxr-xr-x 2 root root   6 Mar 21 07:32 lib
    drwxr-xr-x 2 root root   6 Mar 21 07:32 META-INF
    drwxr-xr-x 2 root root   6 Mar 21 07:32 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
    

    img

    5、Apache反向代理tomcat

    [root@linux-node1 ~]# yum install -y httpd
    [root@linux-node1 ~]# grep ^[a-Z] /etc/httpd/conf/httpd.conf 
    ServerRoot "/etc/httpd"
    Listen 80
    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
    

    img

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

    6.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 {
            }
        }
    
    }
    

    6.2、配置静态web-->nginx

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

    img

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

    [root@linux-node1 conf]# cat /etc/httpd/conf.d/vhosts.conf 
    <VirtualHost *:80>
            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>
    

    img
    img

  • 相关阅读:
    微信小程序知识点梳理
    Vue基础知识梳理
    JQuery总结
    JS实现简单斗地主效果
    JS应用猜数游戏
    JS创建一个数组1.求和 2.求平均值 3.最大值 4.最小值 5.数组逆序 6.数组去重 0.退出
    JS数组的基本操作方法
    JS,ATM代码
    简单理解Vue中的nextTick
    Vue keep-alive实践总结
  • 原文地址:https://www.cnblogs.com/linuxk/p/10394802.html
Copyright © 2020-2023  润新知