第十九周 企業(yè)級(jí)Web應(yīng)用服務(wù)器TOMCAT

1、haproxy https實(shí)現(xiàn)

1.1 證書(shū)制作

[root@haproxy ~]#cd /etc/pki/tls/certs
[root@haproxy certs]#mkdir /etc/haproxy/conf.d/ssl
[root@haproxy certs]#vim Makefile       #設(shè)置私鑰key不加密
/usr/bin/openssl genrsa $(KEYLEN) > $@        #修改此行

[root@haproxy certs]#make /etc/haproxy/conf.d/ssl/www.magedu.org.crt
… …
Country Name (2 letter code) [XX]:CN
State or Province Name (full name) []:beijing
Locality Name (eg, city) [Default City]:beijing
Organization Name (eg, company) [Default Company Ltd]:magedu
Organizational Unit Name (eg, section) []:it
Common Name (eg, your name or your server’s hostname) []:www.magedu.org
Email Address []:

[root@haproxy certs]#ls /etc/haproxy/conf.d/ssl/
www.magedu.org.crt   www.magedu.org.key

[root@haproxy certs]#cat www.magedu.org.crt www.magedu.org.key > www.magedu.org.pem

1.2 https配置示例

[root@haproxy ~]#vim /etc/haproxy/conf.d/test.cfg
listen web_http_https_nodes
  bind 10.0.0.100:80
  bind 10.0.0.100:443 crt /etx/haproxy/conf.d/ssl/www.magedu.org.pem
  redirect scheme https if !{ ssl_fc }      # 注意{ }內(nèi)的空格
  server web1 10.0.0.18:80 check inter 3000 fall 3 rise 5
  server web2 10.0.0.28:80 check inter 3000 fall 3 rise 5

[root@haproxy ~]#systemctl restart haproxy
[root@haproxy ~]#ss -ntl     #80和443端口打開(kāi)

#在10.0.0.8客戶(hù)端上測(cè)試
[root@client ~]#curl -k https://10.0.0.100/       #-k忽略證書(shū)檢查
10.0.0.18
[root@client ~]#curl -k https://10.0.0.100/
10.0.0.28
[root@client ~]#curl -k https://10.0.0.100/
10.0.0.18
[root@client ~]#curl -k https://10.0.0.100/
10.0.0.28

1.3 修改后端服務(wù)器的日志格式

[root@rs1 ~]#vim /etc/httpd/conf/httpd.conf
LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\" \"%{X-Forwarded-Port}i\" \"%{X-Forwarded-Proto}i\"" combined

[root@rs2 ~]#vim /etc/httpd/conf/httpd.conf
LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\" \"%{X-Forwarded-Port}i\" \"%{X-Forwarded-Proto}i\"" combined

1.4 驗(yàn)證https

[root@client ~]#curl http://10.0.0.100/ -I
HTTP/1.1 302 Found
content-length: 0
location: https:/10.0.0.100/
cache-control: no-cache

[root@client ~]#curl http://10.0.0.100/ -ILk
HTTP/1.1 302 Found
content-length: 0
location: https:/10.0.0.100/
cache-control: no-cache

HTTP/1.1 200 OK
date: Wed, 23 Jun 2021 02:07:10 GMT
server: Apache/2.4.37 (centos) OpenSSL/1.1.1g
last-modified: Fri, 18 Jun 2021 08:54:55 GMT
etag: "b-5c5067a4b39dd"
accept-ranges: bytes
content-length: 11
content-type: text/html; charset=UTF-8

[root@client ~]#curl http://10.0.0.100/ -Lk
10.0.0.28
[root@client ~]#curl http://10.0.0.100/ -Lk
10.0.0.18

2、總結(jié)tomcat的核心組件以及根目錄結(jié)構(gòu)

tomcat的核心組件

  • Tomcat啟動(dòng)一個(gè)Server進(jìn)程??梢詥?dòng)多個(gè)Server,即tomcat的多實(shí)例, 但一般只啟動(dòng)一個(gè)
  • 創(chuàng)建一個(gè)Service提供服務(wù)??梢詣?chuàng)建多個(gè)Service,但一般也只創(chuàng)建一個(gè)
    ? 每個(gè)Service中,是Engine和其連接器Connector的關(guān)聯(lián)配置
  • 可以為這個(gè)Service提供多個(gè)連接器Connector,這些Connector使用了不同的協(xié)議,綁定了不同的端口。其作用就是處理來(lái)自客戶(hù)端的不同的連接請(qǐng)求或響應(yīng)
  • Service 內(nèi)部還定義了Engine,引擎才是真正的處理請(qǐng)求的入口,其內(nèi)部定義多個(gè)虛擬主機(jī)Host
    ? Engine對(duì)請(qǐng)求頭做了分析,將請(qǐng)求發(fā)送給相應(yīng)的虛擬主機(jī)
    ? 如果沒(méi)有匹配,數(shù)據(jù)就發(fā)往Engine上的defaultHost缺省虛擬主機(jī)
    ? Engine上的缺省虛擬主機(jī)可以修改
  • Host 定義虛擬主機(jī),虛擬主機(jī)有name名稱(chēng),通過(guò)名稱(chēng)匹配
  • Context 定義應(yīng)用程序單獨(dú)的路徑映射和配置

