From 2c9379a97b5d9b450103c59f671b3a27a54e8682 Mon Sep 17 00:00:00 2001 From: xiaoshun Date: Mon, 1 Jul 2024 19:45:14 +0800 Subject: [PATCH] =?UTF-8?q?=E4=B8=8A=E4=BC=A0=E6=96=87=E4=BB=B6=E8=87=B3?= =?UTF-8?q?=20/?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Nginx动静分离+负载均衡.md | 437 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 437 insertions(+) create mode 100644 Nginx动静分离+负载均衡.md diff --git a/Nginx动静分离+负载均衡.md b/Nginx动静分离+负载均衡.md new file mode 100644 index 0000000..1a715ce --- /dev/null +++ b/Nginx动静分离+负载均衡.md @@ -0,0 +1,437 @@ +# Nginx动静分离+负载均衡 + +x86 + +​ windows linux 部分unix + +小型机 + +​ IBM HP 安装不了普通的操作系统(windows linux) + +​ 只能安装厂商自身提供的UNIX系统 + +​ 常见的Unix系统:IBM的AIX HP的HP-UX 这些系统只能安装在他们自身厂商的小型机上 + +大型机 + +​ 国企 还不是一般的国企 搞科研 真正的高科技 航天 军工 导弹 + +​ + +集群的分类:cluster + 高可用集群 HA high availability + +​ 避免单节点故障 +​ 软件:keepalived + +​ 负载均衡集群 **LB** **load balance** +​ 提高负载,提高并发量 +​ 软件:nginx反向代理(7层) lvs(4层) haproxy(7层) +​ 硬件:硬件负载均衡器 F5(BigIP)和redware +​ + +​ HPC高性能运算集群 + +​ 分布式存储集群 +​ 极大的提升存储容量,提供数据高可用,保证数据安全 +​ 软件:ceph glusterfs hdfs + +​ 存储分类:NAS SAN DAS + +Nginx proxy 是 Nginx 的王牌功能,利用 proxy 基本可以实现一个完整的 7 层负载均衡。 + +1. 功能强大,性能卓越,运行稳定。 + +2. 配置简单灵活。 + +3. 能够自动剔除工作不正常的后端服务器。 + +4. 上传文件使用异步模式。 + +5. 支持多种分配策略,可以分配权重,分配方式灵活。 + + + +lvs和nginx组合代理负载均衡 面试题(lvs和nginx的区别) + +nginx用来做http的反向代理,能够upsteam实现http请求的多种方式的均衡转发。由于采用的是**异步转发可以做到如果一个服务器请求失败,立即切换到其他服务器,直到请求成功或者最后一台服务器失败为止**。这可以最大程度的提高系统的请求成功率。 +lvs采用的是**同步请求转发**的策略。这里说一下同步转发和异步转发的区别。同步转发是在lvs服务器接收到请求之后,立即redirect到一个后端服务器,由客户端直接和后端服务器建立连接。**异步转发**是nginx在保持客户端连接的同时,发起一个相同内容的新请求到后端,等后端返回结果后,由nginx返回给客户端。 +进一步来说:当做为负载均衡服务器的nginx和lvs处理相同的请求时,所有的请求和响应流量都会经过nginx;但是使用lvs时,仅请求流量经过lvs的网络,响应流量由后端服务器的网络返回。 +也就是,当作为后端的服务器规模庞大时,nginx的网络带宽就成了一个巨大的瓶颈。 +但是仅仅使用lvs作为负载均衡的话,一旦后端接受到请求的服务器出了问题,那么这次请求就失败了。但是如果在lvs的后端在添加一层nginx(多个),每个nginx后端再有几台应用服务器,那么结合两者的优势,既能避免单nginx的流量集中瓶颈,又能避免单lvs时一锤子买卖的问题。 + +lvs/dr 同步传输 +nginx 异步传输 + +![image-20220629162706237](assets/image-20220629162706237.png) + +**拓扑** + +[![file://C:/Users/86186/AppData/Local/Temp/.LRX4N1/1.png](file://C:/Users/86186/AppData/Local/Temp/.LRX4N1/1.png)]() + +**环境** + +1. 修改主机名称 + +2. 名称解析 + +3. ip互通 所有机器全部在同一个网段 + +4. 关闭防火墙和selinux + + 5 . HTML A & HTML B + +```bash +[root@localhost ~]# yum install httpd -y +分别创建测试页面 index.html 开启服务 +``` + +6. PHP A & PHP B + + ```bash + [root@localhost ~]# yum install httpd php -y + 分别创建测试页面 index.php 开启服务 + + ``` + +7. 测试4台真实服务器的页面是否能正常访问 + +8. 安装配置负载均衡器上的Nginx(负载均衡器、分发器、反向代理) + + ```bash + # yum install nginx -y + # vim /etc/nginx/nginx.conf + location / { + root /usr/share/nginx/html; + index index.html index.htm; + if ($request_uri ~* \.html$) { + proxy_pass http://htmlserver; + } + + if ($request_uri ~* \.php$) { + proxy_pass http://phpserver; + } + } + + # vim /etc/nginx/conf.d/test.conf + upstream htmlserver { + server 192.168.122.10; + server 192.168.122.20; + } + upstream phpserver { + server 192.168.122.30; + server 192.168.122.40; + } + + # systemctl restart nginx + ``` + + 在客户端访问 Nginx 测试 + + ```bash + # elinks --dump http:// 192.168.122.254 + # elinks --dump http:// 192.168.122.254/index.html + # elinks --dump http:// 192.168.122.254/index.php + ``` + + + **upstream支持的负载均衡算法**(面试题) + **轮询(默认)**: 可以通过weight指定轮询的权重,权重越大,被调度的次数越多 **rr round robin** + 权重:用数字 谁数字大谁权重就高 按比例 1 3 + rr + wrr + **ip_hash**: 根据每个请求IP进行调度,可以解决session的问题,不能使用weight + client_ip 192.168.1.8 nginx反向 webserver1 + fair: 可以根据请求页面的大小和加载时间长短进行调度,使用第三方的upstream_fair模块 + url_hash: 按请求的url的hash进行调度,从而使每个url定向到同一服务器,使用第三方的hash模块 + +**upstream支持的状态参数** + +``` +down: 暂停对该服务器的调度 +backup: 类似于LVS Sorry Server,当所有的非backup的服务器故障 +max_fails: 请求失败的次数,默认为1 +fail_timeout: 在经历max_fails次失败后,暂停服务的时间 +``` + +upstream htmlservers { + +```bash +# ip_hash; +server 192.168.10.137 weight=1 max_fails=2 fail_timeout=2; +server 192.168.10.20 weight=2 max_fails=2 fail_timeout=2; +server 192.168.10.251 max_fails=2 fail_timeout=5 **down**; +server 192.168.10.253 backup; +} +``` + +注:当使用ip_hash时,服务器状态不可使用weight和backup + +**Nginx实现七层的负载均衡** + +调度到同一组上游服务器 + +**拓扑结构** + +​ [**LB Nginx**] +​ 192.168.1.2 + +​ [**httpd**] [**httpd**] [**httpd**] +​ 192.168.1.3 192.168.1.4 192.168.1.5 + +**实施过程** +\1. nginx +http { + **upstream httpservers { + server 192.168.1.3**:80 weight=1 max_fails=2 fail_timeout=2; + **server 192.168.1.4**:80 weight=2 max_fails=2 fail_timeout=2; + server 192.168.1.5:80 weight=2 max_fails=2 fail_timeout=2; + server 192.168.1.100:80 backup; + **}** + +​ **location / { +​ proxy_pass** http://httpservers; +​ proxy_next_upstream error timeout invalid_header http_500 http_502 http_503 http_504; +​ **}** + } + +proxy_next_upstream:这个指令属于 http_proxy 模块的,指定后端返回什么样的异常响应时,使用另一个realserver + +\2. Apache LogFormat 可选 +LogFormat "%{X-Real-IP}i %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined +LogFormat "%h %l %u %t \"%r\" %>s %b" common +LogFormat "%{Referer}i -> %U" referer +LogFormat "%{User-agent}i" agent + +================================================================================= +**Nginx实现七层的负载均衡** + +调度到不同组上游服务器 +\1. 动静分离 +\2. 网站进行分区 +================================================================================= + +**拓扑结构** + +​ [**vip: 192.168.1.80**] + +​ [**LB1 Nginx**] [**LB2 Nginx**] +​ 192.168.1.2 192.168.1.3 + +​ [**news**] [**milis**] [**videos**] [**images**] [**others**] +​ 1.11 1.21 1.31 1.41 1.51 +​ 1.12 1.22 1.32 1.42 1.52 +​ 1.13 1.23 1.33 1.43 1.53 +​ ... ... ... ... ... + +**一、实施过程** +\1. 根据站点分区进行调度 +http { + upstream news { + server 192.168.1.11:80 weight=1 max_fails=2 fail_timeout=2; + server 192.168.1.12:80 weight=2 max_fails=2 fail_timeout=2; + server 192.168.1.13:80 weight=2 max_fails=2 fail_timeout=2; + } + upstream milis { + server 192.168.1.21:80 weight=1 max_fails=2 fail_timeout=2; + server 192.168.1.22:80 weight=2 max_fails=2 fail_timeout=2; + server 192.168.1.23:80 weight=2 max_fails=2 fail_timeout=2; + } + +​ upstream videos { +​ server 192.168.1.31:80 weight=1 max_fails=2 fail_timeout=2; +​ server 192.168.1.32:80 weight=2 max_fails=2 fail_timeout=2; +​ server 192.168.1.33:80 weight=2 max_fails=2 fail_timeout=2; +​ } + +​ upstream images { +​ server 192.168.1.41:80 weight=1 max_fails=2 fail_timeout=2; +​ server 192.168.1.42:80 weight=2 max_fails=2 fail_timeout=2; +​ server 192.168.1.43:80 weight=2 max_fails=2 fail_timeout=2; +​ } + +​ upstream others { +​ server 192.168.1.51:80 weight=1 max_fails=2 fail_timeout=2; +​ server 192.168.1.52:80 weight=2 max_fails=2 fail_timeout=2; +​ server 192.168.1.53:80 weight=2 max_fails=2 fail_timeout=2; +​ } +​ server { +​ location / { +​ proxy_pass http://others; +​ } +​ +​ location /news { +​ proxy_pass http://news; +​ } +​ +​ location /mili { +​ proxy_pass http://milis; +​ } +​ +​ location ~* \.(wmv|mp4|rmvb)$ { +​ proxy_pass http://videos; +​ } +​ +​ location ~* \.(png|gif|jpg)$ { +​ proxy_pass http://images; +​ } +} + +\2. 根据动静分离进行调度 +http { + upstream htmlservers { + server 192.168.1.3:80 weight=1 max_fails=2 fail_timeout=2; + server 192.168.1.4:80 weight=2 max_fails=2 fail_timeout=2; + } + + upstream phpservers { + server 192.168.1.3:80 weight=1 max_fails=2 fail_timeout=2; + server 192.168.1.4:80 weight=2 max_fails=2 fail_timeout=2; + } + + server { + location ~* \.html$ { + proxy_pass http://htmlservers; + } + + location ~* \.php$ { + proxy_pass http://phpservers; + } + } + } + +二、Keepalived实现调度器HA +注:主/备调度器均能够实现正常调度 +\1. 主/备调度器安装软件 +[root@master ~]# yum -y install ipvsadm keepalived +[root@backup ~]# yum -y install ipvsadm keepalived + +\2. Keepalived +**Master** +\# vim /etc/keepalived/keepalived.conf +! Configuration File for keepalived + +global_defs { + router_id director1 //辅助改为director2 +} + +vrrp_instance VI_1 { + state BACKUP + nopreempt + interface eth0 //心跳接口,尽量单独连接心跳 + virtual_router_id 80 //MASTER,BACKUP一致 + priority 100 //辅助改为50 + advert_int 1 + authentication { + auth_type PASS + auth_pass 1111 + } + virtual_ipaddress { + 192.168.1.80 + } +} + +**BACKUP** +\3. 启动KeepAlived(主备均启动) +\# chkconfig keepalived on +\# service keepalived start +\# ip addr + +\4. 扩展对调度器Nginx健康检查(可选) +思路: +让Keepalived以一定时间间隔执行一个外部脚本,脚本的功能是当Nginx失败,则关闭本机的Keepalived +a. script +[root@master ~]# cat /etc/keepalived/check_nginx_status.sh +\#!/bin/bash +/usr/bin/curl -I http://localhost &>/dev/null +if [ $? -ne 0 ];then + /etc/init.d/keepalived stop +fi +[root@master ~]# chmod a+x /etc/keepalived/check_nginx_status.sh + +b. keepalived使用script +! Configuration File for keepalived + +global_defs { + router_id director1 +} + +vrrp_script check_nginx { + script "/etc/keepalived/check_nginx_status.sh" + interval 5 +} + +vrrp_instance VI_1 { + state BACKUP + interface eth0 + nopreempt + virtual_router_id 90 + priority 100 + advert_int 1 + authentication { + auth_type PASS + auth_pass tianyun + } + virtual_ipaddress { + 192.168.1.80 + } + +​ track_script { +​ check_nginx +​ } +} + +\-------------------- +proxy_pass + 后端服务器用的非php独立进程 + apache+php模块 +fastcgi_pass + 后端服务器用的是php-fpm + php-fpm(fastcgi形式的php) + +后端服务器部署详细过程: +安装软件: + \# yum install nginx php php-fpm -y + \# vim /etc/nginx/nginx.conf //添加php配置 + 在server里面添加如下配置: + location ~ \.php$ { + root html; + fastcgi_pass 127.0.0.1:9000; + fastcgi_index index.php; + fastcgi_param SCRIPT_FILENAME **$document_root**$fastcgi_script_name; + include fastcgi_params; + } + + 修改php-fpm进程账户并开启php-fpm的进程: 端口是9000 + \#vim /etc/php-fpm.d/www.conf //修改如下参数,默认值是apache + user = nginx + group = nginx + + 为什么设置成nginx: + 因为nginx.conf配置的账户为nginx + + \# systemctl start php-fpm + + +前端nginx反向代理服务器: + upstream web { + server 10.0.0.21; + server 10.0.0.22; + } + upstream phpserver { + server 10.0.0.23; + server 10.0.0.24; + } #上面的配置写到http里面server外面 + server { + listen 80; + server_name www.baidu.com; + location / { #html的配置 + proxy_pass http://web; + } + +​ location ~* \.php$ { #php的配置 +​ proxy_pass http://phpserver; +​ } \ No newline at end of file