1鄙煤、haproxy https實(shí)現(xiàn)
環(huán)境:
haproxy服務(wù)器: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展哭、總結(jié)tomcat的核心組件以及根目錄結(jié)構(gòu)
tomcat核心組件:
- 頂級(jí)組件
Server泼掠,代表整個(gè)Tomcat容器燃乍,一臺(tái)主機(jī)可以啟動(dòng)多tomcat實(shí)例悟泵,需要確保端口不要產(chǎn)生沖突 - 服務(wù)類組件
Service香到,實(shí)現(xiàn)組織Engine和Connector图柏,建立兩者之間關(guān)聯(lián)關(guān)系, service 里面只能包含一個(gè)Engine - 連接器組件
Connector序六,有HTTP(默認(rèn)端口8080/tcp)、HTTPS(默認(rèn)端口8443/tcp)爆办、AJP(默認(rèn)端口8009/tcp)協(xié)議的連接器难咕,AJP(Apache Jserv protocol)是一種基于TCP的二進(jìn)制通訊協(xié)議课梳。 - 容器類
Engine距辆、Host(虛擬主機(jī))、Context(上下文件,解決路徑映射)都是容器類組件暮刃,可以嵌入其它組件跨算,內(nèi)部配置如何運(yùn)行應(yīng)用程序。 - 內(nèi)嵌類
可以內(nèi)嵌到其他組件內(nèi)椭懊,valve诸蚕、logger、realm氧猬、loader背犯、manager等。以logger舉例盅抚,在不同容器組件內(nèi)分別定義漠魏。 - 集群類組件
listener、cluster
目錄結(jié)構(gòu):
bin:服務(wù)啟動(dòng)妄均、停止等相關(guān)程序和文件
conf:配置文件
lib:庫目錄
logs:日志目錄
webapps:應(yīng)用程序柱锹,應(yīng)用部署目錄
work:jsp編譯后的結(jié)果文件,建議提前預(yù)熱訪問
3丰包、tomcat實(shí)現(xiàn)多虛擬主機(jī)
安裝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
#配置環(huán)境變量
[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
二進(jìn)制安裝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
#創(chuàng)建tomcat專用帳戶
[root@centos7-01 local]# useradd -r -s /sbin/nologin tomcat
#準(zhǔn)備service文件中相關(guān)環(huán)境文件
[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/
#創(chuàng)建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
多虛擬主機(jī)配置
[root@centos7-01 local]# vi /usr/local/tomcat/conf/server.xml
#在文件最后面增加下面內(nèi)容
...
<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>
#準(zhǔn)備虛擬主機(jī)的數(shù)據(jù)目錄
[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
驗(yàn)證:
#配置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實(shí)現(xiàn)后端tomcat的負(fù)載均衡調(diào)度
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創(chuàng)建相同頁面文件
[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>
#配置權(quán)限
[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.內(nèi)存分配機(jī)制
應(yīng)用程序運(yùn)行需要使用內(nèi)存存儲(chǔ)數(shù)據(jù)邑彪,但對(duì)于一個(gè)緩存系統(tǒng)來說瞧毙,申請(qǐng)內(nèi)存、釋放內(nèi)存將十分頻繁寄症,非常容易導(dǎo)致大量內(nèi)存碎片升筏,最后導(dǎo)致無連續(xù)可用內(nèi)存可用。
Memcached采用了Slab Allocator機(jī)制來分配瘸爽、管理內(nèi)存您访。
- Page:分配給Slab的內(nèi)存空間,默認(rèn)為1MB剪决,分配后就得到一個(gè)Slab灵汪。Slab分配之后內(nèi)存按照固定字節(jié)大小等分成chunk檀训。
- Chunk:用于緩存記錄k/v值的內(nèi)存空間。Memcached會(huì)根據(jù)數(shù)據(jù)大小選擇存到哪一個(gè)chunk中享言,假設(shè)chunk有128bytes峻凫、64bytes等多種,數(shù)據(jù)只有100bytes存儲(chǔ)在128bytes中览露,存在少許浪費(fèi)荧琼。
- Chunk最大就是Page的大小,即一個(gè)Page中就一個(gè)Chunk
- Slab Class:Slab按照Chunk的大小分組差牛,就組成不同的Slab Class, 第一個(gè)Chunk大小為 96B的Slab為Class1,Chunk 120B為Class 2,如果有100bytes要存命锄,那么Memcached會(huì)選擇下圖中Slab Class 2 存儲(chǔ),因?yàn)樗?20bytes的Chunk偏化。Slab之間的差異可以使用Growth Factor 控制脐恩,默認(rèn)1.25。
2.懶過期 Lazy Expiration
memcached不會(huì)監(jiān)視數(shù)據(jù)是否過期侦讨,而是在取數(shù)據(jù)時(shí)才看是否過期驶冒,如果過期,把數(shù)據(jù)有效期限標(biāo)識(shí)為0,并不清除該數(shù)據(jù)韵卤。以后可以覆蓋該位置存儲(chǔ)其它數(shù)據(jù)骗污。
3.LRU
當(dāng)內(nèi)存不足時(shí),memcached會(huì)使用LRU(Least Recently Used)機(jī)制來查找可用空間沈条,分配給新記錄使用需忿。
4.集群
Memcached集群,稱為基于客戶端的分布式集群拍鲤,即由客戶端實(shí)現(xiàn)集群功能贴谎,即Memcached本身不支持集群
Memcached集群內(nèi)部并不互相通信,一切都需要客戶端連接到Memcached服務(wù)器后自行組織這些節(jié)點(diǎn)季稳,并決定數(shù)據(jù)存儲(chǔ)的節(jié)點(diǎn)擅这。