Nginx调度器
Nginx调度器是一种负载均衡工具,可以将客户端请求分配到多个后端服务器上,以提高系统的可用性和性能。
-
Nginx的作用
- web服务器
- 反响代理服务器
-
代理服务器相当于/中介
-
代理服务器的过程
-
客户端访问代理服务器要页面
-
代理服务器没有页面
-
代理服务器帮你访问服务器
-
由后台服务器把访问结果交回代理服务器
-
代理服务器把结果传回客户端
-
-
代理服务器也叫 调度器
-
调度器 : 负载均衡 / 健康检查
-
**负载均衡 : **
- 将客户端的并发访问量均衡的分配给够台服务器
- 对于高并发量来说 , 负载均衡旧显得重要
-
**健康简称 : **
-
时不时检查后台服务器的健康状态
-
发现了服务器有问题就不会把客户端的请求发送给它 ( 默认每10秒再检测 )
-
服务器健康状态则处理客户端请求
-
-
-
Nginx 调度算法
-
轮询 : 逐一循环调度(默认)
-
weight : 指定轮询机率 , 权重值和访问比率成正比
-
ip_hash : 根据客户端IP分配固定的后端服务器
-
-
Nginx 服务器组主机状态
-
**[ down ] : **表示当前server暂时不参与负载
-
**[ max_fails ] : **允许请求失败的次数 ( 默认为1 )
-
**[ fail_timeout ] : **max_fails 次失败后 , 暂停提供服务的时间
-
-
Nginx 反向代理语法
- 定义源服务器组
- upstream xxx{ sever 192.xxx.xxx.xxx:80; }
- 调用服务组
- server{ ... ... proxy_pass http://xxx; ... ... }
- 定义源服务器组
-
Nginx支持的调度器
-
HTTP反向代理 : 7层代理 OSI应用层
- 处理网络任务
-
TCP/UDP调度 : 4层代理 TCP/UDP , 第四层传输层的传输协议代理
- 处理数据任务
-
Web反向代理
-
功能
-
后端web服务器两台 , 可以使用httpd
-
Nginx采用轮询方式调用后端Web服务器
-
两台Web服务器的权重要求生物质不同的值
-
最大失败次数为2 , 失败超时时间为30秒
-
1. 部署实施后端Web服务器
环境准备,同网段要互通,检查yum
安装 : vim net-tools bash-completion psmisc httpd
1) 部署后端 web1 服务器
写入 /var/www/html/index.html
2)部署后端 web2 服务器
写入 /var/www/html/index.html
3)主机测试连接
curl web1 web2
2. 配置Nginx服务器 , 添加服务器池
重置Nginx
1)修改 /usr/local/nginx/conf/nginx.conf 配置文件
vim /usr/local/nginx/conf/nginx.conf
.. ..
http {
.. ..
#使用upstream定义后端服务器集群,集群名称任意(如webserver)
#使用server定义集群中的具体服务器和端口
upstream webserver {
server 192.168.99.100:80;
server 192.168.99.200:80;
}
.. ..
server {
listen 80;
server_name localhost;
location / {
.. ..
#通过proxy_pass将用户的请求转发给webserver集群
proxy_pass http://webserver;
.. ..
}
}
.. ..
}
/usr/local/nginx/sbin/ngiipnx -s reload
curl多次访问proxy主机可以看到网站的轮询效果
3. 配置 upstream 服务器集群池属性
1) 设置权限
[ weight ]可以设置后台服务器的权重,权重越大任务的分配量就越大
vim /usr/local/nginx/conf/nginx.conf
upstream webserver {
server 192.168.99.100 weight=2; #设置权重为2
server 192.168.99.200; #默认权重为0
}
# 优先调用权重为2的 192.168.99.100 服务器
/usr/local/nginx/sbin/nginx -s reload
2) 优化健康检查
[ max_fails ] 可以设置后台服务器的失败次数 , 默认 1 次
[ fail_timeout ] 可以设置后台服务器的失败超时时间 , 默认 10 秒
vim /usr/local/nginx/conf/nginx.conf
upstream webserver {
server 192.168.99.100;
server 192.168.99.200 max_fails=2 fail_timeout=30;
}
#失败次数 2 , 失败超时时间30秒
/usr/local/nginx/sbin/nginx -s reload
测试时,先将web2的httpd服务关闭,回到proxy访问集群页面curl 192.168.99.5
只会显示web1的页面,此时即使将web2的httpd服务开启也无效,因为要等
待30秒
4. 配置 upsteam 服务器集群的调度算法
1) 设置相同客户端访问相同Web服务器
-
[ ip_hash ] : 根据IP地址固定后端服务器
vim /usr/local/nginx/conf/nginx.conf
upstream webserver {
ip_hash; #根据客户端IP分配固定的后端服务器
server 192.168.99.100 ;
server 192.168.99.200 ;
}
/usr/local/nginx/sbin/nginx -s reload
客户端使用浏览器访问代理服务器测试只会见到一个页面
添加 down 标记
[ down ] 标记可以让集群主机暂时不参加集体活动
vim /usr/local/nginx/conf/nginx.conf
upstream webserver {
server 192.168.99.100 ;
server 192.168.99.200 down; #暂时不参与任务分配
}
/usr/local/nginx/sbin/nginx -s reload
客户端使用浏览器访问代理服务器测试只会见到192.168.99.100
TCP/UDP 调度器
-
四层代理 , 第四层的传输层代理
-
功能
-
后端SSH服务器两台
-
Nginx 编译安装时需要使用 --with-stream , 开启 ngx_stream_core_module模块
-
Nginx 采用轮询的方式调用后端 SSH 服务器
-
1. 部署四层代理Nginx服务器
Nginx-1.9 版本以前Nginx没有第四层代理功能
现Nginx默认不存在 第四层代理功能 , 需要安装
Nginx-1.22版本 的 [ ./configure ] 设置需要添加 [ --with-stream ]
[root@proxy nginx]# cd ~/lnmp_soft/nginx-1.22.1/
[root@proxy nginx-1.22.1]# killall nginx
[root@proxy nginx-1.22.1]# rm -rf /usr/local/nginx/
[root@proxy nginx-1.22.1]# ./configure \
> --with-stream #开启4层代理功能
[root@proxy nginx-1.22.1]# make && make install 编译并安装
[root@proxy nginx-1.22.1]# /usr/local/nginx/sbin/nginx -V
#查看安装模块情况
2. 配置Nginx服务器 , 添加服务器池
1) 修改/usr/local/nginx/conf/nginx.conf配置文件
新添加的内容不在 http函数内 , 属于网络外的操作 , 新添加 stream 函数.
vim /usr/local/nginx/conf/nginx.conf
stream {
upstream backend {
server 192.168.99.100:22; #后端SSH服务器的IP和端口
server 192.168.99.200:22;
}
server {
listen 12345; #Nginx监听的端口
proxy_pass backend;
}
}
http {
.. ..
}
/usr/local/nginx/sbin/nginx -s reload
Nginx 优化
-
优化服务器性能
-
自定义返回客户端 404 错误页面
-
查看服务器状态信息
-
解决客户端访问服务器提示 "Too many open files"
-
解决客户端访问头部信息过长
-
客户端浏览器缓存数据
-
-
测试客户端性能
-
使用ab压力测试软件并发量
-
编写测试脚本生成头部信息并访问
-
客户端访问不存在的页面 , 测试404错误页面是否重定向
-
1. 自定义报错页面
-
HTTP常见错误代码
-
[ 200 ] 正常
-
[ 301 & 302 ] 重定向
-
[ 400 ] 请求语法错误
-
[ 401 ] 访问被拒绝
-
[ 403 ] 禁止访问
-
[ 404 ] 资源找不到
-
[ 414 ] 请求URI头部太长
-
[ 500 ] 服务器内部错误
-
[ 502 ] 代理服务器无法正常获取下一个服务器的正常应答
1) 优化前 , 查看404代码
客户端使用浏览器访问不存在的页面,会提示404文件未找到
2)修改Nginx配置文件 , 自定义报错页面
vim /usr/local/nginx/conf/nginx.conf
.. ..
charset utf-8; #仅在需要中文时修改该选项
error_page 404 /test.jpg;
#自定义错误页面为一张图片,图片可以从真机拷入
#图片文件放在/usr/../nginx/html下
.. ..
/usr/local/nginx/sbin/nginx -s reload
优化后,客户端再次使用浏览器访问不存在的页面,会看到图片
2. 查看服务器状态信息
1) 安装Nginx模块
编译安装时使用[ --with-http_stub_status_module ]开启状态页面模块
[root@proxy nginx]# cd ~/lnmp_soft/nginx-1.22.1/
[root@proxy nginx-1.22.1]# ./configure \
> --with-stream #开启4层代理模块
> --with-http_stub_status_module #开启status状态页面
[root@proxy nginx-1.22.1]# make #编译
[root@proxy nginx-1.22.1]# killall nginx
[root@proxy nginx-1.22.1]# cp objs/nginx \ /usr/local/nginx/sbin/ #覆盖原文件
[root@proxy nginx-1.22.1]# /usr/local/nginx/sbin/nginx #开启nginx
2) 修改Nginx配置文件 , 定义状态页面
cat /usr/local/nginx/conf/nginx.conf
... ...
location /status {
stub_status on;
#allow IP地址; #只允许对应IP地址的人查看
#deny all; #拒绝对应的人查看
}
... ...
/usr/local/nginx/sbin/nginx -s reload
3) 查看状态页面信息
curl http://192.168.99.5/status
Active connections: 1
server accepts handled requests
10 10 3
Reading: 0 Writing: 1 Waiting: 0
Active connections:当前活动的连接数量。
Accepts:已经接受客户端的连接总数量。
Handled:已经处理客户端的连接总数量。
Requests:客户端发送的请求数量。
Reading:当前服务器正在读取客户端请求头的数量。
Writing:当前服务器正在写响应信息的数量。
Waiting:当前多少客户端在等待服务器的响应。
3. 优化Nginx并发量
1) 优化前使用ab高并发测试
-
使用 Web1 或 proxy 自己作为海量客户
-
防火墙与SELinux都关闭
[root@proxy ~]# ab -n 100 -c 100 http://192.168.99.5/
# -n任务量,-c是连接数
...
...
100% #成功
[root@proxy ~]# ab -n 2000 -c 2000 http://192.168.99.5/
Benchmarking 192.168.99.5 (be patient)
socket: Too many open files (24) #失败
2)修改Nginx配置文件 , 增加并发量
vim /usr/local/nginx/conf/nginx.conf
.. ..
worker_processes 2; #与CPU核心数量一致
events {
worker_connections 50000; #每个worker最大并发连接数
}
.. ..
/usr/local/nginx/sbin/nginx -s reload
3) 优化Linux内核参数 (最大文件数量)
[root@proxy ~]# ulimit -n #查看最大文件数量
[root@proxy ~]# ulimit -n 100000 #临时设置最大文件数量
[root@proxy ~]# vim /etc/security/limits.conf
.. ..
* soft nofile 100000
* hard nofile 100000
配置文件 [ /etc/security/limits.conf ]
- 该配置文件分4列,分别如下:
- 用户或组 硬限制或软限制 需要限制的项目 限制的值
4) 优化后测试服务器并发量
ab -n 2000 -c 2000 http://192.168.99.5/
4. 优化Nginx数据包缓存 , 支持超长地址
- 优化前 , 使用脚本制作超长头部请求是否能获得响应
- 默认情况下nginx无法支持长地址栏 , 会报414错误
1) 超长地址脚本
cat lnmp_soft/buffer.sh
#!/bin/bash
URL=http://192.168.99.5/index.html?
for i in {1..5000}
do
URL=${URL}v$i=$i
done
curl $URL #经过5000次循环后,生成一个超长的URL地址
./buffer.sh
.. ..
<center><h1>414 Request-URI Too Large</h1></center> #访问失败
2) 修改Nginx配置文件 , 增加数据包头部缓存大小
vim /usr/local/nginx/conf/nginx.conf
.. ..
http {
client_header_buffer_size 200k; #请求包头信息的缓存大小
large_client_header_buffers 4 200k; #大请求包头部信息的缓存个数与容量
.. ..
}
/usr/local/nginx/sbin/nginx -s reload
3) 优化后 , 使用脚本测试
./buffer.sh
5. 浏览器本地缓存静态数据
1) 浏览器界面操作清空历史记录/缓存
2 )修改Nginx配置文件 , 定义对静态页面的缓存时间
vim /usr/local/nginx/conf/nginx.conf
server {
listen 80;
server_name localhost;
location / {
root html;
index index.html index.htm;
}
location ~* \.(jpg|jpeg|gif|png|css|js|ico|xml)$ {
expires 30d; #定义客户端缓存时间为30天
}
}
/usr/local/nginx/sbin/nginx -s reload
3) 优化后使用浏览器访问图片 , 查看缓存
在firefox地址栏内输入about:cache,查看本地缓存数据,查看是否有图片以及过期时间是否正确。