M63.第十九周作業

1、haproxy https實現

haproxy可以實現https的證書安全,從用戶到haproxy為https,從haproxy到后端服務器用http通信。但基于性能考慮,生產中證書都是在后端服務器比如nginx上實現

#配置HAProxy支持https協議,支持ssl會話;

bind *:443 ssl crt /PATH/TO/SOME_PEM_FILE

#指令crt后證書文件為PEM格式,需要同時包含證書和所有私鑰

cat demo.key demo.crt > demo.pem

#把80端口的請求重向定443

bind *:80

redirect scheme https if !{ ssl_fc }

#向后端傳遞用戶請求的協議和端口(frontend或backend)

http_request set-header X-Forwarded-Port %[dst_port]

http_request add-header X-Forwared-Proto https if { ssl_fc }

1證書制作

[root@haproxy ~]#cd /etc/pki/tls/certs/

[root@haproxy certs]#mkdir /etc/haproxy/conf.d/ssl

[root@haproxy certs]#vim Makefile

%.key:

? ? umask 77 ; \

? ? #/usr/bin/openssl genrsa -aes128 $(KEYLEN) > $@

? ? /usr/bin/openssl genrsa? $(KEYLEN) > $@

[root@haproxy certs]#make /etc/haproxy/conf.d/ssl/www.linux2022.com.crt

umask 77 ; \

#/usr/bin/openssl genrsa -aes128 2048 > /etc/haproxy/conf.d/ssl/www.linux2022.com.key

/usr/bin/openssl genrsa? 2048 > /etc/haproxy/conf.d/ssl/www.linux2022.com.key

Generating RSA private key, 2048 bit long modulus

.................................................+++

............................+++

e is 65537 (0x10001)

umask 77 ; \

/usr/bin/openssl req -utf8 -new -key /etc/haproxy/conf.d/ssl/www.linux2022.com.key -x509 -days 365 -out /etc/haproxy/conf.d/ssl/www.linux2022.com.crt

You are about to be asked to enter information that will be incorporated

into your certificate request.

What you are about to enter is what is called a Distinguished Name or a DN.

There are quite a few fields but you can leave some blank

For some fields there will be a default value,

If you enter '.', the field will be left blank.

-----

Country Name (2 letter code) [XX]:CN

State or Province Name (full name) []:guangdong

Locality Name (eg, city) [Default City]:guangzhou

Organization Name (eg, company) [Default Company Ltd]:linux2022

Organizational Unit Name (eg, section) []:it

Common Name (eg, your name or your server's hostname) []:www.linux2022.com

Email Address []:

[root@haproxy certs]#cd /etc/haproxy/conf.d/ssl/

[root@haproxy ssl]#ls

www.linux2022.com.crt? www.linux2022.com.key

[root@haproxy ssl]#cat www.linux2022.com.key www.linux2022.com.crt > www.linux2022.com.pem

2 https配置

[root@haproxy ssl]#cd ..

[root@haproxy conf.d]#ls

ssl? test.cfg

[root@haproxy conf.d]#vim test.cfg

listen ha1_https_443

? ? bind 10.0.0.7:80

? ? bind 10.0.0.7:443 ssl crt /etc/haproxy/conf.d/ssl/www.linux2022.com.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 }

? ? balance roundrobin

? ? server rs1 10.0.0.17:80 check inter 3000 fall 2 rise 5

? ? server rs2 10.0.0.27:80 check inter 3000 fall 2 rise 5

[root@haproxy conf.d]#systemctl restart haproxy.service

[root@haproxy conf.d]#ss -ntl

State? ? ? Recv-Q Send-Q? ? ? ? ? ? ? Local Address:Port? ? ? ? ? ? ? ? ? ? ? ? ? ? Peer Address:Port

LISTEN? ? 0? ? ? 128? ? ? ? ? ? ? ? ? ? ? ? ? ? *:9999? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? *:*

LISTEN? ? 0? ? ? 128? ? ? ? ? ? ? ? ? ? ? 10.0.0.7:80? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? *:*

LISTEN? ? 0? ? ? 128? ? ? ? ? ? ? ? ? ? ? ? ? ? *:22? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? *:*

LISTEN? ? 0? ? ? 100? ? ? ? ? ? ? ? ? ? 127.0.0.1:25? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? *:*

LISTEN? ? 0? ? ? 128? ? ? ? ? ? ? ? ? ? ? 10.0.0.7:443? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? *:*

LISTEN? ? 0? ? ? 128? ? ? ? ? ? ? ? ? ? ? ? ? [::]:22? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? [::]:*

LISTEN? ? 0? ? ? 100? ? ? ? ? ? ? ? ? ? ? ? [::1]:25? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? [::]:*

3 修改后端服務器的日志格式

[root@rs1 html]#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@rs1 html]#httpd -t

[root@rs1 html]#systemctl restart httpd.service

[root@rs2 html]#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 html]#httpd -t

[root@rs2 html]#systemctl restart httpd.service

4 驗證https

[root@rs1 ~]#cd /var/www/html

