当前位置:   article > 正文

【运维知识进阶篇】集群架构-Nginx常用模块(目录索引+状态监控+访问控制+访问限制)

【运维知识进阶篇】集群架构-Nginx常用模块(目录索引+状态监控+访问控制+访问限制)

这篇文章给大家介绍Nginx常用模块,包括Nginx目录索引,Nginx状态监控,Nginx访问控制,Nginx访问限制。熟悉使用模块,才能给Nginx增加色彩。

目录

目录索引模块

一、配置方法

二、配置示例

状态监控模块

访问控制模块

一、Nginx基于IP访问控制

1、访问控制配置,拒绝指定IP,其他全部允许

​编辑2、访问控制配置示例,只允许谁能访问,其他全部拒绝

二、Nginx基于用户登录认证

1、安装httpd-tools,该包中携带了httpasswd命令

2、创建新的密码文件,-c创建新文件,-b允许命令行输入密码

3、Nginx配置调用

访问限制模块

一、Nginx连接限制配置示例

1、Nginx配置文件使用模块

2、ab工具进行压力测试

3、查看Nginx报错日志

二、Nginx请求限制配置实战

1、修改Nginx配置文件,重启Nginx,ab压力测试

2、查看Nginx报错日志

3、Nginx请求限制重定向

Nginx请求限制比连接限制更有效

Nginx请求限制如何做


目录索引模块

  1. Nginx不允许列出整个目录浏览下载,可以用模块自己做个下载页。
  2. ngx_http_autoindex_module模块处理以斜杠字符(’/’)结尾的请求,并生成目录列表。
  3. 当ngx_http_index_module模块找不到索引文件时,通常会将请求传递给ngx_http_autoindex_module模块。

一、配置方法

  1. autoindex on;如果在location下写,只对当前location生效。不能写index.html
  2. #autoindex常用参数
  3. autoindex_exact_size off;
  4. 默认为on,显示出文件的确切大小,单位是bytes。
  5. 修改为off,显示出文件的大概大小,单位是KB或者MB或者GB。
  6. autoindex_localtime on;
  7. 默认为off,显示的文件时间为GMT时间。
  8. 修改为on,显示的文件时间为文件的服务器时间。
  9. charset utf-8,gbk;
  10. 默认中文目录乱码,添加上解决乱码
  11. 对下载资源进行限速
  12. limit_rate rate
  13. limit_rate_after size

二、配置示例

  1. [root@Web01 ~]# cat /etc/nginx/conf.d/module.conf
  2. server {
  3. listen 80;
  4. server_name module.koten.com
  5. charset utf-8,gbk;
  6. location / {
  7. root /code;
  8. index index.html index.htm;
  9. }
  10. location /download {
  11. alias /module; #根下的module
  12. autoindex on;
  13. autoindex_exact_size off;
  14. autoindex_localtime on;
  15. }
  16. }
  17. [root@Web01 code]# systemctl restart nginx
  18. [root@Web01 code]# mkdir /module
  19. [root@Web01 code]# touch /module/1.txt
  20. [root@Web01 code]# touch /module/你好.txt
  21. 注意路径问题:
  22. location /{
  23.     root /code/;   #/=====/code 用户访问www.baidu.com实际是在/code目录下查找index.html
  24. }

45c7a40f53434239a4c6db8f31d4c601.png

状态监控模块

ngx_http_stub_status_module模块提供对基本状态信息的访问,默认情况下不构建此模块,应使用--with-http_stub_status_module配置参数启用它

  1. [root@Web01 code]# cat /etc/nginx/conf.d/module.conf
  2. server {
  3. listen 80;
  4. server_name module.koten.com;
  5. access_log off;
  6. location /nginx_status {
  7. stub_status;
  8. }
  9. }
  10. [root@Web01 code]# systemctl restart nginx

c3dddf0443f94f109359e42df0239598.png

  1. Active connections # 当前活动的连接数
  2. accepts # 已接收T的总TCP连接数量
  3. handled # 已处理的TCP连接数量
  4. requests # 当前http请求数
  5. Reading # 当前读取请求头数量
  6. Writing # 当前响应的请求头数量
  7. Waiting # 等待的请求数,开启了keepalive
  8. # 注意, 一次TCP的连接,可以发起多次http的请求, 如下参数可配置进行验证
  9. keepalive_timeout 0; # 类似于关闭长连接
  10. keepalive_timeout 65; # 65s没有活动则断开连接

访问控制模块

基于IP的访问控制http_access_module和基于用户登陆认证http_auth_basic_module

