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;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/451573.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

MySQL-事务Transaction详解

文章目录 事务概述事务基本概念事务四大特性(ACID)演示MySQL事务手动开启事务MySQL默认事务机制 事务的隔离级别隔离级别基本概述三种现象脏读不可重复读幻读 查看和设置隔离级别四种隔离级别及演示读未提交(read uncommitted)读提交(read committed)可重复读(repeatable read)…

颠覆Transformer的Mamba模型[精简版本]------S4

1、改进transformer不擅长处理超长的序列的问题:输入u到状态x 序列数据一般都是离散的数据 比如文本、图、DNA,但现实生活中还有很多连续的数据,比如音频、视频,对于音视频这种信号而言,其一个重要特点就是有极长的context window,而在transformer长context上往往会失败,…

Spring Boot技术栈的电影评论网站设计与实现

6系统测试 6.1概念和意义 测试的定义:程序测试是为了发现错误而执行程序的过程。测试(Testing)的任务与目的可以描述为: 目的:发现程序的错误; 任务:通过在计算机上执行程序,暴露程序中潜在的错误。 另一个…

算法——python实现堆排序

文章目录 堆排序二叉树堆堆排序的过程:代码实现python中的heapq模块 堆排序 二叉树 关于二叉树的操作,其实核心就是 父节点找子节点,子节点找父节点 如果要将二叉树存储到队列中,就需要找出 父子节点之间的规律: 父…

什么是SYN flood,如何处理

在数字化时代,随着互联网的普及和技术的飞速发展,网络安全问题变得日益严峻。Flood攻击,作为一种典型的网络攻击手段,对个人和企业的信息安全构成了重大威胁。通过深入了解Flood攻击的概念、特点、影响及解决方案,我们…

Sentinel 快速入门

前置推荐阅读:Sentinel 介绍-CSDN博客 前置推荐阅读:Nacos快速入门-CSDN博客 快速开始 欢迎来到 Sentinel 的世界!这篇新手指南将指引您快速入门 Sentinel。 Sentinel 的使用可以分为两个部分: 核心库(Java 客户端)&#xff1a…

现代数字信号处理I-P4 CRLB+LMMSE 学习笔记

目录 学习资料视频链接: 1. 估计参数的CRLB回顾 2. 参数变换下的CRLB拓展 3. 矢量参数下的CRLB扩展 3.1 矢量参数下的CRLB公式 3.2 两个矩阵不等式关系的意义说明 3.3 矢量参数下CRLB公式的证明过程 4. 线性估计 重点注意事项:此处的线性估计&am…

【React】React18核心源码解读

前言 本文使用 React18.2.0 的源码,如果想回退到某一版本执行git checkout tags/v18.2.0即可。如果打开源码发现js文件报ts类型错误请看本人另一篇文章:VsCode查看React源码全是类型报错如何解决。 阅读源码的过程: 下载源码 观察 package…

【java面经thinking】二

目录 redis了解 使用原因 应用场景 数据类型 redis事务 数据持久化 RDB(快照): AOF(即时更新): 选择方式: redis快速的原因 redis单线程 单机瓶颈 经典3问 参考博客 redis了解 缓存中间件 使用原因 缓解高并发、提升高可用。…

Qt 实现动态时钟

1.实现效果 2.widget.h #ifndef WIDGET_H #define WIDGET_H#include <QWidget>QT_BEGIN_NAMESPACE namespace

归一化输入

当输入的不同的特征取值范围差异过大&#xff0c;取得对应参数差别也会很大&#xff0c;在对参数进行优化的过程中&#xff0c;参数小的维度步长较小&#xff0c;参数大的维度步长较大&#xff0c;优化过程中路径曲折&#xff0c;将输入归一化&#xff0c;使特征取值范围差别小…

Leetcode 剑指 Offer II 098.不同路径

题目难度: 中等 原题链接 今天继续更新 Leetcode 的剑指 Offer&#xff08;专项突击版&#xff09;系列, 大家在公众号 算法精选 里回复 剑指offer2 就能看到该系列当前连载的所有文章了, 记得关注哦~ 题目描述 一个机器人位于一个 m x n 网格的左上角 &#xff08;起始点在下…

华强北耳机最强攻略。华强北Airpods不踩坑,指南在这

#华强北Airpods##华强北耳机#这一篇文章&#xff0c;我会比较啰嗦&#xff0c;但会十分详细介绍目前能入手的渠道 和每一个渠道入手的优缺点&#xff0c;以便各位选择适合自己的渠道入手。 ■ 01 芯片ic大升级—————— 采用全新07IC板的洛达Ae芯片 整体提升三个单位算法 该…

idea-java序列化serialversionUID自动生成

&#x1f496;简介 java.io.Serializable 是 Java 中的一个标记接口&#xff08;marker interface&#xff09;&#xff0c;它没有任何方法或字段。当一个类实现了 Serializable 接口&#xff0c;那么这个类的对象就可以被序列化和反序列化。序列化是将对象的状态转换为字节流…

【原创】java+ssm+mysql小区物业管理系统设计与实现

个人主页&#xff1a;程序猿小小杨 个人简介&#xff1a;从事开发多年&#xff0c;Java、Php、Python、前端开发均有涉猎 博客内容&#xff1a;Java项目实战、项目演示、技术分享 文末有作者名片&#xff0c;希望和大家一起共同进步&#xff0c;你只管努力&#xff0c;剩下的交…

使用 Docker-compose 部署达梦 DM 数据库

目录 1. 获取达梦 DM8 Docker 镜像并上传到 Harbor 服务器 2. Docker-compose 部署达梦 DM8 数据库 3. 配置 dm.ini 文件 4.完整的 dm.ini 文件 最近&#xff0c;将 MySQL 数据库迁移到了达梦 DM8 数据库。本文将分享如何通过 Docker-compose 部署达梦 DM8 数据库的过程&am…

全面的编程语言常识

本文首发 编程语言常识 语雀看图区别编程语言什么是强类型、弱类型语言&#xff1f;哪种更好&#xff1f;强...https://www.yuque.com/ysgstudyhard/da6e0c/ggatoo 看图区别编程语言 什么是强类型、弱类型语言&#xff1f;哪种更好&#xff1f; 强类型语言 强类型语言是一…

网络通信与并发编程(二)基于tcp的套接字、基于udp的套接字、粘包现象

基于tcp的套接字 文章目录 基于tcp的套接字一、套接字的工作流程二、基于tcp的套接字通信三、基于udp的套接字通信四、粘包现象 一、套接字的工作流程 Socket是应用层与TCP/IP协议族通信的中间软件抽象层&#xff0c;它是一组接口。在设计模式中&#xff0c;Socket其实就是一个…

【Java】多线程 Start() 与 run() (简洁实操)

Java系列文章目录 补充内容 Windows通过SSH连接Linux 第一章 Linux基本命令的学习与Linux历史 文章目录 Java系列文章目录一、前言二、学习内容&#xff1a;三、问题描述start() 方法run() 方法 四、解决方案&#xff1a;4.1 重复调用 .run()4.2 重复调用 start()4.3 正常调用…

基础数据结构——链表(单向链表,双向链表,循环链表)

1.概述 在计算机科学中&#xff0c;链表是数据元素的线性集合&#xff0c;其每个元素都指向下一个元素&#xff0c;元素存储上并不连续 分类 单向链表&#xff0c;每个元素只知道其下一个元素是谁 双向链表&#xff0c;每个元素知道其上一个元素和下一个元素 循环链表&am…