Nginx进阶-配置提升(下)

Nginx 流量控制

在流量控制方面, Nginx 主要提供了ngx_http_limit_conn_module 和ngx_http_limit_req_module 两种模块来完成这样的功能。

ngx_http_limit_conn_module 模块: 主要针对连接数的配置

ngx_http_limit_req_module 模块: 主要针对请求并发量的控制

1、ngx_http_limit_conn_module 模块配置实例

1)添加配置

# 在http 段上设置一个共享区间(只能在http段上设置), 在这个共享区间中会以
$binary_remote_addr 为key,
# 去记录每个客户端的连接情况
limit_conn_zone $binary_remote_addr zone=addr:20m;
# 设置每个客户端的连接最大数为10, 当超过最大限制后,将返回error
# 可以设置在http段 、server段、location 段
#
limit_conn addr 10;
# 超过最大限制后, 返回的error状态码。 默认不设置也为 503
limit_conn_status 503;
limit_conn_zone $binary_remote_addr zone=addr:20m;
server {
listen 80;:
server_name cdn.qfedu.com;
root /data0/www/htdocs/cdn.qfedu.com;
access_log /data0/www/logs/cdn.qfedu.com-access_log main;
error_log /data0/www/logs/cdn.qfedu.com-error_log;
limit_conn addr 10;
limit_conn_status 503;
location ~ .*.(gif|jpg|jpeg|png|bmp|swf)$ {
expires 1d;
}
location ~ .*.(js|css)?$ {
expires 1d;
}
}

2)压测验证

# 发起1000个请求,每次并发10个请求。基本发现不了连接次数超限的情况
# ab -n 1000 -c 10 http://cdn.qfedu.com/test.css
# 压力测试的同事,观察访问日志的状态码
# tail -f cdn.qfedu.com-access_log | awk '$8 > 500 {print}'
# 发起1000个请求,每次并发11个请求的时候已经存在连接次数超限的情况
# ab -n 1000 -c 11 http://cdn.qfedu.com/test.css
# tail -f cdn.qfedu.com-access_log | awk '$8 > 500 {print}'
cdn.qfedu.com [21/Mar/2018:23:44:43 +0800] "GET /test.css HTTP/1.0" 89 503 206
0.006 "-" "ApacheBench/2.3"
cdn.qfedu.com [21/Mar/2018:23:44:43 +0800] "GET /test.css HTTP/1.0" 89 503 206
0.002 "-" "ApacheBench/2.3"
cdn.qfedu.com [21/Mar/2018:23:44:43 +0800] "GET /test.css HTTP/1.0" 89 503 206
0.002 "-" "ApacheBench/2.3"

2、ngx_http_limit_req_module 模块配置实例

1)添加配置

# 在http 段上设置一个共享区间(只能在http段上设置), 在这个共享区间中会以
$binary_remote_addr 为key,
# 去记录每个客户端的请求状况。这里设置每个客户端的每秒最多能请求1个
limit_req_zone $binary_remote_addr zone=client:10m rate=1r/s;
# 可以设置在http段 、server段、location 段
# 在峰值burst=5以内的并发请求,会被挂起,延迟处理
# 超出请求数限制则直接返回error(503)
limit_req zone=client burst=5;
# 超过最大限制后, 返回的error状态码。 默认不设置也为 503
limit_req_status 503;
server {
listen 80;
server_name cdn.qfedu.com;
root /data0/www/htdocs/cdn.qfedu.com;
access_log /data0/www/logs/cdn.qfedu.com-access_log main;
error_log /data0/www/logs/cdn.qfedu.com-error_log;
location ~ .*.(gif|jpg|jpeg|png|bmp|swf)$ {
expires 1d;
}
location ~ .*.(js|css)?$ {
limit_req zone=client burst=5;
limit_req_status 503;
expires 1d;
}
}

2)压测验证

# 测试,发起20个请求,每次并发1个请求。
# ab -n 20 -c 1 http://cdn.qfedu.com/test.css
# 压力测试的同时观察日志, 发现每次请求的响应时间都约等于1s,说明我们的设置是没有问题的。
# tail -f cdn.qfedu.com-access_log
cdn.qfedu.com [21/Mar/2018:23:57:43 +0800] "GET /test.css HTTP/1.0" 89 200 9
1.000 "-" "ApacheBench/2.3"
cdn.qfedu.com [21/Mar/2018:23:57:44 +0800] "GET /test.css HTTP/1.0" 89 200 9
0.999 "-" "ApacheBench/2.3"
cdn.qfedu.com [21/Mar/2018:23:57:45 +0800] "GET /test.css HTTP/1.0" 89 200 9
1.001 "-" "ApacheBench/2.3"
# 测试,发起20个请求,每次并发2个请求。
# ab -n 20 -c 2 http://cdn.qfedu.com/test.css
# 压力测试的同时观察日志, 发现每次请求的响应时间存在大于1s 的情况了,说明请求有积压,被存到
burst 中了。
# tail -f cdn.qfedu.com-access_log
cdn.qfedu.com [22/Mar/2018:00:00:05 +0800] "GET /test.css HTTP/1.0" 89 200 9
1.001 "-" "ApacheBench/2.3"
cdn.qfedu.com [22/Mar/2018:00:00:06 +0800] "GET /test.css HTTP/1.0" 89 200 9
2.001 "-" "ApacheBench/2.3"
cdn.qfedu.com [22/Mar/2018:00:00:07 +0800] "GET /test.css HTTP/1.0" 89 200 9
2.000 "-" "ApacheBench/2.3"
# 测试,发起20个请求,每次并发6个请求。
# ab -n 20 -c 6 http://cdn.qfedu.com/test.css
# 压力测试的同时观察日志, 发现每次请求的响应状态码已经出现了503,说明请求积压已经达到了
burst 设置的最大值 5,超过这个值的其他请求直接被 503了。
# tail -f cdn.qfedu.com-access_log
cdn.qfedu.com [22/Mar/2018:00:03:57 +0800] "GET /test.css HTTP/1.0" 89 200 9
0.001 "-" "ApacheBench/2.3"
cdn.qfedu.com [22/Mar/2018:00:03:57 +0800] "GET /test.css HTTP/1.0" 89 503 206
0.000 "-" "ApacheBench/2.3"
cdn.qfedu.com [22/Mar/2018:00:03:57 +0800] "GET /test.css HTTP/1.0" 89 503 206
0.001 "-" "ApacheBench/2.3"

