nginx配置静态-动态网站负载均衡-故障排错
nginx配置静态网站负载均衡
1.nginx配置静态网站负载均衡
#步骤
负载均衡(1台)
10.0.1.134
集群web(3台)
web1 10.0.1.146
web2 10.0.1.147
web3 10.0.1.144
mysql服务器
10.0.1.150
1.准备服务器 安装nginx
10.0.1.134
yum -y install pcre-devel openssl-devel zlib-devel gcc
groupadd nginx
useradd -g nginx -s /sbin/nologin nginx
切换到解压后的nginx目录中执行:
cd /usr/local/src
wget http://nginx.org/download/nginx-1.18.0.tar.gz
./configure --user=nginx --group=nginx --prefix=/usr/local/nginx --with-http_ssl_module --with-http_stub_status_module
make
make install
启动nginx:/usr/local/nginx/sbin/nginx
关闭nginx:/usr/local/nginx/sbin/nginx -s stop
检查nginx 是否异常:/usr/local/nginx/sbin/nginx -t
重启nginx: nginx -s reload
每次都需要输入路径才可以重启 检查等操作比较繁琐
用软连接定义
ln -s /usr/local/nginx/sbin/nginx /bin/nginx
这样就可以了
启动 : nginx
停止:nginx -t stop
重启 : nginx -s reload
检查: nginx -t
2.准备三台web服务器正常访问
web1 10.0.1.146
web2 10.0.1.147
web3 10.0.1.144
2.1 编辑配置文件
cd /usr/local/nginx/conf/
vi nginx.conf
server {
listen 80;
server_name localhost; 这个localhost就是域名,如果你不想用ip访问,这里可以更换一个域名吧,如www.it.com 如果你在设置域名的话,由于我们是在Windows下虚拟机环境测试,这里需要再Windows的etc/hosts/文件里做个域名解析,不然你设置的域名是打不开的
#charset koi8-r;
#access_log logs/host.access.log main;
location / {
root html; #这个位置就是发布目录,如果你要重新定义发布目录,在这里修改你创建的发布目录
index index.html index.htm;
}
修改配置
server {
listen 80;
server_name www.it.com;
#charset koi8-r;
#access_log logs/host.access.log main;
location / {
root /html/www;
index index.html index.htm;
}
mkdir /html/www -p
cd /html/www
echo web1 > index.html
以上过程重复在web2 web3执行 ,保证这三个web服务器都能够正常访问就可以了
echo web2 > index.html
echo web3 > index.html
2.2 域名解析配置
#tips:生产环境中一般都是在服务器上或者云服务器上做个域名解析就可以了,
不过在这里我们只能用Windows去模拟一下域名解析了
在这个目录下用notepad或者记事本打开
C:\Windows\System32\drivers\etc
在文档末尾位置,添加如下这行
10.0.1.146 www.it.com
10.0.1.147 www.1688.com
10.0.1.144 www.abc.com
#tips :域名这里是随便填的,在生产环境中,每个ip可能对应多个域名,也可能一个ip对应一个域名,不可能一个域名对应多个ip,域名唯一
#tips2:不需要启动php,防火墙也关闭
3.配置(nginx主站)负载均衡(10.0.1.134)
#tips:添加就是这两个模块
upstream 负载均衡模块
proxy_pass 反向代理模块
cd /usr/local/nginx/conf/vhost/
vim www.conf #注意这里要新建一个模块配置文件,如果你是多网站域名引用,注意要修改域名引用位置,在include这个位置去修改引用位置
upstream web {
server 10.0.1.146:80; #添加负载均衡的web,Nginx将根据负载均衡策略将请求分发给这三个后端服务器之一
server 10.0.1.147:80;
server 10.0.1.144:80;
}
server {
listen 80;
server_name 10.0.1.134 www.it.com;#这里是主站的ip ,有域名就要填一下域名,没有域名就填一下主站的ip,也就是本机ip
location / {
proxy_pass http://web; #Nginx将使用proxy_pass指令将请求代理至名为web的upstream模块所定义的后端服务器组
}
}
nginx -t
nginx -s reload
http://10.0.1.134/
#tips:此时页面是可以正常访问的,柘林如果不行,看一下是不是防火墙没有关闭
4.重启--测试
nginx -t
nginx -s reload
不断刷新这个网页,我们之前在三个web都分别写了一个静态网页内容的页面,此时你刷新页面,可以看到不同的内容,这里我们需要不同的测试页面,就是希望帮助你理解三个不同的负载均衡web服务。轮询
http://10.0.1.134/
总结:
1.主站创建上游服务组 成员包括web1 2 3
2.主站配置一个反向代理--实现--用户只要请求我,我就把请求以轮询的方式给下面后端服务器,以此来分担我的压力
搭建了一个简单的反向代理服务,用户访问 10.0.1.134 或 www.it.com 时,请求会被均衡地分发给 10.0.1.146:80、10.0.1.147:80 和 10.0.1.144:80 这三个后端服务器中的一个处理。通过这种方式,不仅可以隐藏后端服务器的细节,还可以实现负载均衡和灵活的请求转发。
效果图如下
原先web正常访问页面
https://images.cnblogs.com/cnblogs_com/blogs/816085/galleries/2387518/o_240326102753_web测试1.png
实现后的不断刷新访问的页面(轮询)
https://images.cnblogs.com/cnblogs_com/blogs/816085/galleries/2387518/t_240326102753_web测试2.png
https://images.cnblogs.com/cnblogs_com/blogs/816085/galleries/2387518/t_240326102753_web测试1.png
https://images.cnblogs.com/cnblogs_com/blogs/816085/galleries/2387518/t_240326102752_web测试3.png
2.nginx均衡3台动态网站(重点)
#步骤
动态网站类别
php
java
负载均衡(1台)
10.0.1.134
集群web(3台--有论坛)
web1 10.0.1.146
web2 10.0.1.147
web3 10.0.1.144
mysql服务器
10.0.1.150
一.准备三台web (状态:可以正常访问论坛)
web1 10.0.1.146
web2 10.0.1.147
web3 10.0.1.144
http://10.0.1.146/upload/ web1
http://10.0.1.147/upload/ web2
http://10.0.1.144/upload/ web3
启动nginx
nginx
启动php
/etc/init.d/php-fpm start
二.nginx配置
cd /usr/local/nginx/conf/vhost
vim www.conf
upstream web {
server 10.0.1.146:80 ;
server 10.0.1.147:80 ;
server 10.0.1.144:80 ;
}
server {
listen 80;
server_name 10.0.1.134 www.it.com;
location / {
proxy_pass http://web;
proxy_set_header Host $host;
}
}
nginx -t
nginx -s reload
测试
cd /usr/local/nginx/logs/
tail -100 access.log
#参数详解:
这段Nginx配置的主要目的是实现负载均衡和反向代理功能。下面逐个参数进行解释,并用通俗语言概括:
1. 10.0.1.150upstream web {10.0.1.150
- upstream 是Nginx配置中的一个模块,用于定义一组后端服务器(集群)。
- web 是这个集群的名字,方便在其他地方引用。
- 下面列出的 server 代表集群内的服务器,这里列出了三台:
- server 10.0.1.146:80; 表示集群中有一台服务器,IP地址为10.0.1.146,端口为80。
- 同理,server 10.0.1.147:80; 和 server 10.0.1.144:80; 分别代表另外两台服务器。
通俗理解:就像组建了一支由三名队员组成的篮球队,名叫“web队”,队员们都有自己的球衣号码(IP地址和端口),准备接受比赛任务(处理请求)。
2. 10.0.1.150server {10.0.1.150
- listen 80; 表示这个Nginx服务器监听80端口,等待客户端的HTTP请求。
- server_name 10.0.1.134 www.it.com; 定义了该服务器服务的域名/IP地址,即当用户访问 10.0.1.134 或者 www.it.com 时,Nginx将处理这些请求。
通俗理解:这个Nginx服务器是个门卫,它守在大门(80端口)上,无论是有人敲门说找“10.0.1.134”还是“www.it.com”,它都会负责接待。
3. 10.0.1.150location / {10.0.1.150
- location / 指定匹配所有以根路径("/")开头的请求。
- proxy_pass http://web; 说明当收到匹配请求时,Nginx将请求转发给之前定义的名为“web”的后端服务器集群。
- proxy_set_header Host $host; 设置代理转发时,将请求头中的 Host 字段保持不变,即保留原请求的域名或IP地址。
通俗理解:当有访客(请求)来到大厅("/"),门卫(Nginx)并不会亲自服务,而是根据来访者的名片(请求头)将其转交给“web队”的某位队员(后端服务器)处理,并且告诉队员,这位访客是来找谁的(保持原有的Host信息)。这样就可以实现将用户的请求分散到多台服务器上处理,从而达到负载均衡的目的。
参数解释:
proxy_set_header Host $host;
作用 请求 header中字段会放到转发请求里面
不加 nginx转发请求头时候 不会用host字段 而 服务器就是靠这个host
补充:不加proxy_set_header Host $host; 和加proxy_set_header Host $host;的区别(用日志分别)
cd /usr/local/nginx/logs/
tail -10 access.log
[root@master logs]# tail -10 access.log
10.0.1.1 - - [27/Mar/2024:05:17:28 +0800] "GET /upload/misc.php?mod=patch&action=ipnotice&_r=0.26641092183016757&inajax=1&ajaxtarget=ip_notice HTTP/1.1" 200 76 "http://10.0.1.134/upload/" "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.4606.71 Safari/537.36 Core/1.94.225.400 QQBrowser/12.2.5544.400"
10.0.1.1 - - [27/Mar/2024:05:17:28 +0800] "GET /upload/ HTTP/1.1" 200 14983 "-" "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.4606.71 Safari/537.36 Core/1.94.225.400 QQBrowser/12.2.5544.400"
10.0.1.1 - - [27/Mar/2024:05:17:28 +0800] "GET /upload/uc_server/avatar.php?uid=2&size=small&ts=1 HTTP/1.1" 302 5 "http://10.0.1.134/upload/" "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.4606.71 Safari/537.36 Core/1.94.225.400 QQBrowser/12.2.5544.400"
10.0.1.1 - - [27/Mar/2024:05:17:28 +0800] "GET /upload/misc.php?mod=patch&action=ipnotice&_r=0.5472891656053496&inajax=1&ajaxtarget=ip_notice HTTP/1.1" 200 76 "http://10.0.1.134/upload/" "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.4606.71 Safari/537.36 Core/1.94.225.400 QQBrowser/12.2.5544.400"
10.0.1.1 - - [27/Mar/2024:05:19:05 +0800] "GET /upload/ HTTP/1.1" 200 15034 "-" "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.4606.71 Safari/537.36 Core/1.94.225.400 QQBrowser/12.2.5544.400"
10.0.1.1 - - [27/Mar/2024:05:19:07 +0800] "GET /upload/uc_server/avatar.php?uid=2&size=small&ts=1 HTTP/1.1" 302 5 "http://10.0.1.134/upload/" "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.4606.71 Safari/537.36 Core/1.94.225.400 QQBrowser/12.2.5544.400"
10.0.1.1 - - [27/Mar/2024:05:19:10 +0800] "GET /upload/ HTTP/1.1" 200 15019 "-" "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.4606.71 Safari/537.36 Core/1.94.225.400 QQBrowser/12.2.5544.400"
10.0.1.1 - - [27/Mar/2024:05:19:13 +0800] "GET /upload/uc_server/avatar.php?uid=2&size=small&ts=1 HTTP/1.1" 302 5 "http://10.0.1.134/upload/" "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.4606.71 Safari/537.36 Core/1.94.225.400 QQBrowser/12.2.5544.400"
10.0.1.1 - - [27/Mar/2024:05:19:16 +0800] "GET /upload/ HTTP/1.1" 200 15034 "-" "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.4606.71 Safari/537.36 Core/1.94.225.400 QQBrowser/12.2.5544.400"
10.0.1.1 - - [27/Mar/2024:05:19:18 +0800] "GET /upload/uc_server/avatar.php?uid=2&size=small&ts=1 HTTP/1.1" 302 5 "http://10.0.1.134/upload/" "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.4606.71 Safari/537.36 Core/1.94.225.400 QQBrowser/12.2.5544.400"
未加参数前
加参数后
3.负载均衡故障排查(重点)
步骤
1.检查后端服务器--是否正常
输入后端ip地址,看页面是否可以正常访问
curl 10.0.1.146
curl 10.0.1.147
curl 10.0.1.144
2.nginx负载均衡配置问题
cd /usr/lcoal/nginx/conf/vhost/
vim www.conf
upstream web {
server 10.0.1.146:80; #添加负载均衡的web,Nginx将根据负载均衡策略将请求分发给这三个后端服务器之一
server 10.0.1.147:80;
server 10.0.1.144:80;
}
server {
listen 80;
server_name 10.0.1.134 www.it.com; #这里是主站的ip ,有域名就要填一下域名,没有域名就填一下主站的ip,也就是本机ip
location / {
proxy_pass http://web; #Nginx将使用proxy_pass指令将请求代理至名为web的upstream模块所定义的后端服务器组
}
}
3.防火墙问题 多域名引用位置问题 日志
4.均衡这样报错解决方法
故障如图
F12分析请求失败页面
F12分析请求成功页面
参数解释:
proxy_set_header Host $host;
作用 请求 header中字段会放到转发请求里面
不加 nginx转发请求头时候 不会用host字段 而 服务器就是靠这个host
#自己的解释:当Nginx把客户端的请求转发给后端服务器时,记得把这个请求原本带有的‘Host’信息一并带上。”
就好比你是一位快递员(nginx主站),客户(用户)要求你将一封信送到另一个地方。信封上原本写着收件人的详细地址(即$host,代表客户端请求的原始网址信息)。为了让最终收件人(后台服务器web1 web2 web3)能准确知道是谁寄来的信,你在转交这封信时特意强调:“不要改变信封上的收件人地址信息。
”这就是proxy_set_header Host $host;在Nginx配置中的作用,确保了后端服务器能够看到原始客户端请求的完整网址信息
#详细语句解释:
1. 10.0.1.150upstream web {10.0.1.150
- upstream 是Nginx配置中的一个模块,用于定义一组后端服务器(集群)。
- web 是这个集群的名字,方便在其他地方引用。
- 下面列出的 server 代表集群内的服务器,这里列出了三台:
- server 10.0.1.146:80; 表示集群中有一台服务器,IP地址为10.0.1.146,端口为80。
- 同理,server 10.0.1.147:80; 和 server 10.0.1.144:80; 分别代表另外两台服务器。
通俗理解:就像组建了一支由三名队员组成的篮球队,名叫“web队”,队员们都有自己的球衣号码(IP地址和端口),准备接受比赛任务(处理请求)。
2. 10.0.1.150server {10.0.1.150
- listen 80; 表示这个Nginx服务器监听80端口,等待客户端的HTTP请求。
- server_name 10.0.1.134 www.it.com; 定义了该服务器服务的域名/IP地址,即当用户访问 10.0.1.134 或者 www.it.com 时,Nginx将处理这些请求。
通俗理解:这个Nginx服务器是个门卫,它守在大门(80端口)上,无论是有人敲门说找“10.0.1.134”还是“www.it.com”,它都会负责接待。
3. 10.0.1.150location / {10.0.1.150
- location / 指定匹配所有以根路径("/")开头的请求。
- proxy_pass http://web; 说明当收到匹配请求时,Nginx将请求转发给之前定义的名为“web”的后端服务器集群。
- proxy_set_header Host $host; 设置代理转发时,将请求头中的 Host 字段保持不变,即保留原请求的域名或IP地址。
通俗理解:当有访客(请求)来到大厅("/"),门卫(Nginx)并不会亲自服务,而是根据来访者的名片(请求头)将其转交给“web队”的某位队员(后端服务器)处理,并且告诉队员,这位访客是来找谁的(保持原有的Host信息)。这样就可以实现将用户的请求分散到多台服务器上处理,从而达到负载均衡的目的。
5.nginx 均衡有啥调度算法 谈谈
1.轮询算法
平均的算法
2.权重算法
能力强就多干点
3.ip_hash算法 (场景:网站会出反复登录失败 会话保持)
捆绑
如果你不使用ip_hash算法,可以使用redis作缓存来解决会话保持的问题
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 零经验选手,Compose 一天开发一款小游戏!
· 一起来玩mcp_server_sqlite,让AI帮你做增删改查!!