1、haproxy https实现
环境:
haproxy服务器:192.168.184.101
nginx后端:192.168.184.102
nginx后端页面:
[root@centos7-02 ~]# cat /usr/local/nginx/html/test.html
<h1>https://www.example.com</h1>
<h2>192.168.184.102</h2>
haproxy配置:
#生成证书
[root@centos7-01 conf.d]# mkdir /etc/haproxy/certs/
[root@centos7-01 conf.d]# cd /etc/haproxy/certs/
[root@centos7-01 certs]# openssl genrsa -out example.key 2048
[root@centos7-01 certs]# openssl req -new -x509 -key example.key -out example.crt -days 365 -subj "/CN=www.example.com"
[root@centos7-01 certs]# cat example.key example.crt > example.pem
#修改配置文件
[root@centos7-01 certs]# cat /etc/haproxy/conf.d/test.cfg
frontend example_http_port
bind 192.168.184.101:80
bind 192.168.184.101:443 ssl crt /etc/haproxy/certs/example.pem
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 acl_example_domain hdr_dom(host) -i www.example.com
use_backend example_hosts if acl_example_domain
backend example_hosts
mode http
server web1 192.168.184.102:80 check inter 2000 fall 3 rise 5
[root@centos7-01 certs]# systemctl restart haproxy
windows上修改DNS解析:192.168.184.101 www.example.com
测试访问:
2、总结tomcat的核心组件以及根目录结构
tomcat核心组件:
- 顶级组件
Server,代表整个Tomcat容器,一台主机可以启动多tomcat实例,需要确保端口不要产生冲突 - 服务类组件
Service,实现组织Engine和Connector,建立两者之间关联关系, service 里面只能包含一个Engine - 连接器组件
Connector,有HTTP(默认端口8080/tcp)、HTTPS(默认端口8443/tcp)、AJP(默认端口8009/tcp)协议的连接器,AJP(Apache Jserv protocol)是一种基于TCP的二进制通讯协议。 - 容器类
Engine、Host(虚拟主机)、Context(上下文件,解决路径映射)都是容器类组件,可以嵌入其它组件,内部配置如何运行应用程序。 - 内嵌类
可以内嵌到其他组件内,valve、logger、realm、loader、manager等。以logger举例,在不同容器组件内分别定义。 - 集群类组件
listener、cluster
目录结构:
bin:服务启动、停止等相关程序和文件
conf:配置文件
lib:库目录
logs:日志目录
webapps:应用程序,应用部署目录
work:jsp编译后的结果文件,建议提前预热访问
3、tomcat实现多虚拟主机
安装jdk
#下载安装包:https://www.oracle.com/java/technologies/downloads/archive/
[root@centos7-01 local]# tar xvf jdk-8u331-linux-x64.tar.gz -C /usr/local/
[root@centos7-01 ~]# cd /usr/local/
[root@centos7-01 local]# ln -s jdk1.8.0_331/ jdk
#配置环境变量
[root@centos7-01 local]# cat /etc/profile.d/jdk.sh
export JAVA_HOME=/usr/local/jdk
export PATH=$JAVA_HOME/bin:$PATH
[root@centos7-01 local]# . /etc/profile.d/jdk.sh
二进制安装tomcat
[root@centos7-01 ~]# wget https://dlcdn.apache.org/tomcat/tomcat-8/v8.5.78/bin/apache-tomcat-8.5.78.tar.gz
[root@centos7-01 ~]# tar xf apache-tomcat-8.5.78.tar.gz -C /usr/local/
[root@centos7-01 ~]# cd /usr/local/
[root@centos7-01 local]# ln -s apache-tomcat-8.5.78/ tomcat
[root@centos7-01 local]# echo 'PATH=/usr/local/tomcat/bin:$PATH' > /etc/profile.d/tomcat.sh
[root@centos7-01 local]# . /etc/profile.d/tomcat.sh
#创建tomcat专用帐户
[root@centos7-01 local]# useradd -r -s /sbin/nologin tomcat
#准备service文件中相关环境文件
[root@centos7-01 local]# vi /usr/local/tomcat/conf/tomcat.conf
JAVA_HOME=/usr/local/jdk
[root@centos7-01 local]# chown -R tomcat.tomcat /usr/local/tomcat/
#创建tomcat.service文件
[root@centos7-01 local]# 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@centos7-01 local]# systemctl daemon-reload
[root@centos7-01 local]# systemctl enable --now tomcat
多虚拟主机配置
[root@centos7-01 local]# vi /usr/local/tomcat/conf/server.xml
#在文件最后面增加下面内容
...
<Host name="web1.example.com" appBase="/data/webapps/web1" unpackWARs="True"
autoDeploy="false">
<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
prefix="web1_access_log" suffix=".txt" pattern="%h %l %u %t "%r" %s %b" />
</Host>
<Host name="web2.example.com" appBase="/data/webapps/web2" unpackWARs="True"
autoDeploy="false">
<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
prefix="web2_access_log" suffix=".txt" pattern="%h %l %u %t "%r" %s %b" />
</Host>
</Engine>
</Service>
</Server>
#准备虚拟主机的数据目录
[root@centos7-01 local]# mkdir -p /data/webapps/web{1,2}/ROOT
[root@centos7-01 local]# echo web1.example.com > /data/webapps/web1/ROOT/index.html
[root@centos7-01 local]# echo web2.example.com > /data/webapps/web2/ROOT/index.html
[root@centos7-01 local]# systemctl restart tomcat
验证:
#配置hosts解析
[root@centos7-03 ~]# vi /etc/hosts
192.168.184.101 web1.example.com web2.example.com
#测试访问
[root@centos7-03 ~]# curl http://web1.example.com:8080
web1.example.com
[root@centos7-03 ~]# curl http://web2.example.com:8080
web2.example.com
4、nginx实现后端tomcat的负载均衡调度
tomcat1 192.168.184.101
tomcat2 192.168.184.102
nginx 192.168.184.103
tomcat配置
#tomcat1和tomcat2添加以下配置
[root@centos7-01 ~]# vi /usr/local/tomcat/conf/server.xml
<Host name="tomcat-server" appBase="/data/webapps" unpackWARs="True" autoDeploy="false">
</Host>
#在tomcat1和tomcat2创建相同页面文件
[root@centos7-01 ~]# mkdir -p /data/webapps/ROOT
#编写测试jsp文件
[root@centos7-01 ~]# vi /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@centos7-01 ~]# chown -R tomcat.tomcat /data/webapps/
[root@centos7-01 ~]# systemctl restart tomcat
nginx配置
[root@centos7-03 ~]# vi /etc/nginx/nginx.conf
#在http语句块中修改
upstream tomcat-server {
server t1.example.com:8080;
server t2.example.com:8080;
}
server {
listen 80;
listen [::]:80;
server_name _;
root /usr/share/nginx/html;
location ~* \.jsp$ {
proxy_pass http://tomcat-server;
}
#修改hosts文件
[root@centos7-03 ~]# vi /etc/hosts
192.168.184.101 t1.example.com
192.168.184.102 t2.example.com
测试访问
5、简述memcached的工作原理
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)机制来查找可用空间,分配给新记录使用。
4.集群
Memcached集群,称为基于客户端的分布式集群,即由客户端实现集群功能,即Memcached本身不支持集群
Memcached集群内部并不互相通信,一切都需要客户端连接到Memcached服务器后自行组织这些节点,并决定数据存储的节点。