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;
}
}
posted @ 2025-03-21 08:45  丁志岩  阅读(67)  评论(0)    收藏  举报