httpstomcat与nginx

Posted 会飞de冬瓜

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了httpstomcat与nginx相关的知识,希望对你有一定的参考价值。

一、haproxy https实现

1. 准备工作

序号

机器名

IP地址

作用

1

Haproxy

192.168.31.8

提供反向代理、代理证书、将https转发到后端http

2

nginx-01

192.168.31.18

提供静态网页

2

Nginx-02

192.168.31.28

提供静态网页

1.1 Haproxy安装

序号

机器名

IP地址

1

Haproxy

192.168.31.8

1.2 SSL证书准备

序号

机器名

IP地址

1

Haproxy

192.168.31.8


1.3 后端服务器Nginx安装

序号

机器名

IP地址

1

Nginx-01

192.168.31.18

2

Nginx-02

192.168.31.28

1.4 后端页面准备

序号

机器名

IP地址

1

Nginx-01

192.168.31.18

2

Nginx-02

192.168.31.28

cat >/apps/nginx/conf/nginx.conf<<EOF

worker_processes  2;

worker_cpu_affinity 0001 0010;

error_log  logs/error.log;

pid        logs/nginx.pid;

events

   worker_connections  10240;

http

   include       mime.types;

   default_type  application/octet-stream;

   sendfile        on;

   keepalive_timeout  65;

   server

       listen       80;

       location /

           root   /apps/app0;

           index  index.html index.htm;

       

       error_page   500 502 503 504  /50x.html;

       location = /50x.html

           root   html;

       

   

EOF

echo `hostname` `hostname -I` >/apps/app1/index.html


https、tomcat与nginx_centos


序号

机器名

IP地址

1

Haproxy

192.168.31.8

2. Haproxy 配置

mkdir  /etc/haproxy/certs/

cat /data/ssl/www.pana.local.key /data/ssl/www.pana.local.crt > /etc/haproxy/certs/pana.pam

cat >/etc/haproxy/haproxy.cfg <<EOF

global

   maxconn 100000

   chroot /apps/haproxy

   stats socket /var/lib/haproxy/haproxy.sock mode 600 level admin

   user haproxy

   group haproxy

   daemon

   pidfile /var/lib/haproxy/haproxy.pid

   log 127.0.0.1 local2 info

defaults

   option http-keep-alive

   option forwardfor

   maxconn 100000

   mode http

   timeout connect 300000ms

   timeout client 300000ms

   timeout server 300000ms

frontend http_port

###################### https setting ##############################

 bind 192.168.31.8:443 ssl crt /etc/haproxy/certs/pana.pam

 redirect scheme https if ! ssl_fc

 http-request set-header X-forwarded-Port %[dst_port]

 http-request add-header X-forwarded-Proto https if ssl_fc

 mode http

 balance roundrobin

 log global

 option httplog

###################### acl hosts #################################

 default_backend web_hosts

################### backend hosts #################################

backend web_hosts

 mode http

 server web1 192.168.31.18:80 check inter 2000 fall 3 rise 5

 server web2 192.168.31.28:80 check inter 2000 fall 3 rise 5

EOF

3. 测试

https、tomcat与nginx_nginx_02

至此Haproxy Https配置已完成


二、总结tomcat的核心组件以及根目录结构 

1. Tomcat 核心组件

Tomcat核心组件有6个,分别为Tomcat有Server、Service、Connector、Engine、Host和Context等

1.1 Server

Server元素在最顶层,代表整个Tomcat容器,因此它必须是server.xml中唯一一个最外层的元素。一个Server元素中可以有一个或多个Service元素。可以启动多个Server,即tomcat的多实例

Server的主要任务,就是提供一个接口让客户端能够访问到这个Service集合,同时维护它所包含的所有的Service的声明周期,包括如何初始化、如何结束服务、如何找到客户端要访问的Service。

1.2 Service

