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

news2024/11/20 18:46:57

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

目录索引模块

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

配置方法

autoindex on;如果在location下写,只对当前location生效。不能写index.html

#autoindex常用参数
autoindex_exact_size off;
默认为on,显示出文件的确切大小,单位是bytes。
修改为off,显示出文件的大概大小,单位是KB或者MB或者GB。

autoindex_localtime on;
默认为off,显示的文件时间为GMT时间。
修改为on,显示的文件时间为文件的服务器时间。

charset utf-8,gbk;
默认中文目录乱码,添加上解决乱码

对下载资源进行限速
limit_rate rate
limit_rate_after size

配置示例

[root@Web01 ~]# cat /etc/nginx/conf.d/module.conf
server {
  listen 80;
  server_name module.koten.com
  charset utf-8,gbk;

  location / {
    root /code;
    index index.html index.htm;
  }

  location /download {
    alias /module;    #根下的module
    autoindex on;
    autoindex_exact_size off;
    autoindex_localtime on;
  }
}
[root@Web01 code]# systemctl restart nginx
[root@Web01 code]# mkdir /module
[root@Web01 code]# touch /module/1.txt
[root@Web01 code]# touch /module/你好.txt

注意路径问题:
location /{
    root /code/;   #/=====/code 用户访问www.baidu.com实际是在/code目录下查找index.html
}

状态监控模块

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

[root@Web01 code]# cat /etc/nginx/conf.d/module.conf
server {
    listen 80;
    server_name module.koten.com;
    access_log off;

    location /nginx_status {
        stub_status;
    }
}
[root@Web01 code]# systemctl restart nginx

Active connections  # 当前活动的连接数
accepts             # 已接收T的总TCP连接数量
handled             # 已处理的TCP连接数量
requests            # 当前http请求数

Reading             # 当前读取请求头数量
Writing             # 当前响应的请求头数量
Waiting             # 等待的请求数,开启了keepalive

# 注意, 一次TCP的连接,可以发起多次http的请求, 如下参数可配置进行验证
keepalive_timeout  0;   # 类似于关闭长连接
keepalive_timeout  65;  # 65s没有活动则断开连接

访问控制模块

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

Nginx基于IP访问控制

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

[root@Web01 code]# cat /etc/nginx/conf.d/module.conf
server {
    listen 80;
    server_name module.koten.com;
    access_log off;

    location /nginx_status {
        stub_status;
	deny 10.0.0.1;
	allow all;
    }
}
[root@Web01 code]# systemctl restart nginx

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

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

[root@Web01 code]# cat /etc/nginx/conf.d/module.conf
server {
    listen 80;
    server_name module.koten.com;
    access_log off;

    location /nginx_status {
        stub_status;
	allow 10.0.0.1/24;
	allow 127.0.0.1;
	deny all;
    }
}
[root@Web01 code]# systemctl restart nginx

[root@Web02 code]# tail -1 /etc/hosts    #修改hosts解析
10.0.0.7 module.koten.com
[root@Web02 code]# curl -s module.koten.com/nginx_status
Active connections: 2 
server accepts handled requests
 56 56 55 
Reading: 0 Writing: 1 Waiting: 1 

Nginx基于用户登录认证

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

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

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

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

3、Nginx配置调用

[root@Web01 ~]# cat /etc/nginx/conf.d/module.conf 
server {
    listen 80;
    server_name module.koten.com;
    access_log off;

    location /nginx_status {
        stub_status;
        auth_basic "请输入账号和密码!";
        auth_basic_user_file auth_conf;
    }
}
[root@Web01 ~]# systemctl restart nginx

  

访问限制模块

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

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

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

limit_conn_module连接频率限制

limit_req_module请求频率限制

Nginx连接限制配置示例

1、Nginx配置文件使用模块

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

2、ab工具进行压力测试

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

3、查看Nginx报错日志

[root@Web01 ~]# tail -10 /var/log/nginx/error.log
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"
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"
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"
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"
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"
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"
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"
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"
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"
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请求限制配置实战

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

# http标签段定义请求限制, rate限制速率,限制一秒钟最多一个IP请求
http {
    limit_req_zone $binary_remote_addr zone=req_zone:10m rate=1r/s;
}

server {
	listen 80;
	server_name blog.koten.com;
	root /code/wordpress;
	index index.php index.html index.htm;

	location ~\.php$ {
		root /code/wordpress;
		fastcgi_pass 127.0.0.1:9000;
		fastcgi_index index.php;
		fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
                fastcgi_param HTTPS on;
		include fastcgi_params;
	}
    # 1r/s只接收一个请求,其余请求拒绝处理并返回错误码给客户端
    #limit_req zone=req_zone;

    # 请求超过1r/s,剩下的将被延迟处理,请求数超过burst定义的数量, 多余的请求返回503
    limit_req zone=req_zone burst=3 nodelay;
}
[root@Web01 ~]# systemctl restart nginx
[root@Web01 ~]# ab -n 20 -c 2  http://blog.koten.com/