[root@rs1 html]#hostname -I > index.html

[root@rs1 html]#cat index.html

10.0.0.17

[root@rs2 ~]#cd /var/www/html

[root@rs2 html]#cat index.html

10.0.0.27

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

10.0.0.7 www.linux2022.com

[root@client ~]#curl -k https://10.0.0.7

10.0.0.17

[root@client ~]#curl -k https://10.0.0.7

10.0.0.27

[root@client ~]#curl -k https://10.0.0.7

10.0.0.17

[root@client ~]#curl -k https://10.0.0.7

10.0.0.27

[root@client ~]#curl -Ik https://10.0.0.7

HTTP/1.1 200 OK

date: Thu, 21 Apr 2022 23:56:52 GMT

server: Apache/2.4.6 (CentOS)

last-modified: Tue, 19 Apr 2022 13:49:35 GMT

etag: "a-5dd0225b759a2"

accept-ranges: bytes

content-length: 10

content-type: text/html; charset=UTF-8

[root@client ~]#curl -ILk http://10.0.0.7

HTTP/1.1 302 Found

content-length: 0

location: https://10.0.0.7/

cache-control: no-cache

HTTP/1.1 200 OK

date: Thu, 21 Apr 2022 23:55:11 GMT

server: Apache/2.4.6 (CentOS)

last-modified: Tue, 19 Apr 2022 13:49:35 GMT

etag: "a-5dd0225b759a2"

accept-ranges: bytes

content-length: 10

content-type: text/html; charset=UTF-8

5 查看后端服務器的訪問日志

[root@rs1 html]#tail /var/log/httpd/access_log -f

10.0.0.7 - - [22/Apr/2022:08:10:22 +0800] "GET / HTTP/1.1" 200 11 "-" "curl/7.58.0" "443" "https"

[root@rs2 html]#tail /var/log/httpd/access_log -f

10.0.0.7 - - [22/Apr/2022:08:10:23 +0800] "GET / HTTP/1.1" 200 10 "-" "curl/7.58.0" "443" "https"


2、總結tomcat的核心組件以及根目錄結構

1 tomcat的目錄結構

目錄說明

bin????????????服務啟動、停止等相關程序和文件

conf? ? ? ? ? 配置文件目錄

lib? ? ? ? ? ? ?庫目錄

logs? ? ? ? ?日志文件目錄

temp? ? ? ?臨時文件目錄

webapps 應用程序,應用部署目錄

workjsp????編譯后的結果文件,建議提前預熱訪問

[root@centos7 tomcat]#pwd

/usr/local/tomcat

[root@centos7 tomcat]#tree -L 1 -d

.

├── bin

├── conf

├── lib

├── logs

├── temp

├── webapps

└── work

7 directories

1.1 bin目錄

用于存放 Tomcat的啟動、停止等相關程序文件和Shell腳本

目錄及文件 ????????????????????????????????????說明

bin/startup.sh ????????????用于在 Linux下啟動 Tomcat

bin/startup.bat? ? ? ? ? ?用于在 Windows下啟動 Tomcat

bin/shutdown.sh? ? ? ? 用于在 Linux下停止 Tomcat

bin/shutdown.bat? ? ? ?用于在 Windows下停止 Tomcat

bin/catalina.sh? ? ? ? ? ?用于在 Linux下啟動和關閉 Tomcat

bin/version.sh? ? ? ? ? ?用于在 Linux下查看 Tomcat版本信息

[root@centos7 tomcat]#ll bin/

total 880

-rw-r----- 1 tomcat tomcat? 36192 Apr? 1 00:05 bootstrap.jar

-rw-r----- 1 tomcat tomcat? 16840 Apr? 1 00:05 catalina.bat

-rwxr-x--- 1 tomcat tomcat? 25294 Apr? 1 00:05 catalina.sh

-rw-r----- 1 tomcat tomcat? 1664 Apr? 1 00:05 catalina-tasks.xml

-rw-r----- 1 tomcat tomcat? 2123 Apr? 1 00:05 ciphers.bat

-rwxr-x--- 1 tomcat tomcat? 1997 Apr? 1 00:05 ciphers.sh

-rw-r----- 1 tomcat tomcat? 25308 Apr? 1 00:05 commons-daemon.jar

-rw-r----- 1 tomcat tomcat 210038 Apr? 1 00:05 commons-daemon-native.tar.gz

-rw-r----- 1 tomcat tomcat? 2040 Apr? 1 00:05 configtest.bat

-rwxr-x--- 1 tomcat tomcat? 1922 Apr? 1 00:05 configtest.sh

-rwxr-x--- 1 tomcat tomcat? 9100 Apr? 1 00:05 daemon.sh

-rw-r----- 1 tomcat tomcat? 2091 Apr? 1 00:05 digest.bat

-rwxr-x--- 1 tomcat tomcat? 1965 Apr? 1 00:05 digest.sh

-rw-r----- 1 tomcat tomcat? 3460 Apr? 1 00:05 setclasspath.bat