一、Nginx基于IP访问控制

1、访问控制配置,拒绝指定IP,其他全部允许

  1. [root@Web01 code]# cat /etc/nginx/conf.d/module.conf
  2. server {
  3. listen 80;
  4. server_name module.koten.com;
  5. access_log off;
  6. location /nginx_status {
  7. stub_status;
  8. deny 10.0.0.1;
  9. allow all;
  10. }
  11. }
  12. [root@Web01 code]# systemctl restart nginx

由于本机IP是10.0.0.1所以访问失败,权限拒绝 

6b2a634bfa6c4e64b90dbdfe9fcbd07f.png

2、访问控制配置示例,只允许谁能访问,其他全部拒绝

  1. [root@Web01 code]# cat /etc/nginx/conf.d/module.conf
  2. server {
  3. listen 80;
  4. server_name module.koten.com;
  5. access_log off;
  6. location /nginx_status {
  7. stub_status;
  8. allow 10.0.0.1/24;
  9. allow 127.0.0.1;
  10. deny all;
  11. }
  12. }
  13. [root@Web01 code]# systemctl restart nginx
  14. [root@Web02 code]# tail -1 /etc/hosts #修改hosts解析
  15. 10.0.0.7 module.koten.com
  16. [root@Web02 code]# curl -s module.koten.com/nginx_status
  17. Active connections: 2
  18. server accepts handled requests
  19. 56 56 55
  20. Reading: 0 Writing: 1 Waiting: 1

2ffc22c680274721838fb7c6144f8c0a.png

二、Nginx基于用户登录认证

1、安装httpd-tools,该包中携带了httpasswd命令

[root@Web01 ~]# yum -y install httpd-tools

2、创建新的密码文件,-c创建新文件,-b允许命令行输入密码

  1. [root@Web01 ~]# htpasswd -b -c /etc/nginx/auth_conf koten 1
  2. Adding password for user koten

3、Nginx配置调用

  1. [root@Web01 ~]# cat /etc/nginx/conf.d/module.conf
  2. server {
  3. listen 80;
  4. server_name module.koten.com;
  5. access_log off;
  6. location /nginx_status {
  7. stub_status;
  8. auth_basic "请输入账号和密码!";
  9. auth_basic_user_file auth_conf;
  10. }
  11. }
  12. [root@Web01 ~]# systemctl restart nginx

f7159d9bebe0440894271c4972fed722.png  

访问限制模块

企业中经常会遇到服务器流量异常,负载过大的情况,对于大流量恶意的攻击访问,会带来宽带的

浪费,会影响业务,我们往往考虑对同一个IP的连接数,请求数进行限制。

ngx_http_limit_conn_module模块可以根据定义的key来限制每个键值的连接数,如同一个IP来源的连接数。

limit_conn_module连接频率限制

limit_req_module请求频率限制

一、Nginx连接限制配置示例

1、Nginx配置文件使用模块

  1. [root@Web01 ~]# cat /etc/nginx/nginx.conf |grep limit
  2. limit_conn_zone $remote_addr zone=conn_zone:10m; #放在http中
  3. [root@Web01 ~]# cat /etc/nginx/conf.d/wordpress.conf |grep limit
  4. limit_conn conn_zone 1; #放在server中
  5. [root@Web01 ~]# systemctl restart nginx

2、ab工具进行压力测试

  1. [root@Web01 ~]# tail -1 /etc/hosts
  2. 10.0.0.7 blog.koten.com
  3. [root@Web01 ~]# yum -y install httpd-tools
  4. [root@Web01 ~]# ab -n 20 -c 2 http://blog.koten.com/

