Nginx 实现负载均衡
2021-12-31 本文已影响0人
小屁孩云熙
1. 负载均衡概念说明
1.1 什么是负载均衡
- 实现用户访问请求进行调度分配
- 实现用户访问压力分担
1.2 什么是反向代理
1.2.1 反向代理
外网(用户) ===> (外网网卡)代理服务器(内网网卡)===> 公司网站服务器Web(内网)
1.2.2 正向代理(翻墙)
内网(局域网主机) ===> (内网网卡)代理服务器(外网网卡) ===> 互联网 Web服务器
1.3 集群
1.3.1 什么是集群
完成相同任务或工作的一组服务器
1.3.2 特点
- 高性能
- 价格有效性
- 可伸缩性
- 高可用性
- 透明性
2. 负载均衡环境搭建
2.1 集群服务器部署
集群中每台服务器的配置 一模一样
- 企业中,先部署好一台 LNMP 服务器,上传代码信息
- 进行访问测试
- 批量部署多台 Web 服务器
- 将 Nginx 配置文件批量分发
- 将站点目录分发给所有主机
2.2 负载均衡服务器部署
2.2.1 安装 Nginx 软件
2.2.2 编写 Nginx 负载服务配置文件
- Nginx 模块
# 模块01
ngx_http_upstream_module
指令: upstream -- 负载均衡
# 模块02
ngx_http_proxy_module
指令: proxy_pass -- 反向代理
- 编写配置文件 (lb.conf)
# 定义可将请求分配给哪些服务器 (upstream 配置在 http 区域)
upstream yunxuanedu {
server 10.1.1.7:80;
server 10.1.1.8:80;
server 10.1.1.9:80;
}
# 将请求分配给指定的集群
server {
listen 80;
server_name www.yunxuanedu.com;
location / {
proxy_pass http://yunxuanedu;
}
}
2.2.3 实现负载功能测试
2.2.4 抓包
image-20211230162632129.png3. 负载均衡访问网站异常排错思路
- 在负载均衡服务器上,测试 Web 节点服务器访问是否正常
# 在命令行 指定 映射关系测试
[root@lb01 ~]# curl -H host:www.yunxuanedu.com 10.1.1.7/test001.html
www 172.16.1.7
[root@lb01 ~]# curl -H host:www.yunxuanedu.com 10.1.1.8/test001.html
www 172.16.1.8
[root@lb01 ~]# curl -H host:www.yunxuanedu.com 10.1.1.9/test001.html
www 172.16.1.9
-
在负载均衡服务器上,利用 curl 访问负载均衡服务器 是否正常
-
在本地测试 访问 负载均衡服务器是否正常
4. 负载均衡配置模块详细说明
4.1 ngx_http_upstream_module (upstream)
4.1.1 实现不同调度功能
- 轮询分配请求(平均)
- 权重分配请求(能力越强责任越重)
upstream yunxuanedu {
server 10.1.1.7:80 weight=3;
server 10.1.1.8:80 weight=2;
server 10.1.1.9:80 weight=1;
}
- 实现热备功能
# 9为热备,所有请求分发给7和8,只有7和8均无法提供服务,才使用9
upstream yunxuanedu {
server 10.1.1.7:80;
server 10.1.1.8:80;
server 10.1.1.9:80 backup;
}
- 定义最大失败次数(健康检查参数)
# 默认次数为 1
upstream yunxuanedu {
server 10.1.1.7:80 max_fails=5;
server 10.1.1.8:80;
server 10.1.1.9:80;
}
- 定义失败之后重发的间隔时间(健康检查参数)
upstream yunxuanedu {
server 10.1.1.7:80 fail_timeout=10s;
server 10.1.1.8:80;
server 10.1.1.9:80;
}
4.1.2 实现不同调度算法
-
rr 轮询调度算法
-
wrr 权重调度算法
-
ip_hash 算法(可避免 cookie 分发问题,导致闪退)
ip_hash 会出现负载不均衡问题
cookie 不一致,闪退。此外还可以使用缓存服务器保存 会话记录,使用 memcache
upstream yunxuanedu {
ip_hash;
server 10.1.1.7:80;
server 10.1.1.8:80;
server 10.1.1.9:80;
}
-
least_conn (最小连接数)
那台服务器 连接数较少,分配给谁
4.2 ngx_http_proxy_module (proxy_pass)
4.2.1 访问不同的网站地址,不能显示不同的网站页面(有旁站)
- 问题现状
[root@lb01 conf.d]# curl -H host:www.yunxuanedu.com 10.1.1.7/test001.html
www 172.16.1.7
[root@lb01 conf.d]# curl -H host:www.yunxuanedu.com 10.1.1.8/test001.html
www 172.16.1.8
[root@lb01 conf.d]# curl -H host:www.yunxuanedu.com 10.1.1.9/test001.html
www 172.16.1.9
[root@lb01 conf.d]# curl -H host:www.yunxuanedu.com 10.1.1.5/test001.html
bbs 172.16.1.7
[root@lb01 conf.d]# curl -H host:www.yunxuanedu.com 10.1.1.5/test001.html
bbs 172.16.1.8
[root@lb01 conf.d]# curl -H host:www.yunxuanedu.com 10.1.1.5/test001.html
bbs 172.16.1.9
- 解决方法
location / {
proxy_pass http://yunxuanedu;
proxy_set_header Host $host;
}
4.2.2 访问网站用户地址信息无法进行分析统计
- 问题如下,日志记录全部为负载服务器地址
[root@web01 ~]# tail /var/log/nginx/access.log
……
10.1.1.5 - - [30/Dec/2021:16:20:22 +0800] "GET /test001.html HTTP/1.0" 200 15 "-" "curl/7.29.0" "-"
10.1.1.5 - - [30/Dec/2021:16:20:25 +0800] "GET /test001.html HTTP/1.0" 200 15 "-" "curl/7.29.0" "-"
10.1.1.5 - - [30/Dec/2021:16:25:28 +0800] "GET / HTTP/1.0" 200 28 "-" "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.89 Safari/537.36 SLBrowser/7.0.0.6241 SLBChan/27" "-"
10.1.1.5 - - [30/Dec/2021:16:36:53 +0800] "GET /test001.html HTTP/1.1" 200 15 "-" "curl/7.29.0" "-"
- 解决
location / {
proxy_pass http://yunxuanedu;
proxy_set_header X-Forwarded-For $remote_addr;
}
4.2.3 访问负载均衡,出现错误页面,影响用户体验
location / {
proxy_pass http://yunxuanedu;
proxy_next_upstream error timeout http_404 http_502 http_403;
}
4.3 lb.conf 文件内容
[root@lb01 conf.d]# cat lb.conf
upstream yunxuanedu {
server 10.1.1.7:80;
server 10.1.1.8:80;
server 10.1.1.9:80;
}
server {
listen 80;
server_name www.yunxuanedu.com;
location / {
proxy_pass http://yunxuanedu;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $remote_addr;
proxy_next_upstream error timeout http_404 http_502 http_403;
}
}
server {
listen 80;
server_name bbs.yunxuanedu.com;
location / {
proxy_pass http://yunxuanedu;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $remote_addr;
proxy_next_upstream error timeout http_404 http_502 http_403;
}
}
server {
listen 80;
server_name blog.yunxuanedu.com;
location / {
proxy_pass http://yunxuanedu;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $remote_addr;
proxy_next_upstream error timeout http_404 http_502 http_403;
}
}
5. 负载均衡企业实践应用
5.1 根据用户访问的uri信息进行负载均衡 (动静分离)
5.1.1 环境规划
用户请求(URI) | 处理请求服务器 | 站点目录 | 功能 |
---|---|---|---|
/upload | 10.1.1.8:80 | /html/www/upload | upload 服务器集群 |
/static | 10.1.1.7:80 | /html/www/static | static 静态服务器 集群 |
/ | 10.1.1.9:80 | /html/www | 默认 |
- 访问 URL 信息
www.yunxuanedu.com/test.html
www.yunxuanedu.com/upload/test.html
www.yunxuanedu.com/static/test.html
5.1.2 环境部署
- 10.1.1.7
[root@web01 conf.d]# cat www.conf
server {
listen 80;
server_name www.yunxuanedu.com yx.com;
location / {
root /html/www;
index test.html;
}
}
[root@web01 ~]# systemctl reload nginx
[root@web01 ~]# cd /html/www/
[root@web01 www]# mkdir static
[root@web01 www]# cd static/
[root@web01 static]# echo "static-RAC-10.1.1.7" > test.html
[root@web01 static]# cat test.html
static-RAC-10.1.1.7
- 10.1.1.8
[root@web02 conf.d]# cat www.conf
server {
listen 80;
server_name www.yunxuanedu.com yx.com;
location / {
root /html/www;
index test.html;
}
}
[root@web02 ~]# systemctl reload nginx
[root@web02 ~]# cd /html/www
[root@web02 www]# mkdir upload
[root@web02 www]# cd upload/
[root@web02 upload]# echo "upload-RAC-10.1.1.8" > test.html
[root@web02 upload]# cat test.html
upload-RAC-10.1.1.8
- 10.1.1.9
[root@web03 conf.d]# cat www.conf
server {
listen 80;
server_name www.yunxuanedu.com yx.com;
location / {
root /html/www;
index test.html;
}
}
[root@web03 ~]# systemctl reload nginx
[root@web03 ~]# cd /html/www/
[root@web03 www]# echo "default-RAC-10.1.1.9" > test.html
[root@web03 www]# cat test.html
default-RAC-10.1.1.9
- 10.1.1.5 (负载均衡服务器)
[root@lb01 ~]# cd /etc/nginx/conf.d/
[root@lb01 conf.d]# ll
total 8
-rw-r--r-- 1 root root 1072 Nov 16 23:02 default.conf
-rw-r--r-- 1 root root 746 Dec 30 18:52 lb.conf
[root@lb01 conf.d]# cp lb.conf{,.bak01}
[root@lb01 conf.d]# vim lb.conf
[root@lb01 conf.d]# nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
[root@lb01 conf.d]# cat lb.conf
upstream default {
server 10.1.1.9:80;
}
upstream static {
server 10.1.1.7:80;
}
upstream upload {
server 10.1.1.8:80;
}
server {
listen 80;
server_name www.yunxuanedu.com;
location / {
proxy_pass http://default;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $remote_addr;
}
location /upload {
proxy_pass http://upload;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $remote_addr;
}
location /static {
proxy_pass http://static;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $remote_addr;
}
}
[root@lb01 conf.d]# systemctl reload nginx
5.1.3 访问测试
5.1.4 总结 - 实现网站集群动静分离
- 提高网站服务的安全性
- 简化运维管理操作
- 可以划分不同人员管理不同的集群服务器
5.2 根据用户访问的终端信息进行负载均衡
5.2.1 环境规划
用户请求 | 处理请求服务器 | 站点目录 | 功能 |
---|---|---|---|
iphone | 10.1.1.7:80 | /html/www | 移动端 集群 |
google 浏览器 | 10.1.1.8:80 | /html/www | google 端访问集群 |
其他浏览器 | 10.1.1.9:80 | /html/www | default 集群 |
5.2.2 环境部署
- 10.1.1.7
[root@web01 ~]# echo "Mobile-RAC-10.1.1.7" > /html/www/test.html
[root@web01 ~]# cat /html/www/test.html
Mobile-RAC-10.1.1.7
- 10.1.1.8
[root@web02 ~]# echo "Google-RAC-10.1.1.8" > /html/www/test.html
[root@web02 ~]# cat /html/www/test.html
Google-RAC-10.1.1.8
- 10.1.1.9
[root@web03 ~]# echo "Default-RAC-10.1.1.9" > /html/www/test.html
[root@web03 ~]# cat /html/www/test.html
Default-RAC-10.1.1.9
- 10.1.1.5 (负载均衡服务器)
[root@lb01 conf.d]# vim lb.conf
[root@lb01 conf.d]# nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
[root@lb01 conf.d]# systemctl reload nginx
[root@lb01 conf.d]# cat lb.conf
upstream mobile {
server 10.1.1.7:80;
}
upstream google {
server 10.1.1.8:80;
}
upstream default {
server 10.1.1.9:80;
}
server {
listen 80;
server_name www.yunxuanedu.com;
location / {
if ($http_user_agent ~* iphone) {
proxy_pass http://mobile;
}
if ($http_user_agent ~* Chrome) {
proxy_pass http://google;
}
proxy_pass http://default;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $remote_addr;
}
}