Tomcat

作者: Icarus_ac47 | 来源:发表于2018-09-26 11:34 被阅读0次
    传统的服务器只能解析静态界面:apache nginx 
    如果解析动态界面,需要使用容器
    web容器:
        web容器: uwsgi php tomcat
    Tomcat
    JAVA容器,WEB容器,WEB中间件
    Tomcat,Resin,JBOSS,WebSphere,Weblogic属于oracle
    

    方案二: Nginx+Tomcat
    方案三: 使用nginx做反向代理负载均衡

                    Nginx --只做代理,不做解析,负载均衡
                        |
        +-------------------------------------------
        |               |               |               |
    Tomcat1 Tomcat2 Tomcat3         nginx 用来解析静态界面
    

    建议使用Nginx和Tomcat配合,Nginx处理静态,Tomcat处理动态程序方案三中后端Tomcat可以运行在单独的主机,也可以是同一台主机上的多实例一台物理机可以部署多个tomcat实例,前提是服务器性能高

        tomcat默认并发是200
    

    端口:

        tomcat自身服务的端口:8005
        tomcat和其他应用通信的端口:8009
        tomcat给客户端浏览器访问页面使用的端口:8080
    

    一、Tomcat Http Server
    1.安装JDK和tomcat

    #tar xf apache-tomcat-7.0.34.tar.gz -C /usr/local/
    # tar xf jdk-8u91-linux-x64.tar.gz -C /usr/local
    # ln -s /usr/local/jdk1.8.0_91 /usr/local/java 做了一个连接,或者是改名.或者直接mv
    # ln -s /usr/local/apache-tomcat-7.0.34 /usr/local/tomcat
    

    2.修改环境变量

    #vim /etc/profile
    JAVA_HOME=/usr/local/java
    PATH=$JAVA_HOME/bin:$PATH 使用JAVA_HOME下的JAVA命令
    export JAVA_HOME PATH
    CATALINA_HOME=/usr/local/tomcat          //Tomcat安装目录
    export CATALINA_HOME# env |grep JAVA
    JAVA_HOME=/usr/local/java
    # source /etc/profile
    

    3.检测

    java -version

    java version "1.8.0_91"
    Java(TM) SE Runtime Environment (build 1.8.0_91-b14)
    Java HotSpot(TM) 64-Bit Server VM (build 25.91-b14, mixed mode)
    4.启动Tomcat
    或者设置环境变量直接启动服务

    vim ~/.base_profile 添加
    :/usr/local/tomcat/bin
    # /usr/local/tomcat/bin/startup.sh                //启动tomcat
    Using CATALINA_BASE: /usr/local/tomcat
    Using CATALINA_HOME: /usr/local/tomcat
    Using CATALINA_TMPDIR: /usr/local/tomcat/temp
    Using JRE_HOME: /usr/java/jdk1.7.0_11
    Using CLASSPATH: /usr/local/tomcat/bin/bootstrap.jar:/usr/local/tomcat/bin/tomcat-juli.jar
    # netstat -tnlp |grep java
    tcp 0 0 ::ffff:127.0.0.1:8005              :::*            LISTEN 6191/java
    tcp 0 0 :::8009                              :::*               LISTEN 6191/java
    tcp 0 0 :::8080                             :::*                 LISTEN 6191/java
    # /usr/local/tomcat/bin/shutdown.sh                  关闭tomcat
    

    关于tomcat端口:

    Tomcat服务器通过Connector连接器组件与客户程序建立连接,Connector组件负责
    接收客户的请求,以及把Tomcat服务器的响应结果发送给客户。
    默认情况下Tomcat在server.xml中配置了两种连接器:
    第一个连接器监听8080端口,负责建立HTTP连接。在通过浏览器访问Tomcat
    服务器的Web应用时,使用的就是这个连接器。  
    第二个连接器监听8009端口,负责和其他的HTTP服务器建立连接。
    在Tomcat与其他HTTP服务器集成时,就需要用到这个连接器。
    8005是tomcat本身的端口
    5. 测试
    http://192.168.2.251:8080/
    

    二、安装MySQL(略)

    1.使用mariadb
    yum -y install mariadb mariadb-server mariadb-libs
    systemctl start mariadb
    mysqladmin -u root password '123'
    创建数据库并指定字符集
    create database jspgou default charset=utf8;
    flush privileges;
    导入数据库
    mysql -u root -p123 -D jspgou < jspgou.sql
    2.使用mysql(略)
    将压缩包内 DB文件中jspgou.sql文件导入至创建好的jspgou数据库中,如导入中出
    现执行sql语句过长问题,请修改mysql配置文件my.cnf中max_allowed_packet参数为64m,默认为1m
    注意:导入数据库时如果报错
    1.把所有datetime类型的字段默认值改成CURRENT_TIMESTAMP
    2.凡是NOT NULL 的报错 :%s/00000000/CURRENT_TIMESTAMP/
    

    三、部署jspgou

    #ls /usr/local/tomcat/webapps/            //默认网站的基目录base
    docs examples host-manager manager ROOT
    # ls /usr/local/tomcat/webapps/ROOT        //默认网站的主目录
    unzip jsp…… .zip
    cp -r ROOT/ /usr/usr/local/tomcat/webapps/
    

    四、更改数据库链接

    程序包内vim /usr/local/tomcat/webapps/ROOT\WEB-INF\config\jdbc.properties文件第20行左右
    jdbc.url=jdbc:mysql://127.0.0.1:3306/创建好的数据库名?characterEncoding=UTF-8
    jdbc.username=root                         
    jdbc.password=123
    
    3.导入数据: 
    

    五、测试

    系统管理后台登录:http://localhost:8080/jeeadmin/jspgou/index.do
    用户名:admin
    密 码:123456
    

    nginx负载均衡
    Nginx配置

    tcpdump -i lo -n -v port 8083
    [root@www ~]# vim /usr/local/nginx/conf/nginx.conf
    这个地方是 地址池,这里包含了后端服务器的地址和端口,这里的名字随便启。
    http {
        upstream tomcat_pool {
            #ip_hash;                                                  最大失败次数  失败超时时间  
            server 192.168.122.105:8081 weight=1 max_fails=2 fail_timeout=2;
            server 192.168.122.105:8082 weight=1 max_fails=2 fail_timeout=2;
            server 192.168.122.105:8083 weight=1 max_fails=2 fail_timeout=2;
            server 192.168.122.105:8084 weight=1 max_fails=2 fail_timeout=2;
        }
    负载均衡的算法: RR round robin session  
    ip_hash 是常用的负载均衡的算法
        server {
            location / {
                    proxy_pass http://tomcat_pool;
                    proxy_redirect off;
                    proxy_set_header Host $host;
                    proxy_set_header X-Real-IP $remote_addr;
                    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
                }
         }                  
     }
    

    session(会话)暂没有使用共享方式,目前采用的会话保持。即将同一个client的访问始终调度到同一后端实例。

    tomcat优化

    主要分类:

    1.java虚拟机本身的优化
    2.进程数的优化
    
    内存溢出的处理办法(tomcat内存优化):修改catalina.sh
    

    Tomcat内存优化主要是对 tomcat 启动参数优化,我们可以在 tomcat 的启动脚本 catalina.sh(在此文件第一行开始添加新的设置即可)中设置 JAVA_OPTS 参数

    JAVA_OPTS=”-server -Xms800m -Xmx800m -XX:PermSize=64M
    -XX:MaxNewSize=256m -XX:MaxPermSize=128m -Djava.awt.headless=true ”
    
      -server  启用jdk 的 server 版;  
      -Xms    java虚拟机初始化时的初始堆大小 就是heap,值越大处理频率就会越少;  
      -Xmx   java虚拟机可使用的最大堆大小;  
      -XX:PermSize          内存永久保留区域  
      -XX:MaxPermSize   内存最大永久保留区域(老生代对象能占用内存的最大值)
       没有标准,一般设成 -XX:PermSize=64M的一倍
      -XX:MaxNewSize=size 新生成对象能占用内存的最大值 一般设成-XX:MaxPermSize=128m的两倍
      
    注:要加“m”说明是MB,否则就是KB,在启动tomcat时会报内存不足。
    注:永久保存区:
    
     PermGen space的全称是Permanent Generation space,是指内存的永久保存区
    域。这一部分用于存放Class和Meta的信息,Class在被 Load的时候被放入PermGen
    space区域,它和存放Instance的Heap区域不同,GC(Garbage Collection)不会在主
    程序运行期对PermGen space进行清理,所以如果你的APP会LOAD很多CLASS的
    话,就很可能出现PermGen space错误。这种错误常见在web服务器对JSP进行
    precompile的时候。jvm的gc是不会清理PemGen space的,导致内存溢出
    

    常见的内存溢出一般会有下面三种情况:

            1.OutOfMemoryError: Java heap space  //堆溢出,在JVM中如果98%的时间
    是用于GC且可用的 Heap size 不足2%的时候将抛出此异常信息  
    解决方案:调大堆内存
            2.OutOfMemoryError: PermGen space    //永久保存区域溢出 
            3.OutOfMemoryError: unable to create new native thread.  
    //当JVM的heap size设置过大时,thread的创建数量便会减少    
    解决方案:减少heap size的值,他的值不能超过真实硬盘的一半
    

    解决:

    1.调整-Xms -Xmx参数可以解决第一种情况
        
        64位操作系统对堆内存大小无限制
        堆的大小可以使用 java -Xmx***M  -version 命令来测试,***位置填写想设置的内
    存大小。支持的话会出现jdk的版本号,不支持会报错。
       
        -Xms -Xmx一般配置成一样比较好比如set JAVA_OPTS= -Xms1024m -Xmx1024m
       注意:java -Xmx***M  version 命令来测试的最大堆内存是 -Xmx与 -XX:PermSize
    的和,比如系统支持最大的jvm堆大小事1.5G,那  -Xmx1024m  
    -XX:PermSize=768M 是无法运行的
    

    2.加大-XX:PermSize -XX:MaxPermSize来解决第二种情况
    3.解决问题3方法如下:

        1).如果程序中有bug,导致创建大量不需要的线程或者线程没有及时回收,那么
    必须解决这个bug,修改参数是不能解决问题的。 
        2).如果程序确实需要大量的线程,现有的设置不能达到要求,那么可以通过修改
    MaxProcessMemory,JVMMemory,ThreadStackSize这三个因素,来增加能创建的线程数:
            a, MaxProcessMemory 使用64位操作系统
            b, JVMMemory   减少JVMMemory的分配  使用tomcat的catalina.sh这里配
    置,JAVA_OPTS=-Xms1024m -Xmx1024m -XX:PermSize=256M -XX:MaxNewSize=512m-XX:MaxPermSize=256m
            c, ThreadStackSize  减小单个线程的栈大小 
    
        这个异常问题本质原因是:
            我们创建了太多的线程,而能创建的线程数是有限制的,导致了异常的发生。
            能创建的线程数的具体计算公式如下: 
                (MaxProcessMemory - JVMMemory - ReservedOsMemory) / 
    (ThreadStackSize) = Number of threads
            
                MaxProcessMemory  指的是一个进程的最大内存
                JVMMemory              JVM内存
                ReservedOsMemory  保留的操作系统内存
               ThreadStackSize        线程栈的大小 
            
    在java语言里, 当你创建一个线程的时候,虚拟机会在JVM内存创建一个Thread对
    象同时创建一个操作系统线程,而这个系统线程的内存用的不是JVMMemory,而是
    系统中剩下的内存(MaxProcessMemory - JVMMemory - ReservedOsMemory)。
    由公式得出结论:你给JVM内存越多,那么你能创建的线程
    越少,越容易发生java.lang.OutOfMemoryError: unable to create new native thread。
    
     MaxProcessMemory(Maximum Address Space Per Process):
     Operating System                    Maximum Address Space Per Process
     Redhat Linux 32 bit                    2 GB
     Redhat Linux 64 bit                    3 GB
     Windows 98/2000/NT/Me/XP    2 GB
    

    JVMMemory: Heap + PermGen

    -XX:ThreadStackSize=512 设置线程栈大小,若为0则使用系统默认值(jdk1.5.0以后默认值为1M)
    

    线程池设置:

    线程池指定Web请求负载的数量,因此,为获得更好的性能这部分应小心处理。可
    以通过调整连接器属性“maxThreads”完成设置。maxThreads的值应该根据流量的
    大小,如果值过低,将有没有足够的线程来处理所有的请求,请求将进入等待状
    态,只有当一个的处理线程释放后才被处理;如果设置的太大,Tomcat的启动将花
    费更多时间。因此它取决于我们给maxThreads设置一个正确的值。
    #vim server.xml
        <Connector port="8080" protocol="HTTP/1.1" 
                   maxThreads="500" 能接受的最大连接数 默认是200    就是并发量 最多上到500
                   connectionTimeout="20000"  连接超时时间 单位是毫秒
                   redirectPort="8443" />
    
    在上述配置中,maxThreads值设定为“500”,这指定可以由服务器处理的并发请求
    的最大数量。如果没有指定,这个属性的默认值为“200”。任何多出的并发请求将收
    到“拒绝连接”的错误提示,直到另一个处理请求进程被释放。错误看起来如下,
    [ org.apache.tomcat.util.threads.ThreadPool logFull SEVERE: All threads (500) are 
     currently busy, waiting. Increase maxThreads (500) or check the servlet status  
    
    最好使用“Tomcat集群”的多个实例。也就是说,如果有“1000”请求,两个Tomcat实
    例设置“maxThreads= 500”,而不在单Tomcat实例的情况下设置maxThreads=1000。
    
    
     <Connector port="9027"      
                     protocol="HTTP/1.1"  
                     maxHttpHeaderSize="8192"      
                     maxThreads="1000"     
                     minSpareThreads="100"     
                     maxSpareThreads="1000"    
                     minProcessors="100"     
                     maxProcessors="1000"    
                     enableLookups="false"    
                     URIEncoding="utf-8"     
                     acceptCount="1000"     
                     redirectPort="8443"     
                     disableUploadTimeout="true"/> 
    
    参数说明:
    maxThreads            客户请求最大线程数 
    minSpareThreads    Tomcat初始化时创建的 socket 线程数  
    maxSpareThreads   Tomcat连接器的最大空闲 socket 线程数  
    enableLookups        若设为true, 则支持域名解析,可把 ip 地址解析为主机名    
    redirectPort             在需要基于安全通道的场合,把客户请求转发到基于SSL 的 redirectPort 端口  
    acceptAccount        监听端口队列最大数,满了之后客户请求会被拒绝(不能小于maxSpareThreads  )  
    connectionTimeout  连接超时  
    minProcessors         服务器创建时的最小处理线程数  
    maxProcessors        服务器同时最大处理线程数  
    URIEncoding            URL统一编码  
    
    

    查看内存设置和使用信息:

    [root@nfs conf]# lsof -i:8080
    COMMAND  PID USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
    java    1903 root   46u  IPv6  16003      0t0  TCP *:webcache (LISTEN)
    [root@nfs conf]# jmap -heap 1903  查看详细的java信息
    

    打war部署(扩展):

    选中eclipse中的jeecms项目,右键->Export->WAR file,生成xxx.war
    将xxx.war放入本机tomcat安装目录下的webapps文件夹中,确保webapps下不包含名为xxx的文件夹,启动tomcat 
    

    niginx负载均衡的算法:

    一、Nginx负载均衡算法

        1、轮询(默认)
            每个请求按时间顺序逐一分配到不同的后端服务,如果后端某台服务器死机
    ,自动剔除故障系统,使用户访问不受影响。
        2、weight(轮询权值)
            weight的值越大分配到的访问概率越高,主要用于后端每台服务器性能不均衡
    的情况下。或者仅仅为在主从的情况下设置不同的权值,达到合理有效的地利用主
    机资源。
        3、ip_hash
            每个请求按访问IP的哈希结果分配,使来自同一个IP的访客固定访问一台后端
    服务器,并且可以有效解决动态网页存在的session共享问题。
                    以下这两种本的nginx都不支持,需要安装相应的模块
        4、fair
            比  weight、ip_hash更加智能的负载均衡算法,fair算法可以根据页面大小和加
    载时间长短智能地进行负载均衡,也就是根据后端服务器的响应时间  来分配请求,
    响应时间短的优先分配。Nginx本身不支持fair,如果需要这种调度算法,则必须安
    装upstream_fair模块。
        5、url_hash
            按访问的URL的哈希结果来分配请求,使每个URL定向到一台后端服务器,可
    以进一步提高后端缓存服务器的效率。Nginx本身不支持url_hash,如果需要这种调
    度算法,则必须安装Nginx的hash软件包。
    

    一、轮询(默认)

    每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器down掉,能自
    动剔除。 
    

    二、weight(权重)

    指定轮询几率,weight和访问比率成正比,用于后端服务器性能不均的情况。  
    例如:  
    upstream bakend {  
    server 192.168.0.14 weight=10;  
    server 192.168.0.15 weight=10;  
    } 
    

    三、ip_hash

    每个请求按访问ip的hash结果分配,这样每个访客固定访问一个后端服务器,可以解决session的问题。  
    例如:  
    upstream bakend {  
    ip_hash;  
    server 192.168.0.14:88  weight=10;  
    server 192.168.0.15:80  weight=10;  代权重的轮询
    }  
    

    四、fair(第三方)

    按后端服务器的响应时间来分配请求,响应时间短的优先分配。  
    upstream backend {  
    server server1;  
    server server2;  
    fair;  
    }  
    

    五、url_hash(第三方)

    按访问url的hash结果来分配请求,使每个url定向到同一个后端服务器,后端服务器为缓存时比较有效。  
    例:在upstream中加入hash语句,server语句中不能写入weight等其他的参数,hash_method是使用的hash算法  
    upstream backend {  
    server squid1:3128;  
    server squid2:3128;  
    hash $request_uri;  
    hash_method crc32;  
    

    二、Nginx负载均衡调度状态

      在Nginx upstream模块中,可以设定每台后端服务器在负载均衡调度中的状态,常用的状态有:
        1、down,表示当前的server暂时不参与负载均衡
        2、backup,预留的备份机器。当其他所有的非backup机器出现故障或者忙的时
    候,才会请求backup机器,因此这台机器的访问压力最低
        3、max_fails,允许请求失败的次数,默认为1,当超过最大次数时,返回
    proxy_next_upstream模块定义的错误。
        4、fail_timeout,请求失败超时时间,在经历了max_fails次失败后,暂停服务的
    时间。max_fails和fail_timeout可以一起使用。
    

    如果Nginx没有仅仅只能代理一台服务器的话,那它也不可能像今天这么火,Nginx
    可以配置代理多台服务器,当一台服务器宕机之后,仍能保持系统可用。具体配置
    过程如下:

    1. 在http节点下,添加upstream节点。
    upstream linuxidc { 
          server 10.0.6.108:7080; 
          server 10.0.0.85:8980; 
    }
      2.  将server节点下的location节点中的proxy_pass配置为:http:// + upstream名称,即“
    http://linuxidc”.
    
    location / { 
                root  html; 
                index  index.html index.htm; 
                proxy_pass http://linuxidc; 
    }
        3.   现在负载均衡初步完成了。upstream按照轮询(默认)方式进行负载,每个
    请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器down掉,能自动剔
    除。虽然这种方式简便、成本低廉。但缺点是:可靠性低和负载分配不均衡。适用
    于图片服务器集群和纯静态页面服务器集群。
        除此之外,upstream还有其它的分配策略,分别如下:
        weight(权重)
        指定轮询几率,weight和访问比率成正比,用于后端服务器性能不均的情况。
    如下所示,10.0.0.88的访问比率要比10.0.0.77的访问比率高一倍。
    upstream linuxidc{ 
          server 10.0.0.77 weight=5; 
          server 10.0.0.88 weight=10; 
    }
        ip_hash(访问ip)
        每个请求按访问ip的hash结果分配,这样每个访客固定访问一个后端服务器,可以解决session的问题。
    upstream favresin{ 
          ip_hash; 
          server 10.0.0.10:8080; 
          server 10.0.0.11:8080; 
    }
        fair(第三方)
        按后端服务器的响应时间来分配请求,响应时间短的优先分配。与weight分配策略类似。
     upstream favresin{      
          server 10.0.0.10:8080; 
          server 10.0.0.11:8080; 
          fair; 
    }
    url_hash(第三方)
    按访问url的hash结果来分配请求,使每个url定向到同一个后端服务器,后端服务器为缓存时比较有效。
    注意:在upstream中加入hash语句,server语句中不能写入weight等其他的参数,hash_method是使用的hash算法。
     upstream resinserver{ 
          server 10.0.0.10:7777; 
          server 10.0.0.11:8888; 
          hash $request_uri; 
          hash_method crc32; 
    }
    upstream还可以为每个设备设置状态值,这些状态值的含义分别如下:
    down 表示单前的server暂时不参与负载.
    weight 默认为1.weight越大,负载的权重就越大。
    max_fails :允许请求失败的次数默认为1.当超过最大次数时,返回proxy_next_upstream 模块定义的错误.
    fail_timeout : max_fails次失败后,暂停的时间。
    backup: 其它所有的非backup机器down或者忙的时候,请求backup机器。所以这台机器压力会最轻。
    upstream bakend{ #定义负载均衡设备的Ip及设备状态 
          ip_hash; 
          server 10.0.0.11:9090 down; 
          server 10.0.0.11:8080 weight=2; 
          server 10.0.0.11:6060; 
          server 10.0.0.11:7070 backup; 
    }
    

    相关文章

      网友评论

          本文标题:Tomcat

          本文链接:https://www.haomeiwen.com/subject/jszroftx.html