欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 文旅 > 旅游 > Web集群服务-代理和负载均衡

Web集群服务-代理和负载均衡

2024/10/23 21:31:15 来源:https://blog.csdn.net/qq_63826739/article/details/142925826  浏览:    关键词:Web集群服务-代理和负载均衡

1. 概述

1. 用户----->代理--->Web节点,后面只有一个节点,一般使用的是nginx代理功能即可

2. 后面如果是集群需要使用nginx负载均衡功能

2. 代理分类

代理分类方向应用
正向代理用户(服务器)-->代理--->外部(某网站)服务器通过代理实现共享上网/访问公网
反向代理用户(app/浏览器)--->代理--->网站web服务器给网站设置个统一入口,后面是网站集群(可以使用负载均衡功能)

3.  极速上手指南

3.1 环境概述

角色主机名ip
代理服务器lb0110.0.0.5/172.16.1.5
web服务器nginx_xing

10.0.0.8/172.16.1.8

3.2 给lb01配置nginx

参考链接: 

Web集群服务-Nginx-CSDN博客icon-default.png?t=O83Ahttps://blog.csdn.net/qq_63826739/article/details/142857315

nginx启动后默认是web服务器.

需要使用对应的模块:proxy模块(代理),upstream模块(负载均衡模块)

3.3 web服务器

##注释所有nginx子配置文件
##创建proxy.conf配置文件
server{listen 80;server_name proxy.oldboylinux.cn;error_log /var/log/nginx/proxy/error.log notice;access_log /var/log/nginx/proxy/access.log main;root /app/code/proxy;location / {index index.html;}
}
nginx -t
systemctl reload nginx
##创建站点目录
mkdir -p /app/code/proxy
##创建日志文件
mkdir -p /var/log/nginx/proxy
##创建首页文件内容
echo 'proxy.oldboylinux.cn web' >/app/code/proxy/index.html
##测试
curl -H Host:proxy.oldboylinux.cn 10.0.0.8

3.4 lb01代理服务器

1. 不需要配置站点目录

2. 仅仅需要转发proxy_pass

