首页 > 技术文章 > nginx常用模块

litianyang 2021-08-12 16:43 原文

内容概述

1.nginx常用模块
-1.1 目录索引模块
-1.2 nginx访问控制模块
-1.3 nginx状态监控模块
-1.4 nginx访问限制模块

内容详细

1.nginx常用模块

1.1 目录索引模块

ngx_http_autoindex_module模块处理以斜杠字符('/')结尾的请求并,生成目录列表.
1.语法:
Syntax:    autoindex on | off;
Default:    autoindex off;
Context:    http, server, location
2.常用参数:
# autoindex_exact_size on | off;
默认为on,显示出文件的"确切大小",单位是bytes.
可以修改为off,显示出文件的"大概大小",单位是KB或者MB甚至GB.
# autoindex_localtime on | off;
默认为off,显示的文件为GMT时间(比咱们的北京时间差8小时)
修改为on,显示的文件时间为文件的服务器时间(文件在服务器上显示的时间)
# charset utf-8,gbk;
默认中文目录乱码,添加这个可以解决乱码问题.

3.配置实例:
vim /etc/nginx/conf.d/www.autoindex.com.conf
server {
    listen 80;
    server_name www.autoindex.com;
    charset utf-8,gbk;
 
    localtion / {
        root /tmp/autoindex;			# 查找/tmp/autoindex/index.html
        index index.html index.htm;
    }
 
    location /download {
    	root /tmp/autoindex;			# 查找/tmp/autoindex/download
        autoindex on;
        autoindex_exact_size off;
        autoindex_localtime on;
    }
}

1.2 nginx访问控制模块

1.基于IP的访问控制 http_access_module
# 允许访问的配置语法:
Syntax: allow address | CIDR | unix: | all;
Default:    —
Context:    http, server, location, limit_except
# 拒绝访问的配置语法:
Syntax: deny address | CIDR | unix: | all;
Default:    —
Context:    http, server, location, limit_except

示例,拒绝指定的ip,其他的全部允许
vim /etc/nginx/conf.d/www.maliao.com.conf
server {
    listen 80;
    server_name www.maliao.com;
    charset utf8;
    
    location / {
        root /tmp/html5-mario;
        autoindex on;
        deny 192.0.0.1;        # 拒绝192.0.0.1网段访问
        allow all;              # 允许除了192.0.0.1网段的其他访问
    }
}

示例2:只允许指定的ip访问,其他全部拒绝
server {
    listen 80;
    server_name www.maliao.com;
    
    location / {
        root /tmp/html5-mario;
        autoindex on;
        allow 192.0.0.1/24;      
        allow 127.0.0.0;
        deny  all;
    }
}
2.基于用户登录的访问控制 http_auth_basic_module
语法:
# 访问的提示字符串:
Syntax: auth_basic string| off;
Default: auth_basic off;
Context: http, server, location, limit_except	
# 账户密码文件:
Syntax: auth_basic_user_file file;
Default: -
Context: http, server, location, limit_except

基于用户登录认证配置实践
# 首先需要安装httpd-tools,这个包中有我们需要的htpasswd命令
yum install httpd-tools
# 创建密码文件
htpasswd -c /etc/nginx/auth_basic lhd
New password: 
Re-type new password: 
Adding password for user lhd 
# 添加一个登录用户
htpasswd /etc/nginx/auth_basic egon
New password: 
Re-type new password: 
Adding password for user lty
# 密码文件内容
cat /etc/nginx/auth_basic
lhd:$apr1$aABeV4BC$kyetu7dPQWybG/VQAufjc.
lty:$apr1$/KUB/T8i$nCzmeOVcUh1bIYJZXgaO3.
# 配置访问登录
server {
    listen 80;
    server_name www.maliao.com;
    
    location / {
        root /tmp/html5-mario;
        index index.html;
 	    auth_basic " 小伙子快来玩啊!";
        auth_basic_user_file /etc/nginx/auth_basic;	  
	}   
}

1.3 nginx状态监控模块

ngx_http_stub_status_module模块能提供对基本状态信息的访问
默认情况下我们不构建此模块,应使用 --with-http_stub_status_module 配置参数来启用它
语法:
Syntax: stub_status;
Default:    —
Context:    server, location
配置:
server {
    listen 80;
    server_name www.maliao.com;
    
    location / {
        root /tmp/html5-mario;
        index index.html;
 	    auth_basic " 小伙子快来玩啊!";
        auth_basic_user_file /etc/nginx/auth_basic;	  
	}  
        location /nginx_status {
          stub_status;
	}
}
# 访问 http://www.maliao.com/basic_status
Active connections: 2 
server accepts handled requests
 71 71 2534 