查看Nginx报错日志

[root@Web01 ~]# tail -10 /var/log/nginx/error.log
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"
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"
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"
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"
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"
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"
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"
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"
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"
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"

Nginx请求限制重定向

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

默认情况下是503

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

[root@Web01 ~]# cat /etc/nginx/conf.d/wordpress.conf
server {
	listen 80;
	server_name blog.koten.com;
	root /code/wordpress;
	index index.php index.html index.htm;

	location ~\.php$ {
		root /code/wordpress;
		fastcgi_pass 127.0.0.1:9000;
		fastcgi_index index.php;
		fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
                fastcgi_param HTTPS on;
		include fastcgi_params;
	}
	limit_req zone=req_zone burst=3 nodelay;
	limit_req_status 478
}

#访问后查看日志发现状态码变为478
[root@Web01 ~]# cat /var/log/nginx/access.log|grep 478
10.0.0.7 - - [11/May/2023:22:53:58 +0800] "GET / HTTP/1.0" 478 130 "-" "ApacheBench/2.3" "-"

2、重定向报错页面

[root@Web01 ~]# cat /etc/nginx/conf.d/wordpress.conf 
server {
	listen 80;
	server_name blog.koten.com;
	root /code/wordpress;
	index index.php index.html index.htm;

	location ~\.php$ {
		root /code/wordpress;
		fastcgi_pass 127.0.0.1:9000;
		fastcgi_index index.php;
		fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
                fastcgi_param HTTPS on;
		include fastcgi_params;
	}
	limit_req zone=req_zone burst=3 nodelay;
	limit_req_status 478;
	error_page 478 /err.html;
}
[root@Web01 ~]# cat /code/wordpress/err.html
<img style='width:100%;height:100%;' src=https://img.zcool.cn/community/01da295b2749baa8012034f792b59f.jpg@1280w_1l_2o_100sh.jpg>

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年运维经验,持续分享运维干货,感谢大家的阅读和关注!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/516451.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

QT窗体之间值的传递,多种方法实现

QT窗体之间值的传递&#xff0c;多种方法实现 前言[1] QT窗体之间值的传递&#xff0c;多种方法实现1、新建工程2、全局变量extern3、公共成员函数public4、信号与槽singnals5、总结与工程分享主窗口.cpp文件主窗口头文件子窗口.cpp文件子窗口头文件 [2] Qt在子窗口接收父窗口的…

Node.js版本管理工具,我选择n

文件收录&#xff1a; 个人网址&#xff1a;https://linglan01.cn/ Github&#xff1a; https://github.com/CatsAndMice/blog/issues 为什么要管理Node.js版本&#xff1f;这是我们要先明白的点。 假设我电脑Node.js版本为v14.x&#xff0c;日常工作中可能会遇到以下场景&…

c#入门教程(有一定计算机基础的人看)

废话不说&#xff0c;有一定基础的人看&#xff0c;如java等程序员 c#是什么&#xff1f; 开发语言&#xff0c;为什么要学&#xff1f;主流游戏是用这个开发 c#怎么运行? c#微软做的&#xff0c;微软做了个.net framework&#xff0c;c#运行在这个之上。windows自带.net …

8. 100ASK_V853-PRO开发板支持MPP媒体处理平台

0.前言 ​ MPP 系统控制模块&#xff0c;根据芯片特性&#xff0c;完成硬件各个部件的复位、基本初始化工作&#xff0c;同时负责完成 MPP&#xff08;Media Process Platform 媒体处理平台&#xff09;系统各个业务模块的初始化、去初始化以及管理 MPP 系统各个业务模块的工作…

python基于LBP+SVM开发构建基于fer2013数据集的人脸表情识别模型是种什么体验,让结果告诉你...

本身LBPSVM是比较经典的技术路线用来做图像识别、目标检测&#xff0c;没有什么特殊的地方 fer2013数据集在我之前的博文中也有详细的实践过&#xff0c;如下&#xff1a; 《fer2013人脸表情数据实践》 系统地基于CNN开发实现 《Python实现将人脸表情数据集fer2013转化为图像…

IP网络电话呼叫转移设置

这里的网络电话呼叫转移设置&#xff0c;我们以IP电话系统用方位的网络电话机为例说明 通话转移 当用户正在与对方通话时&#xff0c;并希望将呼叫转移到其他号码&#xff0c;这里有两种方法来转移呼叫&#xff0c;出席移转和非出席移转。 出席移转 出席移转也被称为“礼貌…

条形码阅读器 CnetSDK Barcode Scanner SDK Crack

条形码阅读器组件SDK CnetSDK Barcode Scanner SDK 为.NET程序员提供了一个免费测试的条形码阅读器软件&#xff0c;称为.NET Barcode Scanner SDK。它在从许多图像文件中读取条形码和识别条形码方面非常有效。这个.NET条形码库支持最流行的线性和2D条形码&#xff0c;如QR码&a…

膨胀阀的结构和工作原理(详细篇)