##创建proxy.conf配置文件
server{listen 80;server_name proxy.oldbooylinux.cn;location /{proxy_pass  http://10.0.0.8:80;proxy_set_header Host $http_host;} 
}
nginx -t
systemctl reload nginx
##测试
curl -H Host:proxy.oldboylinux.cn  http://10.0.0.5

浏览器访问10.0.0.5 

3.5 web记录用户真实ip地址 

现象:

用户请求经过代理,然后访问web,web服务器没有记录真实的客户端的ip地址,而是记录了代理的ip

解决:

1. 在代理上面修改请求头,proxy_set_header X-Forwarded-For  $remote_addr;

2. 最后在web服务器上记录了真实的ip地址,$http_x_forwarded_for"

##修改proxy.conf配置文件
server{listen 80;server_name proxy.oldbooylinux.cn;error_log /var/log/nginx/proxy/error.log notice;access_log /var/log/nginx/proxy/access.log main;location /{proxy_pass  http://10.0.0.8:80;proxy_set_header Host $http_host;proxy_set_header X-Forwarded-For $remote_addr; ##只会一个ip地址proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;  ##多层代理的时候,会记录每个代理的ip地址.相当于记录了多个} 
}
nginx -t
systemctl reload nginx
 浏览器访问,查看web服务器的日志

生产建议:

proxy_set_header Host $http_host;

proxy_set_header   X-Real-IP       $remote_addr;

proxy_set_header   X-Forwarded-For  $proxy_add_x_forwarded_for; 

 3.6 部署nginxconf 站点并访问

##web01服务器配置文件
server{listen 80;server_name cfg.oldboylinux.cn;access_log /var/log/nginx/cfg/access.log main;error_log /var/log/nginx/cfg/error.log notice;root /app/code/cfg;location /{index index.html;  }}
##代理服务服务器配置文件
upstream cfg_pools{server 10.0.0.8:80;  ##资源池,以后可以写多个web服务器地址server 10.0.0.7:80;  ##创建分组/池塘,proxy_pass中使用即可server 10.0.0.6:80;
}
server{listen 80;server_name cfg.oldboylinux.cn;access_log /var/log/nginx/cfg/access.log main;error_log /var/log/nginx/cfg/error.log notice;location /{proxy_pass http://cfg_pools;proxy_set_header Host $http_host;proxy_set_header X_Real_Ip $remote_addr;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;}
}

3.7 负载均衡模块的选项

upstream模块 sever 指令支持的选项:

upstrem pools {

        server 10.0.0.7:80  weight=1 max_fails=3 fail_timeout=10s;

        server 10.0.0.8:80  weight=1 max_fails=3 fail_timeout=10s;

        server 10.0.0.9:80 backup; server 10.0.0.9:80 backup;

}

server后面可以加的选项说明应用场景

weight

权重,根据权重nginx分配请求

如果web服务端配置不同,1c2g, 2c8g.

代码更新与测试的时候,给测试服务器较小的权重

max_failsnginx具备一些健康检查功能,指定失败的次数,超过这个次 数就认为节点挂了一般情况下可以设置1-3即可. 不太重要,缓存业 务,可以设置为10
fail_timeout认为节点挂了后间隔多久再次检查健康情况. 默认是 10s.根据要求设置时间即可,可以长一些.30/60s
backup备胎服务器,其他所有服务器都挂了的时候,才启用使用的时候需要考虑雪崩的情况

4. wordpress接入负载均衡

1. 接入nfs挂载

2. db数据库库,用户

3. web01,web02 部署环境ngx+php,测试,部署代码,挂载nfs

4. 接入负载

4.1 nfs存储 

参考:数据服务-存储服务(NFS)-CSDN博客

##编写存储目录
vim/etc/exports
/wp-uploads/ 172.16.1.0/24(rw,all_squash)
##创建目录
mkdir -p /wp-uploads/
chown  -R nfsnobody.nfsnobody /wp-uploads/
systemctl restart nfs

4.2 db数据库

参考:Web集群服务-Nginx-CSDN博客

 4.3 web01

yum install -y nfs-utils
mount -t nfs 172.16.1.31:/wp-uploads  /app/code/blog/wp-content/uploads/ ##挂载

4.4 接入负载均衡

upstream blog_pools{server 10.0.0.8:80;
}
server {listen 80;server_name blog.oldboylinux.cn;error_log /var/log/nginx/blog/error.log notice;access_log /var/log/nginx/blog/access.log main;location /{proxy_pass http://blog_pools;proxy_set_header Host $http_host;proxy_set_header X_Real_Ip $remote_addr;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;}
}
nginx -t
systemctl reload -nginx

5. 会话保持

5.1 概述

用户的请求,登录的请求,经过负载均衡后落到后面的web服务器上,登录的状态/信息也会记录在web服务器上,就会导致不通的web服务器 上,登录状态不统一,造成用户频繁需要登录

5.2 cookie vs session

技术共同点区别
cookie存放用户的信息,登 录信息存放在客户端浏览器上
session        存放用户的信息,登 录信息存放在服务器上

 5.3 会话保持方案

1. 登录状态写入cookie中

2. ip_hash方法

3. 通过redis实现phpmyadmin/kodbox会话共享

5.3.1 部署phpMyAdmin

db准备phpmyadmin的用户
grant all on *.* 'phpmyadmin@'172.16.1.%' identified by '1';
在nginx上写配置文件
server{listen 80;server_name phpadmin.oldboylinux.cn;access_log /var/log/nginx/phpadmin/access.log main;error_log /var/log/nginx/phpadmin/error.log notice;root /app/code/phpadmin;location / {index index.php;}location ~ \.php$ {fastcgi_pass 127.0.0.1:9000;fastcgi_buffering on;fastcgi_buffers 64 64k;fastcgi_index  index.php;fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;include fastcgi_params;}
}
部署代码:

phpMyAdminicon-default.png?t=O83Ahttps://www.phpmyadmin.net/

浏览器解析与访问
##修改权限
chown -R nginx.nginx /var/lib/php/session
##手动创建连接数据库的配置文件
cp /app/code/phpadmin/config.sample.inc.php  /app/code/phpadmin/config.inc.php
##修改config.inc.php第三十行服务器地址改为数据库服务器地址
grep -n host config.inc.php 
30:$cfg['Servers'][$i]['host'] = '172.16.1.51';

5.3.2 部署redis服务

##在数据库服务器上安装redis
yum install -y redis
##修改/etc/redis.conf
bind 127.0.0.1 172.16.1.51  ##增加本地网卡的ip
##服务启动和查看端口
systemctl enable now  redis
ss -lntup|grep redis

 5.3.3 负载均衡配置文件

upstream phpadmin_pools{server 10.0.0.8:80;
}
server{listen 80;server_name phpadmin.oldboylinux.cn;error_log /var/log/nginx/phpadmin/error.log notice;access_log /var/log/nginx/phpadmin/access.log main;location /{proxy_pass http://phpadmin_pools;proxy_set_header Host $http_host;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;}}
nginx -t
systemctl reload nginx

5.3.4 php配置文件指定会话存放位置

##
cd /etc/php-fpm.d
cp www.conf session.conf
egrep -v '^$|;' session.conf 
vim  session.conf
##书写配置文件
[session]  ###修改
user = nginx  ##修改
group = nginx  ##修改
listen = 127.0.0.1:9001  ###修改
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.51:6379 ##修改
php_value[soap.wsdl_cache_dir]  = /var/lib/php/wsdlcache
##检查语法
php-fpm -t
systemctl  reload php-fpm
ss -lntup|grep php ##有9001端口

 5.3.5 修改ngx配置 admin转发到9001端口的php处理

server{listen 80;server_name phpadmin.oldboylinux.cn;access_log /var/log/nginx/phpadmin/access.log main;error_log /var/log/nginx/phpadmin/error.log notice;root /app/code/phpadmin;location / {index index.php;}location ~ \.php$ {fastcgi_pass 127.0.0.1:9001; ##传递给9001端口fastcgi_buffering on;fastcgi_buffers 64 64k;fastcgi_index  index.php;fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;include fastcgi_params;}
}
nginx -t
systemctl reload nginx 

5.3.6 最终测试

浏览器访问登录phpadmin,查看redis数据库是否有数据
##登录phpadmin后刷新页面,查看redis数据
redis-cli
KEYS *

6. 轮询算法

6.1 概述

决定负载均衡如何把请求分发给后端节点,这种分发的方式就是轮询算法

负载轮询算法说明
rr轮询默认的循环访问
wrr加权轮询,在轮询的基础上增加权重功能. server中 weight就是加权轮询
ip_haship哈希, 只要客户端ip一样,就会一直访问同一个后端节点
xxx_hashurl_hash 只要用户访问的url相同/uri相同,就访问相同的web服务器
least_conn最小连接数,lc算法. 也可以配合上权重 weight, wlc权重的最小连接数

 

6.2 ip_hash

upstream blog_pools{ip_hash;server 10.0.0.8:80;
}
server {listen 80;server_name blog.oldboylinux.cn;error_log /var/log/nginx/blog/error.log notice;access_log /var/log/nginx/blog/access.log main;location /{proxy_pass http://blog_pools;proxy_set_header Host $http_host;proxy_set_header X_Real_Ip $remote_addr;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;}}

7. 对负载均衡进行状态检查

1. 负载均衡状态检查模块 upstream check模块,web展示

2. 默认ngx没有安装,是一个第三方的模块,需要编译安装nginx添加这个模块即可.生成nginx命令

upstream cfg_pools{server 10.0.0.8:80  weight=1 max_fails=3 fail_timeout=30s;check interval=3000 rise=2 fail=5 timeout=1000 type=http;check_http_send "HEAD / HTTP/1.0\r\n\r\n";check_http_expect_alive http_2xx http_3xx;
}
server{listen 80;server_name cfg.oldboylinux.cn;access_log /var/log/nginx/cfg/access.log main;error_log /var/log/nginx/cfg/error.log notice;location /{proxy_pass http://cfg_pools;proxy_set_header Host $http_host;proxy_set_header X_Real_Ip $remote_addr;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;location /lb_status {check_status;access_log off;allow 10.0.0.1;allow 10.0.0.0/24;deny all;}}
}

 8. 重定向rewrite

rewrite模块相关的指令说明
return实现对url的改写,一般与ngx变量一起使用. 返回指定的状态码.
rewrite实现对url的改写, 使用正则匹配uri,进行改写. 还有各种标记
set创建或修改ngx变量
if判断,一般与ngx变量一起使用

8.1 return指令

如果用户访问/admin/页面返回403
server{listen 80;server_name rewrite.oldboylinux.cn;root /app/code/rewrite;location /{index index.html;}location /admin/ {return 403;}}mkdir -p /app/code/rewrite/admin/
echo rewrite index >/app/code/rewrite/index.html
echo admin  index >/app/code/rewrite/admin/index.html
curl -H Host:rewrite.oldboylinux.cn  http://10.0.0.8
curl -H Host:rewrite.oldboylinux.cn  http://10.0.0.8/admin/
域名间跳转
server {listen 80;server_name rewrite.oldboylinux.cn;return 301 http://www.baidu.com;
}

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com