-rwxr-x--- 1 tomcat tomcat? 3708 Apr? 1 00:05 setclasspath.sh

-rw-r----- 1 tomcat tomcat? 2020 Apr? 1 00:05 shutdown.bat

-rwxr-x--- 1 tomcat tomcat? 1902 Apr? 1 00:05 shutdown.sh

-rw-r----- 1 tomcat tomcat? 2022 Apr? 1 00:05 startup.bat

-rwxr-x--- 1 tomcat tomcat? 1904 Apr? 1 00:05 startup.sh

-rw-r----- 1 tomcat tomcat? 51379 Apr? 1 00:05 tomcat-juli.jar

-rw-r----- 1 tomcat tomcat 429747 Apr? 1 00:05 tomcat-native.tar.gz

-rw-r----- 1 tomcat tomcat? 4574 Apr? 1 00:05 tool-wrapper.bat

-rwxr-x--- 1 tomcat tomcat? 5540 Apr? 1 00:05 tool-wrapper.sh

-rw-r----- 1 tomcat tomcat? 2026 Apr? 1 00:05 version.bat

-rwxr-x--- 1 tomcat tomcat? 1908 Apr? 1 00:05 version.sh

1.2 conf目錄

用于存放 Tomcat的相關配置文件

注意:配置文件大小寫敏感

目錄及文件? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 說明

conf/server.xml? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 主配置文件,用于配置 Tomcat的鏈接器、監聽端口、處理請求的虛擬主機等

conf/web.xml? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?每個webapp只有“部署”后才能被訪問,它的部署方式通常由web.xml進行定義,其存放位置為WEB-INF/目錄中;此文件為所有的webapps提供默認部署相關的配置,每個web應用也可以使用專用配置文件,來覆蓋全局文件

conf/context.xml? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 用于定義所有web應用均需加載的Context配置,此文件為所有的webapps提供默認配置,每個web應用也可以使用自已專用的配置,它通常由專用的配置文件context.xml來定義,其存放位置為WEB-INF/目錄中,覆蓋全局的文件

conf/tomcat-users.xml??? ??????????????????????????????????? 用戶認證的賬號和密碼文件

conf/catalina.policy? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?當使用security選項啟動tomcat時,用于為tomcat設置安全策略

conf/catalina.properties Tomcat???????????????????????? 環境變量的配置,用于設定類加載器路徑,以及一些與JVM調優相關參數

conf/logging.properties Tomcat? ? ? ? ? ? ? ? ? ? ? ? ? 日志系統相關的配置,可以修改日志級別和日志路徑等

conf/Catalina/ ????????????????????????????????????????????????????用于存儲針對每個虛擬機的 Context 配置

[root@centos7 tomcat]#ll conf/

total 232

drwxr-x--- 3 tomcat tomcat? 4096 Apr 22 20:16 Catalina

-rw------- 1 tomcat tomcat? 12954 Apr? 1 00:05 catalina.policy

-rw------- 1 tomcat tomcat? 7707 Apr? 1 00:05 catalina.properties

-rw------- 1 tomcat tomcat? 1338 Apr? 1 00:05 context.xml

-rw------- 1 tomcat tomcat? 1149 Apr? 1 00:05 jaspic-providers.xml

-rw------- 1 tomcat tomcat? 2313 Apr? 1 00:05 jaspic-providers.xsd

-rw------- 1 tomcat tomcat? 3916 Apr? 1 00:05 logging.properties

-rw------- 1 tomcat tomcat? 7580 Apr? 1 00:05 server.xml

-rw-r--r-- 1 tomcat tomcat? ? 25 Apr 22 20:16 tomcat.conf

-rw------- 1 tomcat tomcat? 2756 Apr? 1 00:05 tomcat-users.xml

-rw------- 1 tomcat tomcat? 2558 Apr? 1 00:05 tomcat-users.xsd

-rw------- 1 tomcat tomcat 171879 Apr? 1 00:05 web.xml

1.3 lib目錄

Tomcat服務器依賴庫目錄,包含 Tomcat服務器運行環境依賴 jar包

[root@centos7 tomcat]#ll lib/

total 8740

-rw-r----- 1 tomcat tomcat? 12356 Apr? 1 00:05 annotations-api.jar

-rw-r----- 1 tomcat tomcat? 54059 Apr? 1 00:05 catalina-ant.jar

-rw-r----- 1 tomcat tomcat? 120997 Apr? 1 00:05 catalina-ha.jar

-rw-r----- 1 tomcat tomcat 1721764 Apr? 1 00:05 catalina.jar

-rw-r----- 1 tomcat tomcat? 77625 Apr? 1 00:05 catalina-storeconfig.jar

-rw-r----- 1 tomcat tomcat? 294101 Apr? 1 00:05 catalina-tribes.jar

-rw-r----- 1 tomcat tomcat 2450404 Apr? 1 00:05 ecj-4.6.3.jar

-rw-r----- 1 tomcat tomcat? 89441 Apr? 1 00:05 el-api.jar

