史上最全的nginx安全访问控制配置

史上最全的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

当你每秒刷新一次的时候

史上最全的nginx安全访问控制配置

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

史上最全的nginx安全访问控制配置

3、处理突发

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

史上最全的nginx安全访问控制配置

我们只需要在代理服务器上添加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

史上最全的nginx安全访问控制配置

史上最全的nginx安全访问控制配置代理服务器已经没有权限了,所以返回一个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

史上最全的nginx安全访问控制配置

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

资料获取方式:

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

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

     

史上最全的nginx安全访问控制配置

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/111848.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • java分布式框架_5个强大的Java分布式缓存框架推荐

    java分布式框架_5个强大的Java分布式缓存框架推荐在开发中大型Java软件项目时,很多Java架构师都会遇到数据库读写瓶颈,如果你在系统架构时并没有将缓存策略考虑进去,或者并没有选择更优的缓存策略,那么到时候重构起来将会是一个噩梦。本文主要是分享了5个常用的Java分布式缓存框架,这些缓存框架支持多台服务器的缓存读写功能,可以让你的缓存系统更容易扩展。1、Ehcache–Java分布式缓存框架Ehcache是一个Java实现的开源分布式缓存框架…

    2022年6月5日
    24
  • html 网页不可以复制粘贴,网页上的文字不能复制,三种方法教你复制全网文字…

    html 网页不可以复制粘贴,网页上的文字不能复制,三种方法教你复制全网文字…有时候在网上找文字素材的时候,一般做法是直接复制粘贴使用。但你有没有遇到过不能复制的时候?反正小编是有的!好不容易找到了需要的文字却复制不出来,是不是好让人闹心?!有什么办法可以避开这个限制,将网页的文字复制下来为我所用呢?今天小编就分享三种方法给大家,不多不少就三种,帮你轻松搞定网页限制,复制想要的文字~至于哪种最好,还是看大家的喜好啦!1、Ctrl+P没错,就是这个快捷键。p代表print,打…

    2022年10月13日
    0
  • 什么是光栅化?_光栅成像

    什么是光栅化?_光栅成像光栅化首先,光栅化(Rasterize/rasteriztion)。这个词儿Adobe官方翻译成栅格化或者像素化。没错,就是把矢量图形转化成像素点儿的过程。我们屏幕上显示的画面都是由像素组成,而三维物体都是点线面构成的。要让点线面,变成能在屏幕上显示的像素,就需要Rasterize这个过程。就是从矢量的点线面的描述,变成像素的描述。如下图,这是一个放大了1200%的屏幕,前面是告诉计算机我有一个圆形,后面就是计算机把圆形转换成可以显示的像素点。这个过程就是Rasterize。参考链接如何理解Open

    2022年10月19日
    1
  • Databus 调研测试

    Databus 调研测试1.简介Databus是一个低延迟、可靠的、支持事务的、保持一致性的数据变更抓取系统。由LinkedIn于2013年开源。Databus通过挖掘数据库日志的方式,将数据库变更实时、可靠的从数据库拉取出来,业务可以通过定制化client实时获取变更并进行其他业务逻辑。Databus有以下特点:数据源和消费者之间的隔离。数据传输能保证顺序性和至少一次交付的高可用性。从变化流的任意时间点进行消费,包括…

    2022年10月17日
    0
  • String和Integer转换的大坑

    String和Integer转换的大坑今天碰到一个大坑 相信很多人也都碰到过 那就是 String 和 Integer 的相互转换 m Integer parseInt num 到最后判断的时候我用 m l getM 一直得不到我想要的结果后来在网上查了很多资料发现 Integer 类型的取值范围在 128 127 我的这个 m 是 157 所以到最后取到的数据不全最后我用 if m equals l getM 把数

    2025年7月28日
    1
  • [开源夏令营][四] Docker remote API 之 镜像篇

    [开源夏令营][四] Docker remote API 之 镜像篇

    2021年12月1日
    55

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号