Service的作用,是在Connector和Engine外面包了一层,把它们组装在一起,对外提供服务。一个Service可以包含多个Connector,但是只能包含一个Engine;其中Connector的作用是从客户端接收请求,Engine的作用是处理接收进来的请求。Tomcat可以提供多个Service,不同的Service监听不同的端口。

1.3 Connector

Connector的主要功能,是接收连接请求,创建Request和Response对象用于和请求端交换数据;然后分配线程让Engine来处理这个请求,并把产生的Request和Response对象传给Engine。可以为这个Service提供多个连接器Connector,这些Connector使用了不同的协议,绑定了不同的端口。其作用就是处理来自客户端的不同的连接请求或响应

1.4 Engine

Engine组件在Service组件中有且只有一个;Engine是Service组件中的请求处理组件。Engine组件从一个或多个Connector中接收请求并处理,并将完成的响应返回给Connector,最终传递给客户端。

实际上,Engine、Host和Context都是容器,但它们不是平行的关系,而是父子关系:Engine包含Host,Host包含Context。

1.5 Host

Host是Engine的子容器。Engine组件中可以内嵌1个或多个Host组件,每个Host组件代表Engine中的一个虚拟主机。Host组件至少有一个,且其中一个的name必须与Engine组件的defaultHost属性相匹配。

Host虚拟主机的作用,是运行多个Web应用(一个Context代表一个Web应用),并负责安装、展开、启动和结束每个Web应用。

1.6 Context

Context元素代表在特定虚拟主机上运行的一个Web应用。每个Web应用基于WAR文件,或WAR文件解压后对应的目录(这里称为应用目录)。Context是Host的子容器,每个Host中可以定义任意多的Context元素。Context 定义应用程序单独的路径映射和配置

2.目录结构

bin: 服务启动、停止等相关程序和文件

conf: 配置文件

在tomcat安装目录下的 conf 子目录中,有以下的 tomcat 的配置文件

server.xml 主配置文件

web.xml: 每个webapp只有“部署”后才能被访问,它的部署方式通常由web.xml进行定义,其放位置为WEB-INF/目录中;此文件为所有的webapps提供默认部署相关的配置,每个web应用也可以使用专用配置文件,来覆盖全局文件

context.xml: 用于定义所有web应用均需加载的Context配置,此文件为所有的webapps提供默认配置,每个web应用也可以使用自已专用的配置,它通常由专用的配置文件context.xml来定义,其存放位置为WEB-INF/目录中,覆盖全局的文件

tomcat-users.xml: 用户认证的账号和密码文件

catalina.policy: 当使用security选项启动tomcat时,用于为tomcat设置安全策略

catalina.properties: Tomcat 环境变量的配置,用于设定类加载器路径,以及一些与JVM调优相关参数

logging.properties: Tomcat 日志系统相关的配置,可以修改日志级别和日志路径等

lib: 库目录

logs: 日志目录

webapps: 应用程序,应用部署目录

Tomcat中默认网站根目录是$CATALINA_BASE/webapps/。$CATALINA_BASE/webapps下面的每个目录都对应一个Web应用,即WebApp。在Tomcat的webapps目录中,有个非常特殊的目录ROOT,它就是网站默认根目录。

$CATALINA_BASE/webapps下面的每个目录对应的WebApp,可能有以下子目录,但下面子目录是非必须的

主页配置:默认按以下顺序查找主页文件 index.html,index.htm、index.jsp

WEB-INF/:当前目录WebApp的私有资源路径,通常存储当前应用使用的web.xml和context.xml

配置文件

META-INF/:类似于WEB-INF,也是私有资源的配置信息,和WEB-INF/目录一样浏览器无法访问

classes/:类文件,当前webapp需要的类

lib/:当前应用依赖的jar包

work: jsp编译后的结果文件,建议提前预热访问


三、tomcat实现多虚拟主机

1.安装tomcat

#下载tomcat8的包