-rw-r----- 1 tomcat tomcat? 170106 Apr? 1 00:05 jasper-el.jar

-rw-r----- 1 tomcat tomcat? 602651 Apr? 1 00:05 jasper.jar

-rw-r----- 1 tomcat tomcat? 26799 Apr? 1 00:05 jaspic-api.jar

-rw-r----- 1 tomcat tomcat? 61742 Apr? 1 00:05 jsp-api.jar

-rw-r----- 1 tomcat tomcat? 249335 Apr? 1 00:05 servlet-api.jar

-rw-r----- 1 tomcat tomcat? 10648 Apr? 1 00:05 tomcat-api.jar

-rw-r----- 1 tomcat tomcat? 883924 Apr? 1 00:05 tomcat-coyote.jar

-rw-r----- 1 tomcat tomcat? 285968 Apr? 1 00:05 tomcat-dbcp.jar

-rw-r----- 1 tomcat tomcat? 75372 Apr? 1 00:05 tomcat-i18n-de.jar

-rw-r----- 1 tomcat tomcat? 106263 Apr? 1 00:05 tomcat-i18n-es.jar

-rw-r----- 1 tomcat tomcat? 159755 Apr? 1 00:05 tomcat-i18n-fr.jar

-rw-r----- 1 tomcat tomcat? 180465 Apr? 1 00:05 tomcat-i18n-ja.jar

-rw-r----- 1 tomcat tomcat? 179224 Apr? 1 00:05 tomcat-i18n-ko.jar

-rw-r----- 1 tomcat tomcat? 48430 Apr? 1 00:05 tomcat-i18n-ru.jar

-rw-r----- 1 tomcat tomcat? 164122 Apr? 1 00:05 tomcat-i18n-zh-CN.jar

-rw-r----- 1 tomcat tomcat? 149103 Apr? 1 00:05 tomcat-jdbc.jar

-rw-r----- 1 tomcat tomcat? 34823 Apr? 1 00:05 tomcat-jni.jar

-rw-r----- 1 tomcat tomcat? 185499 Apr? 1 00:05 tomcat-util.jar

-rw-r----- 1 tomcat tomcat? 214053 Apr? 1 00:05 tomcat-util-scan.jar

-rw-r----- 1 tomcat tomcat? 238006 Apr? 1 00:05 tomcat-websocket.jar

-rw-r----- 1 tomcat tomcat? 38449 Apr? 1 00:05 websocket-api.jar

1.4 logs目錄

Tomcat默認的日志存放路徑

目錄及文件 ????????????????????????????????????????說明

logs/catalina.out Tomcat????????????????????服務日志

logs/host-manager.日期.log? ? ? ? ? ? ? ?host manager管理日志,對應webapps/host-manager/

logs/localhost.日期.log? ? ? ? ? ? ? ? ? ? ? ?默認主機日志

logs/localhost_access_log.日期.txt? ? 默認主機訪問日志

logs/manager.日期.log manager? ? ? ? 管理日志,對應webapps/manager/

[root@centos7 tomcat]#ll logs/

total 52

-rw-r----- 1 tomcat tomcat 12238 Apr 22 22:17 catalina.2022-04-22.log

-rw-r----- 1 tomcat tomcat? 6008 Apr 23 09:07 catalina.2022-04-23.log

-rw-r----- 1 tomcat tomcat 18246 Apr 23 09:07 catalina.out

-rw-r----- 1 tomcat tomcat? ? 0 Apr 22 20:16 host-manager.2022-04-22.log

-rw-r----- 1 tomcat tomcat? ? 0 Apr 23 09:07 host-manager.2022-04-23.log

-rw-r----- 1 tomcat tomcat? 917 Apr 22 22:17 localhost.2022-04-22.log

-rw-r----- 1 tomcat tomcat? 459 Apr 23 09:07 localhost.2022-04-23.log

-rw-r----- 1 tomcat tomcat? 1422 Apr 22 20:22 localhost_access_log.2022-04-22.txt

-rw-r----- 1 tomcat tomcat? ? 0 Apr 23 09:07 localhost_access_log.2022-04-23.txt

-rw-r----- 1 tomcat tomcat? ? 0 Apr 22 20:16 manager.2022-04-22.log

-rw-r----- 1 tomcat tomcat? ? 0 Apr 23 09:07 manager.2022-04-23.log

1.5 temp目錄

存放tomcat在運行過程中產生的臨時文件

[root@centos7 tomcat]#ll temp/

total 0

-rw-r----- 1 tomcat tomcat 0 Apr? 1 00:05 safeToDelete.tmp

1.6 webapps目錄

Tomcat默認的Web應用部署目錄

目錄及文件????????????????????????????????????????????????????說明

webapps/ROOT/? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?網站默認根目錄,類似于httpd的/var/www/html/


假設有一個testapp,/usr/local/tomcat/webapps/testapp就相當于/var/www/html/testapp

[root@centos7 tomcat]#ll webapps/

total 20

drwxr-x--- 15 tomcat tomcat 4096 Apr 22 20:16 docs