3、查看Nginx报错日志

  1. [root@Web01 ~]# tail -10 /var/log/nginx/error.log
  2. 2023/05/11 22:29:45 [error] 96196#96196: *58 limiting connections by zone "conn_zone", client: 10.0.0.7, server: blog.koten.com, request: "GET / HTTP/1.0", host: "blog.koten.com"
  3. 2023/05/11 22:29:45 [error] 96196#96196: *59 limiting connections by zone "conn_zone", client: 10.0.0.7, server: blog.koten.com, request: "GET / HTTP/1.0", host: "blog.koten.com"
  4. 2023/05/11 22:29:45 [error] 96196#96196: *60 limiting connections by zone "conn_zone", client: 10.0.0.7, server: blog.koten.com, request: "GET / HTTP/1.0", host: "blog.koten.com"
  5. 2023/05/11 22:29:45 [error] 96196#96196: *61 limiting connections by zone "conn_zone", client: 10.0.0.7, server: blog.koten.com, request: "GET / HTTP/1.0", host: "blog.koten.com"
  6. 2023/05/11 22:29:45 [error] 96196#96196: *62 limiting connections by zone "conn_zone", client: 10.0.0.7, server: blog.koten.com, request: "GET / HTTP/1.0", host: "blog.koten.com"
  7. 2023/05/11 22:29:45 [error] 96196#96196: *63 limiting connections by zone "conn_zone", client: 10.0.0.7, server: blog.koten.com, request: "GET / HTTP/1.0", host: "blog.koten.com"
  8. 2023/05/11 22:29:45 [error] 96196#96196: *64 limiting connections by zone "conn_zone", client: 10.0.0.7, server: blog.koten.com, request: "GET / HTTP/1.0", host: "blog.koten.com"
  9. 2023/05/11 22:29:45 [error] 96196#96196: *65 limiting connections by zone "conn_zone", client: 10.0.0.7, server: blog.koten.com, request: "GET / HTTP/1.0", host: "blog.koten.com"
  10. 2023/05/11 22:29:45 [error] 96196#96196: *66 limiting connections by zone "conn_zone", client: 10.0.0.7, server: blog.koten.com, request: "GET / HTTP/1.0", host: "blog.koten.com"
  11. 2023/05/11 22:29:45 [error] 96196#96196: *67 limiting connections by zone "conn_zone", client: 10.0.0.7, server: blog.koten.com, request: "GET / HTTP/1.0", host: "blog.koten.com"

二、Nginx请求限制配置实战

1、修改Nginx配置文件,重启Nginx,ab压力测试

  1. # http标签段定义请求限制, rate限制速率,限制一秒钟最多一个IP请求
  2. http {
  3. limit_req_zone $binary_remote_addr zone=req_zone:10m rate=1r/s;
  4. }
  5. server {
  6. listen 80;
  7. server_name blog.koten.com;
  8. root /code/wordpress;
  9. index index.php index.html index.htm;
  10. location ~\.php$ {
  11. root /code/wordpress;
  12. fastcgi_pass 127.0.0.1:9000;
  13. fastcgi_index index.php;
  14. fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
  15. fastcgi_param HTTPS on;
  16. include fastcgi_params;
  17. }
  18. # 1r/s只接收一个请求,其余请求拒绝处理并返回错误码给客户端
  19. #limit_req zone=req_zone;
  20. # 请求超过1r/s,剩下的将被延迟处理,请求数超过burst定义的数量, 多余的请求返回503
  21. limit_req zone=req_zone burst=3 nodelay;
  22. }
  23. [root@Web01 ~]# systemctl restart nginx
  24. [root@Web01 ~]# ab -n 20 -c 2 http://blog.koten.com/

2、查看Nginx报错日志

  1. [root@Web01 ~]# tail -10 /var/log/nginx/error.log
  2. 2023/05/11 22:39:46 [error] 99013#99013: *77 limiting requests, excess: 3.919 by zone "req_zone", client: 10.0.0.7, server: blog.koten.com, request: "GET / HTTP/1.0", host: "blog.koten.com"
  3. 2023/05/11 22:39:46 [error] 99013#99013: *78 limiting requests, excess: 3.919 by zone "req_zone", client: 10.0.0.7, server: blog.koten.com, request: "GET / HTTP/1.0", host: "blog.koten.com"
  4. 2023/05/11 22:39:46 [error] 99013#99013: *79 limiting requests, excess: 3.918 by zone "req_zone", client: 10.0.0.7, server: blog.koten.com, request: "GET / HTTP/1.0", host: "blog.koten.com"
  5. 2023/05/11 22:39:46 [error] 99013#99013: *80 limiting requests, excess: 3.918 by zone "req_zone", client: 10.0.0.7, server: blog.koten.com, request: "GET / HTTP/1.0", host: "blog.koten.com"
  6. 2023/05/11 22:39:46 [error] 99013#99013: *81 limiting requests, excess: 3.917 by zone "req_zone", client: 10.0.0.7, server: blog.koten.com, request: "GET / HTTP/1.0", host: "blog.koten.com"
  7. 2023/05/11 22:39:46 [error] 99013#99013: *82 limiting requests, excess: 3.917 by zone "req_zone", client: 10.0.0.7, server: blog.koten.com, request: "GET / HTTP/1.0", host: "blog.koten.com"
  8. 2023/05/11 22:39:46 [error] 99013#99013: *83 limiting requests, excess: 3.917 by zone "req_zone", client: 10.0.0.7, server: blog.koten.com, request: "GET / HTTP/1.0", host: "blog.koten.com"
  9. 2023/05/11 22:39:46 [error] 99013#99013: *84 limiting requests, excess: 3.905 by zone "req_zone", client: 10.0.0.7, server: blog.koten.com, request: "GET / HTTP/1.0", host: "blog.koten.com"
  10. 2023/05/11 22:39:46 [error] 99013#99013: *85 limiting requests, excess: 3.905 by zone "req_zone", client: 10.0.0.7, server: blog.koten.com, request: "GET / HTTP/1.0", host: "blog.koten.com"
  11. 2023/05/11 22:39:46 [error] 99013#99013: *86 limiting requests, excess: 3.904 by zone "req_zone", client: 10.0.0.7, server: blog.koten.com, request: "GET / HTTP/1.0", host: "blog.koten.com"