[root@centos8 ~]#wget https://mirrors.tuna.tsinghua.edu.cn/apache/tomcat/tomcat-8/v8.5.73/bin/apache-tomcat-8.5.73.tar.gz

[root@centos8 ~]#tar -xf apache-tomcat-8.5.73.tar.gz -C /usr/local/

[root@centos8 ~]#cd /usr/local/

[root@centos8 local]#ln -s apache-tomcat-8.5.73/ tomcat

[root@centos8 local]#echo PATH=/usr/local/tomcat/bin:$PATH> /etc/profile.d/tomcat.sh

[root@centos8 local]#. /etc/profile.d/tomcat.sh

[root@centos8 local]#echo $PATH

/usr/local/tomcat/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin

2.安装jdk

[root@centos8 ~]#dnf -y install java-1.8.0-openjdk.x86_64 java-1.8.0-openjdk-devel

[root@centos8 ~]#java -version

openjdk version "1.8.0_312"

OpenJDK Runtime Environment (build 1.8.0_312-b07)

OpenJDK 64-Bit Server VM (build 25.312-b07, mixed mode)

3.启动及关闭tomcat

[root@centos8 ~]#catalina.sh start

Using CATALINA_BASE: /usr/local/tomcat

Using CATALINA_HOME: /usr/local/tomcat

Using CATALINA_TMPDIR: /usr/local/tomcat/temp

Using JRE_HOME: /usr

Using CLASSPATH: /usr/local/tomcat/bin/bootstrap.jar:/usr/local/tomcat/bin/tomcat-juli.jar

Using CATALINA_OPTS:

Tomcat started.

[root@centos8 ~]#ps aux|grep tomcat

root 32332 2.1 1.6 5129608 134564 pts/0 Sl 17:56 0:03 /usr/bin/java -Djava.util.logging.config.file=/usr/local/tomcat/conf/logging.properties -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -Djdk.tls.ephemeralDHKeySize=2048 -Djava.protocol.handler.pkgs=org.apache.catalina.webresources -Dorg.apache.catalina.security.SecurityListener.UMASK=0027 -Dignore.endorsed.dirs= -classpath /usr/local/tomcat/bin/bootstrap.jar:/usr/local/tomcat/bin/tomcat-juli.jar -Dcatalina.base=/usr/local/tomcat -Dcatalina.home=/usr/local/tomcat -Djava.io.tmpdir=/usr/local/tomcat/temp org.apache.catalina.startup.Bootstrap start

root 32431 0.0 0.0 12112 1000 pts/0 S+ 17:59 0:00 grep --color=auto tomcat

#关闭tomcat

[root@centos8 ~]#catalina.sh stop

4.配置 tomcat自启动的 service 文件

#创建tomcat专用帐户

[root@centos8 ~]#useradd -r -s /sbin/nologin tomcat

#准备service文件中相关环境文件

[root@centos8 ~]#vim /usr/local/tomcat/conf/tomcat.conf

[root@centos8 ~]#cat /usr/local/tomcat/conf/tomcat.conf

JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.312.b07-2.el8_5.x86_64/

[root@centos8 ~]#chown -R tomcat.tomcat /usr/local/tomcat/

#创建tomcat.service文件

[root@centos8 ~]#vim /lib/systemd/system/tomcat.service

[root@centos8 ~]#cat /lib/systemd/system/tomcat.service

[Unit]

Description=Tomcat

#After=syslog.target network.target remote-fs.target nss-lookup.target

After=syslog.target network.target

[Service]

Type=forking

EnvironmentFile=/usr/local/tomcat/conf/tomcat.conf

ExecStart=/usr/local/tomcat/bin/startup.sh

ExecStop=/usr/local/tomcat/bin/shutdown.sh

PrivateTmp=true

User=tomcat

Group=tomcat

[Install]

WantedBy=multi-user.target

[root@centos8 ~]#systemctl daemon-reload