Nginx 监控

一个服务健康与否,与运维人员息息相关。当一个服务出现问题时,运维人员如何在第一时间感知 并恢复业务呢?

此时相应的监控、告警就排上了用场。

1、配置位置

无所谓配置位置了。七层代理层和业务逻辑层的Nginx都需要监控的。

2、基于外部的进程监控

#! /bin/bash
function check_nginx_port(){
NGINX_PID="/usr/local/nginx/logs/nginx.pid"
CPUCORES=`cat /proc/cpuinfo |grep 'cpu cores' |wc -l`
test -s $NGINX_PID
if [ $? -eq 0 ];then
MASTER_NUM=`ps ax |grep `cat $NGINX_PID` |grep -v grep |wc -l`
SLAVE_NUM=`ps ax |grep [n]ginx|grep -vE "master|grep" |wc -l`
if [ $MASTER_NUM -eq 0 -o $SLAVE_NUM -lt $CPUCORES ];then
echo "Nginx process may have a problem!!!"
fi
else
echo "Nginx Pid file may have a problem!!!"
fi
}
check_nginx_port

3、基于外部的端口监

#! /bin/bash
function check_nginx_port(){
ss -anpt|grep 80 2&> /dev/null;
ret=$?
if [ $ret -ne 0 ];then
echo "Nginx Port 80 up!!"
exit 1
else
echo 0
fi
}
check_nginx_port

4、StubStatus 模块监控

Nginx 的 ngx_http_stub_status_module 模块提供了基础的Nginx状态统计信息。要使用此功能, 前提在编译安装时要指定参数 --with-http_stub_status_module。 那如何配置使用呢?

1)在任意一个虚拟主机中添加如下location配置

location /nginx_status {
stub_status on;
access_log off;
allow 127.0.0.1;
deny all;
}

2)单独的配置了一个用于信息统计的虚拟主机

server {
listen 80;
server_name www.qfedu.com;
root /usr/share;
access_log /var/logs/www.qfedu.com-access_log main;
error_log /var/logs/www.qfedu.com-error_log;
location /nginx_status {
stub_status on;
access_log off;
allow 127.0.0.1;
deny all;
}
}

3)验证测试

[[email protected] ~]# curl http://127.0.0.1/nginx_status -H "HOST:
www.status.qfedu.com"
将会出现如下类似结果:
Active connections: 5
server accepts handled requests
5970806143 5970806143 7560482010
Reading: 0 Writing: 5 Waiting: 0
具体含义:
Active connections 当前活跃的客户端连接数量
accepts 到目前为止总共接受的客户端连接数量
handled 到目前为止已处理的连接数量,正常情况下,值同参数 accepts 的值相同
requests 到目前为止总的客户端请求数量
Reading 从当前的连接中,Nginx 读到的请求头数量
Writing 从当前的连接中,Nginx 正在写入响应到客户端的数量
Waiting 当前有多少个空闲连接在等待请求。 数量等于 Active connections - Reading -
Writing

5、使用 limit_rate 限制客户端传输数据的速度

1)编辑/etc/nginx/nginx.conf

location / {
root /var/www/nginx;
index index.html;
limit_rate 2k; #对每个连接的限速为2k/s
}

2)重启服务

注意要点:

配置文件中的每个语句要以 ; 结尾

使用 htpasswd 命令需要先安装 httpd

Alias 虚拟目录

location /qfedu {
alias /var/www/qfedu;
index index.html; # 访问http://x.x.x.x/qfedu时实际上访问
是/var/www/qfedu/index.html
}

root 和 alias 的主要区别是:

使用 root ,实际的路径就是:root值 + location值。

使用 alias ,实际的路径就是:alias值。

例如,

有一张图片,URL是:www.qfedu.com/static/a.jpg

它在服务器的路径是:/var/www/app/static/a.jpg

那么用 root 的配置是:

location /static/ {
root /var/www/app/;
}

用 alias 的配置就是:

location /static/ {
alias /var/www/app/static/;
}

对于 alias ,location值可以随便取,例如:

location /hello/ {
alias /var/www/app/static/;
}

这样,我们访问图片的地址就是:www.lys.com/hello/a.jpg 注意:

1.alias 在 location 中 配置不是以 index.html 为主页的文件,需要添加 ‘/’。2.alias 在使用正则匹配时,必须捕捉要匹配的内容,并在指定的内容处使用。3.alias 只能位于 location 块中, root 可以不放在 location 中。

以上与大家分享的内容,如果需要学习教程、源码笔记的或者想学习交流,扫码加我拉你进群

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
THE END
分享
二维码
< <上一篇
下一篇>>