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.准备新的机器,IP地址,关闭防火墙
2. 安装Nginx,php环境
3. 拷贝配置文件(Nginx php)
4. 拉取代码
方法二(自动化工具):
1.Cobber 自动化安装系统(固定对应的IP地址) Python java 脚本实现
2.Ansible 自动化配置工具来实现 (自动化准备 应用环境, 配置文件管理)
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 (不可变的内容,称之为静态资源 )
2.3 NFS静态资源共享方案实现
2.1安装一台NFS服务器,配置并共享一个目录。
思路:任何一个服务,都是 安装 配置 启动。
安装,配置 NFS
[root@nfs ~]# yum install nfs-utils -y
[root@nfs ~]# cat /etc/exports
/data/blog 172.16.1.0/24(rw,sync,all_squash,anonuid=666,anongid=666)
初始化环境
[root@nfs ~]# groupadd -g 666 www
[root@nfs ~]# useradd -u666 -g666 www
[root@nfs ~]# rm -rf /data/ && mkdir /data/blog -p
[root@nfs ~]# chown -R www.www /data/blog/
重启
[root@nfs ~]# systemctl restart nfs
[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)
配置DNS的 A记录
blog.oldxu.com
10.0.0.7
10.0.0.8
10.0.0.9
1.需要所有的web节点具备公网IP地址 2.公网独立IP需要费用,而且不便宜。 3.所有的web节点有公网IP,不安全。 4.DNS轮询机制,没有健康检查功能。( 体验差 )
3.2 解决—>负载均衡
(仅需要一台服务器对外, 所有的后端节点走内网)
1. 所有的web节点不在需要有公网IP
1.1 节省成本
1.2 保证安全
2. 能够对后端的web节点进行健康检查机制
3. 负载均衡有对应的调度算法
轮询
加权轮询
最少连接数调度算法
想要实现负载均衡,必须先去了解 Nginx代理?
4. Ngxin代理服务基本概述
4.1 Nginx代理服务的常见模式
一正向代理:
1. 客户端科学上网
2. 客户端提速
3. 客户端缓存
4. 客户端授权
二:反向代理:
1. 路由功能
2 负载负载
3. 动静分离
4. 数据缓存
4.2 正向代理与反向代理区别
区别在于形式上服务的”对象”不一样
正向代理代理的对象是客户端,为客户端服务 (常用与为客户端提供科学写上网的方式)
反向代理代理的对象是服务端,为服务端服务 (用用于企业集群架构, 后端有多个web节点组成的集群,然后 接入代理,由代理统一调度)
4.3 Nginx反向代理常用的协议:
5. Nginx反向代理场景实践
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;
}
}
- 抓包分析:
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的连接。 负载均衡 其实 都是 七层应用层 的。
1.Ps: **尽量不要用配置临时目录(proxy_temp_path模块) 影响性能。 2.如何查看页面大小:**
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;
}
}