nginx负载均衡
1.集群的准备
集群:一群做着相同工作的服务器
1.1虚拟环境的集群搭建
将首先关闭web01虚拟机,进行克隆。开机配置ip hostname
web集群的配置如下:
主机名称 | ip |
---|---|
web01 | 192.168.246.7 |
web02 | 192.168.246.8 |
web03 | 192.168.246.9 |
修改主机名
hostnamectl set-hostname web02
修改ip
sed -i 's#\.8#.9#g' /etc/sysconfig/network-scripts/ifcfg-eth[01]
sed -i '/UUID/d' /etc/sysconfig/network-scripts/ifcfg-eth[01]
重启网络
systemctl restart network
重新连接即可
1.2 企业里边集群的部署
1.先部署好一个lnmp服务器,上传代码信息
2.进行访问测试
3.批量部署多台web服务器(ansible)
4,。将nginx配置文件进行分发
5.将站点目录分发给所有主机
2. 负载均衡服务器的配置
原理:
2.1利用模板机克隆一台新的机器
修改 ip,主机名称。方式同上
hostname | ip |
---|---|
lb01 | 192.168.246.5 |
2.2 安装nginx
配置yum源:https://nginx.org/en/linux_packages.html
vim //etc/yum.repos.d/nginx.repo
[nginx-stable]
name=nginx stable repo
baseurl=http://nginx.org/packages/centos/$releasever/$basearch/
gpgcheck=1
enabled=1
gpgkey=https://nginx.org/keys/nginx_signing.key
module_hotfixes=true
安装nginx:
yum -y install nginx
启动:
systemctl start nginx
systemctl enable nginx
2.3 编写负载均衡的nginx的配置文件
两个模块
1.负载均衡
ngx_http_upstream_module --upstream
2.反向代理(比如:内网–》内网—》外网(由内到外))
ngx_http_proxy_module --proxy_pass
2.4 简单的负载均衡配置文件
vim /etc/nginx/conf.d/lb.conf
upstream yq{
server 192.168.246.7:80;
server 192.168.246.8:80;
server 192.168.246.8:80;
}
server {
listen 80;
server_name www.yq.com;
location / {
proxy_pass http://yq;
}
}
systemctl restart nginx
这样简单的配置在是有一个网站的运行的时候是没有问题的,但是多个网站就会出现:
1.网站页面错乱
2.服务器出问题也买显示错误
3.无法搜集客户的地址ip进行统计分析
2.5 特别注意:upstream yq与 proxy_pass http://yq中的后边yq必须是一样的
2.6实现负载均衡功能
三台web操作(都要操作):
mkdir /html/{bbs,www} -p
web01
for name in www bbs ;do echo "$name 192.168.246.7">/html/$name/idenx.html;done
web02
for name in www bbs ;do echo "$name 192.168.246.8">/html/$name/idenx.html;done
web03
for name in www bbs ;do echo "$name 192.168.246.9">/html/$name/idenx.html;done
chown -R www.www /html
nginx配置文件:
/etc/nginx/conf.d/下创建www.conf bbs.conf
www.conf:
server{
listen 80;
server_name www.yq.com;
access_log /var/log/nginx/www_log.log main;
error_log /var/log/nginx/www_log.log warn;
location /{
root /html/www;
index index.html;
}
}
bbs.conf:
server{
listen 80;
server_name bbs.yq.com;
access_log /var/log/nginx/www_log.log main;
error_log /var/log/nginx/www_log.log warn;
location /{
root /html/bbs;
index index.html;
}
}
systemctl reload nginx
配置windows的hosts文件
192.168.246.5 blog.yq.com www.yq.com
浏览器访问:
www.yq.com
bbs.yq.com
负载均衡服务器lb01:
vim /etc/hosts
172.16.1.5 www.yq.com bbs.yq.com
curl www.yq.com
curl bbs.yq.com
3. ngx_http_upstream_module详解
3.1 不同的调度功能 weight
1.默认的是平均的分配
2.自己分配(能力强的分配多)
修改配置文件的:
upstream yq{
server 192.168.246.7:80 weight=3;
server 192.168.246.8:80 weight=2;
server 192.168.246.8:80 weight=1;
}
这样访问六次,
3次在web01(192.168.246.7)
2次web02(192.168.246.8)
1次web01(192.168.246.9)
3.2 实现备用功能 backup
配置文件
upstream yq{
server 192.168.246.7:80;
server 192.168.246.8:80;
server 192.168.246.8:80 backup;
}
前两台服务器不能工作了,就会使用第三台
3.3 最大失败次数,失败后重新发送请求(max_fails=5 fail-timeout=10s)
配置文件
upstream yq{
server 192.168.246.7:80 max_fails=5 fail_time=10s;
server 192.168.246.8:80;
server 192.168.246.8:80;
}
web01连接五次失败后,10s会再次发送连接
3.4 不同的调度算法
1.rr轮训调度算法
2.wrr权重调度算法(weight)
3.ip_hash(出现反复登录的时候)
当我们登录网站时候会出现卡在登录界面,这个时候就是请求每次都是不同的web服务器了
解决办法:ip_hash
配置文件
upstream yq{
ip_hash;
server 192.168.246.7:80;
server 192.168.246.8:80;
server 192.168.246.8:80 backup;
}
这种办法当访问少的时候就是根据他的MD5的是一直访问的是一个服务器,负载均衡不均的问题
3.2 缓存服务器也可以解决此问题(后续)
4.lest_conn(根据服务器的连接数分配资源)
4. ngx_http_proxy_module 模块
可以解决的问题:
4.1 访问不同的网址,不能显示不同网站问题
编辑配置文件:
upstream yq {
server 192.168.246.7:80;
server 192.168.246.8:80;
server 192.168.246.9:80;
}
server {
listen 80;
server_name www.yq.com;
location / {
proxy_pass http://yq;
#不同的网址显示不同的界面
proxy_set_header Host $host;
}
}
4.2 访问用户的地址信息无法进行统计
proxy_set_header X-Forwarded-For $remote_addr;
upstream yq {
server 192.168.246.7:80;
server 192.168.246.8:80;
server 192.168.246.9:80;
}
server {
listen 80;
server_name www.yq.com;
location / {
proxy_pass http://yq;
#不同的网址显示不同的界面
proxy_set_header Host $host;
# 访问网站用户地址信息无法进行分析统计
proxy_set_header X-Forwarded-For $remote_addr;
}
}
日志文件的格式
cat /etc/nginx/nginx.conf
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log /var/log/nginx/access.log main;
$remote_addr 显示用户访问源IP地址信息
$remote_user 显示认证的用户名信息
[$time_local] 显示访问网站时间
"$request" 请求报文的请求行信息
$status 用户访问网站状态码信息
$body_bytes_sent 显示响应的数据尺寸信息
$http_referer 记录调用网站资源的连接地址信息(防止用户盗链)
$http_user_agent 记录用户使用什么客户端软件进行访问页面的 (谷歌 火狐 IE 安卓 iphone)
$http_x_forwarded_for 负载均衡ip
$http_x_forwarded_for就是访问的ip地址
访问网站查看日志文件:
web01上
cat /var/log/nginx/access_www.log
192.168.246.5 - - [20/Sep/2021:10:52:31 +0800] "GET /wenwen.html HTTP/1.0" 200 6 "-"
"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko)
Chrome/92.0.4515.131 Safari/537.36" "192.168.246.1"
192.168.246.5是负载均衡代理服务器的地址,最后192.168.246.1是访问的ip地址
4.3 错误页面会显示问题
upstream yq {
server 192.168.246.7:80;
server 192.168.246.8:80;
server 192.168.246.9:80;
}
server {
listen 80;
server_name www.yq.com;
location / {
proxy_pass http://yq;
#不同的网址显示不同的界面
proxy_set_header Host $host;
#错误页面不显示给用户
proxy_next_upstream error timeout http_404 http_502 http_403;
# 访问网站用户地址信息无法进行分析统计
proxy_set_header X-Forwarded-For $remote_addr;
}
}
systemctl reload nginx
4.4 完整配置文件
upstream yq {
server 192.168.246.7:80;
server 192.168.246.8:80;
server 192.168.246.9:80;
}
server {
listen 80;
server_name www.yq.com;
location / {
proxy_pass http://yq;
#不同的网址显示不同的界面
proxy_set_header Host $host;
#错误页面不显示给用户
proxy_next_upstream error timeout http_404 http_502 http_403;
# 访问网站用户地址信息无法进行分析统计
proxy_set_header X-Forwarded-For $remote_addr;
}
}
server {
listen 80;
server_name bbs.yq.com;
location / {
proxy_pass http://yq;
proxy_set_header Host $host;
proxy_next_upstream error timeout http_404 http_502 http_403;
}
}
systemctl reload nginx
这个是博客网站的配置文件;可加可不加
server {
listen 80;
server_name blog.yq.com;
location / {
proxy_pass http://yq;
proxy_set_header Host $host;
proxy_next_upstream error timeout http_404 http_502 http_403;
}
}