运维三 负载均衡 轮询 加权 iphash 初步优化 更新模块
前日补充
rewirte选项表格
选项 | 说明 |
---|---|
redirect | 临时修改地址值给用户看 状态码302 |
permanent | 永久修改 状态码301 帮助爬虫??? |
last | 不在读其他rewrite 相同作用块中 如果一个在server全局作用块中 另一个在location作用块中 |
break | 不在读其他语句,结束请求 相同作用块中 |
设置选项后查看日志
tail -3 /usr/local/nginx/logs/access.log #设置redirect后浏览器访问后
#rewrite ^/a.html$ /b.html redirect;
192.168.2.1 - - [11/Dec/2020:04:40:57 -0500] "GET /a.html HTTP/1.1" 302 145 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:83.0) Gecko/20100101 Firefox/83.0" #302 重定向开始
192.168.2.1 - - [11/Dec/2020:04:40:57 -0500] "GET /b.html HTTP/1.1" 200 11 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:83.0) Gecko/20100101 Firefox/83.0" #200 地址成功被重写
192.168.2.1 - - [11/Dec/2020:04:40:57 -0500] "GET /favicon.ico HTTP/1.1" 404 153 "http://192.168.2.5/b.html" "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:83.0) Gecko/20100101 Firefox/83.0" #404 找不到图标 测试网页当然没有
tail -3 /usr/local/nginx/logs/access.log #浏览器访问后
#rewrite ^/a.html$ /b.html permanent;
192.168.2.1 - - [11/Dec/2020:04:45:49 -0500] "GET /a.html HTTP/1.1" 301 169 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:83.0) Gecko/20100101 Firefox/83.0" #301 permanent 重定向开始
192.168.2.1 - - [11/Dec/2020:04:45:49 -0500] "GET /b.html HTTP/1.1" 200 11 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:83.0) Gecko/20100101 Firefox/83.0" #200 地址成功被重写
192.168.2.1 - - [11/Dec/2020:04:45:49 -0500] "GET /favicon.ico HTTP/1.1" 404 153 "http://192.168.2.5/b.html" "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:83.0) Gecko/20100101 Firefox/83.0"
#404 同上
前日错误修改
vim /usr/local/nginx/conf/nginx.conf
#========================================
server {
rewrite /a.html /b.html;
rewrite /b.html /c.html;
#并非昨日匹配即停止,如果输入/a.html会变成/c.html
#昨天测试用的同样的匹配条件 所以不会修改后匹配了。。。。
#这时候last选项的作用就出来了
rewrite /d.html /e.html last; #重写为/e.html之后不会匹配下面这条
rewrite /e.html /f.html; #不会导致重写两次
#前提是在同一个作用域块内 如果两条分别放到location块中 last就失效了~~~~~~~
#本质就是last的作用范围只在最近的作用块中
}
#=========================================
重写过程分析(redirect选项)
- 用户用浏览器发送修改前的地址给nginx服务器
- nginx服务器发送回302页面及修改后的地址给用户浏览器
- 浏览器根据修改后的地址又请求新页面
- nginx服务器返回新页面给用户,浏览器显示
总结
- 至少两次数据交互
curl 192.168.2.5/a.html #配置文件中为 rewrite /a.html /b.html redirect
<html>
<head><title>302 Found</title></head>
<body>
<center><h1>302 Found</h1></center>
<hr><center>nginx/1.17.6</center>
</body>
</html>
#返回的文本是302页面 因为curl并没有第二次发送数据功能 只能接受一次估计, redirect是要回显修改后的地址给用户的
重写过程分析(无选项)
- 用户用浏览器发送修改前的地址给nginx服务器
- nginx服务器就地(处理掉修改地址)
- 返回处理掉的地址网页给用户
- 用户显示“新页面”网页地址不变
总结
- 大概一次数据交互
#配置文件中为rewrite /a.html /b.html
[root@hahaha conf]# curl 192.168.2.5/a.html
nginx B~~~
#这次就显示了
nginx反向代理
反向代理举例(nginx反向代理格式 负载均衡weght max_fails fail_timeout down等)
轮询
#前置 有两台提供http服务的服务器
vim /usr/local/nginx/conf/nginx.conf
#=====================================
http {
upstream my_first_colony { #定义源服务器组
server 192.168.2.100:80; #定义服务器ip和服务端口
server 192.168.2.200:80;
}
server {
listen 80;
server_name localhost;
location / {
.....
proxy_pass http://my_first_*colony; #调用服务组
}
}
}
#======================================
/usr/local/nginx/sbin/nginx -s reload #重启服务
[root@proxy conf]# curl 192.168.2.5 #访问
httpd_web1~~~~~ #192.168.2.100:80服务http
[root@proxy conf]# curl 192.168.2.5
httpd_web2 ~~~~~ #192.168.2.200:80服务http
[root@proxy conf]# curl 192.168.2.5
httpd_web1~~~~~
[root@proxy conf]# curl 192.168.2.5
httpd_web2 ~~~~~
#####默认轮询分担 只定义了2.100:80 2.200:80两台 所以就两台轮询
加权轮询
#加权轮询
vim /usr/local/nginx/conf/nginx.conf
#=================================
http {
upstream my_first_colony { #加权轮询
server 192.168.2.100:80 weight=2;
server 192.168.2.200:80;
}
}
#=================================
/usr/local/nginx/sbin/nginx -s reload
[root@proxy conf]# curl 192.168.2.5
httpd_web1~~~~~
[root@proxy conf]# curl 192.168.2.5
httpd_web1~~~~~
[root@proxy conf]# curl 192.168.2.5
httpd_web2 ~~~~~
[root@proxy conf]# curl 192.168.2.5
httpd_web1~~~~~
[root@proxy conf]# curl 192.168.2.5
httpd_web1~~~~~
[root@proxy conf]# curl 192.168.2.5
httpd_web2 ~~~~~
#########可以发现服务器提供服务的比例为 2 : 1 因为设置了192.168.2.80 权重为2 192.168.2.200:80权重默认为1
健康检查功能
#=====================================
http {
upstream my_first_colony {
server 192.168.2.100:80 max_fails= 2 fail_timeout=30;
#max_fails 检测两次如果失败就认为该服务器挂了,等30秒后再检测
server 192.168.1.200:80;
}
}
#=====================================
#口述测试
#2.100挂了之后 服务一直由2.200提供 30秒之后(2.100在这段时间恢复了) 服务正常继续了
关闭服务器
#=====================================
http {
upstream my_first_colony {
server 192.168.2.100:80 down;
server 192.168.1.200:80;
}
}
#=====================================
#直白告诉nginx代理服务器2.100不能用了
ip_hash
#===================================
http {
upstream my_first_colony {
ip_hash; #ip_hash方式调度 每个Ip客户端都会提供到专属服务器上 session不用共享了 但是维护比较麻烦
server 192.168.2.100:80;
server 192.168.2.200:80;
}
}
#===================================
提供其他服务集群(ssh)
./configure --prefix=/usr/local/nginx --user=nginx --with-http_ssl_module --with-stream --with-http_stub_status_module
#stream 支持四层代理 可以让nginx组建其他业务(非web)的集群
#http_stub_status_module 可以查看网站后台数据
make
#可以将重新生成的二进制文件objs目录下的nginx替换掉旧的
cp objs/nginx /usr/local/nginx/sbin/nginx
yes #覆盖 最好先备份
vim /usr/local/nginx/conf/nginx.conf
===================================
event {
}
stream {#创建新业务
upstream my_not_web_daemon {#创建新集群
server 192.168.2.100:22; #22端口提供服务 默认是ssh服务
server 192.168.2.200:22;
}
server {
listen 12345; #将新的监听新端口
proxy_pass my_not_web_daemon;
}
}
http {
}
=====================================
nginx #启动
ssh 192.168.2.5 -p 12345 #访问nginx代理服务器的12345端口
#成功进入192.168.2.100的ssh的服务中
rm -rf ~/.ssh/known_hosts #删除记录 排除干扰
ssh 192.168.2.5 -p 12345 #继续测试轮询
#成功进入192.168.2.200的ssh的服务 轮询
报错页面替换
vim /usr/local/nginx/conf/nginx.conf
#========================================
http {
server{
listen 80;
server_name localhost;
error_page 404 /notfind.html #自己的notfind.html放到html目录下
}
}
#========================================
查看后台数据(很重要)
vim /usr/local/nginx/conf/nginx.conf
#====================================
server {
location /status {
stub_status on; #显示后台数据
allow 192.168.2.5;#运行2.5ip地址访问
deny all;#拒绝所有
}
}
#======================================
/usr/local/nginx/sbin/nginx -s reload
curl 192.168.2.5/status #查看网站后台数据 http_stub_status_module模块提供
Active connections: 2 #当前活动的连接数量,体现了多少用户正在访问网站
server accepts handled requests
#accepts已经处理客户端连接 handled服务器给回客户端的次数 request请求数
5 5 4
Reading: 0 Writing: 1 Waiting: 1
#服务器正在读取客户端请求头数量 回应数据数 正在等待服务器响应的客户端数量
配置nginx缓存功能
vim /usr/local/nginx/conf/nginx.conf
#===========================================
server{
location ~* \.(jpg|html|mp4|PNG)$ {
expires 30; #缓存在客户机上30天
}
}
#=============================================
nginx调优
414处理
- 414 URL过长
vim longlongurl.sh
#========================================#产生个超长的url并访问
#!/bin/bash
URL=http://192.168.4.5/index.html?
for i in {1..5000}
do
URL=${URL}v$i=$i
done
curl $URL
#========================================
bash longlongurl.sh
<html>
<head><title>414 Request-URI Too Large</title></head>
<body>
<center><h1>414 Request-URI Too Large</h1></center>
<hr><center>nginx/1.17.6</center>
</body>
</html>
#414错误 网站不太行
vim /usr/local/nginx/conf/nginx.conf #马上改
#=======================================
http {
client_header_buffer_size 200k;#增加到200k
large_client_header_buffers 4 200k;#还不够 来4个200k
#还不够 建议解决提出问题的人
server {
}
}
#========================================
/usr/local/nginx/sbin/nginx -s reload
bash longlongurl.sh
#414消失了
ss命令
选项 | 说明 |
---|---|
-a | 显示所有端口的信息 |
-n | 以数字格式显示端口号 |
-t | 显示TCP连接的端口 |
-u | 显示UDP连接的端口 |
-l | 显示服务正在监听的端口信息 |
-p | 显示监听端口的服务名称是什么 |
RHEL7中可以用ss来替代netstat命令