tomcat的根目錄結(jié)構(gòu)
Tomcat中默認(rèn)網(wǎng)站根目錄是/usr/local/tomat/webapps/
在Tomcat中部署主站應(yīng)用程序和其他應(yīng)用程序,和之前WEB服務(wù)程序不同。

nginx
假設(shè)在nginx中部署2個(gè)網(wǎng)站應(yīng)用eshop、forum,假設(shè)網(wǎng)站根目錄是/data/nginx/html,那么部署可以是這樣的。
eshop解壓縮所有文件放到 /data/nginx/html/ 目錄下,forum 的文件放在 /data/nginx/html/forum/ 下。
最終網(wǎng)站鏈接有以下對(duì)應(yīng)關(guān)系
http://localhost/ 對(duì)應(yīng)于eshop的應(yīng)用,即 /data/nginx/html/
http://localhost/forum/ 對(duì)應(yīng)于forum的應(yīng)用,即/data/nginx/html/forum/

Tomcat
Tomcat中默認(rèn)網(wǎng)站根目錄是/usr/local/tomat/webapps/
在Tomcat的webapps目錄中,有個(gè)非常特殊的目錄ROOT,它就是網(wǎng)站默認(rèn)根目錄。
將eshop解壓后的文件放到這個(gè)/usr/local/tomat/webapps/ROOT中。
bbs解壓后文件都放在/usr/local/tomat/webapps/forum目錄下。
/usr/local/tomat/webapps下面的每個(gè)目錄都對(duì)應(yīng)一個(gè)Web應(yīng)用,即WebApp
最終網(wǎng)站鏈接有以下對(duì)應(yīng)關(guān)系
http://localhost/ 對(duì)應(yīng)于eshop的應(yīng)用WebApp,即/usr/local/tomat/webapps/ROOT/目錄,
http://localhost/forum/ 對(duì)應(yīng)于forum的應(yīng)用WebApp,即/usr/local/tomat/webapps/forum/

如果同時(shí)存在/usr/local/tomat/webapps/ROOT/forum ,仍以 /usr/local/tomat/webapps/forum/ 優(yōu)先生效

每一個(gè)虛擬主機(jī)都可以使用appBase指令配置自己的站點(diǎn)目錄,使用appBase目錄下的ROOT目錄作為主站目錄。

3、tomcat實(shí)現(xiàn)多虛擬主機(jī)

#對(duì)每個(gè)虛擬主機(jī),準(zhǔn)備數(shù)據(jù)
[root@centos8 ~]#mkdir /data/website{1,2,3}/ROOT -pv
[root@centos8 ~]#vim  /data/website1/ROOT/index.html
www.a.com
/data/website1/ROOT/index.html

[root@centos8 ~]#vim  /data/website2/ROOT/index.html
www.b.com
/data/website2/ROOT/index.html

[root@centos8 ~]#vim  /data/website3/ROOT/index.html
www.c.com
/data/website3/ROOT/index.html

#修改配置conf/server.xml
[root@centos8 ~]#vim /usr/local/tomcat/conf/server.xml
#在文件最后面增加下面內(nèi)容
<Host name="www.a.com"  appBase="/data/website1/"
unpackWARs="true" autoDeploy="true">
</Host>
<Host name="www.b.com"  appBase="/data/website2/"
unpackWARs="true" autoDeploy="true">
</Host>
<Host name="www.c.com"  appBase="/data/website3/"
unpackWARs="true" autoDeploy="true">
</Host>

[root@centos8 ~]#systemctl restart tomcat

#修改windows中的hosts文件
10.0.0.18  www.a.com  www.b.com  www.c.com

#瀏覽器訪問(wèn)測(cè)試


1.png

2.png

3.png

4、nginx實(shí)現(xiàn)后端tomcat的負(fù)載均衡調(diào)度

1 負(fù)載均衡主機(jī)和網(wǎng)絡(luò)地址規(guī)劃

a.png

    主機(jī)名                IP            服務(wù)           軟件
proxy.magedu.org       10.0.0.8        調(diào)度器         Nginx
t1.magedu.org          10.0.0.18      tomcat1      JDK8、Tomcat8
t2.magedu.org          10.0.0.28      tomcat2      JDK8、Tomcat8
#在10.0.0.8的nginx主機(jī)上實(shí)現(xiàn)域名解析
[root@proxy ~]#vim /etc/hosts
#添加以下行
10.0.0.18   t1.magedu.org
10.0.0.28   t2.magedu.org

#在客戶(hù)端主機(jī)上實(shí)現(xiàn)域名解析
[root@client ~]#vim /etc/hosts
#添加以下行
10.0.0.8    www.magedu.org