drwxr-x---? 7 tomcat tomcat 4096 Apr 22 20:16 examples

drwxr-x---? 6 tomcat tomcat 4096 Apr 22 20:16 host-manager

drwxr-x---? 6 tomcat tomcat 4096 Apr 22 20:16 manager

drwxr-x---? 3 tomcat tomcat 4096 Apr 22 20:16 ROOT

1.7 work目錄

存放Web應用 JSP 代碼生成和編譯后產生的 class 字節碼文件。

JSP中的Java代碼執行過程:

(1)先找到 jsp頁面,然后Tomcat會生成一個jsp對應的java文件和一個編譯生成的class字節碼文件。

(2)然后加載class字節碼文件

(3)調用jsp的 service方法

(4)然后產生結果,并把結果返回給client

[root@centos7 tomcat]#tree work/

work/

└── Catalina

? ? └── localhost

? ? ? ? ├── docs

? ? ? ? ├── examples

? ? ? ? ├── host-manager

? ? ? ? ├── manager

? ? ? ? └── ROOT

? ? ? ? ? ? └── org

? ? ? ? ? ? ? ? └── apache

? ? ? ? ? ? ? ? ? ? └── jsp

? ? ? ? ? ? ? ? ? ? ? ? ├── index_jsp.class? #字節碼文件

? ? ? ? ? ? ? ? ? ? ? ? └── index_jsp.java? #servlet文件

10 directories, 2 files

[root@centos7 tomcat]#pwd

/usr/local/tomcat

[root@centos7 tomcat]#mv test.jsp /usr/local/tomcat/webapps/ROOT/

#瀏覽器訪問jsp文件:http://10.0.0.7:8080/test.jsp

#當訪問test.jsp文件后,jsp目錄中會生成對應的新的test_jsp.java文件和test_jsp.class字節碼文件

Java程序上線前建議提前預熱訪問一下,所謂預熱訪問,就是生成應用程序對應的.java文件和.class文件,

等用戶訪問應用程序時,訪問速度就會加快,這樣用戶訪問就不慢了。

注意:jsp目錄類似于緩存,在上線Java程序時,經常會有一些版本升級,升級新版本前,要將舊版本的jsp目錄下的

內容刪除,下次訪問時,就會生成新版本的jsp文件。

[root@centos7 tomcat]#tree work/

work/

└── Catalina

? ? └── localhost

? ? ? ? ├── docs

? ? ? ? ├── examples

? ? ? ? ├── host-manager

? ? ? ? ├── manager

? ? ? ? └── ROOT

? ? ? ? ? ? └── org

? ? ? ? ? ? ? ? └── apache

? ? ? ? ? ? ? ? ? ? └── jsp

? ? ? ? ? ? ? ? ? ? ? ? ├── index_jsp.class

? ? ? ? ? ? ? ? ? ? ? ? ├── index_jsp.java

? ? ? ? ? ? ? ? ? ? ? ? ├── test_jsp.class

? ? ? ? ? ? ? ? ? ? ? ? └── test_jsp.java

10 directories, 4 files


2 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

2.1 Tomcat 內部組成


名稱? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 說明

Server? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 服務器,Tomcat 運行的進程實例,一個Server中可以有多個service,但通常就一個

Service? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 服務,用來組織Engine和Connector的對應關系,一個service中只有一個Engine

Connector? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?連接器,負責客戶端的HTTP、HTTPS、AJP等協議連接。一個Connector只屬于某一個Engine

Engine? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?即引擎,用來響應并處理用戶請求。一個Engine上可以綁定多個Connector

Host? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?即虛擬主機,可以實現多虛擬主機,例如使用不同的主機頭區分

Context? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 應用的上下文,配置特定url路徑映射和目錄的映射關系:url => directory

每一個組件都由一個Java“類”實現,這些組件大體可分為以下幾個類型:

頂級組件:Server

服務類組件:Service

連接器組件:http, https, ajp(apache jserv protocol)

容器類:Engine, Host, Context

被嵌套類:valve, logger, realm, loader, manager, ...

集群類組件:listener, cluster, ...

2.2 tomcat的核心組件

????Tomcat啟動一個Server進程。可以啟動多個Server,即tomcat的多實例, 但一般只啟動一個

????創建一個Service提供服務。可以創建多個Service,但一般也只創建一個

????????每個Service中,是Engine和其連接器Connector的關聯配置

????可以為這個Service提供多個連接器Connector,這些Connector使用了不同的協議,綁定了不同的端口。其作用就是處理來自客戶端的不同的連接請求或響應

????Service 內部還定義了Engine,引擎才是真正的處理請求的入口,其內部定義多個虛擬主機Host

????????Engine對請求頭做了分析,將請求發送給相應的虛擬主機

????????如果沒有匹配,數據就發往Engine上的defaultHost缺省虛擬主機

????????Engine上的缺省虛擬主機可以修改

????Host 定義虛擬主機,虛擬主機有name名稱,通過名稱匹配

????Context 定義應用程序單獨的路徑映射和配置

