负载均衡

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方模块)

 

posted @ 2024-11-01 15:41  老虎死了还有狼  阅读(13)  评论(0编辑  收藏  举报