zoukankan      html  css  js  c++  java
  • 史上最全的nginx安全访问控制配置

    点击上方“ 码农编程进阶笔记 ”,选择“置顶或者星标

    文末有干货,每天定时与您相约!

    1.准备工作

    准备两台带有yum安装的nginx的虚拟机,一台作为代理服务器,一台作为真实服务器。

    192.168.13.133           真实服务器
    192.168.13.129           代理服务器
    

    2.配置基本的限流

    “流量限制”配置两个主要的指令,limit_req_zone和limit_req,如下所示:

    代理服务器配置(192.168.13.129):
    [root@server ~]# vim /etc/nginx/conf.d/default.conf
    清空并添加以下代码
    limit_req_zone $binary_remote_addr zone=mylimit:10m rate=1r/s;
    upstream myweb {
            server 192.168.62.157:80 weight=1 max_fails=1 fail_timeout=1;
            }
    server {
            listen 80;
            server_name localhost;
    
    
    
    
            location /login {
                    limit_req zone=mylimit;
                    proxy_pass http://myweb;
                    proxy_set_header Host $host:$server_port;
                    proxy_set_header X-Real-IP $remote_addr;
                    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
                    }
    }
    
    [root@server ~]# nginx -t
    [root@server ~]# nginx -s reload
    

    limit_req_zone指令定义了流量限制相关的参数,而limit_req指令在出现的上下文中启用流量限制(示例中,对于”/login/”的所有请求)。

    limit_req_zone指令通常在HTTP块中定义,使其可在多个上下文中使用,它需要以下三个参数:

    Key - 定义应用限制的请求特性。示例中的 Nginx 变量$binary_remote_addr,保存客户端IP地址的二进制形式。这意味着,我们可以将每个不同的IP地址限制到,通过第三个参数设置的请求速率。(使用该变量是因为比字符串形式的客户端IP地址$remote_addr,占用更少的空间)

    Zone - 定义用于存储每个IP地址状态以及被限制请求URL访问频率的共享内存区域。保存在内存共享区域的信息,意味着可以在Nginx的worker进程之间共享。定义分为两个部分:通过zone=keyword标识区域的名字,以及冒号后面跟区域大小。16000个IP地址的状态信息,大约需要1MB,所以示例中区域可以存储160000个IP地址。

    Rate - 定义最大请求速率。在示例中,速率不能超过每秒1个请求。Nginx实际上以毫秒的粒度来跟踪请求,所以速率限制相当于每1000毫秒1个请求。因为不允许”突发情况”,这意味着在前一个请求1000毫秒内到达的请求将被拒绝。

    limit_req_zone指令设置流量限制和共享内存区域的参数,但实际上并不限制请求速率。所以需要通过添加limit_req指令,将流量限制应用在特定的location或者server块。在上面示例中,我们对/login/请求进行流量限制。

    现在每个IP地址被限制为每秒只能请求1次/login/,更准确地说,在前一个请求的1000毫秒内不能请求该URL。

    真实服务器配置(192.168.13.133):

    [root@real-server ~]# vim /etc/nginx/conf.d/default.conf
    清空并添加以下内容(当然你也可以什么都不做)
    server {
            listen 80;
            server_name localhost;
            location /login {
                    root    /usr/share/nginx/html;
                    index   index.html index.html;
                    }
    }
    
    [root@real-server ~]# nginx -t
    [root@real-server ~]# nginx -s reload
    

    创建目录和文件并写入测试数据

    [root@real-server ~]# mkdir -p /usr/share/nginx/html/login
    [root@real-server ~]# echo "test" > /usr/share/nginx/html/login/index.html
    

    当你每秒刷新一次的时候

    当你每秒刷新多于一次的时候

    3、处理突发

    如果我们在1000毫秒内接收到2个请求,怎么办?对于第二个请求,Nginx将给客户端返回错误。这可能并不是我们想要的结果,因为应用本质上趋向于突发性。相反地,我们希望缓冲任何超额的请求,然后及时地处理它们。我们更新下配置,在limit_req中使用burst参数:

    我们只需要在代理服务器上添加burst参数就行了。示例中的mylimit`区域,速率限制在每秒1个请求,或每1000毫秒一个请求,客户端还能发起多少请求。上一个请求100毫秒内到达的请求将会被放入队列,我们将队列大小设置为5。

    4.基于IP的访问控制

    基于IP的访问控制:http_access_module

    我们在真实服务器上(192.168.13.133)进行如下配置:
    [root@real-server ~]# vim /etc/nginx/conf.d/default.conf
    清空并添加以下内容
    server {
            listen 80;
            server_name localhost;
            location /login {
                    root    /usr/share/nginx/html;
                    index   index.html index.html;
                    deny 192.168.13.129;
                    allow all;
                    }
    }
    #需要注意:
    如果先允许访问,在定义拒绝访问。那么拒绝访问不生效。(即allow all在deny 192.168.13.129前面)
    
    [root@real-server ~]# nginx -s reload
    

    代理服务器已经没有权限了,所以返回一个403状态码。

    5.基于用户的信任登录

    我们在真实服务器上(192.168.13.133)进行如下配置:

    [root@real-server ~]# vim /etc/nginx/conf.d/default.conf
    清空并添加以下内容
    server {
            listen 80;
            server_name localhost;
            location /login {
                    root    /usr/share/nginx/html;
                    index   index.html index.html;
                    auth_basic "Auth access test!";
                    auth_basic_user_file /etc/nginx/auth_conf;
                    }
    }
    #auth_basic不为off,开启登录验证功能,auth_basic_user_file加载账号密码文件。
    
    [root@real-server ~]# yum -y install httpd-tools
    #htpasswd 是开源 http 服务器 apache httpd 的一个命令工具,用于生成 http 基本认证的密码文件
    [root@real-server ~]# htpasswd -cm /etc/nginx/auth_conf user10
    New password:        #输入密码
    Re-type new password:          #确认密码
    Adding password for user user10
    

    以上内容希望帮助到大家,很多PHPer在进阶的时候总会遇到一些问题和瓶颈,业务代码写多了没有方向感,不知道该从那里入手去提升,对此我整理了一些资料,包括但不限于:分布式架构、高可扩展、高性能、高并发、服务器性能调优、TP6,laravel,YII2,Redis,Swoole、Swoft、Kafka、Mysql优化、shell脚本、Docker、微服务、Nginx等多个知识点高级进阶干货需要的可以免费分享给大家

    资料获取方式:

    1. 扫描下方二维码,后台回复关键字

    2. 或   点击这里 【直通车1】  【直通车2 】

       


  • 相关阅读:
    修复PLSQL Developer 与 Office 2010的集成导出Excel 功能
    Using svn in CLI with Batch
    mysql 备份数据库 mysqldump
    Red Hat 5.8 CentOS 6.5 共用 输入法
    HP 4411s Install Red Hat Enterprise Linux 5.8) Wireless Driver
    变更RHEL(Red Hat Enterprise Linux 5.8)更新源使之自动更新
    RedHat 5.6 问题简记
    Weblogic 9.2和10.3 改密码 一站完成
    ExtJS Tab里放Grid高度自适应问题,官方Perfect方案。
    文件和目录之utime函数
  • 原文地址:https://www.cnblogs.com/lxwphp/p/15452884.html
Copyright © 2011-2022 走看看