1、haproxy https实现

#生成证书:
[root@cen7_17 ~]# mkdir /etc/haproxy/certs
[root@cen7_17 ~]# cd /etc/haproxy/certs/
[root@cen7_17 certs]# openssl req -x509 -newkey rsa:2048 -subj "/CN=www.yzl.org" -keyout haproxy.key -nodes -days 365 -out haproxy.crt
Generating a 2048 bit RSA private key
..+++
........................+++
writing new private key to 'haproxy.key'
-----
[root@cen7_17 certs]# ls
haproxy.crt  haproxy.key
[root@cen7_17 certs]# cat haproxy.key haproxy.crt > haproxy.pem
[root@cen7_17 certs]# openssl x509 -in haproxy.pem -noout -text     #查看证书

#http配置
[root@cen7_17 ~]# cat /etc/haproxy/conf.d/tt.cfg 
frontend web_80
    bind 10.0.0.17:80
    bind 10.0.0.17:443 ssl crt /etc/haproxy/certs/haproxy.pem
    redirect scheme https if !{ ssl_fc }    #注意{ }内的空格
    use_backend web_web1
 
backend web_web1
    balance roundrobin
    server 10.0.0.40 10.0.0.40:80 check
    server 10.0.0.50 10.0.0.50:80 check
 
backend web_web2
    server 10.0.0.50 10.0.0.50:80 check
 
#测试
[root@cen7_17 ~]# curl -k https://10.0.0.17
10.0.0.40
web1
[root@cen7_17 ~]# curl -k https://10.0.0.17
10.0.0.50
web2
[root@cen7_17 ~]# 
 
[root@cen7_17 ~]# curl  http://10.0.0.17 -I
HTTP/1.1 302 Found
content-length: 0
location: https://10.0.0.17/
cache-control: no-cache
 
#修改httpd后端服务器的日志格式
[root@cent8_yzl_40 ~]# vim /etc/httpd/conf/httpd.conf
 
LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\" \"%{X-Forwarded-For}i\" " combined
 
[root@cent8_yzl_40 ~]# tail /var/log/httpd/access_log -f
10.0.0.17 - - [24/Jun/2021:17:48:35 +0800] "GET / HTTP/1.1" 200 10 "-" "curl/7.29.0" "10.0.0.27"

2、tomcat的核心组件以及根目录结构

目录结构:

image.png bin: image.png conf: image.png logs: image.png

Tomcat核心组件:

image.png

名称 说明
Server 服务器,Tomcat 运行的进程实例,一个Server中可以有多个service,但通常就一个
Service 服务,用来组织Engine和Connector的对应关系,一个service中只有一个Engine
Connector 连接器,负责客户端的HTTP、HTTPS、AJP等协议连接。一个Connector只属于某一个Engine
Engine 即引擎,用来响应并处理用户请求。一个Engine上可以绑定多个Connector
Host 即虚拟主机,可以实现多虚拟主机,例如使用不同的主机头区分
Context 应用的上下文,配置特定url路径映射和目录的映射关系:url => directory

3、tomcat实现多虚拟主机

#修改server.xml
# vim /usr/local/tomcat/conf/server.xml
...省略
#在最下面添加以下内容
      <Host name="www.a.com"  appBase="/data/tomcat/webapp1/"
            unpackWARs="true" autoDeploy="true">  </Host>

      <Host name="www.b.com"  appBase="/data/tomcat/webapp2"
            unpackWARs="true" autoDeploy="true">  </Host>

      <Host name="www.c.com"  appBase="/data/tomcat/webapp3"
            unpackWARs="true" autoDeploy="true">  </Host>
...省略...

#准备数据目录
# mkdir /data/tomcat/webapp{1..3}/ROOT -p
# echo "www.a.com" > /data/tomcat/webapp1/ROOT/index.html;\
echo "www.b.com" > /data/tomcat/webapp2/ROOT/index.html;\
echo "www.c.com" > /data/tomcat/webapp3/ROOT/index.html
# chown -R tomcat.tomcat /data/tomcat/

#重启Tomcat
#测试
[root@8-1 ~]#curl www.a.com:8080
www.a.com
[root@8-1 ~]#curl www.b.com:8080
www.b.com
[root@8-1 ~]#curl www.c.com:8080
www.c.com

4、nginx实现后端tomcat的负载均衡调度

IP 主机名 服务
10.0.0.100 proxy.magedu.org 调度器
10.0.0.101 t1.magedu.org tomcat1
10.0.0.102 t2.magedu.org tomcat2
#只需在10.0.0.100的nginx主机上实现域名解析
vim /etc/hosts
#添加以下三行
10.0.0.100 proxy.magedu.org proxy
10.0.0.101 t1.magedu.org t1
10.0.0.102 t2.magedu.org t2

Tomcat主机准备 修改tomcat的虚拟机主机为自定义的主机名,并设为默认的虚拟主机 t1虚拟主机配置conf/server.xml

<Engine name="Catalina" defaultHost="t1.magedu.org">
    <Host name="t1.magedu.org" appBase="/data/webapps" autoDeploy="true" >
    </Host>
</Engine>

t2虚拟主机配置conf/server.xml

<Engine name="Catalina" defaultHost="t2.magedu.org">
    <Host name="t2.magedu.org" appBase="/data/webapps" autoDeploy="true" >
    </Host>
</Engine>

在t1和 t2节点创建相同的文件/data/webapps/ROOT/index.jsp

#项目路径配置
mkdir -pv /data/webapps/ROOT

#编写测试jsp文件,内容在下面
vim /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>

#设置权限
chown -R tomcat.tomcat /data/webapps/

Nginx 实现后端 tomcat 的负载均衡

#nginx 配置如下
vim /etc/nginx/nginx.conf
#在http块中加以下内容
#注意名称不要用下划线
upstream tomcat-server {
        #ip_hash; # 先禁用看看轮询,之后开启开黏性
        #hash $cookie_JSESSIONID; # 先禁用看看轮询,之后开启开黏性
        server t1.magedu.org:8080;
        server t2.magedu.org:8080;
}
    
server {
        location ~* \.(jsp|do)$ {
       proxy_pass http://tomcat-server;
       }
}

测试

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


[root@proxy ~]#curl http://proxy.magedu.org/index.jsp
<!DOCTYPE html>
<html lang="en">
<head>
   <meta charset="UTF-8">
   <title>tomcat test</title>
</head>
<body>
 tomcat website 
<div>On tomcat-server</div>
<div>10.0.0.102:8080</div>
<div>SessionID = <span
style="color:blue">C5CC437BC05EE5A8620822CB07E71B7C</span></div>
Thu Jul 09 17:58:07 CST 2020
</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作用

高性能分布式缓存服务器(缓存数据库查询结果,减少数据库访问次数)缓存读取/写入过程 : 首次访问 : 从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)机制来分配空间,就从最近未被使用的记录中搜索,并将其空间分配给新的记录.