膨胀阀的工作原理 编辑搜图 膨胀阀也称节流阀&#xff0c;是组成汽车空调制冷系统的主要部件&#xff0c;安装在蒸发器入口处&#xff0c;如图 所示&#xff0c;是汽车空调制冷系统的高压与低压的分界点。其功用是&#xff1a;把来自贮液干燥器的高压液态制冷剂节流减压&#…

第五十七章 Unity 混音器

本章节我们介绍Unity 混音器 (Audio Mixer)&#xff0c;它允许我们混合各种音频源&#xff0c;并对音频源进行统一控制或应用各种效果。在Unity中混音器是一种资源文件&#xff0c;可以右键Create创建AudioMixer文件。虽然它是一个文件&#xff0c;但是Unity提供了图形化界面来…

人大李崇轩:我的生成模型修炼之路丨智源大会嘉宾风采

导读 AIGC的飞速发展离不开生成模型、深度学习以及多模态学习等领域研究的不断累积&#xff0c;其中生成模型的原理与算法发展是不可或缺的一部分&#xff0c;如&#xff1a;生成对抗网络 GAN 及其一系列变体、变分自编码器 VAE 及其一系列变体、自回归模型 AR、流模型 FLOW &a…

考虑多能负荷不确定性的区域综合能源系统鲁棒规划(MatlabPython代码)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

Interiorai: 室内设计工具平台

【产品介绍】 Interiorai是一个可以让用户从自己的房间照片中生成不同风格的室内设计的在线平台。用户只需上传一张房间的照片&#xff0c;选择想要的设计风格和模式&#xff0c;就可以看到AI生成的室内设计效果&#xff0c;并且可以下载或分享。帮助用户快速找到装修或改造房间…

即时聊天app开发-即时通讯app开发方案分析

如今&#xff0c;即时聊天APP层出不穷&#xff0c;它已经成为人们日常生活中密不可分的社交工具。如今&#xff0c;即时聊天APP不仅是聊天工具&#xff0c;也是企业营销的利器。我们经常可以在聊天主页上看到一些广告。如有必要&#xff0c;用户可以直接点击广告了解详情。即时…

五、云对象存储以及课程分类管理模块

本项目的存储图片和音频文件都存储在腾讯云的服务器中&#xff0c;本章先介绍存储图片的方式。 存储桶文件创建&#xff1a; 存储桶项目存储内容&#xff1a; APPID和密钥管理&#xff1a; APPID和密钥是整个云存储最为重要的验证依据&#xff0c;在配置文件中应用。 现在简要…

超大规模数据库集群保稳系列之一:高可用系统

总第560篇 2023年 第012篇 基于过去多年在大规模数据集群保稳方面的实践经验&#xff0c;我们希望能够跟业界进行一些技术交流&#xff0c;美团技术团队举办了第75期技术沙龙。我们邀请到了美团研究员赵应钢担任出品人&#xff0c;同时请邀请到张洪、王占全、蔺瑞超、沈裕锋等4…

【Linux】进程信号(上)

文章目录 1.信号概念理解信号产生信号保存信号处理 2. 信号的产生证明输入 CTRL C 就是向前台进程发送信号signal 函数内部参数传递的理解对于信号自定义动作的捕捉问题 3.信号产生的方式1.从键盘输入2.使用系统调用向进程发送信号killraiseabort 3.由软件条件产生信号 1.信号概…

轻博客Plume的搭建

什么是 Plume &#xff1f; Plume 是一个基于 ActivityPub 的联合博客引擎。它是用 Rust 编写的&#xff0c;带有 Rocket 框架&#xff0c;以及 Diesel 与数据库交互。前端使用 Ructe模板、WASM 和SCSS。 反向代理 假设我们实际访问地址为&#xff1a; https://plume.laosu.ml…

Map和WeakMap对象的用法(JS)

&#x1f4dd;个人主页&#xff1a;爱吃炫迈 &#x1f48c;系列专栏&#xff1a;数据结构与算法 &#x1f9d1;‍&#x1f4bb;座右铭&#xff1a;道阻且长&#xff0c;行则将至&#x1f497; 文章目录 &#x1f338;Mapkey创建map的其他方式Map常用方法Map结构原生提供三个遍历…

项目成本管理

定义&#xff1a;项目各个成本的总和 作用&#xff1a;在预算范围内完成项目 考点&#xff1a; 直接成本是指一个由项目组承担的费用&#xff0c;例如员工的工资&#xff0c;电脑等硬件费用。 间接成本是指由多个项目组承担的费用&#xff0c;例如租金&#xff0c;水电费&am…

社交媒体中的“点赞”“喜欢”是如何存储在数据库中的?

你有没有想过 Instagram、Twitter、Facebook 或任何社交媒体平台如何跟踪谁喜欢你的帖子&#xff1f;让我们在这篇文章中弄清楚&#xff01; 1&#xff1a;序言 最近&#xff0c;我受邀在一个名为“CityJS”的活动中发言。但问题在于&#xff1a;我是 PHP 开发人员。我根本不懂…