kylin-Nginx负载均衡、调度算法、健康检查模块、phpmyadmin实现会话保持
Nginx七层负载均衡
目录
- 负载均衡能实现的应用场景一: 四层负载均衡
所谓四层负载均衡指的是 OSI 七层模型中的传输层,那么传输层Nginx已经能支持TCP/IP的控制,所以只需要对客户端的请求进行TCP/IP协议的包转发就可以实现负载均衡,那么它的好处是性能非常快、只需要底层进行应用处理,而不需要进行一些复杂的逻辑。
即客户端打包OSI七层模型的前四层转发给服务端
- 负载均衡能实现的应用场景二:七层负载均衡
七层负载均衡它是在应用层,那么它可以完成很多应用方面的协议请求,比如我们说的http应用的负载均衡,它可以实现http信息的改写、头信息的改写、安全应用规则控制、URL匹配规则控制、以及转发、rewrite等等的规则,所以在应用层的服务里面,我们可以做的内容就更多,那么Nginx则是一个典型的七层负载均衡 SLB
- 四层负载均衡与七层负载均衡区别
四层负载均衡数据包在底层就进行了分发,而七层负载均衡数据包则是在最顶层进行分发、由此可以看出,七层负载均衡效率没有四负载均衡高。
但七层负载均衡更贴近于服务,如:http协议就是七层协议,我们可以用Nginx可以作会话保持,URL路径规则匹配、head头改写等等,这些是四层负载均衡无法实现的。
注意:四层负载均衡不识别域名,七层负载均衡识别域名
一、遇到错误代码转发请求
- 作用: 代理服务器向后转发如果遇到500 502 503 504 则直接请求下一台WEB服务器
[root@lb01 conf.d]# vim lb.conf
upstream webs {
server 172.16.1.7;
server 172.16.1.8;
}
server {
listen 80;
server_name www.wp.com;
location / {
proxy_pass http://webs;
include proxy_params;
proxy_next_upstream error timeout http_500 http_502 http_503 http_504;
}
}
二、Nginx负载均衡调度算法
负载均衡的调度算法有哪几种?
- rr轮循:默认使用的调度算法;
- weight加权轮询:即web01服务器响应n个请求,然后才请求web02,常用在后端服务器配置不同的时候;
- ip_hash:以IP地址的方式进行转发,第一次10.0.0.1请求的是WEB01 那么以后每次来访问都是web01来响应你;
- url_hash:以url来转发到不同的web服务器
- least_conn最少链接数:看哪台web服务器的TCP链接少,我就分给谁
#加权轮询配置方法
[root@lb01 conf.d]# vim lb.conf
upstream webs {
server 172.16.1.7 weight=5; # 加权轮询 web01响应5个 然后再请求web02
server 172.16.1.8;
}
....
调度算法配置示例
- 加权轮询配置方法
[root@lb01 conf.d]# vim lb.conf
upstream webs {
server 172.16.1.7 weight=5; # 加权轮询 web01响应5个 然后再请求web02
server 172.16.1.8;
}
....
- ip_hash
#如果客户端都走相同代理, 会导致某一台服务器连接过多
upstream load_pass {
ip_hash;
server 10.0.0.7:80;
server 10.0.0.8:80;
}
三、Nginx负载均衡后端状态
五种状态
| 状态 | 概述 |
|---|---|
| down | 当前的server暂时不参与负载均衡 |
| backup | 预留的备份服务器 |
| max_fails | 允许请求失败的次数 |
| fail_timeout | 经过max_fails失败后, 服务暂停时间 |
| max_conns | 限制最大的接收连接数 |
状态示例
- 测试down状态测试该Server不参与负载均衡的调度
down # 不参与调度 类似前面加#注释
upstream webs {
#不参与任何调度, 一般用于停机维护
server 172.16.1.7 down;
server 172.16.1.8;
}
- 测试其余状态
upstream load_pass {
#不参与任何调度, 一般用于停机维护
server 10.0.0.7:80 down;
#作为备份服务器,当所有机器都down掉时,启用
server 10.0.0.8:80 backup;
#经过一次请求失败后,暂停服务10秒
server 10.0.0.9:80 max_fails=1 fail_timeout=10s;
}
四、Nginx负载均衡健康检查
编译安装Nginx添加新模块
- 作用: 根据需求自定义nginx的安装配置及所需要的模块
- 安装方法:
第一步:安装所需依赖
[root@lb01 ~]# yum install -y gcc glibc gcc-c++ pcre-devel openssl-devel patch
第二步:下载Nginx源码包(要和当前nginx版本号一致) 并解压
[root@lb01 ~]# wget http://nginx.org/download/nginx-1.26.1.tar.gz
[root@lb01 ~]# tar xf nginx-1.26.1.tar.gz
第三步:下载第三方模块并解压
[root@lb01 ~]# wget https://github.com/yaoweibin/nginx_upstream_check_module/archive/master.zip
[root@lb01 ~]# unzip master.zip
第四步:将新的模块添加进默认的模版中
[root@lb01 nginx-1.26.1]# patch -p1 < ../nginx_upstream_check_module-master/check_1.20.1+.patch
第五步:添加模块的位置到默认的配置中
#查看Nginx的默认配置
[root@lb01 nginx-1.26.1]# Nginx -V
#将模块添加进默认位置
--add-module=/root/nginx_upstream_check_module-master
#配置安装
[root@lb01 nginx-1.26.1]# ./configure --prefix=/etc/nginx --sbin-path=/usr/sbin/nginx --modules-path=/usr/lib64/nginx/modules --conf-path=/etc/nginx/nginx.conf --error-log-path=/var/log/nginx/error.log --http-log-path=/var/log/nginx/access.log --pid-path=/var/run/nginx.pid --lock-path=/var/run/nginx.lock --http-client-body-temp-path=/var/cache/nginx/client_temp --http-proxy-temp-path=/var/cache/nginx/proxy_temp --http-fastcgi-temp-path=/var/cache/nginx/fastcgi_temp --http-uwsgi-temp-path=/var/cache/nginx/uwsgi_temp --http-scgi-temp-path=/var/cache/nginx/scgi_temp --user=nginx --group=nginx --with-compat --with-file-aio --with-threads --with-http_addition_module --with-http_auth_request_module --with-http_dav_module --with-http_flv_module --with-http_gunzip_module --with-http_gzip_static_module --with-http_mp4_module --with-http_random_index_module --with-http_realip_module --with-http_secure_link_module --with-http_slice_module --with-http_ssl_module --with-http_stub_status_module --with-http_sub_module --with-http_v2_module --with-mail --with-mail_ssl_module --with-stream --add-module=/root/nginx_upstream_check_module-master --with-stream_realip_module --with-stream_ssl_module --with-stream_ssl_preread_module --with-cc-opt='-O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector-strong --param=ssp-buffer-size=4 -grecord-gcc-switches -m64 -mtune=generic -fPIC' --with-ld-opt='-Wl,-z,relro -Wl,-z,now -pie'
第六步:make编译并安装
[root@lb01 nginx-1.26.1]# make && make install
第七步:检查模块,检查Nginx语法
[root@lb01 ~]# nginx -V
#查看是否有--add-module=/root/nginx_upstream_check_module-master
[root@lb01 conf.d]# nginx -t
配置健康检查模块
#可直接配置一个单独的conf文件,或添加在原有的conf文件中
[root@lb01 conf.d]# vim etc/nginx/conf.d/check_status.conf
upstream webs {
server 172.16.1.7:80 max_fails=2 fail_timeout=10s;
server 172.16.1.8:80 max_fails=2 fail_timeout=10s;
check interval=3000 rise=2 fall=3 timeout=1000 type=tcp;
}
server{
listen 80;
server_name www.test.com;
location /upstream_check{
check_status;
}
}
#网页访问测试,Windows做本地解析
www.test.com/upstream_check
五、Nginx负载均衡会话保持
1.部署phpmyadmin项目
- phpMyAdmin 是一个基于 Web 的 MySQL 数据库管理工具,它允许用户通过一个图形界面与 MySQL 数据库进行交互
#在web01部署
第一步:编辑配置文件
[root@lb01 conf.d]# vim etc/nginx/conf.d/admin.conf
server {
listen 80;
server_name www.admin.com;
root /code/admin;
location / {
index index.php index.html;
}
location ~ \.php$ {
fastcgi_pass 127.0.0.1:9000;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
}
第二步:重启服务;创建代码目录;下载代码;
[root@web01 conf.d]# systemctl restart nginx
[root@web01 conf.d]# mkdir /code/admin
[root@web01 conf.d]# cd /code/admin
[root@web01 admin]# wget https://files.phpmyadmin.net/phpMyAdmin/5.2.1/phpMyAdmin-5.2.1-all-languages.zip
[root@web01 admin]# unzip phpMyAdmin-5.2.1-all-languages.zip
[root@web01 admin]# mv phpMyAdmin-5.2.1-all-languages/* .
第三步:手动配置代码指向数据库
[root@web01 admin]# mv config.sample.inc.php config.inc.php
[root@web01 admin]# grep 172.16.1.51 config.inc.php -n
30:$cfg['Servers'][$i]['host'] = '172.16.1.51';
第四步:修改session会话目录的权限
[root@web01 admin]# chown www.www /var/lib/php/session
第五步:重启服务;测试;
[root@web01 admin]# systemctl restart nginx
#做Windows的本地解析 10.0.0.7 www.admin.com
#浏览器访问 需要输入数据库远程普通用户名称和密码 dzy dzy123.com
#在web02部署
第一步:编辑配置文件
[root@lb01 conf.d]# vim etc/nginx/conf.d/admin.conf
server {
listen 80;
server_name www.admin.com;
root /code/admin;
location / {
index index.php index.html;
}
location ~ \.php$ {
fastcgi_pass 127.0.0.1:9000;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
}
第二步:重启服务;拷贝代码,修改会话目录权限;
[root@web02 conf.d]# systemctl restart nginx
[root@web02 conf.d]# scp -r 10.0.0.7:/code/admin /code
[root@web02 conf.d]# chown www.www /var/lib/php/session
第三步:测试访问
2.将服务加入到负载均衡
[root@lb01 conf.d]# vim admin.conf
upstream admin {
server 172.16.1.7:80;
server 172.16.1.8:80;
}
server {
listen 80;
server_name www.admin.com;
location / {
proxy_pass http://admin;
include proxy_params;
}
}
[root@lb01 conf.d]# systemctl restart nginx
浏览器访问测试(解析改到10.0.0.5)
3.部署redis服务
第一步:在db01服务器上部署redis服务
[root@db01 ~]# yum -y install redis
#配置redis监听端口 默认127.0.0.1
[root@db01 ~]# vim /etc/redis/redis.conf
75:bind 127.0.0.1 172.16.1.51
第二步:启动redis服务
[root@db01 ~]# systemctl start redis
[root@db01 ~]# systemctl enable redis
第三步:登录查看会话文件
[root@db01 ~]# redis-cli
127.0.0.1:6379> keys *
(empty array)
127.0.0.1:6379> quit
4.修改两台web,将会话写入到redis
#web01配置
#记得安装编译命令
yum install -y gcc glibc gcc-c++ pcre-devel openssl-devel patch
#PHP安装redis插件
第一步:下载redis源码包;解压代码
[root@web01:~]# wget http://pecl.php.net/get/redis-4.0.1.tgz
[root@web01:~]# tar xf redis-4.0.1.tgz
第二步:配置redis
[root@web01:~]#cd redis-4.0.1/
[root@web01 redis-4.0.1]# phpize # 初始化
[root@web01:redis-4.0.1]#./configure
第四步:编译安装
[root@web01:redis-4.0.1]# make && make install
第五步:开启php中redis插件功能
#在配置文件1357行新添加一行,内容为:
[root@web01:~]# vim /etc/php.ini
1357:extension=redis.so
#改写下列两行
1222:session.save_handler = redis
1255:session.save_path = "tcp://172.16.1.51:6379"
第六步:修改php的配置文件;重启php服务生效
#注释files和session的行
[root@web01 ~]# vim /etc/php-fpm.d/www.conf
#修改最后四行为↓,注意!';'是注释
;php_value[session.save_handler] = files
;php_value[session.save_path] = /var/lib/php/session
php_value[soap.wsdl_cache_dir] = /var/lib/php/wsdlcache
;php_value[opcache.file_cache] = /var/lib/php/opcache
[root@web01 ~]# systemctl restart php-fpm
第七步:将web01配置好的文件同步给web02
[root@web01 ~]# rsync -avz /etc/php.ini 10.0.0.8:/etc/
[root@web01 ~]# rsync -avz /etc/php-fpm.d/www.conf 10.0.0.8:/etc/php-fpm.d/
[root@web02 ~]# systemctl restart php-fpm
第八步:测试登录
#登录后在db01服务器中科查看到登录会话文件(cookie)
[root@db01 ~]# redis-cli
127.0.0.1:6379> keys *
1) "PHPREDIS_SESSION:fbrgrlb88ihvnlat6tv4lbgsvq"
六、多级代理获取真实用户IP地址
set_real_ip_from: 真实服务器上一级代理的IP地址或者IP地址段,可以写多行
real_ip_header: 从那个heare头检索出需要的IP地址
real_ip_recursive: 递归排除set_real_ip_from里出现的IP,没有出现的则为remote用户来源IP
server {
listen 80;
server_name nginx.dezyan.com;
set_real_ip_from 172.16.1.7;
set_real_ip_from 172.16.1.8;
real_ip_header X-Forwarded-For;# 携带客户端信息模块可以直接写进proxy_params中
real_ip_recursive on;
location / {
root /code;
index index.html index.php;
}
}
本文来自博客园,作者:丁志岩,转载请注明原文链接:https://www.cnblogs.com/dezyan/p/18784455

浙公网安备 33010602011771号