负载均衡
1. 负载均衡选型
# 选型 产品
硬件 # F5,....
软件 # nginx,haproxy,lvs
云产品 # 云负载均衡 slb(tengine+lvs)
2. 负载均衡对比
ngx vs ha vs lvs区别(负 载均衡vs反向代理)
一般出现在面试中,如果不是一般认为这两个是一致的.区别在于处理用户请求的方式.
内容 |
共同点 | 区别 | 服务 |
负载均衡 |
用户的请求分发到后端节点上 |
用户-->lb-->web lb负载均衡做的是数据转发,不会产生新的请求. 1个请求1个响应 |
lvs(专门做负载均衡) |
反向代理 | 用户的请求分发到后端节点上 |
中间有个中介,用户-->中介-->web 2个请求2个响应. 代理代替用户去找web服务器 |
ngx/tengine/openresty/haproxy |
# 软件的其他区别 说明
lvs 4层
ngx/haproxy 7层和4层
7层负载: 对http/https请求进行转发 (uri,ua,host)
4层负载:端口进行负载均衡
https://www.processon.com/view/link/6266084107912970cb20c597
3. 负载均衡指令与模块
3.1 upstream模块
upstream写在http区域中,不能写在server中.
upstream后的名字要唯一.
当使用 upstream 定义负载均衡后,默认情况下,proxy_pass 会将请求头中的 Host 设置为上游服务器的名称。
这可能会导致后端服务接收到的 Host 头不符合预期。
为了保持原始请求的 Host 头,您可以在配置中显式设置 proxy_set_header Host
3.2 proxy模块
- proxy模块转发(代理)
- proxy_pass
- proxy_set_header
3.2.1 proxy_pass
指令把请求往后抛.
使用方式
- proxy_pass http://10.0.0.69:80;
- proxy_pass http://分组名字(upstream)
proxy模块转发(代理) |
proxy_pass | proxy_set_header |
weight |
权重,根据权重ngx分配请求. |
如果web服务端配置不同,1c2g, 2c8g.代码更新与测试的时候,给测试服务器较小的权重 |
max_fails |
ngx具备一些健康检查功能,指定失败的次数,超过这个次数就认为节点挂了. |
一般情况下可以设置1-3即可. 不太重要,缓存业务,可以设置为10 |
fail_timeout |
认为节点挂了后间隔多久再次检查健康情况. 默认是10s. |
根据要求设置时间即可,可以长一些.30/60s. |
backup |
备胎服务器,其他所有服务器都挂了的时候,才启用. |
使用的时候需要考虑雪崩的情况 |
down |
添加上这个标记,主机不会被使用 |
实例
upstrem pools {
server 10.0.0.7:80 weight=1 max_fails=3 fail_timeout=10s;
server 10.0.0.8:80 weight=2000 max_fails=3 fail_timeout=10s;
server 10.0.0.9:80 weight=2000 max_fails=3 fail_timeout=10s;
server 10.0.0.10:80 down weight=1 max_fails=3 fail_timeout=10s;
server 10.0.0.11:80 backup weight=1 max_fails=3 fail_timeout=10s;
}
实例:负载均衡多虚拟主机的故障
upstream blog_groups {
server 10.0.0.69:80;
server 10.0.0.70:80;
}
server{
listen 80;
server_name blog.web01.cn;
error_log /var/log/nginx/lb_blog_error.log notice;
access_log /var/log/nginx/lb_blog_access.log main;
location / {
proxy_pass http://blog_groups;
}
}
抓包发现请求头Host域名不对
现象: web节点上有多个虚拟主机,负载均衡在转发数据的时候会有访问异常.访问多个虚拟主机的默认的或第1个.
原因:负载均衡向后端节点发出请求的时候,请求头Host变成了upstream名字,相当于使用ip访问.
3.2.2 proxy_set_header
proxy_set_header Host $http_host;# 这行代码将请求头中的 Host 设置为 $http_host,这是请求中原始的 Host 头。这样做可以确保后端服务收到正确的 Host 信息。
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; # 这里的用法有一个小拼写错误,正确的写法是 $proxy_add_x_forwarded_for。此请求头用于传递客户端 IP 地址链,后端服务器可以根据这个头查看到原始的客户端 IP 以及经过的代理服务器 IP(如果有的话)。
proxy_set_header X-Real-IP $remote_addr;# 这个请求头用于传递直接连接到 Nginx 的客户端的真实 IP 地址。
实例:经过负载均衡后web节点如何记 录客户端真实ip地址
在负载均衡上设置proxy_set_header指令修改负载到web节点的请求头.
upstream blog_groups {
server 10.0.0.69:80;
server 10.0.0.70:80;
}
server{
listen 80;
server_name blog.web01.cn;
error_log /var/log/nginx/lb_blog_error.log notice;
access_log /var/log/nginx/lb_blog_access.log main;
location / {
proxy_pass http://blog_groups;
proxy_set_header Host $http_host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Real-Ip $remote_addr;
}
}
抓包可以看到正确的Host和两个真实用户ip地址
web服务器nginx主配置文件access日志最后一列信息就是X-Forwarded-For内容
配置后查看日志,没配置用户真实的ip地址之前最后一列为空,配置后为10.0.0.1(用户真实ip地址)
4. 网站的动静分离
4.1 背景
- 随着网站访问量增加,我们发现网站的动态资源vs静态资源 (读vs写),哪个访问的多? 读多写少.
- 我们可以采取动静分离方案.
- web服务器分为动态服务器(ngx+php),静态服务器(ngx)
4.2 架构图
4.3 项目准备
环境准备 |
说明 | ip |
lb01 |
负载均衡 | 10.0.0.75/172.16.1.75 |
web01 |
静态请求 | 10.0.0.69/172.16.1.69 |
web02 |
动态请求 | 10.0.0.70/172.16.1.70 |
nfs01 |
存放静态图片 | 10.0.0.68/172.16.1.68 |
4.4 静态组
- 保留现有的环境
- 关闭php服务
获取图片
4.5 动态组
- 保留现有的环境
- ngx+php
- 需要nfs挂载
4.6 接入负载均衡(配置)
lb_blog.conf
upstream blog_static {
server 10.0.0.69:80;
}
upstream blog_dynamic {
server 10.0.0.70:80;
}
server{
listen 80;
server_name blog.web01.cn;
error_log /var/log/nginx/lb_blog_error.log notice;
access_log /var/log/nginx/lb_blog_access.log main;
location ~* \.(jpg|png|css|js)$ {
proxy_pass http://blog_static;
proxy_set_header Host $http_host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Real-Ip $remote_addr;
}
location / {
proxy_pass http://blog_dynamic;
proxy_set_header Host $http_host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Real-Ip $remote_addr;
}
}
4.7 测试与检查(抓包)
hosts解析:10.0.0.75 blog.web01.cn
访问地址:http://blog.web01.cn/
4.7.1 静态组抓包(获取图片信息)
4.7.2 动态组抓包(上传图片)
4.8 小结
核心: 动静分离应用场景. 动静分离高级用法前后端分离(java环境)
把现有的wordpress改造成动静分离. (用已安装过的wordpress的代码. 数据库mysqldump备份,使用的时候mysql导入)
5. 网站架构优化/整改: 会话保持
5.1 概述
- 用户的请求,登录的请求,经过负载均衡后落到后面的web服务器上,登录的状态/信息也会记录在web服务器上,就会导致不通的web服务器上,登录状态不统一,造成用户频繁需要登录.
- 会话: 用户的登录状态,购物车状态..
- 目标: 如何实现会话保持/会话共享
5.2 cookie vs session
开发中核心概念,知晓cookie和sesion含义,大致区别即可
技术点 |
共同点 | 区别 | 其他 |
cookie |
存放用户的信息,登录信息 |
存放在客户端浏览器 |
服务器给客户端响应,进行设置set-cookie,未来再次访问携带者cookie访问服务端 |
session |
存放用户的信息,登录信息 |
存放服务端(文件,数据库,redis) |
浏览器cookie与服务端的session对应 |
浏览器F12查看cookie信息
5.3 会话保持方案
- 登录状态写入cookie中.(wordpress)
- cookie+session方式 + 统一存放session服务器(会话保持服务器redis) 类似于使用nfs做共享存储.
- 通过认证服务实现Oauth 2.0(使用token(令牌)方式)
- ip_hash方法(讲解负载均衡轮询算法)
- 一致性Hash算法
- 通过redis实现phpmyadmin会话共享
部署:phpMyAdmin,web页面版本的数据库管理工具. SQL语句. PHP代码.
只需要ngx+php,不需要创建库,添加用户(权限大).
- 搭建phpmyadmin实现会话共享流程
- db: phpmyadmin用户,权限大一些(所有库的所有表).
- web: 部署代码,传输到另外一个web上
- db: 准备redis环境(db01)
- web:
- 原有的9000端口给wordpress(cookie认证,不需要session保持)
- 修改php配置(9001)redis会话保持端口
- php添加redis模块
- lb:接入负载均衡.访问与测试
5.3.1 db准备phpmyadmin的用户
查看代码
[root@db01 ~]# mysql -uroot -p
Enter password:
Welcome to the MariaDB monitor. Commands end with ; or \g.
Your MariaDB connection id is 8
Server version: 10.3.39-MariaDB MariaDB Server
Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
MariaDB [(none)]> grant all on *.* to "phpmyadmin"@"172.16.1.%" identified by "1";
Query OK, 0 rows affected (0.000 sec)
MariaDB [(none)]> grant all on *.* to "phpmyadmin"@"localhost" identified by "1";
Query OK, 0 rows affected (0.000 sec)
MariaDB [(none)]> select user,host from mysql.user;
+------------+------------+
| user | host |
+------------+------------+
| root | 127.0.0.1 |
| blog | 172.16.1.% |
| phpmyadmin | 172.16.1.% |
| wordpress | 172.16.1.% |
| root | ::1 |
| blog | localhost |
| phpmyadmin | localhost |
| root | localhost |
| wordpress | localhost |
+------------+------------+
9 rows in set (0.000 sec)
MariaDB [(none)]> exit;
Bye
[root@db01 ~]#
5.3.2 web01部署代码
查看代码
# 下载解压phpmyadmin
[root@web01 ~]# mkdir -p /app/code/phpmyadmin/
[root@web01 ~]# rz
[root@web01 ~]# ls
all_db.sql.gz anaconda-ks.cfg blog.tar.gz initial-setup-ks.cfg phpMyAdmin-5.2.1-all-languages.zip wordpress wordpress.zip
[root@web01 ~]# unzip -q phpMyAdmin-5.2.1-all-languages.zip
[root@web01 ~]# ls
all_db.sql.gz anaconda-ks.cfg blog.tar.gz initial-setup-ks.cfg phpMyAdmin-5.2.1-all-languages phpMyAdmin-5.2.1-all-languages.zip wordpress wordpress.zip
[root@web01 ~]# mv phpMyAdmin-5.2.1-all-languages/* /app/code/phpmyadmin/
[root@web01 ~]#
[root@web01 ~]# chown -R www.www /app/code/phpmyadmin/
[root@web01 ~]# ll /app/code/phpmyadmin/
总用量 728
-rw-r--r-- 1 www www 69 2月 7 2023 babel.config.json
-rw-r--r-- 1 www www 71006 2月 7 2023 ChangeLog
-rw-r--r-- 1 www www 5323 2月 7 2023 composer.json
-rw-r--r-- 1 www www 305844 2月 7 2023 composer.lock
-rw-r--r-- 1 www www 4810 2月 7 2023 config.sample.inc.php
-rw-r--r-- 1 www www 2587 2月 7 2023 CONTRIBUTING.md
drwxr-xr-x 3 www www 18 2月 7 2023 doc
drwxr-xr-x 2 www www 99 2月 7 2023 examples
-rw-r--r-- 1 www www 22486 2月 7 2023 favicon.ico
-rw-r--r-- 1 www www 1074 2月 7 2023 index.php
drwxr-xr-x 6 www www 77 2月 7 2023 js
drwxr-xr-x 4 www www 336 2月 7 2023 libraries
-rw-r--r-- 1 www www 18092 2月 7 2023 LICENSE
drwxr-xr-x 44 www www 4096 2月 7 2023 locale
-rw-r--r-- 1 www www 2787 2月 7 2023 package.json
-rw-r--r-- 1 www www 1520 2月 7 2023 README
-rw-r--r-- 1 www www 29 2月 7 2023 RELEASE-DATE-5.2.1
-rw-r--r-- 1 www www 26 2月 7 2023 robots.txt
drwxr-xr-x 5 www www 138 2月 7 2023 setup
-rw-r--r-- 1 www www 1153 2月 7 2023 show_config_errors.php
drwxr-xr-x 2 www www 141 2月 7 2023 sql
drwxr-xr-x 25 www www 4096 2月 7 2023 templates
drwxr-xr-x 6 www www 83 2月 7 2023 themes
-rw-r--r-- 1 www www 965 2月 7 2023 url.php
drwxr-xr-x 28 www www 4096 2月 7 2023 vendor
-rw-r--r-- 1 www www 253106 2月 7 2023 yarn.lock
[root@web01 ~]#
# 修改phpmyadmin连接地址
[root@web01 /etc/php-fpm.d]# cd /app/code/phpmyadmin/
[root@web01 /app/code/phpmyadmin]# ls
babel.config.json composer.lock doc index.php LICENSE README setup templates vendor
ChangeLog config.sample.inc.php examples js locale RELEASE-DATE-5.2.1 show_config_errors.php themes yarn.lock
composer.json CONTRIBUTING.md favicon.ico libraries package.json robots.txt sql url.php
[root@web01 /app/code/phpmyadmin]#
[root@web01 /app/code/phpmyadmin]# cp config.sample.inc.php config.inc.php
[root@web01 /app/code/phpmyadmin]# vim config.inc.php
[root@web01 /app/code/phpmyadmin]#
[root@web01 /app/code/phpmyadmin]# grep -wn host config.inc.php
30:$cfg['Servers'][$i]['host'] = '172.16.1.81';
[root@web01 /app/code/phpmyadmin]#
# nginx 配置
[root@web01 ~]# cd /etc/nginx/conf.d/
[root@web01 /etc/nginx/conf.d]# ls
blog.web01.cn.conf default.conf php-fpm.conf
[root@web01 /etc/nginx/conf.d]#
[root@web01 /etc/nginx/conf.d]# cp blog.web01.cn.conf phpmyadmin.web01.cn.conf
[root@web01 /etc/nginx/conf.d]# vim phpmyadmin.web01.cn.conf
[root@web01 /app/code]# cat /etc/nginx/conf.d/phpmyadmin.web01.cn.conf
server{
listen 80;
server_name phpmyadmin.web01.cn;
root /app/code/phpmyadmin/;
error_log /var/log/nginx/phpmyadmin-error.log notice;
access_log /var/log/nginx/phpmyadmin-access.log main;
location / {
index index.php;
}
location ~* \.php$ {
fastcgi_pass 127.0.0.1:9001;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
}
# php配置
[root@web01 /etc/php-fpm.d]# egrep -v '^ *$|;' www.conf
[www]
user = www
group = www
listen = 127.0.0.1:9000
listen.acl_users = apache,nginx
listen.allowed_clients = 127.0.0.1
pm = dynamic
pm.max_children = 50
pm.start_servers = 5
pm.min_spare_servers = 5
pm.max_spare_servers = 35
slowlog = /var/log/php-fpm/www-slow.log
php_admin_value[error_log] = /var/log/php-fpm/www-error.log
php_admin_flag[log_errors] = on
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
[root@web01 /etc/php-fpm.d]#
[root@web01 /etc/php-fpm.d]#
[root@web01 /etc/php-fpm.d]# egrep -v '^ *$|;' www.conf > session.conf
[root@web01 /etc/php-fpm.d]#
[root@web01 /etc/php-fpm.d]# vim session.conf
[root@web01 /etc/php-fpm.d]# cat session.conf
[session]
user = www
group = www
listen = 127.0.0.1:9001
listen.acl_users = apache,nginx
listen.allowed_clients = 127.0.0.1
pm = dynamic
pm.max_children = 50
pm.start_servers = 5
pm.min_spare_servers = 5
pm.max_spare_servers = 35
slowlog = /var/log/php-fpm/www-slow.log
php_admin_value[error_log] = /var/log/php-fpm/www-error.log
php_admin_flag[log_errors] = on
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
[root@web01 /etc/php-fpm.d]#
# 检查语法
[root@web01 ~]# nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
[root@web01 ~]#
[root@web01 /etc/php-fpm.d]# php-fpm -t
[31-Oct-2024 09:50:29] NOTICE: configuration file /etc/php-fpm.conf test is successful
# 重启服务
[root@web01 /etc/php-fpm.d]# systemctl restart nginx php-fpm.service
# 查看端口,进程
[root@web01 ~]# ps -ef | grep nginx
root 2512 1 0 10:49 ? 00:00:00 nginx: master process /usr/sbin/nginx -c /etc/nginx/nginx.conf
www 2513 2512 0 10:49 ? 00:00:00 nginx: worker process
www 2514 2512 0 10:49 ? 00:00:00 nginx: worker process
root 2768 1362 0 11:19 pts/0 00:00:00 grep --color=auto nginx
[root@web01 ~]#
[root@web01 ~]# ps -ef | grep php
root 2640 1 0 10:07 ? 00:00:00 php-fpm: master process (/etc/php-fpm.conf)
www 2641 2640 0 10:07 ? 00:00:00 php-fpm: pool session
www 2642 2640 0 10:07 ? 00:00:00 php-fpm: pool session
www 2643 2640 0 10:07 ? 00:00:00 php-fpm: pool session
www 2644 2640 0 10:07 ? 00:00:00 php-fpm: pool session
www 2645 2640 0 10:07 ? 00:00:00 php-fpm: pool session
www 2646 2640 0 10:07 ? 00:00:00 php-fpm: pool www
www 2647 2640 0 10:07 ? 00:00:00 php-fpm: pool www
www 2648 2640 0 10:07 ? 00:00:00 php-fpm: pool www
www 2649 2640 0 10:07 ? 00:00:00 php-fpm: pool www
www 2650 2640 0 10:07 ? 00:00:00 php-fpm: pool www
root 2653 1252 0 10:07 pts/0 00:00:00 grep --color=auto php
[root@web01 ~]# ss -lntup | grep nginx
tcp LISTEN 0 128 0.0.0.0:80 0.0.0.0:* users:(("nginx",pid=2216,fd=13),("nginx",pid=2215,fd=13),("nginx",pid=2214,fd=13))
[root@web01 /etc/php-fpm.d]# ss -lntup | grep php
tcp LISTEN 0 128 127.0.0.1:9000 0.0.0.0:* users:(("php-fpm",pid=2650,fd=12),("php-fpm",pid=2649,fd=12),("php-fpm",pid=2648,fd=12),(php-fpm",pid=2647,fd=12),("php-fpm",pid=2646,fd=12),("php-fpm",pid=2640,fd=10))
tcp LISTEN 0 128 127.0.0.1:9001 0.0.0.0:* users:(("php-fpm",pid=2645,fd=12),("php-fpm",pid=2644,fd=12),("php-fpm",pid=2643,fd=12),(php-fpm",pid=2642,fd=12),("php-fpm",pid=2641,fd=12),("php-fpm",pid=2640,fd=9))
配置域名解析:10.0.0.69 phpmyadmin.web01.cn
页面访问:http://phpmyadmin.web01.cn/
解决办法:var/lib/php/session/加上www权限
[root@web01 ~]# chown -R www.www /var/lib/php/session/
[root@web01 ~]# ll /var/lib/php/
总用量 0
drwxrwx--- 2 root apache 6 2月 23 2024 opcache
drwxr-xr-x 2 root root 6 2月 23 2024 peclxml
drwxrwx--- 2 www www 6 2月 23 2024 session
drwxrwx--- 2 root apache 6 2月 23 2024 wsdlcache
[root@web01 ~]#
[root@web01 ~]# ll /var/lib/php/session/
总用量 0
登陆后页面
查看session文件
[root@web01 ~]# ll /var/lib/php/session/
总用量 4
-rw------- 1 www www 3631 10月 31 10:36 sess_c4m0t6grjnvlpnove17981eqdg
[root@web01 ~]#
5.3.3 部署web02代码
查看代码
# web01远程传输代码
[root@web01 /etc/nginx/conf.d]# ls
blog.web01.cn.conf default.conf php-fpm.conf phpmyadmin.web01.cn.conf
[root@web01 /etc/nginx/conf.d]# scp -rp phpmyadmin.web01.cn.conf root@web02:`pwd`
Authorized users only. All activities may be monitored and reported.
root@web02's password:
phpmyadmin.web01.cn.conf 100% 433 207.5KB/s 00:00
[root@web01 /etc/nginx/conf.d]#
[root@web01 /etc/nginx/conf.d]# cd /etc/php-fpm.d/
[root@web01 /etc/php-fpm.d]# ls
session.conf www.conf www.conf.bak
[root@web01 /etc/php-fpm.d]# scp -rp session.conf root@web02:`pwd`
Authorized users only. All activities may be monitored and reported.
root@web02's password:
session.conf 100% 514 388.7KB/s 00:00
[root@web01 /etc/php-fpm.d]#
[root@web01 /etc/php-fpm.d]# cd /app/code/
[root@web01 /app/code]# ls
blog phpmyadmin
[root@web01 /app/code]# scp -rpq phpmyadmin/ root@web02:`pwd`
root@web02's password:
[root@web01 /app/code]#
# web02检查
[root@web02 ~]# nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
[root@web02 ~]# php-fpm -t
[31-Oct-2024 10:40:33] NOTICE: configuration file /etc/php-fpm.conf test is successful
[root@web02 ~]# systemctl restart nginx php-fpm.service
[root@web02 ~]#
[root@web02 ~]# ps -ef | grep nginx
root 2311 1 0 10:40 ? 00:00:00 nginx: master process /usr/sbin/nginx -c /etc/nginx/nginx.conf
www 2312 2311 0 10:40 ? 00:00:00 nginx: worker process
www 2313 2311 0 10:40 ? 00:00:00 nginx: worker process
root 2326 1362 0 10:41 pts/0 00:00:00 grep --color=auto nginx
[root@web02 ~]# ss -lntup | grep nginx
tcp LISTEN 0 128 0.0.0.0:80 0.0.0.0:* users:(("nginx",pid=2313,fd=12),("nginx",pid=2312,fd=12),("nginx",pid=2311,fd=12))
[root@web02 ~]#
[root@web02 ~]# ps -ef | grep php-fpm
root 2308 1 0 10:40 ? 00:00:00 php-fpm: master process (/etc/php-fpm.conf)
www 2314 2308 0 10:40 ? 00:00:00 php-fpm: pool session
www 2315 2308 0 10:40 ? 00:00:00 php-fpm: pool session
www 2316 2308 0 10:40 ? 00:00:00 php-fpm: pool session
www 2317 2308 0 10:40 ? 00:00:00 php-fpm: pool session
www 2318 2308 0 10:40 ? 00:00:00 php-fpm: pool session
www 2319 2308 0 10:40 ? 00:00:00 php-fpm: pool www
www 2320 2308 0 10:40 ? 00:00:00 php-fpm: pool www
www 2321 2308 0 10:40 ? 00:00:00 php-fpm: pool www
www 2322 2308 0 10:40 ? 00:00:00 php-fpm: pool www
www 2323 2308 0 10:40 ? 00:00:00 php-fpm: pool www
root 2338 1362 0 10:41 pts/0 00:00:00 grep --color=auto php-fpm
[root@web02 ~]# ss -lntup | grep php-fpm
tcp LISTEN 0 128 127.0.0.1:9000 0.0.0.0:* users:(("php-fpm",pid=2323,fd=12),("php-fpm",pid=2322,fd=12),("php-fpm",pid=2321,fd=12),(php-fpm",pid=2320,fd=12),("php-fpm",pid=2319,fd=12),("php-fpm",pid=2308,fd=10))
tcp LISTEN 0 128 127.0.0.1:9001 0.0.0.0:* users:(("php-fpm",pid=2318,fd=12),("php-fpm",pid=2317,fd=12),("php-fpm",pid=2316,fd=12),(php-fpm",pid=2315,fd=12),("php-fpm",pid=2314,fd=12),("php-fpm",pid=2308,fd=9))
[root@web02 ~]#
[root@web02 ~]# cat /etc/nginx/conf.d/phpmyadmin.web01.cn.conf
server{
listen 80;
server_name phpmyadmin.web01.cn;
root /app/code/phpmyadmin/;
error_log /var/log/nginx/phpmyadmin-error.log notice;
access_log /var/log/nginx/phpmyadmin-access.log main;
location / {
index index.php;
}
location ~* \.php$ {
fastcgi_pass 127.0.0.1:9001;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
}
[root@web02 ~]# cat /etc/php-fpm.d/session.conf
[session]
user = www
group = www
listen = 127.0.0.1:9001
listen.acl_users = apache,nginx
listen.allowed_clients = 127.0.0.1
pm = dynamic
pm.max_children = 50
pm.start_servers = 5
pm.min_spare_servers = 5
pm.max_spare_servers = 35
slowlog = /var/log/php-fpm/www-slow.log
php_admin_value[error_log] = /var/log/php-fpm/www-error.log
php_admin_flag[log_errors] = on
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
[root@web02 ~]#
[root@web02 ~]# chown -R www.www /var/lib/php/session/
[root@web02 ~]# ll /var/lib/php/
总用量 0
drwxrwx--- 2 root apache 6 2月 23 2024 opcache
drwxr-xr-x 2 root root 6 2月 23 2024 peclxml
drwxrwx--- 2 www www 6 2月 23 2024 session
drwxrwx--- 2 root apache 6 2月 23 2024 wsdlcache
[root@web02 ~]#
[root@web02 ~]# ll /var/lib/php/session/
总用量 0
[root@web02 ~]# ll /app/code/
总用量 8
drwxr-xr-x 5 www www 4096 10月 29 21:24 blog
drwxr-xr-x 13 root root 4096 10月 31 09:42 phpmyadmin
[root@web02 ~]# ll /app/code/phpmyadmin/
总用量 736
-rw-r--r-- 1 root root 69 2月 7 2023 babel.config.json
-rw-r--r-- 1 root root 71006 2月 7 2023 ChangeLog
-rw-r--r-- 1 root root 5323 2月 7 2023 composer.json
-rw-r--r-- 1 root root 305844 2月 7 2023 composer.lock
-rw-r--r-- 1 root root 4812 10月 31 09:36 config.inc.php
-rw-r--r-- 1 root root 4810 2月 7 2023 config.sample.inc.php
-rw-r--r-- 1 root root 2587 2月 7 2023 CONTRIBUTING.md
drwxr-xr-x 3 root root 18 2月 7 2023 doc
drwxr-xr-x 2 root root 99 2月 7 2023 examples
-rw-r--r-- 1 root root 22486 2月 7 2023 favicon.ico
-rw-r--r-- 1 root root 1074 2月 7 2023 index.php
drwxr-xr-x 6 root root 77 2月 7 2023 js
drwxr-xr-x 4 root root 336 2月 7 2023 libraries
-rw-r--r-- 1 root root 18092 2月 7 2023 LICENSE
drwxr-xr-x 44 root root 4096 2月 7 2023 locale
-rw-r--r-- 1 root root 2787 2月 7 2023 package.json
-rw-r--r-- 1 root root 1520 2月 7 2023 README
-rw-r--r-- 1 root root 29 2月 7 2023 RELEASE-DATE-5.2.1
-rw-r--r-- 1 root root 26 2月 7 2023 robots.txt
drwxr-xr-x 5 root root 138 2月 7 2023 setup
-rw-r--r-- 1 root root 1153 2月 7 2023 show_config_errors.php
drwxr-xr-x 2 root root 141 2月 7 2023 sql
drwxr-xr-x 25 root root 4096 2月 7 2023 templates
drwxr-xr-x 6 root root 83 2月 7 2023 themes
drwxr-x--- 3 root root 18 10月 31 09:42 tmp
-rw-r--r-- 1 root root 965 2月 7 2023 url.php
drwxr-xr-x 28 root root 4096 2月 7 2023 vendor
-rw-r--r-- 1 root root 253106 2月 7 2023 yarn.lock
[root@web02 ~]#
[root@web02 ~]# chown -R www.www /app/code/phpmyadmin/
[root@web02 ~]#
[root@web02 ~]# systemctl restart nginx php-fpm.service
[root@web02 ~]#
5.3.4 接入负载(db01)
phpmyadmin.conf
[root@lb01 /etc/nginx/conf.d]# cat phpmyadmin.conf
upstream phpmyadmin_groups {
server 10.0.0.69:80;
server 10.0.0.70:80;
}
server{
listen 80;
server_name phpmyadmin.web01.cn;
error_log /var/log/nginx/phpmyadmin_error.log notice;
access_log /var/log/nginx/phpmyadmin_access.log main;
location / {
proxy_pass http://phpmyadmin_groups;
proxy_set_header Host $http_host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Real-Ip $remote_addr;
}
}
[root@lb01 /etc/nginx/conf.d]# nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
[root@lb01 /etc/nginx/conf.d]#
[root@lb01 /etc/nginx/conf.d]# systemctl restart nginx
配置域名解析:10.0.0.75 phpmyadmin.web01.cn
此刻访问:负载均衡,phpmyadmin站点无法正常登录的
页面访问:http://phpmyadmin.web01.cn/
5.3.5 部署redis服务(db01)
查看代码
[root@db01 ~]# yum install -y redis
已安装:
redis-6.2.7-1.p02.ky10.x86_64
完毕!
[root@db01 ~]# cd /etc/redis/
[root@db01 /etc/redis]# ls
redis.conf sentinel.conf
[root@db01 /etc/redis]# vim redis.conf
[root@db01 /etc/redis]# cp redis.conf redis.conf.bak
[root@db01 /etc/redis]# vim redis.conf
[root@db01 /etc/redis]#
[root@db01 /etc/redis]# grep ^bind redis.conf
bind 127.0.0.1 -::1 172.16.1.81
[root@db01 /etc/redis]#
[root@db01 /etc/redis]# systemctl enable --now redis
Created symlink /etc/systemd/system/multi-user.target.wants/redis.service → /usr/lib/systemd/system/redis.service.
[root@db01 /etc/redis]#
[root@db01 /etc/redis]#
[root@db01 /etc/redis]# ps -ef | grep redis
redis 2900 1 0 11:52 ? 00:00:00 /usr/bin/redis-server 127.0.0.1:6379
root 2906 1440 0 11:52 pts/0 00:00:00 grep --color=auto redis
[root@db01 /etc/redis]#
[root@db01 /etc/redis]# ss -lntup | grep redis
tcp LISTEN 0 128 172.16.1.81:6379 0.0.0.0:* users:(("redis-server",pid=2900,fd=8))
tcp LISTEN 0 128 127.0.0.1:6379 0.0.0.0:* users:(("redis-server",pid=2900,fd=6))
tcp LISTEN 0 128 [::1]:6379 [::]:* users:(("redis-server",pid=2900,fd=7))
[root@db01 /etc/redis]#
5.3.6 安装php-redis插件(web01)
麒麟系统sp2-sp3
查看代码
#下载php软件用于安装 php插件包管理器
[root@web01 ~]# wget http://pear.php.net/go-pear.phar -O go-pear.php
go-pear.php 100%[==============================>] 3.46M 52.6KB/s 用时 59s
2024-10-31 11:59:06 (60.1 KB/s) - 已保存 “go-pear.php” [3629185/3629185])
# 提示的时候直接按回车即可
[root@web01 ~]# php go-pear.php
The 'pear' command is now at your service at /usr/bin/pear
** The 'pear' command is not currently in your PATH, so you need to
** use '/usr/bin/pear' until you have added
** '/usr/bin' to your PATH environment variable.
Run it without parameters to see the available actions, try 'pear list'
to see what packages are installed, or 'pear help' for help.
For more information about PEAR, see:
http://pear.php.net/faq.php
http://pear.php.net/manual/
Thanks for using go-pear!
# 通过pecl安装php插件 #pecl install redis #php7.4以上可以直接安装,有提示按回车
[root@web01 ~]# pecl install https://pecl.php.net/get/redis-5.3.7.tgz
Build process completed successfully
Installing '/usr/lib64/php/modules/redis.so'
install ok: channel://pecl.php.net/redis-5.3.7
configuration option "php_ini" is not set to php.ini location
You should add "extension=redis.so" to php.ini
[root@web01 ~]# ll /etc/php.
php.d/ php.ini
[root@web01 ~]# ll /etc/php.d/
总用量 152
-rw-r--r-- 1 root root 4848 2月 23 2024 10-opcache.ini
-rw-r--r-- 1 root root 50 2月 23 2024 20-bcmath.ini
-rw-r--r-- 1 root root 44 2月 23 2024 20-bz2.ini
-rw-r--r-- 1 root root 54 2月 23 2024 20-calendar.ini
-rw-r--r-- 1 root root 48 2月 23 2024 20-ctype.ini
-rw-r--r-- 1 root root 46 2月 23 2024 20-curl.ini
-rw-r--r-- 1 root root 44 2月 23 2024 20-dom.ini
-rw-r--r-- 1 root root 46 2月 23 2024 20-exif.ini
-rw-r--r-- 1 root root 54 2月 23 2024 20-fileinfo.ini
-rw-r--r-- 1 root root 44 2月 23 2024 20-ftp.ini
-rw-r--r-- 1 root root 42 2月 23 2024 20-gd.ini
-rw-r--r-- 1 root root 52 2月 23 2024 20-gettext.ini
-rw-r--r-- 1 root root 48 2月 23 2024 20-iconv.ini
-rw-r--r-- 1 root root 46 2月 23 2024 20-intl.ini
-rw-r--r-- 1 root root 46 2月 23 2024 20-json.ini
-rw-r--r-- 1 root root 54 2月 23 2024 20-mbstring.ini
-rw-r--r-- 1 root root 52 2月 23 2024 20-mysqlnd.ini
-rw-r--r-- 1 root root 44 2月 23 2024 20-pdo.ini
-rw-r--r-- 1 root root 46 2月 23 2024 20-phar.ini
-rw-r--r-- 1 root root 48 2月 23 2024 20-posix.ini
-rw-r--r-- 1 root root 48 2月 23 2024 20-shmop.ini
-rw-r--r-- 1 root root 56 2月 23 2024 20-simplexml.ini
-rw-r--r-- 1 root root 52 2月 23 2024 20-sockets.ini
-rw-r--r-- 1 root root 52 2月 23 2024 20-sqlite3.ini
-rw-r--r-- 1 root root 52 2月 23 2024 20-sysvmsg.ini
-rw-r--r-- 1 root root 52 2月 23 2024 20-sysvsem.ini
-rw-r--r-- 1 root root 52 2月 23 2024 20-sysvshm.ini
-rw-r--r-- 1 root root 56 2月 23 2024 20-tokenizer.ini
-rw-r--r-- 1 root root 44 2月 23 2024 20-xml.ini
-rw-r--r-- 1 root root 56 2月 23 2024 20-xmlwriter.ini
-rw-r--r-- 1 root root 44 2月 23 2024 20-xsl.ini
-rw-r--r-- 1 root root 50 2月 23 2024 30-mysqli.ini
-rw-r--r-- 1 root root 56 2月 23 2024 30-pdo_mysql.ini
-rw-r--r-- 1 root root 58 2月 23 2024 30-pdo_sqlite.ini
-rw-r--r-- 1 root root 46 2月 23 2024 30-wddx.ini
-rw-r--r-- 1 root root 56 2月 23 2024 30-xmlreader.ini
-rw-r--r-- 1 root root 645 2月 23 2024 opcache-default.blacklist
[root@web01 ~]#
# 创建1个php的子配置文件,写入新添加的模块,当前数字为31,数字越小越优先
[root@web01 ~]# cat > /etc/php.d/31-redis.ini<<EOF
> [redis]
> extension=redis.so
> EOF
# 进行检查
[root@web01 ~]# php -m |grep redis
redis
# mysql模块库
[root@web01 ~]# find / -name mysqlnd.so
/usr/lib64/php/modules/mysqlnd.so
[root@web01 ~]# ll /usr/lib64/php/modules
总用量 11592
-rwxr-xr-x 1 root root 39072 2月 23 2024 bcmath.so
-rwxr-xr-x 1 root root 27096 2月 23 2024 bz2.so
-rwxr-xr-x 1 root root 36104 2月 23 2024 calendar.so
-rwxr-xr-x 1 root root 18584 2月 23 2024 ctype.so
-rwxr-xr-x 1 root root 96408 2月 23 2024 curl.so
-rwxr-xr-x 1 root root 178408 2月 23 2024 dom.so
-rwxr-xr-x 1 root root 92312 2月 23 2024 exif.so
-rwxr-xr-x 1 root root 5048888 2月 23 2024 fileinfo.so
-rwxr-xr-x 1 root root 63640 2月 23 2024 ftp.so
-rwxr-xr-x 1 root root 104600 2月 23 2024 gd.so
-rwxr-xr-x 1 root root 14496 2月 23 2024 gettext.so
-rwxr-xr-x 1 root root 43224 2月 23 2024 iconv.so
-rwxr-xr-x 1 root root 490584 2月 23 2024 intl.so
-rwxr-xr-x 1 root root 47256 2月 23 2024 json.so
-rwxr-xr-x 1 root root 1047496 2月 23 2024 mbstring.so
-rwxr-xr-x 1 root root 137456 2月 23 2024 mysqli.so
-rwxr-xr-x 1 root root 255760 2月 23 2024 mysqlnd.so
-rwxr-xr-x 1 root root 449296 2月 23 2024 opcache.so
-rwxr-xr-x 1 root root 31152 2月 23 2024 pdo_mysql.so
-rwxr-xr-x 1 root root 117192 2月 23 2024 pdo.so
-rwxr-xr-x 1 root root 35248 2月 23 2024 pdo_sqlite.so
-rwxr-xr-x 1 root root 277056 2月 23 2024 phar.so
-rwxr-xr-x 1 root root 39256 2月 23 2024 posix.so
-rw-r--r-- 1 root root 2616128 10月 31 12:00 redis.so
-rwxr-xr-x 1 root root 14488 2月 23 2024 shmop.so
-rwxr-xr-x 1 root root 59864 2月 23 2024 simplexml.so
-rwxr-xr-x 1 root root 88224 2月 23 2024 sockets.so
-rwxr-xr-x 1 root root 56800 2月 23 2024 sqlite3.so
-rwxr-xr-x 1 root root 22688 2月 23 2024 sysvmsg.so
-rwxr-xr-x 1 root root 14496 2月 23 2024 sysvsem.so
-rwxr-xr-x 1 root root 14496 2月 23 2024 sysvshm.so
-rwxr-xr-x 1 root root 18592 2月 23 2024 tokenizer.so
-rwxr-xr-x 1 root root 34968 2月 23 2024 wddx.so
-rwxr-xr-x 1 root root 34976 2月 23 2024 xmlreader.so
-rwxr-xr-x 1 root root 55824 2月 23 2024 xml.so
-rwxr-xr-x 1 root root 51360 2月 23 2024 xmlwriter.so
-rwxr-xr-x 1 root root 34968 2月 23 2024 xsl.so
[root@web01 ~]#
# pecl版本
[root@web01 ~]# pecl version
PEAR Version: 1.10.15
PHP Version: 7.2.34
Zend Engine Version: 3.2.0
Running on: Linux web01 4.19.90-52.22.v2207.ky10.x86_64 #1 SMP Tue Mar 14 12:19:10 CST 2023 x86_64
5.3.7 安装php-redis插件(web02)
查看代码
[root@web01 ~]# scp -rp /usr/lib64/php/modules/redis.so root@web02:/usr/lib64/php/modules/
Authorized users only. All activities may be monitored and reported.
root@web02's password:
redis.so
[root@web01 ~]# scp -rp /etc/php.d/31-redis.ini root@web02:/etc/php.d/
Authorized users only. All activities may be monitored and reported.
root@web02's password:
31-redis.ini 100% 27 24.8KB/s 00:00
[root@web01 ~]# cd /etc/php-fpm.d/
[root@web02 ~]# php -m | grep redis
redis
5.3.7 php配置文件指定会话存放位置(web01)
查看代码
[root@web01 /etc/php-fpm.d]# vim www.conf
[root@web01 /etc/php-fpm.d]# vim session.conf
[root@web01 /etc/php-fpm.d]# egrep -v '^ *$|;' www.conf
[www]
user = www
group = www
listen = 127.0.0.1:9000
listen.acl_users = apache,nginx
listen.allowed_clients = 127.0.0.1
pm = dynamic
pm.max_children = 50
pm.start_servers = 5
pm.min_spare_servers = 5
pm.max_spare_servers = 35
slowlog = /var/log/php-fpm/www-slow.log
php_admin_value[error_log] = /var/log/php-fpm/www-error.log
php_admin_flag[log_errors] = on
php_value[session.save_handler] = redis
php_value[session.save_path] = tcp://172.16.1.81:6379
php_value[soap.wsdl_cache_dir] = /var/lib/php/wsdlcache
[root@web01 /etc/php-fpm.d]# cat session.conf
[session]
user = www
group = www
listen = 127.0.0.1:9001
listen.acl_users = apache,nginx
listen.allowed_clients = 127.0.0.1
pm = dynamic
pm.max_children = 50
pm.start_servers = 5
pm.min_spare_servers = 5
pm.max_spare_servers = 35
slowlog = /var/log/php-fpm/www-slow.log
php_admin_value[error_log] = /var/log/php-fpm/www-error.log
php_admin_flag[log_errors] = on
php_value[session.save_handler] = redis
php_value[session.save_path] = tcp://172.16.1.81:6379
php_value[soap.wsdl_cache_dir] = /var/lib/php/wsdlcache
[root@web01 /etc/php-fpm.d]# php-fpm -t
[31-Oct-2024 13:06:32] NOTICE: configuration file /etc/php-fpm.conf test is successful
[root@web01 /etc/php-fpm.d]# systemctl restart php-fpm.service
5.3.8 php配置文件指定会话存放位置(web02)
查看代码
[root@web01 /etc/php-fpm.d]# scp -rp ./* root@web02:`pwd`
Authorized users only. All activities may be monitored and reported.
root@web02's password:
session.conf 100% 516 373.1KB/s 00:00
www.conf 100% 19KB 11.0MB/s 00:00
www.conf.bak 100% 19KB 4.0MB/s 00:00
[root@web01 /etc/php-fpm.d]#
[root@web02 ~]# php-fpm -t
[31-Oct-2024 13:06:57] NOTICE: configuration file /etc/php-fpm.conf test is successful
[root@web02 ~]# systemctl restart php-fpm.service
5.3.9 测试
通过负载进行登录,成功.
redis中可以查看会话信息
redis-cli 进入redis中
keys *查看所有键值信息(危险,生产环境不要用.)
del 加上双引号内容可以删除对应的session信息,查看页面刷新后变为未登录状态
[root@db01 /etc/redis]# redis-cli
127.0.0.1:6379> keys *
1) "PHPREDIS_SESSION:v6f32u2lr3sn7sgbkpdn8tg2lp"
127.0.0.1:6379> del PHPREDIS_SESSION:v6f32u2lr3sn7sgbkpdn8tg2lp
(integer) 1
127.0.0.1:6379>
127.0.0.1:6379> keys *
(empty array)
# 重新登陆后生成新的session
127.0.0.1:6379> keys *
1) "PHPREDIS_SESSION:9eqpojtnq8gtgmdqv37vd9t4b7"
127.0.0.1:6379> exit
[root@db01 /etc/redis]#
5.3.10 小结
- 需要理解,说出来session,cookie区别.
- 说出来会话共享的方案.(redis)
- redis
- 案例通过部署phpmyadmin实现会话共享
6. 负载均衡轮询算法
6.1 概述
决定负载均衡如何把请求分发给后端节点,这种分发的方式就是轮询算法.
6.2 轮询算法
说说常见ngx轮询算法.
rr,wrr,ip_hash,lc算法(最小连接数),wlc(加权最小连接数)
负载 |
说明 |
rr轮询 |
round robin 轮询,默认的循环访问 |
wrr加权轮询 |
加权轮询,在轮询的基础上增加权重功能. server中 weight就是加权轮询. |
ip_hash |
ip哈希, 只要客户端ip一样,就会一直访问同一个后端节点.(用户请求与web服务器绑定.) 解决会话保持/会话共享.可能导致负载不均 |
url_hash |
url_hash 只要用户访问的url相同/uri相同,就访问相同的web服务器. 缓存服务器: 静态资源缓存. hash $request_uri; |
least_conn;(lc) |
最小连接数,lc算法. 也可以配合上权重 weight, wlc权重的最小连接数 |
least_time;(lt) |
最小连接时间,谁的连接时间小,谁处理 |
一致性hash算法 |
hash $remote_addr consistent; 即使用ip_hash特点,服务器增减的时候影响范围最小. |
一致性哈希:https://blog.csdn.net/u014571143/article/details/130098151
实例
查看代码
upstream lb_pools {
ip_hash; # Ip哈希
# hash $remote_addr consistent; #一致性hash算法.
# hash $request_uri; # url哈希
server 10.0.0.69:80 weight=1 max_fails=3 fail_timeout=30s;
server 10.0.0.70:80 weight=1 max_fails=3 fail_timeout=30s;
}
server {
listen 80;
server_name lb.web01.cn;
error_log /var/log/nginx/lb-error.log notice;
access_log /var/log/nginx/lb-access.log main;
location / {
proxy_pass http://lb_pools;
proxy_set_header Host $http_host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
6.3 负载均衡监控模块(健康检查模块)
6.3.1 安装
- 类似于ngx stub_status模块监控ngx状态.
- 第三方模块
- 负载均衡检查模块:展示负载均衡分组的访问情况.是否可以访问.
模块名字 :upstream_check模块
编译过程
[root@web01 ~]# nginx -V |& grep upstream_check # 默认没有安装,这是个第三发模块
# 安装依赖
[root@web01 ~]# yum install -y openssl-devel pcre-devel zlib-devel #麒麟 centos红帽
apt install -y libssl-dev libpcre3 libpcre3-dev zlib1g-dev #ubt debian
# 查看当前已有模块
[root@web01 ~]# nginx -V
nginx version: nginx/1.26.1
built by gcc 4.8.5 20150623 (Red Hat 4.8.5-44) (GCC)
built with OpenSSL 1.0.2k-fips 26 Jan 2017 (running with OpenSSL 1.0.2o-fips 27 Mar 2018)
TLS SNI support enabled
configure arguments: --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 --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'
[root@web01 ~]#
# 下载解压tengine
[root@web01 ~]# wget https://tengine.taobao.org/download/tengine-3.1.0.tar.gz
[root@web01 ~]# mkdir -p /app/tengine/
[root@web01 ~]# tar xf tengine-3.1.0.tar.gz -C /app/tengine/
[root@web01 ~]# cd /app/tengine/tengine-3.1.0/
# tengine源码包配置里加入 --add-module=modules/ngx_http_upstream_check_module
[root@web01 /app/tengine/tengine-3.1.0]# ./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 --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' --add-module=modules/ngx_http_upstream_check_module
[root@web01 /app/tengine/tengine-3.1.0]# echo $?
0
# 编译tengine源码包
[root@web01 /app/tengine/tengine-3.1.0]# make -j `nproc`
[root@web01 /app/tengine/tengine-3.1.0]# echo $?
0
[root@web01 /app/tengine/tengine-3.1.0]# cd objs/
[root@web01 /app/tengine/tengine-3.1.0/objs]#
# 形成新的tengine程序
[root@web01 /app/tengine/tengine-3.1.0/objs]# ll
总用量 9204
drwxr-xr-x 3 root root 44 10月 31 19:50 addon
-rw-r--r-- 1 root root 25194 10月 31 19:50 autoconf.err
-rw-r--r-- 1 root root 65465 10月 31 19:51 Makefile
drwxr-xr-x 3 root root 33 10月 31 19:50 modules
-rwxr-xr-x 1 root root 9223552 10月 31 19:52 nginx
-rw-r--r-- 1 root root 5304 10月 31 19:52 nginx.8
-rw-r--r-- 1 root root 12862 10月 31 19:51 ngx_auto_config.h
-rw-r--r-- 1 root root 657 10月 31 19:50 ngx_auto_headers.h
-rw-r--r-- 1 root root 11439 10月 31 19:50 ngx_modules.c
-rw-r--r-- 1 root root 63464 10月 31 19:52 ngx_modules.o
drwxr-xr-x 10 root root 103 10月 31 19:50 src
[root@web01 /app/tengine/tengine-3.1.0/objs]#
传输/app/tengine/tengine-3.1.0/objs到其他服务器,并替换已有的nginx命令
检查语法(nginx -t )并重启服务, curl -v 10.0.0.70 访问并检查响应头是否为Tengine即可
curl -v 10.0.0.69 |head 10
[root@web02 ~]# curl -v 10.0.0.69 |head 10
head: 无法打开'10' 读取数据: 没有那个文件或目录
* Trying 10.0.0.70:80...
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0* Connected to 10.0.0.69 (10.0.0.69) port 80 (#0)
> GET / HTTP/1.1
> Host: 10.0.0.70
> User-Agent: curl/7.71.1
>
* Mark bundle as not supporting multiuse
< HTTP/1.1 200 OK
< Server: Tengine/3.1.0
< Date: Thu, 31 Oct 2024 12:14:34 GMT
< Content-Type: text/html; charset=UTF-8
< Transfer-Encoding: chunked
< Connection: keep-alive
< X-Powered-By: PHP/7.2.34
< Link: <http://blog.web01.cn/index.php?rest_route=/>; rel="https://api.w.org/"
[root@web01 ~]# curl -I 10.0.0.69
HTTP/1.1 200 OK
Server: Tengine/3.1.0
Date: Thu, 31 Oct 2024 12:25:47 GMT
Content-Type: text/html; charset=UTF-8
Connection: keep-alive
X-Powered-By: PHP/7.2.34
Link: <http://blog.web01.cn/index.php?rest_route=/>; rel="https://api.w.org/"
6.3.2 使用(lb01)
https://tengine.taobao.org/document_cn/http_upstream_check_cn.html
负载均衡健康检查模块指 令说明
check |
指定检查方法:type=http或tcp或ssl_hello检查https interval 检查间隔 3000ms rise成功2次则节点正常的. fail失败5次认为这个节点挂了 interval=3000 rise=2 fall=5 timeout=1000 |
check_http_send |
向当前分组中所有节点发送的http请求的内容"HEAD /index.php HTTP/1.0\r\nHost:blog.oldboylinux.cn\r\nUser-Agent: lb_check" |
check_http_expect_alive http_2xx http_3xx |
收到2xx 3xx的状态码,就是成功的 |
check_status |
开启状态检查功能 |
配置
[root@lb01 /etc/nginx/conf.d]# cat lb_blog.conf
upstream blog_groups {
server 10.0.0.69:80;
server 10.0.0.70:80;
# 配置负载均衡健康检查功能
check interval=3000 rise=2 fall=5 timeout=1000 type=http;
# /index.php 要检查的URI 向当前分组中所有节点发送的http请求的内容
check_http_send "HEAD /index.php HTTP/1.0\r\nHost:blog.oldboylinux.cn\r\nUser-Agent: lb_check\r\n\r\n";
check_http_expect_alive http_2xx http_3xx;
}
server{
listen 80;
server_name blog.web01.cn;
error_log /var/log/nginx/lb_blog_error.log notice;
access_log /var/log/nginx/lb_blog_access.log main;
location / {
proxy_pass http://blog_groups;
proxy_set_header Host $http_host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Real-Ip $remote_addr;
}
location /lb_status {
check_status;
access_log off;
#allow
#deny
}
location /ngx_status {
stub_status;
access_log off;
#allow
#deny
}
}
访问
http://blog.web01.cn/lb_status
http://blog.web01.cn/ngx_status
查看web01日志
curl -H Host:blog.web01.cn http://10.0.0.75/lb_status?format=csv
[root@lb01 ~]# curl -H Host:blog.web01.cn http://10.0.0.75/lb_status?format=csv
0,blog_groups,10.0.0.69:80,up,19,0,http,0
1,blog_groups,10.0.0.70:80,up,19,0,http,0
6.3.3 小结
- 负载均衡健康检查模块应用场景(监控).
- 编译安装ngx/tengine, 编译安装的ngx使用与原有ngx已有的编译参数.
- 编译安装ngx/tengine并添加模块.
- --with-xxx模块(ngx自带)
- --add-module(添加第3方模块)