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 *

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

数据结构~AVL树

文章目录 一、AVL树的概念二、AVL树的定义三、AVL树的插入四、AVL树的平衡五、AVL树的验证六、AVL树的删除七、完整代码八、总结 一、AVL树的概念 AVL树是最先发明的自平衡二叉查找树,AVL是⼀颗空树,或者具备下列性质的二叉搜索树:它的左右子…

《微软飞行模拟2024》在飞行中可能占用高达180 Mb/s的互联网带宽

《微软飞行模拟2024》是一款要求相当高的游戏。 从理想的系统规格所需的高性能系统来看,该游戏目前在用户飞行和地形加载时使用的网络带宽高达 180 Mb/s。 这相当于每小时耗费高达 81 GB 的网络数据,对于有数据上限的用户来说简直就是噩梦。 数据上限通…

[Python学习日记-47] Python 中的系统调用模块—— os 与 sys

[Python学习日记-47] Python 中的系统调用模块 简介 os sys 简介 os 模块和 sys 模块提供了很多允许你的程序与操作系统直接交互的功能。下面将进行逐一介绍。 os 一、os.getcwd() 得到当前工作目录,即当前 Python 脚本工作的目录路径(绝对路径&#…

芝法酱学习笔记(0.7)——harbor与SpringBoot容器化docker部署

前言 之前我们主要讲的jar包部署。使用jar包部署可能导致不同服务互相争抢资源(隔离性),不同服务可能需要不同的jdk环境,有时也会造成困扰。故在微服务时代,我们通常使用docker部署 一、docker安装 docke相关的知识…

sherpa-ncnn 语言模型简单对比

在昨天把系统搞崩溃前,对sherpa-ncnn的中文模型做了一个简单的对比。这次使用的分别是sherpa-ncnn-streaming-zipformer-bilingual-zh-en-2023-02-13(以下简称bilingual-zh-en-2023-02-13)和sherpa-ncnn-streaming-zipformer-small-bilingual…

WPF自定义控件实现的几种方法

Windows Presentation Foundation (WPF) 是微软提供的一种用于构建 Windows 应用程序的开发框架。它以其强大的数据绑定、资源管理和可视化效果处理能力而闻名。在WPF中,自定义控件的实现是一个非常重要的方面,几乎所有的应用程序都会或多或少地需要自定…

哪款宠物空气净化器性价比高?希喂、米家和范罗士哪款更好?

这次我真的不是很想抱怨,是我男朋友真的很过分!真的很过分,差点让我们两个分道扬镳。先听我说,这不是我和他都嫌家里太安静了吗,每天下班后两个人吃完饭就各玩各的手机,生活太无趣了,加上这几年…

【云从】五、负载均衡CLB

文章目录 1、负载均衡2、云负载均衡CLB3、CLB的组成4、CLB的应用场景 1、负载均衡 互联网发展早期,应用服务单机部署就足以负载所有用户的访问需求 如此,部署和运维都简单,但随着用户和访问量的提高,单台服务器的硬件性能是有上限…

【GESP】C++一级练习BCQM3044,字符形状输出

回到一级知识点,用给定字符按指定形状输出。 题目题解详见:https://www.coderli.com/gesp-1-bcqm3044/ 【GESP】C一级练习BCQM3044,字符形状输出 | OneCoder回到一级知识点,用给定字符按指定形状输出。https://www.coderli.com/…

鸿蒙开发 四十五 鸿蒙状态管理(嵌套对象界面更新)

当运行时的状态变量变化,UI重新渲染,在ArkUI中称为状态管理机制,前提是变量必须被装饰器修饰。不是状态变量的所有更改都会引起刷新,只有可以被框架观测到的更改才会引起UI刷新。其中boolen、string、number类型,可观察…

【项目安全设计】软件系统安全设计规范和标准(doc原件)

1.1安全建设原则 1.2 安全管理体系 1.3 安全管理规范 1.4 数据安全保障措施 1.4.1 数据库安全保障 1.4.2 操作系统安全保障 1.4.3 病毒防治 1.5安全保障措施 1.5.1实名认证保障 1.5.2 接口安全保障 1.5.3 加密传输保障 1.5.4终端安全保障 资料获取:私信或者进主页。…

如何从模块内部运行 Pytest

在 Python 中,pytest 是一个强大的测试框架,用于编写和运行测试用例。通常我们会在命令行中运行 pytest,但是有时你可能希望从模块或脚本的内部运行 pytest,比如为了自动化测试或集成到某个工作流程中。 1、问题背景 当你从模块…

Luatools太难了?保姆级教程来啦!

作为由合宙所提供的调试工具,Luatools支持最新固件获取、固件打包、trace打印、单机烧录等功能 此工具适用于合宙所有 4G 模组和 4G GNSS 模组。 一、下载并安装 (一)运行环境要求 此工具运行于win7及以上系统;不支持 Mac和 Linux。 &…

三亚旅游微信小程序的设计与实现

详细视频演示 请联系我获取更详细的演示视频 项目运行截图 技术框架 后端采用SpringBoot框架 Spring Boot 是一个用于快速开发基于 Spring 框架的应用程序的开源框架。它采用约定大于配置的理念,提供了一套默认的配置,让开发者可以更专注于业务逻辑而不…

vulnhub(15):lemonsqueezy(hydra爆破、计划任务提权)

端口 nmap -Pn -p- 192.168.72.173 ​ PORT STATE SERVICE 80/tcp open http MAC Address: 00:0C:29:B8:2D:FC (VMware) 打点 80端口 主页面是apache2的默认页面,没有robots.txt,我们直接扫描目录 gobuster dir -u http://192.168.72.173/ -w /usr/…

SHELL脚本之输出语句的使用

shell脚本能够给用户显示一些信息,就需要输出语句的使用。 1.echo语句 如上图所示,中英文都可以, 如上图所示,在shell脚本中对于转义符的使用应该加上-e的选项,\n表示换行,\t表示电脑键盘上使用tab键隔开的…

24/10/12 算法笔记 AlexNet

AlexNet采用深度网络结构,由8层组成,包括5个卷积和3个全连接层,这种深度结构使得网络能够学习到更复杂的特征表示 1.ReLU激活函数: 首次成功的在较深的网络中使用ReLU激活函数,解决了梯度消失问题,加快了…

华为国际云:全球领先的云服务解决方案

近年来,随着云计算技术的迅猛发展,越来越多的企业开始拥抱云计算,以实现业务的数字化转型和创新。在众多云服务提供商中,华为国际云凭借其强大的技术实力和全球布局,成为了备受瞩目的明星。那么,华为国际云…

Python连接Oracle

Python连接Oracle 可以使用Oracle提供的官方Python驱动程序cx_Oracle。: cx_Oracle官方驱动程序 安装cx_Oracle驱动程序:首先,确保你已经安装了Python解释器。然后,使用pip命令安装cx_Oracle驱动程序。可以在命令行中运行以下…

如何解决JMeter响应数据乱码?

问题: 解决: 1、找到JMeter安装目录下的bin目录 2、 在bin目录下,打开" jmeter.properties "文件 3、搜索"sampleresult.default.encoding" 4、改成"sampleresult.default.encodingUTF-8",去掉前面…