#多個組件關系 conf/server.xml

<?xml version="1.0" encoding="UTF-8"?>

<Server port="8005" shutdown="SHUTDOWN">

? <Service name="Catalina">

? ? <Connector port="8080" protocol="HTTP/1.1"

? ? ? ? ? ? ? connectionTimeout="20000"

? ? ? ? ? ? ? redirectPort="8443" />

? ? <Connector protocol="AJP/1.3"

? ? ? ? ? ? ? address="::1"

? ? ? ? ? ? ? port="8009"

? ? ? ? ? ? ? redirectPort="8443" />

? ? <Engine name="Catalina" defaultHost="localhost">

? ? ? <Host name="localhost"? appBase="webapps"

? ? ? ? ? ? unpackWARs="true" autoDeploy="true">

? ? ? ? ? <Context >

? <Context />? ? ? ? ?

? ? ? </Host>

? ? </Engine>

? </Service>

</Server>

3 tomcat的根目錄結構

Tomcat中默認網站根目錄是$CATALINA_BASE/webapps/

在Tomcat中部署主站應用程序和其他應用程序,和之前WEB服務程序不同。

#假設有個網站:www.linux2022.com

#網頁對應關系

/var/www/html/index.html? =>? http://www.linux2022.com/index.html

/var/www/html/test/index.html? =>? http://www.linux2022.com/test/index.html

/usr/local/tomcat/webapps/ROOT/index.jsp? =>? http://www.linux2022.com/index.jsp

/usr/local/tomcat/webapps/test/index.jsp? =>? http://www.linux2022.com/test/index.jsp

www.linux2022.com/test.html? =>? /usr/local/tomcat/webapps/ROOT/test.html

www.linux2022.com/blog/? =>? /usr/local/tomcat/webapps/blog/index.html

#目錄對應關系:

www.linux2022.com/blog/? =>? /usr/local/tomcat/webapps/blog/?

www.linux2022.com/forum/? =>? /usr/local/tomcat/webapps/forum/

nginx

假設在nginx中部署2個網站應用eshop、forum,假設網站根目錄是/data/nginx/html,那么部署可以是這樣的。

eshop解壓縮所有文件放到 /data/nginx/html/ 目錄下,forum 的文件放在 /data/nginx/html/forum/ 下。

最終網站鏈接有以下對應關系

http://localhost/ 對應于eshop的應用,即 /data/nginx/html/

http://localhost/forum/ 對應于forum的應用,即/data/nginx/html/forum/

Tomcat

Tomcat中默認網站根目錄是$CATALINA_BASE/webapps/

在Tomcat的webapps目錄中,有個非常特殊的目錄ROOT,它就是網站默認根目錄。

將eshop解壓后的文件放到這個$CATALINA_BASE/webapps/ROOT中。

bbs解壓后文件都放在$CATALINA_BASE/webapps/forum目錄下。

$CATALINA_BASE/webapps下面的每個目錄都對應一個Web應用,即WebApp

最終網站鏈接有以下對應關系

http://localhost/ 對應于eshop的應用WebApp,即$CATALINA_BASE/webapps/ROOT/目錄,

http://localhost/forum/ 對應于forum的應用WebApp,即$CATALINA_BASE/webapps/forum/

如果同時存在$CATALINA_BASE /webapps/ROOT/forum ,仍以 $CATALINA_BASE/webapps/forum/ 優先生效

每一個虛擬主機都可以使用appBase指令配置自己的站點目錄,使用appBase目錄下的ROOT目錄作為主站目錄。

[root@centos7 webapps]#pwd

/usr/local/tomcat/webapps

[root@centos7 webapps]#mkdir blog

[root@centos7 webapps]#vim blog/index.html

/usr/local/tomcat/webapps/blog/index.html

#瀏覽器訪問:http://10.0.0.7:8080/blog/


[root@centos7 webapps]#pwd

/usr/local/tomcat/webapps

[root@centos7 webapps]#ls

blog? docs? examples? host-manager? manager? ROOT

[root@centos7 webapps]#vim ROOT/test.html

/usr/local/tomcat/webapps/ROOT/test.html

#瀏覽器訪問:http://10.0.0.7:8080/test.html


4 JSP WebApp目錄結構

$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包


3、tomcat實現多虛擬主機

#準備數據目錄

[root@tomcat ~]#mkdir /data/website{1,2,3}/ROOT -pv

[root@tomcat ~]#vim /data/website1/ROOT/index.html

www.a.com

/data/website1/ROOT/index.html

[root@tomcat ~]#vim /data/website2/ROOT/index.html

www.b.com

/data/website2/ROOT/index.html

[root@tomcat ~]#vim /data/website3/ROOT/index.html

www.c.com

/data/website3/ROOT/index.html

#設置權限

[root@tomcat ~]#chown -R tomcat.tomcat /data/website{1,2,3}/

#修改配置

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

[root@tomcat tomcat]#vim conf/server.xml

? ? ? </Host>

? ? ? <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>

? ? </Engine>

? </Service>

</Server>