3、Nginx请求限制重定向

在Nginx请求限制的过程中,我们可以自定义一个返回值,也就是错误页面的状态码。

默认情况下是503

1、修改默认返回状态码为478

  1. [root@Web01 ~]# cat /etc/nginx/conf.d/wordpress.conf
  2. server {
  3. listen 80;
  4. server_name blog.koten.com;
  5. root /code/wordpress;
  6. index index.php index.html index.htm;
  7. location ~\.php$ {
  8. root /code/wordpress;
  9. fastcgi_pass 127.0.0.1:9000;
  10. fastcgi_index index.php;
  11. fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
  12. fastcgi_param HTTPS on;
  13. include fastcgi_params;
  14. }
  15. limit_req zone=req_zone burst=3 nodelay;
  16. limit_req_status 478
  17. }
  18. #访问后查看日志发现状态码变为478
  19. [root@Web01 ~]# cat /var/log/nginx/access.log|grep 478
  20. 10.0.0.7 - - [11/May/2023:22:53:58 +0800] "GET / HTTP/1.0" 478 130 "-" "ApacheBench/2.3" "-"

2、重定向报错页面

  1. [root@Web01 ~]# cat /etc/nginx/conf.d/wordpress.conf
  2. server {
  3. listen 80;
  4. server_name blog.koten.com;
  5. root /code/wordpress;
  6. index index.php index.html index.htm;
  7. location ~\.php$ {
  8. root /code/wordpress;
  9. fastcgi_pass 127.0.0.1:9000;
  10. fastcgi_index index.php;
  11. fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
  12. fastcgi_param HTTPS on;
  13. include fastcgi_params;
  14. }
  15. limit_req zone=req_zone burst=3 nodelay;
  16. limit_req_status 478;
  17. error_page 478 /err.html;
  18. }
  19. [root@Web01 ~]# cat /code/wordpress/err.html
  20. <img style='width:100%;height:100%;' src=https://img.zcool.cn/community/01da295b2749baa8012034f792b59f.jpg@1280w_1l_2o_100sh.jpg>

e716986d583c44c48a9828257544a1a8.png

Nginx请求限制比连接限制更有效

首先HTTP是建立在TCP基础之上,在完成HTTP请求需要先建立TCP三次握手(称为TCP连接),在连接的基础上在完成HTTP的请求。所以多个HTTP请求可以建立在一次TCP连接之上, 那么我们对请求的精度限制,当然比对一个连接的限制会更加的有效,因为同一时刻只允许一个TCP连接进入, 但是同一时刻多个HTTP请求可以通过一个TCP连接进入。所以针对HTTP的请求限制才是比较优的解决方案。

Nginx请求限制如何做

如果作为代理服务器,我们需要限制每个用户的请求速度和链接数量,但是,由于一个页面有多个子资源,如果毫无选择的都进行限制,那就会出现很多不必要的麻烦,如:一个页面有40个子资源,那么如果想让一个页面完整的显示,就需要将请求速度和连接数都调整到40,以此达到不阻塞用户正常请求,而这个限制,对服务器性能影响很大,几百用户就能把一台nginx的处理性能拉下来。

所以我们需要制定哪些请求是需要进行限制的,如html页面;哪些是不需要限制的,如css、js、图片等,这样就需要通过配置对应的location进一步细化。不对css、js、gif、png,jpg等进行连接限制,对除此之外的链接进行限制。


我是koten,10年运维经验,持续分享运维干货,感谢大家的阅读和关注!

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/很楠不爱3/article/detail/453967
推荐阅读
相关标签
  

闽ICP备14008679号