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

 

   

              connectionTimeout="20000"

              redirectPort="8443" />

   

              address="::1"

              port="8009"

              redirectPort="8443" />

   

     

            unpackWARs="true" autoDeploy="true">

         

           

     

   

 

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

     

     

            unpackWARs="true" autoDeploy="true">

     

     

            unpackWARs="true" autoDeploy="true">

     

     

            unpackWARs="true" autoDeploy="true">

     

   

 

#重启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.*" %>

   

    tomcat2.linux2022.com

On <%=request.getServerName() %>

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

SessionID = <%=session.getId() %>

<%=new Date()%>

#虚拟主机配置

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

[root@tomcat2 tomcat]#pwd

/usr/local/tomcat

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

   

     

            unpackWARs="true" autoDeploy="true">

     

#设置权限

[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.*" %>

   

    tomcat1.linux2022.com

On <%=request.getServerName() %>

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

SessionID = <%=session.getId() %>

<%=new Date()%>

#虚拟主机配置

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

[root@tomcat1 tomcat]#pwd

/usr/local/tomcat

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

   

     

            unpackWARs="true" autoDeploy="true">

     

#设置权限

[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

   

    tomcat2.linux2022.com

On tomcat

10.0.0.27:8080

SessionID = 5FE48687926B239CE23427CE21D35FDE

Mon Apr 25 10:51:37 CST 2022

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

   

    tomcat1.linux2022.com

On tomcat

10.0.0.7:8080

SessionID = E7E1001CDE44EA9FEAF744E2892EBC4E

Mon Apr 25 10:52:02 CST 2022



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高),有(硬盘存储,主从同步),数据结构复杂.

注释 :

散列值 :

将值从一个大的(可能很大)定义域映射到一个较小值域的(数学)函数.散列函数是把该函数应用到大的定义域中的若干值得(大)集合的结果可以均匀地(和随机地)被分布在该范围上.

你可能感兴趣的:(M63.第十九周作业)