2 負(fù)載均衡tomcat主機(jī)準(zhǔn)備
修改tomcat的虛擬機(jī)主機(jī)為自定義的主機(jī)名,并設(shè)為默認(rèn)的虛擬主機(jī)
t1虛擬主機(jī)配置conf/server.xml

[root@t1 ~]#vim /usr/local/tomcat/conf/server.xml
<Engine name="Catalina" defaultHost="t1.magedu.org">
    <Host name="t1.magedu.org" appBase="/data/webapps/"
          unpackWARs="true" autoDeploy="true" >
    </Host>
</Engine>
[root@t1 ~]#systemctl restart tomcat

t2虛擬主機(jī)配置conf/server.xml

[root@t1 ~]#vim /usr/local/tomcat/conf/server.xml
<Engine name="Catalina" defaultHost="t2.magedu.org">
    <Host name="t2.magedu.org" appBase="/data/webapps/"
          unpackWARs="true" autoDeploy="true" >
    </Host>
</Engine>
[root@t1 ~]#systemctl restart tomcat

3 準(zhǔn)備負(fù)載均衡規(guī)劃測(cè)試用的jsp文件
在t1和 t2節(jié)點(diǎn)創(chuàng)建相同的文件/data/webapps/ROOT/index.jsp

#項(xiàng)目路徑配置
mkdir -pv /data/webapps/ROOT

#編寫(xiě)測(cè)試jsp文件,內(nèi)容在下面
vim /data/webapps/ROOT/index.jsp
<%@ page import="java.util.*" %>
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>t1.magdu.org</title>      #t2上改為t2.magdu.org
</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>

#設(shè)置權(quán)限
chown -R tomcat.tomcat /data/webapps/

4 Nginx 實(shí)現(xiàn)后端 tomcat 的負(fù)載均衡調(diào)度

Nginx 實(shí)現(xiàn)后端 tomcat 的負(fù)載均衡

nginx 配置如下

[root@haproxy ~]#vim /etc/nginx/nginx.conf
#在http塊中加以下內(nèi)容
#注意名稱(chēng)不要用下劃線(xiàn)
upstream tomcat {
    #ip_hash;                   # 先禁用看看輪詢(xún),之后開(kāi)啟開(kāi)黏性
    hash $cookie_JSESSIONID;    # 先禁用看看輪詢(xún),之后開(kāi)啟開(kāi)黏性
    server t1.magedu.org:8080;
    server t2.magedu.org:8080
}
server {
    location / {
        proxy_pass http://tomcat;
    }
}
[root@haproxy ~]#systemctl restart nginx

測(cè)試 http://www.magedu.com/index.jsp,可以看到輪詢(xún)調(diào)度效果,每次刷新后端主機(jī)和SessionID都會(huì)變化

[root@client ~]#curl www.magedu.org/index.jsp
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>t1.magedu.org</title>
</head>
<body>
<h1> tomcat website </h1>
<div>On tomcat-server</div>
<div>10.0.0.18:8080</div>
<div>SessionID = <span
style="color:blue">2E4BFA5135497EA3628F1EBDAE62493E</span></div>
Thu Jul 09 17:58:06 CST 2020
</body>
</html>

[root@client ~]#curl www.magedu.org/index.jsp
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>t2.magedu.org</title>
</head>
<body>
<h1> tomcat website </h1>
<div>On tomcat-server</div>
<div>10.0.0.28:8080</div>
<div>SessionID = <span
style="color:blue">2E4BFA5135497EA3628F1EBDAE62493E</span></div>
Thu Jul 09 17:58:07 CST 2020
</body>
</html>

5、簡(jiǎn)述memcached的工作原理

1 內(nèi)存分配機(jī)制
應(yīng)用程序運(yùn)行需要使用內(nèi)存存儲(chǔ)數(shù)據(jù),但對(duì)于一個(gè)緩存系統(tǒng)來(lái)說(shuō),申請(qǐng)內(nèi)存、釋放內(nèi)存將十分頻繁,非常容易導(dǎo)致大量?jī)?nèi)存碎片,最后導(dǎo)致無(wú)連續(xù)可用內(nèi)存可用。
Memcached采用了Slab Allocator機(jī)制來(lái)分配、管理內(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 懶過(guò)期 Lazy Expiration
memcached不會(huì)監(jiān)視數(shù)據(jù)是否過(guò)期,而是在取數(shù)據(jù)時(shí)才看是否過(guò)期,如果過(guò)期,把數(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ī)制來(lái)查找可用空間,分配給新記錄使用。

4 集群
Memcached集群,稱(chēng)為基于客戶(hù)端的分布式集群,即由客戶(hù)端實(shí)現(xiàn)集群功能,即Memcached本身不支持集群
Memcached集群內(nèi)部并不互相通信,一切都需要客戶(hù)端連接到Memcached服務(wù)器后自行組織這些節(jié)點(diǎn),并決定數(shù)據(jù)存儲(chǔ)的節(jié)點(diǎn)。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容