[root@centos8 ~]#systemctl enable --now tomcat

Created symlink /etc/systemd/system/multi-user.target.wants/tomcat.service →

/usr/lib/systemd/system/tomcat.service.

[root@centos8 jre]#systemctl status tomcat

● tomcat.service - Tomcat

Loaded: loaded (/usr/lib/systemd/system/tomcat.service; enabled; vendor preset: disa>

Active: active (running) since Fri 2021-12-31 18:12:55 CST; 6s ago

Process: 32824 ExecStop=/usr/local/tomcat/bin/shutdown.sh (code=exited, status=0/SUCC>

Process: 32903 ExecStart=/usr/local/tomcat/bin/startup.sh (code=exited, status=0/SUCC>

Main PID: 32911 (java)

Tasks: 25 (limit: 50407)

Memory: 116.4M

CGroup: /system.slice/tomcat.service

└─32911 /usr/lib/jvm/java-1.8.0-openjdk-1.8.0.312.b07-2.el8_5.x86_64//bin/ja>

Dec 31 18:12:55 centos8.magedu.org systemd[1]: Starting Tomcat...

Dec 31 18:12:55 centos8.magedu.org systemd[1]: Started Tomcat.

5.多虚拟主机配置

#说明:name 必须是主机名,用主机名来匹配;

#appBase 当前主机的网页根目录,是相对于 $CATALINA_HOME ,也可以使用绝对路径;

#unpackWARs 是否自动解压war格式;

#autoDeploy 热部署,自动加载并运行应用

[root@centos8 jre]#vim /usr/local/tomcat/conf/server.xml

[root@centos8 jre]#tail /usr/local/tomcat/conf/server.xml

#添加了以下四行

<Host name="node1.tomcat.com" appBase="/data/webapps1">

</Host>

<Host name="node2.tomcat.com" appBase="/data/webapps2">

</Host>

</Engine>

</Service>

</Server>

#对每个虚拟主机,准备数据

[root@centos8 jre]#mkdir /data/webapps1,2/ROOT -pv

mkdir: created directory /data

mkdir: created directory /data/webapps1

mkdir: created directory /data/webapps1/ROOT

mkdir: created directory /data/webapps2

mkdir: created directory /data/webapps2/ROOT

[root@centos8 ~]#cat /data/webapps1/ROOT/index.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>

<!DOCTYPE html>

<html>

<head>

<meta charset="utf-8">

<title>jsp例子</title>

</head>

<body>

后面的内容是服务器端动态生成字符串,最后拼接在一起

<br>

<%=request.getRequestURL()%>

</body>

</html>

[root@centos8 ~]#cp -p /data/webapps1/ROOT/index.jsp /data/webapps2/ROOT/index.jsp

[root@centos8 ~]#chown -R tomcat.tomcat /data/webapps1,2/

[root@centos8 ~]#echo 10.0.0.150 node1.tomcat.com node2.tomcat.com >> /etc/hosts

[root@centos8 ~]#cat /etc/hosts

127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4

::1 localhost localhost.localdomain localhost6 localhost6.localdomain6

10.0.0.150 node1.tomcat.com node2.tomcat.com

#修改配置文件后重启tomcat服务

[root@centos8 ~]#systemctl restart tomcat

#访问测试

[root@centos8 ~]#curl http://node1.tomcat.com:8080

<!DOCTYPE html>

<html>

<head>

<meta charset="utf-8">

<title>jsp例子</title>

</head>

<body>

后面的内容是服务器端动态生成字符串,最后拼接在一起

<br>

http://node1.tomcat.com:8080/

</body>

</html>

[root@centos8 ~]#curl http://node2.tomcat.com:8080

<!DOCTYPE html>

<html>

<head>

<meta charset="utf-8">

<title>jsp例子</title>

</head>

<body>

后面的内容是服务器端动态生成字符串,最后拼接在一起

<br>

http://node2.tomcat.com:8080/

</body>

</html>

四、nginx实现后端tomcat的负载均衡调度

1.负载均衡主机和网络地址规划

10.0.0.152  proxy.magedu.org nginx

10.0.0.150   t1.magedu.org   tomcat1

10.0.0.160   t2.magedu.org   tomcat2

#只需在10.0.0.52的nginx主机上实现域名解析

[root@localhost ~]# cat /etc/hosts

127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4

::1         localhost localhost.localdomain localhost6 localhost6.localdomain6

10.0.0.152 proxy.magedu.org proxy

10.0.0.150 t1.magedu.org t1

10.0.0.160 t2.magedu.org t2

2.负载均衡tomcat主机准备

修改tomcat的虚拟机主机为自定义的主机名,并设为默认的虚拟主机

t1虚拟主机配置conf/server.xml

[root@centos8 ~]#vim /usr/local/tomcat/conf/server.xml

<Engine name="Catalina" defaultHost="t1.magedu.org">

   <Host name="t1.magedu.org" appBase="/data/webapps" autoDeploy="true" >

   </Host>

</Engine>

[root@centos8 ~]#systemctl restart tomcat

t2虚拟主机配置conf/server.xml

[root@centos8 ~]#vim /usr/local/tomcat/conf/server.xml

<Engine name="Catalina" defaultHost="t2.magedu.org">

   <Host name="t2.magedu.org" appBase="/data/webapps" autoDeploy="true" >

   </Host>

</Engine>

[root@centos8 ~]#systemctl restart tomcat

3.准备负载均衡规划测试用的jsp文件

#在t1和 t2节点创建相同的文件/data/webapps/ROOT/index.jsp

[root@centos8 ~]#mkdir -pv /data/webapps/ROOT

mkdir: created directory /data/webapps

mkdir: created directory /data/webapps/ROOT

[root@centos8 ~]#vim /data/webapps/ROOT/index.jsp

[root@centos8 ~]#cat /data/webapps/ROOT/index.jsp

<%@ page import="java.util.*" %>

<!DOCTYPE html>

<html lang="en">

<head>

<meta charset="UTF-8">

<title>tomcat test</title>

</head>

<body>

<div>On <%=request.getServerName() %></div>

<div><%=request.getLocalAddr() + ":" + request.getLocalPort() %></div>

<div>SessionID = <span style="color:blue"><%=session.getId() %></span></div>

<%=new Date()%>

</body>

</html>

[root@centos8 ~]#chown -R tomcat.tomcat /data/webapps/

4.Nginx 实现后端 tomcat 的负载均衡

[root@localhost ~]# yum install -y nginx

[root@localhost ~]# vim /etc/nginx/nginx.conf

#在http模块中添加一下几行

   upstream tomcat

       server t1.magedu.org:8080;

       server t2.magedu.org:8080;

       

   server

       server_name proxy.magedu.org;

       location ~* \\.(jsp|do)$

           proxy_pass http://tomcat;

           

       

[root@localhost ~]# systemctl restart nginx

[root@localhost ~]# curl http://proxy.magedu.org/index.jsp

<!DOCTYPE html>

<html lang="en">

<head>

<meta charset="UTF-8">

<title>tomcat test</title>

</head>

<body>

<div>On tomcat</div>

<div>10.0.0.150:8080</div>

<div>SessionID = <span style="color:blue">23B0399E91F79E1F934E1AA087BB26D0</span></div>

Fri Dec 31 21:55:40 CST 2021

</body>

</html>

[root@localhost ~]# curl http://proxy.magedu.org/index.jsp

<!DOCTYPE html>

<html lang="en">

<head>

<meta charset="UTF-8">

<title>tomcat test</title>

</head>

<body>

<div>On tomcat</div>

<div>10.0.0.160:8080</div>

<div>SessionID = <span style="color:blue">306D4E2B1415782E799AE991EFA3286C</span></div>

Fri Dec 31 21:55:45 CST 2021

</body>

</html>

#可以看到轮询调度效果,每次刷新后端主机和SessionID都会变化

5.实现 session 黏性

#在upstream中使用ip_hash指令,使用客户端IP地址Hash。

[root@localhost ~]# vim /etc/nginx/nginx.conf

#在http模块中添加一下几行

   upstream tomcat

    ip_hash;

       server t1.magedu.org:8080;

       server t2.magedu.org:8080;

       

   server

       server_name proxy.magedu.org;

       location ~* \\.(jsp|do)$

           proxy_pass http://tomcat;

           

       

[root@localhost ~]# systemctl restart  nginx

[root@localhost ~]# curl http://proxy.magedu.org/index.jsp

<!DOCTYPE html>

<html lang="en">

<head>

<meta charset="UTF-8">

<title>tomcat test</title>

</head>

<body>

<div>On tomcat</div>

<div>10.0.0.160:8080</div>

<div>SessionID = <span style="color:blue">36DA811FDAEFC13070FE522BC206E68D</span></div>

Fri Dec 31 21:58:53 CST 2021

</body>

</html>

[root@localhost ~]# curl http://proxy.magedu.org/index.jsp

<!DOCTYPE html>

<html lang="en">

<head>

<meta charset="UTF-8">

<title>tomcat test</title>

</head>

<body>

<div>On tomcat</div>

<div>10.0.0.160:8080</div>

<div>SessionID = <span style="color:blue">39CC514BF59EBC8244BF2CD510EE2419</span></div>

Fri Dec 31 21:58:55 CST 2021

</body>

</html>

#用curl访问每次都调度到10.0.0.160主机上,但因为curl每次请求不会自动携带之前获取的cookie,所有SessionID每次都在变化

#通过图形浏览器可看到主机不变,sessionID不变


五、简述memcached的工作原理

Memcached 只支持能序列化的数据类型,不支持持久化,基于Key-Value的内存缓存系统

1.内存分配机制

应用程序运行需要使用内存存储数据,但对于一个缓存系统来说,申请内存、释放内存将十分频繁,非常容易导致大量内存碎片,最后导致无连续可用内存可用。

Memcached采用了Slab Allocator机制来分配、管理内存。

 Page:分配给Slab的内存空间,默认为1MB,分配后就得到一个Slab。Slab分配之后内存按照固定字节大小等分成chunk。

 Chunk:用于缓存记录k/v值的内存空间。Memcached会根据数据大小选择存到哪一个chunk中,假设chunk有128bytes、64bytes等多种,数据只有100bytes存储在128bytes中,存在少许浪费。

  Chunk最大就是Page的大小,即一个Page中就一个Chunk

 Slab Class:Slab按照Chunk的大小分组,就组成不同的Slab Class, 第一个Chunk大小为 96B的Slab为Class1,Chunk 120B为Class 2,如果有100bytes要存,那么Memcached会选择Slab Class 2 存储,因为它是120bytes的Chunk。Slab之间的差异可以使用Growth Factor 控制,默1.25。

2.懒过期 Lazy Expiration

memcached不会监视数据是否过期,而是在取数据时才看是否过期,如果过期,把数据有效期限标识为0,并不清除该数据。以后可以覆盖该位置存储其它数据。

3.LRU

当内存不足时,memcached会使用LRU(Least Recently Used)机制来查找可用空间,分配给新记录使用。


以上是关于httpstomcat与nginx的主要内容,如果未能解决你的问题,请参考以下文章

Android LiveData粘性,粘连,倒灌

CRM系统完善客户服务体系,提高客户黏性

Android EventBus保姆级源码解析黏性事件原理

iOS版QQ的黏性下拉刷新效果简易实现

iOS版QQ的黏性下拉刷新效果简易实现

信息流广告投放怎么样才能精准,超强黏性?