#重啟Tomcat服務

[root@tomcat tomcat]#systemctl restart tomcat.service

#測試訪問

[root@client ~]#vim /etc/hosts

10.0.0.7 www.a.com www.b.com www.c.com

[root@client ~]#curl www.a.com:8080

www.a.com

/data/website1/ROOT/index.html

[root@client ~]#curl www.b.com:8080

www.b.com

/data/website2/ROOT/index.html

[root@client ~]#curl www.c.com:8080

www.c.com

/data/website3/ROOT/index.html


4、nginx實現后端tomcat的負載均衡調度

環境準備

四臺機器:

client:10.0.0.37 客戶端 測試

proxy:10.0.0.17 nginx-1.18?負載均衡調度器

tomcat1: 10.0.0.7 Tomcat-8.5.78

tomcat2: 10.0.0.27 Tomcat-8.5.78

1proxy

[root@proxy ~]#vim /apps/nginx/conf/nginx.conf

http {

? ? upstream tomcat {

? ? ? ? server tomcat1.linux2022.com:8080;

? ? ? ? server tomcat2.linux2022.com:8080;

? ? }

? ? server {

? ? ? ? listen? ? ? 80;

? ? ? ? server_name? www.linux2022.com;

? ? ? ? location / {

? ? ? ? ? ? proxy_pass http://tomcat;

? ? ? ? }

? ? }

[root@proxy ~]#nginx -t

[root@proxy ~]#nginx -s reload

[root@proxy ~]#vim /etc/hosts

10.0.0.7 tomcat1.linux2022.com

10.0.0.27 tomcat2.linux2022.com

[root@proxy ~]#systemctl restart nginx.service

2 tomcat2

#項目路徑配置

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

#編寫測試jsp文件

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

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

<!DOCTYPE html>

<html lang="en">

<head>

? ? <meta charset="UTF-8">

? ? <title>tomcat2.linux2022.com</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@tomcat2 ~]#cd /usr/local/tomcat/

[root@tomcat2 tomcat]#pwd

/usr/local/tomcat

[root@tomcat2 tomcat]#vim conf/server.xml

? ? <Engine name="Catalina" defaultHost="tomcat2.linux2022.com">

? ? ? <Host name="tomcat2.linux2022.com"? appBase="/data/webapps/"

? ? ? ? ? ? unpackWARs="true" autoDeploy="true">

? ? ? </Host>

#設置權限

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

#重啟Tomcat服務

[root@tomcat2 tomcat]#systemctl restart tomcat.service

3 tomcat1

#項目路徑配置

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

#編寫測試jsp文件

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

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

<!DOCTYPE html>

<html lang="en">

<head>

? ? <meta charset="UTF-8">

? ? <title>tomcat1.linux2022.com</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@tomcat1 ~]#cd /usr/local/tomcat/

[root@tomcat1 tomcat]#pwd

/usr/local/tomcat

[root@tomcat1 tomcat]#vim conf/server.xml

? ? <Engine name="Catalina" defaultHost="tomcat1.linux2022.com">

? ? ? <Host name="tomcat1.linux2022.com"? appBase="/data/webapps/"

? ? ? ? ? ? unpackWARs="true" autoDeploy="true">

? ? ? </Host>

#設置權限

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

#重啟Tomcat服務

[root@tomcat1 tomcat]#systemctl restart tomcat.service

4 client

#客戶端測試訪問

[root@client ~]#vim /etc/hosts

10.0.0.17 www.linux2022.com

#默認使用RR輪詢調度算法

[root@client ~]#curl www.linux2022.com/index.jsp

<!DOCTYPE html>

<html lang="en">

<head>

? ? <meta charset="UTF-8">

? ? <title>tomcat2.linux2022.com</title>

</head>

<body>

<div>On tomcat</div>

<div>10.0.0.27:8080</div>

<div>SessionID = <span style="color:blue">5FE48687926B239CE23427CE21D35FDE</span></div>

Mon Apr 25 10:51:37 CST 2022

</body>

</html>

[root@client ~]#curl www.linux2022.com/index.jsp

<!DOCTYPE html>

<html lang="en">

<head>

? ? <meta charset="UTF-8">

? ? <title>tomcat1.linux2022.com</title>

</head>

<body>

<div>On tomcat</div>

<div>10.0.0.7:8080</div>

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

Mon Apr 25 10:52:02 CST 2022

</body>

</html>



5、簡述memcached的工作原理

一. memcached介紹

memcached是一種緩存技術,在存儲在內存中(高性能分布式內存緩存服務器).目的 : 提速.(傳統的都是把數據保存在關系型數據庫管理系統既RDBMS,客戶端請求時會從RDBS中讀取數據并在瀏覽器中顯示,這樣當訪問量過大時或集中時,導致RSBMS負擔過重,數據庫響應惡化,瀏覽器中顯示延遲等嚴重問題,使用memcached減少數據庫查詢和訪問次數以提供訪問速度,提供擴展性)memcached為key->value非關系型數據庫,key為一般子串,值唯一.value除了php中的資源不能存,其它的數據都能存儲(字符串,數值,數組,對象,布爾值,null,二進制<圖片,視頻>)