Reading: 0 Writing: 1 Waiting: 1 

Active connections  # 当前活动的连接数
accepts             # 当前的总连接数TCP
handled             # 成功的连接数TCP
requests            # 总的http请求数
 
Reading             # 请求
Writing             # 响应
Waiting             # 等待的请求数,开启了keepalive
 
# 注意, 一次TCP的连接,可以发起多次http的请求, 如下参数可配置进行验证
keepalive_timeout  0;   # 类似于关闭长连接
keepalive_timeout  65;  # 65s没有活动则断开连接

1.4 nginx访问限制模块

1.我们为什么要对访问进行限制?
在企业中经常会遇到这种情况,服务器流量异常,负载过大等等问题.对于大流量恶意的攻击访问,会带来带宽的浪费,服务器压力负载过高从而影响业务.所以我们可能要考虑对同一个ip的连接数,请求数进行限制.
2.ngx_http_limit_conn_module 模块可以根据定义的key来限制每个键值的连接数,比如对同一个IP来源的连接数进行限制.
# limit_conn_module 连接频率限制
# limit_req_module 请求频率限制
了解语法:
	# 模块名ngx_http_limit_conn_module
    Syntax:     limit_conn_zone key zone=name:size;
    Default: —
    Context: http

    Syntax:    limit_conn zone number;
    Default: —
    Context: http, server, location
"nginx请求限制模块":
# 设置空间的语法
Syntax: limit_req_zone key zone=name:size rate=rate [sync];
Default:    —
Context:    http

limit_req_zone          # 设置空间的模块
key                     # 空间存储的内容
zone                    # 指定空间
=name                   # 空间的名字
:size                   # 空间的大小
rate=rate [sync];       # 读写速率

# 调用的语法
Syntax: limit_req zone=name [burst=number] [nodelay | delay=number];
Default:    —
Context:    http, server, location
 
limit_req               # 调用控件模块
zone=name               # 指定空间=空间的名字
[burst=number]          # 允许多请求几次
[nodelay | delay=number]; # 延时

实例:
# http标签段定义请求限制,,rate限制速率,限制一秒钟最多一个IP请求
http {
    limit_req_zone $binary_remote_addr zone=req_zone:10m rate=1r/s;
}
server {
    listen 80;
    server_name www.maliao.com;
    # 1r/s只接收一个请求,其余请求拒绝处理并返回错误码给客户端
    # limit_req zone=req_zone;
 
    # 请求超过1r/s,剩下的将被延迟处理,请求数超过burst定义的数量, 多余的请求返回503
    limit_req zone=req_zone burst=3 nodelay;
    location / {
        root /tmp/html5-mario;
        index index.html;
    }
}
# 使用ab工具进行测试
什么是ab工具?
ab是apache自带的压力测试工具,ab是apachebench命令的缩写.
ab不仅可以对apache服务器进行网站访问压力测试,也可以对或其它类型的服务器进行压力测试。
ab是一个httpd自带的很好用的压力测试工具,ab命令会创建多个并发访问线程,模拟多个访问者同时对某一URL地址进行访问.
可以用来测试apache的负载压力,也可以用来测试nginx,lighthttp,tomcat,IIS等其它Web服务器的压力负载性能.
# 安装ab工具
yum install -y httpd-tools
# 测试
ab -n 20000 -c 20 http://www.autoindex.com/index.html 
        -n        # 请求的次数
        -c        # 一次请求并发的次数
"nginx连接限制模块":
ngx_http_limit_conn_module
语法了解:
# 设置限制的空间
Syntax: limit_conn_zone key zone=name:size;
Default:    —
Context:    http
 
limit_conn_zone     # 设置空间的模块
key                 # 指定空间存储的内容
zone                # 指定空间
=name               # 空间名字
:size;              # 空间的大小
 
# 调用限制的空间
Syntax: limit_conn zone number;
Default:    —
Context:    http, server, location
 
limit_conn          # 调用空间的模块
zone                # 空间的名字
number;             # 指定可以同时连接的次数
实例:
http {
    limit_req_zone $remote_addr zone=conn_zone:10m;		# 设置一个存储ip地址,空间名字为conn_zone,空间大小为10M的空间
}
server {
    listen 80;
    server_name www.maliao.com;
    limit_coon coon_zone 1;		# 调用conn_zone空间,限制每个ip同时只能连接一次.
    
    location / {
        root /tmp/html5-mario;
        index index.html;
    }
}

推荐阅读