Nginx的配置与开发学习(二):访问控制与请求限制

Nginx模块讲解

Nginx官方模块

编译选项作用
–with-http_stub_status_moduleNginx的客户端状态

http_stub_status_module配置

server {
    listen       80;  //确保端口不被占用
    server_name  localhost;

    #charset koi8-r;
    #access_log  /var/log/nginx/host.access.log  main;

    #添加内容
    location /mystatus {
        stub_status;
    }
    
    location / {
        root   /usr/share/nginx/html;
        index  index.html index.htm;
    }
    ......
}
  1. 检查语法是否正确
    nginx -tc /etc/nginx/nginx.conf

  2. 没问题之后重载服务
    nginx -s reload -c /etc/nginx/nginx.conf

  3. 访问网址
    ip:port/mystatus

    Active connections: 1 
    server accepts handled requests
     255(处理握手次数) 255(处理连接数) 265(总的请求数) 
    Reading: 0 Writing: 1 Waiting: 0 
    

默认模块

编译选项作用
–with-http_random_index_ module目录中选择一个随机主页

http_random_index_ module配置

server {
    listen       80;  //确保端口不被占用
    server_name  localhost;

    #charset koi8-r;
    #access_log  /var/log/nginx/host.access.log  main;
    
    location / {
        root   /opt/app/code;      ##文件夹中放3个html,访问主页之后回随机访问这3个html(不能以.xx.html命名)
        random_index on;   #默认为off
        index  index.html index.htm;
    }
    ......
}
编译选项作用
–with-http_sub_modulehttp内容替换

–with-http_sub_module配置

server {
    listen       80;  //确保端口不被占用
    server_name  localhost;

    #charset koi8-r;
    #access_log  /var/log/nginx/host.access.log  main;

    location / {
        root   /opt/app/code; ##该目录下的html文件是要替换的内容
        index  index.html index.htm;
        sub_filter '需要替换的字符串' '被替换的内容';##网页中需要替换的内容
        sub_filter_once off;   ##设置全局替换,而不是只替换一次
    }
    .......
}

Nginx的请求限制(压测工具 ab)

HTTP请求建立在一次TCP的连接基础上

一次TCP请求至少产生一次HTTP请求

    limit_conn_zone $binary_remote_addr zone=conn_zone:1m;
    limit_req_zone $binary_remote_addr zone=req_zone:1m rate=1r/s;
server {
    listen       80;  //确保端口不被占用
    server_name  localhost;

    #charset koi8-r;
    #access_log  /var/log/nginx/host.access.log  main;

    #添加内容
    location /mystatus {
        stub_status;
    }
    
    location / {
        root   /opt/app/code;
        #limit_conn conn_zone 1;   限制连接数
        #limit_req zone=req_zone burst=3 nodelay; 对前3个请求延迟响应,其他全部返回50X
        #limit_req zone=req_zone burst=3;对前3个请求延迟响应,其他全部等待
        #limit_req zone=req_zone;
        index  index.html index.htm;
    }
    ......
}

Nginx的访问控制

  1. 基于IP的访问控制 ---- http_access_module
server {
    listen       80;  //确保端口不被占用
    server_name  localhost;

    #charset koi8-r;
    #access_log  /var/log/nginx/host.access.log  main;

    #添加内容
    location /mystatus {
        stub_status;
    }
    
    location / {
        root   /opt/app/code;
        index  index.html index.htm;
    }
    
    location ~ ^/admin.html {#模式匹配
        root   /opt/app/code;
        deny  XXX.XXX.XXX.XX;
        allow all;
        index  index.html index.htm;
    }
    
    location ~ ^/admin.html {#模式匹配
        root   /opt/app/code;
        allow XXX.XXX.XXX.XX
        deny  all;
        index  index.html index.htm;
    }
    ......
}

局限性:你限制了ip1地址,但是你实际上用这个ip1去访问的时候采用了代理ip2,那么nginx认为的ip是代理的ip2,就不会限制ip1的地址

解决方法:

  • 采用别的HTTP头信息访问控制,但是头信息可以呗修改 如:http_x_forwarded_for模块,http_x_forwarded_for=Client IP,Proxy(1) IP,Proxy(2) IP…
  • 结合geo模块来解决
  • 通过HTTP自定义变量传递,在HTTP头中自定义变量,一级一级的携带到后端
  1. 基于用户的信任登录----http_auth_basic_module

    • 服务器安装htpasswd工具:yum install httpd-tools -y
    • 生成密码文件,最好在文件上一级目录/etc/nginx: htpasswd -c ./auth_conf cyj
    • 查看密码文件:more auth_conf
    server {
        listen       80;  //确保端口不被占用
        server_name  localhost;
    
        #charset koi8-r;
        #access_log  /var/log/nginx/host.access.log  main;
    
        #添加内容
        location /mystatus {
            stub_status;
        }
        
        location / {
            root   /opt/app/code;
            index  index.html index.htm;
        }
        
        location ~ ^/admin.html {#模式匹配
            root   /opt/app/code;
            auth_basic  "XXXXXXXX请输入密码";
            auth_basic_user_file /etc/nginx/auth_conf;  #存放密码文件路径
            index  index.html index.htm;
        }
        .......
    }
    

    局限性:

    • 用户信息依赖文件方式
    • 操作管理机械,效率低下

    解决方案:

    • Nginx结合LUA实现高效验证
    • Nginx和LDAP打通,利用nginx-auth-ldap模块
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值