Tomcat

2018-09-26  本文已影响0人  Icarus_ac47
传统的服务器只能解析静态界面: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; 
}
上一篇下一篇

猜你喜欢

热点阅读