课前回顾
四层负载均衡 OSI 传输层 转发
七层负载均衡 OSI 应用层 代理
四层负载均衡后面的七层负载均衡server配置一定要相同
四层负载均衡是基于传输层协议包来封装的(如:TCP/IP),那我们前面使用到的七层是指的应用层,他的组装在四层的基础之上,无论四层还是七层都是指的OSI网络模型
四层负载均衡不识别域名,七层负载均衡识别域名
动静分离只有好处:动静分离后,即使动态服务不可用,但静态资源不会受到影响。
使用proxy代理模块可实现,专线内网的传输,多台主机的负载均衡,多台主机的动静分离
公网IP :
局域网IP :
弹性IP :
Nginx负载均衡后端状态
后端Web服务器在前端Nginx负载均衡调度中的状态
状态 | 概述 |
---|---|
down | 当前的server暂时不参与负载均衡(等于注释) |
backup | 预留的备份服务器 |
max_fails | 允许请求失败的次数 |
fail_timeout | 经过max_fails失败后, 服务暂停时间 |
max_conns | 限制最大的接收连接数(连接数不属于请求数) |
测试down状态测试该Server不参与负载均衡的调度,和注释类似
upstream load_pass {
#不参与任何调度, 一般用于停机维护
server 10.0.0.7:80 down;
}
测试backup以及down状态
#这个得配合错误返回码,proxy_next_upstream error timeout http_500 http_502 http_503 http_504 http_404 http_403;
upstream load_pass {
server 10.0.0.7:80 down;
server 10.0.0.8:80 backup;
server 10.0.0.9:80 max_fails=1 fail_timeout=10s;
}
location / {
proxy_pass http://load_pass;
include proxy_params;
}
测试max_fails失败次数和fail_timeout多少时间内失败多少次则标记down
upstream load_pass {
server 10.0.0.7:80;
server 10.0.0.8:80 max_fails=2 fail_timeout=10s;
}
测试max_conns最大TCP连接数
upstream load_pass {
server 10.0.0.7:80;
server 10.0.0.8:80 max_conns=1;
}
负载均衡模板
vim /etc/nginx/conf.d/wp.conf
server {
listen 80;
server_name cs.zh;
location / {
proxy_pass http://backend;
include proxy_params;
}
}
#include后面的相对路径指定就是/etc/nginx/ 下
vim /etc/nginx/nginx.conf
include /etc/nginx/upstream;
include /etc/nginx/conf.d/*.conf;
vim /etc/nginx/upstream
upstream backend {
#server backend1.example.com weight=5;
#server backend2.example.com:8080;
#server unix:/tmp/backend3;
#server backup1.example.com:8080 backup;
server 10.0.0.7:80 down;
server 10.0.0.8:80 backup;
server 10.0.0.9:80 max_fails=1 fail_timeout=10s;
}
vim /etc/nginx/proxy_params
# 客户端的请求头部信息,带着域名来找我,我也带着域名去找下一级(代理机或者代理服务器)
proxy_set_header Host $host;
# 显示客户端的真实ip(和代理的所有IP)
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
#nginx代理与后端服务器连接超时时间(代理连接超时)
proxy_connect_timeout 60s;
#nginx代理等待后端服务器的响应时间
proxy_read_timeout 60s;
#后端服务器数据回传给nginx代理超时时间
proxy_send_timeout 60s;
#nignx会把后端返回的内容先放到缓冲区当中,然后再返回给客户端,边收边传, 不是全部接收完再传给客户端
proxy_buffering on;
#设置nginx代理保存用户头信息的缓冲区大小
proxy_buffer_size 4k;
#proxy_buffer_size 8k;
#proxy_buffers 缓冲区
proxy_buffers 8 4k;
#proxy_buffers 8 8k;
#使用http 1.1协议版本
proxy_http_version 1.1;
#解决集群单点故障的反馈页面影响用户体验,自动跳转到下一个负载均衡主机
proxy_next_upstream error timeout http_500 http_502 http_503 http_504 http_404;
phpmyadmin
phpmyadmin和Navicat类似(软件,包,工具),都是使用图形化管理数据库
phpmyadmin不依赖外网,可以通过代码直接连接数据库
Navicat需要连接外网,来管理数据库
phpmyadmin可以通过所有库所有表的用户直接连接数据库,不用创建数据库
1.上传phpmyadmin安装包
mkdir /code/pm && cd /code/pm
rz -E
2.解压
unzip phpMyAdmin-4.9.0.1-all-languages.zip
mv phpMyAdmin-4.9.0.1-all-languages/* .
rm -rf phpMyAdmin-4.9.0.1-all-languages*
3.编辑虚拟主机
vim /etc/nginx/conf.d/phpmy.conf
server {
listen 80;
server_name cs.pm.com;
root /code/pm;
index info.php index.php;
location ~ \.php$ {
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
}
4.只能手动cp(#因为开发没有做图形化代码)
cp config.sample.inc.php config.inc.php
5.修改对数据库的IP指向
vim config.inc.php
$cfg['Servers'][$i]['host'] = '10.0.0.51';
6.域名解析
10.0.0.9 cs.pm.com
7.浏览器访问
cs.pm.com
多台web配置phpmyadmin
scp和rsync拷贝目录的时候小心带和不带根是不同的
1.拷贝phpmyadmin的server语句
[root@web03 ~]# rsync -avz /etc/nginx/conf.d/phpmy.conf 10.0.0.8:/etc/nginx/conf.d/
[root@web03 ~]# rsync -avz /etc/nginx/conf.d/phpmy.conf 10.0.0.7:/etc/nginx/conf.d/
2.拷贝phpmyadmin的安装包(/pm 和 /pm/结果不同)
[root@web03 ~]# rsync -avz /code/pm 10.0.0.8:/code/
[root@web03 ~]# rsync -avz /code/pm 10.0.0.7:/code/
3.重载nginx
nginx -sreload
配置负载均衡 lb
1.单独写一个虚拟主机,避免混淆,同样因为服务的不同
[root@lb01 ~]# vim /etc/nginx/conf.d/phpmy.conf
upstream phpmy {
server 10.0.0.7;
server 10.0.0.8;
server 10.0.0.9;
}
server {
listen 80;
server_name cs.pm.com;
location / {
proxy_pass http://phpmy;
include proxy_params;
}
}
2.重载nginx配置文件
nginx -sreload
3.域名解析
10.0.0.5 cs.pm.com
4.浏览器访问
cs.pm.com
5.通过对比浏览器的cookie和本地的session可以判断出用户登录的是哪台web服务器,因为cookie和session是一一对应的,同生共死的
[root@web03 ~]# ll /var/lib/php/session/
total 8
-rw------- 1 apache apache 5779 May 28 02:29 sess_70e081786ab1807e20da946ddbd4b785
使用redis做共享存储(企业常用)
使用nfs作为redis服务器,监听(bind)某一网段,redis为PHPadmin提供服务(类似于nfs共享存储),把/var/lib/php/session/* 保存到数据库
使用了redis,就不能再使用WordPress,因为使用redis时候修改了php.ini代码,导致wp不能连接数据库(状态码500)
1.安装redis
yum install -y redis
2.修改监听网段
sed -i '/^bind/c bind 127.0.0.1 172.16.1.31' /etc/redis.conf
3.启动redis
systemctl start redis
systemctl enable redis
#查看redis端口(6379)
netstat -lntup|grep redis
配置web01
1.php配置session,连接redis
#1.修改/etc/php.ini文件
[root@web ~]# vim /etc/php.ini
修改session.save_handler = files为
session.save_handler = redis
修改 ;session.save_path = "/tmp"为 (#小心注释)
session.save_path = "tcp://172.16.1.31:6379"
#待定
;session.save_path = "tcp://172.16.1.31:6379?auth=123" #如果redis存在密码,则使用该方式
#0改成1
session.auto_start = 1
#2.注释php-fpm.d/www.conf里面的两条内容,否则session内容会一直写入/var/lib/php/session目录中(;是注释)
;php_value[session.save_handler] = files
;php_value[session.save_path] = /var/lib/php/session
2.重启php-fpm
systemctl restart php-fpm
使用rsync,扩展多台web
1.将web01上配置好的文件推送到web02
[root@web01 code]# rsync -avz /etc/php.ini [email protected]:/etc/php.ini
[root@web01 code]# rsync -avz /etc/php-fpm.d/www.conf [email protected]:/etc/php-fpm.d/www.conf
2.重启php-fpm
[root@web02 code]# systemctl restart php-fpm
使用redis查看
[root@db01 redis]# redis-cli
127.0.0.1:6379> FLUSHALL #清空session
OK
127.0.0.1:6379> keys * #查看本地记录的session
1) "PHPREDIS_SESSION:1365eaf0490be9315496cb7382965954"
#查看session生存时间
127.0.0.1:6379> TTL PHPREDIS_SESSION:1365eaf0490be9315496cb7382965954
碎碎念
#查看服务器记录的session,该文件与浏览器的登录(cookie)状态息息相关
[root@web03 ~]# ll /var/lib/php/session/
total 8
-rw------- 1 apache apache 5779 May 28 02:29 sess_70e081786ab1807e20da946ddbd4b785
#使用开发者工具可以看到浏览器的cookie名 70e081786ab1807e20da946ddbd4b785
#删除本地session可导致浏览器已有的登录状态变更
rm -rf /var/lib/php/session/
#失误删除session可导致phpadmin无法连接
mkdir /var/lib/php/session
chown apache. /var/lib/php/session/
#测试某一主机的端口是否可以连通
[root@web01 /code/pm]# telnet 172.16.1.31 6379
Trying 172.16.1.31...
Connected to 172.16.1.31. #可以连通
Escape character is '^]'.
quit
redis
[root@nfs ~]# rpm -q redis
redis-3.2.12-2.el7.x86_64
[root@nfs ~]# rpm -ql redis
/etc/logrotate.d/redis #redis的日志切割
/etc/redis-sentinel.conf
/etc/redis.conf
/etc/systemd/system/redis-sentinel.service.d
/etc/systemd/system/redis-sentinel.service.d/limit.conf
/etc/systemd/system/redis.service.d
/etc/systemd/system/redis.service.d/limit.conf
/usr/bin/redis-benchmark
/usr/bin/redis-check-aof
/usr/bin/redis-check-rdb
/usr/bin/redis-cli #使用redis连接数据库
/usr/bin/redis-sentinel
/usr/bin/redis-server
/usr/lib/systemd/system/redis-sentinel.service
/usr/lib/systemd/system/redis.service
/var/lib/redis
/var/log/redis
/var/run/redis
[root@nfs ~]# cat /var/lib/php/session/ #本地的session记录