1.扩展多个WEB节点

1.1 扩展节点概述

原因:单台web服务器能抗住的访问是有限的
配置多台web服务器能提升更高的访问速度,能够接收更多的用户请求。

  • 提高冗余
  • 提高性能 | 节点 | ip | | —- | —- | | web01 | 10.0.0.7    172.16.1.7 | | web02 (复制一份172.16.1.7的数据即可) | 10.0.0.8   172.16.1.8 | | db01 | 10.0.0.51   172.16.1.51 |

1.2 扩展节点具体操作

  1. 方法一(手动-熟练搭建流程):
  2. 1.准备新的机器,IP地址,关闭防火墙
  3. 2. 安装Nginxphp环境
  4. 3. 拷贝配置文件(Nginx php
  5. 4. 拉取代码
  6. 方法二(自动化工具):
  7. 1.Cobber 自动化安装系统(固定对应的IP地址) Python java 脚本实现
  8. 2.Ansible 自动化配置工具来实现 (自动化准备 应用环境, 配置文件管理)
  9. 3.Gitlab jenkins 代码存储的仓库, jenkins拉取代码仓库,推送到对应的目录


1.2.1 准备web02服务器
1.2.2 安装Nginx+PHP环境**
web01执行的操作

scp /etc/yum.repos.d/nginx.reporoot@172.16.1.8:/etc/yum.repos.d/nginx.repo scp php.zip root@172.16.1.8:~

web02执行的操作:

[root@web02 ~]# unzip php.zip      #解压web01推送过来的压缩包 [root@web02 ~]# yum localinstall php/*.rpm           #通过本地方式安装所有的rpm [root@web02 ~]# yum install  nginx -y

1.2.3 推送web01上的nginx配置、php配置、至web02

[root@web01 ~]# scp -rp /etc/nginx root@172.16.1.8:/etc/ [root@web01 ~]# scp -rp /etc/php-fpm.d/www.conf root@172.16.1.8:/etc/php-fpm.d/www.conf [root@web01 ~]# scp -rp /etc/php.ini root@172.16.1.8:/etc/php.ini

1.2.4 将web01上的代码推送一份至web02

[root@web01 ~]# scp -rp /code root@172.16.1.8:/

1.2.5 启动服务nginx php

[root@web02 ~]# groupadd -g 666 www [root@web02 ~]# useradd -u 666 -g 666 www [root@web02 ~]# systemctl restart nginx php-fpm [root@web02 ~]# systemctl enable nginx php-fpm [root@web02 ~]# chown -R www.www /code/

因为推送过来的代码权限发生了变化,所以需要做一次修改

2. 多节点问题一:存储问题

2.1 多节点静态资源如何统一

user —> web02 user —> web01 引入NFS共享存储——> 1.静态资源的一致。 2.节省web节点空间。 3.能够解决容量不足。

2.2 FNS静态资源共享的缺陷

容量,性能 —-> 集群扩充,CDN加速

除了NFS,也可以是其他的存储,比如:glusterfs、fastdfs、云厂商的OSS 容量是有限的。 有多台服务器组成的一个集群。 ( 4台组成集群。 400TB ) 图片、视频、附件、文档、pdf (不可变的内容,称之为静态资源 )

image.png

2.3 NFS静态资源共享方案实现

2.1安装一台NFS服务器,配置并共享一个目录

思路:任何一个服务,都是 安装 配置 启动。

  • 安装,配置 NFS

    1. [root@nfs ~]# yum install nfs-utils -y
    2. [root@nfs ~]# cat /etc/exports
    3. /data/blog 172.16.1.0/24(rw,sync,all_squash,anonuid=666,anongid=666)
  • 初始化环境

    1. [root@nfs ~]# groupadd -g 666 www
    2. [root@nfs ~]# useradd -u666 -g666 www
    3. [root@nfs ~]# rm -rf /data/ && mkdir /data/blog -p
    4. [root@nfs ~]# chown -R www.www /data/blog/
  • 重启

    1. [root@nfs ~]# systemctl restart nfs
    2. [root@nfs ~]# systemctl enable nfs

2.2 找到网站静态资源存放的路径,进行NFS的共享。

浏览器开发者模式:   地址:http://blog.oldxu.com/wp-content/uploads/2020/04/timg.jpeg   路径:/code/wordpress/wp-content/uploads/2020/04/timg.jpeg —>需要共享的目录:/code/wordpress/wp-content/uploads/

2.3 web节点挂载NFS共享目录:

[root@web02 ~]# mount -t nfs 172.16.1.31:/data/blog /code/wordpress/wp-content/uploads/
[root@web01 ~]# mount -t nfs 172.16.1.31:/data/blog /code/wordpress/wp-content/uploads/

wecenter: mount -t nfs 172.16.1.31:/data/zh /code/zh/uploads/article/

2.3 测试,web02上传。web01查看,如果没有问题,说明共享存储对接完成。


3. 多节点问题二:访问问题

3.1 解决—>DNS轮询

(需要依赖web节点是公网IP)

  1. 配置DNS A记录
  2.   blog.oldxu.com
  3.   10.0.0.7
  4.   10.0.0.8
  5.   10.0.0.9

1.需要所有的web节点具备公网IP地址 2.公网独立IP需要费用,而且不便宜。 3.所有的web节点有公网IP,不安全。 4.DNS轮询机制,没有健康检查功能。( 体验差 )

3.2 解决—>负载均衡

(仅需要一台服务器对外, 所有的后端节点走内网)

  1. 1. 所有的web节点不在需要有公网IP
  2.   1.1 节省成本
  3.   1.2 保证安全
  4. 2. 能够对后端的web节点进行健康检查机制
  5. 3. 负载均衡有对应的调度算法
  6.   轮询
  7.   加权轮询
  8.   最少连接数调度算法

想要实现负载均衡,必须先去了解 Nginx代理?

4. Ngxin代理服务基本概述

4.1 Nginx代理服务的常见模式

一正向代理:
        1. 客户端科学上网
        2. 客户端提速
        3. 客户端缓存
        4. 客户端授权
二:反向代理:
        1. 路由功能
        2  负载负载 
        3. 动静分离
        4. 数据缓存

Nginx代理缓存

4.2 正向代理与反向代理区别

区别在于形式上服务的”对象”不一样
正向代理代理的对象是客户端,为客户端服务 (常用与为客户端提供科学写上网的方式)
反向代理代理的对象是服务端,为服务端服务 (用用于企业集群架构, 后端有多个web节点组成的集群,然后 接入代理,由代理统一调度)
image.png

4.3 Nginx反向代理常用的协议:

image.png


5. Nginx反向代理场景实践

image.png

5.1 Nginx反向代理,对应模块

反向代理模式 Nginx反向代理模块 语言
http、websocket、 https ngx_http_proxy_module java / http / https / websocket /go
fastcgi ngx_http_fastcgi_module php
uwsgi ngx_http_uwsgi_module python
grpc ngx_http_v2_module go

ip地址规划:

访问ip 反向代理服务ip 后端节点
10.0.0.1 10.0.0.5 / 172.16.1.5 we02 172.16.1.7

为方便抓包分析可以统一使用 10.0.0.0/24网段来配置代理

  • 配置后端的web节点,域名是 web.oldxu.com 端口是8080
    [root@web01 ~]# cat /etc/nginx/conf.d/web.oldxu.com.conf

    server {
      listen 8080;
      server_name web.oldxu.com;
      root /web;
    
      location / {
          index index.html;
      }
    }
    

    [root@web01 ~]# systemctl reload nginx

  • 配置Nginx反向代理,代理后端的web节点

    [root@lb01 ~]# gzip /etc/nginx/conf.d/default.conf
    [root@lb01 ~]# cat /etc/nginx/conf.d/proxy_web.oldxu.com.conf
    server {
      listen 80;
      #server_name web.oldxu.com;
    
      location / {
          proxy_pass http://10.0.0.7:8080;  #为抓包用外网网卡
      }
    }
    

    [root@lb01 ~]# systemctl start nginx
    [root@lb01 ~]# systemctl enable nginx

1.修改后端的web_Server为80端口
2.修改代理服务器,代理的后端为80端口
 返回 的结果应该是 web….. 返回的结果没有 达到预期?

原因是:proxy_pass 后面跟的是 IP地址:端口,后端只知道你要请求80端口 ,但并不知道你要请求的是哪个域名?(加上如下配置可解决问题)

*5.1 proxy_set_Header Host $http_host;

告诉后端服务器,我要请求你的80端口,同时请求的是哪个域名。 用户请求 代理 使用的是 http1.1协议,而代理请求后端服务使用的是 http1.0协议。 proxy_http_version 1.1; 配置这条即可实现代理与后端走http1.1长连接协议。

*5.3 proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

把客户端的真实IP告诉后端的web节点

proxy代理服务:

  • 后端web节点:

[root@web01 ~]# cat /etc/nginx/conf.d/web.oldxu.com.conf

server {
    listen 80;
    server_name web.oldxu.com;
    root /web;

    location / {
        index index.html;
    }
}
  • 代理服务器:

[root@lb01 ~]# gzip /etc/nginx/conf.d/default.conf
[root@lb01 ~]# cat /etc/nginx/conf.d/proxy_web.oldxu.com.conf

server {
    listen 80;
    server_name web.oldxu.com;

    location / {
        proxy_pass http://10.0.0.7:80;
        proxy_set_header Host $http_host;        #将用户请求的域名信息赋值给Host 请求头信息。
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;  #把客户端的真实IP告诉后端的web节点
        proxy_http_version 1.1;
    }
}
  • 抓包分析:

image.png

6. Nginx代理相关参数


[root@lb01 ~]# cat /etc/nginx/conf.d/proxy_web.oldxu.com.conf

server {
    listen 80;
    server_name web.oldxu.com;

    location / {
        proxy_pass http://172.16.1.7:80;
        proxy_http_version 1.1;

    proxy_set_header Host $http_host;                              # 携带头部信息
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;   # 把客户端的真实IP告诉后端的web节点

    proxy_connect_timeout  60s;     # nginx连接后端的超时时间  TCP
    proxy_read_timeout 60s;         # 响应头部超时时间
    proxy_send_timeout 60s;         # 响应数据主体的超时时间
    proxy_buffering on;                  # 开启缓冲区
    proxy_buffer_size 8k;        # 缓冲区Header大小
    proxy_buffers 4 64k;        # 缓冲区数量 * 大小 = 最大接收
    }
}

Nginx的代理接收的用户连接是有限? 65535 最多能使用的端口数。 5w可以使用。最多代理能支撑5w的连接。 负载均衡 其实 都是 七层应用层 的。

42.Nginx多节点与代理 - 图6

1.Ps: **尽量不要用配置临时目录(proxy_temp_path模块) 影响性能。 2.如何查看页面大小:** image.png

Nginx的代理有问题? 仅能代理一台后端webserver?多台webserver组成的集群怎么办?

Nginx反向代理衍生的另一个功能? Nginx负载均衡

6.1 Nginx代理优化

(统一放入proxy_params中)
[root@lb01 ~]# cat /etc/nginx/proxy_params

proxy_set_header Host $http_host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

proxy_http_version 1.1;
proxy_connect_timeout  60s;     # nginx连接后端的超时时间  TCP
proxy_read_timeout 60s;         # 响应头部超时时间
proxy_send_timeout 60s;         # 响应数据主体的超时时间
proxy_buffering on;                  # 开启缓冲区
proxy_buffer_size 8k;        # 缓冲区Header大小
proxy_buffers 4 64k;        # 缓冲区数量 * 大小 = 最大接收

Nginx代理最终配置 —-> include proxy_params;
[root@lb01 ~]# cat /etc/nginx/conf.d/proxy_web.oldxu.com.conf

server {
    listen 80;
    server_name web.oldxu.com;

    location / {
        proxy_pass http://172.16.1.7:80;
        include proxy_params;
    }
}