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的核心组件以及根目录结构
目录结构:
bin: conf: logs:
Tomcat核心组件:
名称 | 说明 |
---|---|
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)机制来分配空间,就从最近未被使用的记录中搜索,并将其空间分配给新的记录.