提速方法 :

1.傳統 : 模擬cached方法(存儲到數據庫時生成一份靜態文件到磁盤中)

2.直接操作內存(內存表,memcached服務維持了一張內存表hashdata)

3.CPU寄存器(最高速的,但是代價成本高)

二. memcached特征 :

1.協議簡單(文本行協議)

2.基于libevent事件處理(注 : libevent是一個程序庫,封裝了linux的epoll,BSD等操作系統的kqueue等事件處理功能.即使對服務器的連接數添加,也能發揮O(1)的性能. memcached在linux,BSD等操作系統上能發揮其高性能.)

3.內置內存存儲方式(存儲在memcached內置的內存存儲空間中,提高性能.問題 : memcached重啟或操作系統重啟數據會丟失,達到一定量后會啟動算法自動刪除不使用的緩存)

4.不互相通信的分布式(不互相通信共享信息)

三. memcached作用 :

1.高性能分布式緩存服務器(緩存數據庫查詢結果,減少數據庫訪問次數)緩存讀取/寫入過程 : 首次訪問 : 從RDBMS中取得數據保存到memcached;第二次后 : 從memcached中取得數據顯示頁面.

memcached適合做的東西 :

1.訪問頻繁的字典數據

2.大量的hot數據(熱門數據緩存)

3.頁面緩存(web站常用)

4.搜索的查詢條件和結果(熱門搜索的內存緩存起來)

5.臨時處理數據(不需要入庫,排重)

四. memcached工作原理 :

memcached的工作就是在專門的機器的內存里維護一張巨大的hash表,來存儲經常被讀寫的一些數組與文件,從而極大的提高網站的運行效率.采用的是C/S模式,在server端啟動服務進程,在啟動時可以指定監聽的ip,自己的端口號,所使用的內存大小等幾個關鍵參數.采用了單進程,單線程,異步I/O,基于事件(event_based)的服務方式.使用libevent作為事件通知實現.每個Server只是對自己的數據進行管理.Client端通過指定Server端的ip地址(通過域名應該也可以).以key->value形式,key的值通過hash進行轉換,然后確定對那臺server存儲/獲取數據.

memcached內存算法 :

使用的是slab

allocation機制分配和管理內存,按照預先規定的大小,將分配的內存分割成特定長度的內存塊,再把尺寸相同的內存塊分成組,數據在存放時,根據鍵值大小去匹配slab大小,找就近的slab存放,所以存在空間浪費現象.

memcached緩存策略 :

是LRU(最近最少使用)加上到期失效策略.當你在memcached內存儲數據項時,你有可能會指定它在緩存的失效時間,默認為永久.當memcached服務器用完分配的內存時,失效的數據被首先替換,然后也是最近使用的數據.在LRU中,memcached使用的是一種Lazy Expiration策略,自己不會監控存入的key/value對是否過期,而是在獲取key值時查看記錄的時間戳,檢查key/value對空間是否過期,這樣可減輕服務器的負載.

memcached失效策略 :

Lazy expiration + LRU

Lazy expiration作用 :

假如我們所存儲的數據項相對多的時候,在這時候進行監控的話,話費的代價是相當大的,所以memcached不會在過期監視上耗費風度哦的CPU時間,從而在性能方法也起到一定的優化作用.

LRU : memcached會優先使用已超時的空間,但是還是會有追加信息時空間不足的狀態,這時候會使用Least Recently Used(LRU)機制來分配空間,就從最近未被使用的記錄中搜索,并將其空間分配給新的記錄.

memcached分布式算法 :

當向memcached集群存入/取出Key/value時,memcached客戶端會根據一定算法計算存入那臺服務器.(第一步 :

選擇服務器,第二步 : 存取數據)

余數算法 : 先求得鍵的整數散列值,再除以服務器數量,根據余數覺得存儲那臺服務器.(特點 :

簡單,高效.但是擴展性差,服務器數量變更時,幾乎所有的緩存都會失效)

散列算法 : 先計算memcached的散列值,并將其發布在0-2 ^ 32的圓上,然后用同樣的方法算出存儲數據鍵的散列值并映射至圓上,最后從數據映射到的位置開始順時針查找,將數據保存在查找到的第一臺服務器,如果超過2^32還是找不到,則將數據保存在第一臺memcached服務器上.如果添加一臺memcached服務器,則只在圓上添加的逆時針方向的第一臺服務器上的鍵會受到影響.

memcached與redis比較

memcached : 支持多核,內存利用率高,無持久性,數據結構簡單.

redis : 單核,內存利用率低(采用壓縮會比memcached高),有(硬盤存儲,主從同步),數據結構復雜.

注釋 :

散列值 :

將值從一個大的(可能很大)定義域映射到一個較小值域的(數學)函數.散列函數是把該函數應用到大的定義域中的若干值得(大)集合的結果可以均勻地(和隨機地)被分布在該范圍上.

?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容