访问控制

用户访问控制

ngx_http_auth_basic_module

有时我们会有这么一种需求,就是你的网站并不想提供一个公共的访问或者某些页面不希望公开,我们希望的是某些特定的客户端可以访问。那么我们可以在访问时要求进行身份认证,就如给你自己的家门加一把锁,以拒绝那些不速之客。我们在服务课程中学习过apache的访问控制,对于Nginx来说同样可以实现,并且整个过程和Apache 非常的相似。

#1.建立口令文件
htpasswd -c /etc/nginx/passwd.db user1
New password:
Re-type new password:
Adding password for user user1
#2.实现认证
vim default.conf
location / {
root /usr/share/nginx/html;
index index.html index.htm;
auth_basic "hello"; # 这一行是你登录窗口写的提示文字
auth_basic_user_file /etc/nginx/passwd.db; # 密码存放的目录
} # htpasswd -c选项只有第一次没有密码文件的时候需要添加,第二再添加账户的时候,不需要跟-c
systemctl reload nginx

访问测试

重新加载配置文件后如果用elinks,curl访问会报错401,需要授权,需要用浏览器访问.

主机访问控制

ngx_http_access_module

    location / {
root /usr/share/nginx/html;
index index.html index.htm;
# auth_basic "hello";
# auth_basic_user_file /etc/nginx/passwd.db;
allow 39.108.140.0; #只允许此IP访问
deny all; #拒绝所有
}
elinks --dump 49.233.69.195
403 Forbidden

状态访问

ngx_http_stub_status_module

使用第三方的软件监控nginx时,需要保证其本身能显示状态信息,然后利用这些数据显示一些监控数据和生成图表,使用该模块需要在编译nginx时启用该模块.

# 在server中加入以下几行
location ~ /status {
stub_status on;
access_log off; # 状态模块的访问不记录日志
allow 39.108.140.0; # 只允许管理员访问
deny all;
}
curl 49.233.69.195/status
Active connections: 1
server accepts handled requests
14 14 14
Reading: 0 Writing: 1 Waiting: 0 #第一个14: 为一共处理的多少个连接请求
#第二个14: 为创建多少次握手
#第三个14: 为总共创阿金了多少请求 #Active connections 对后端发起的当前活动连接数
#server accepts handled requests:
# Nginx总共处理了14个连接
# 成功创建了14次握手,也就是成功的连接数connection 失败连接=(总连接数-成功连接数) (相等表示中间没有失败的)
# 总共处理了14个请求数requests (server和client建立一条连接之后开始请求数据,每有一个请求此数字会+1) # request: http请求,GET/POST/DELETE/UPLOAD(指的是请求资源),默认情况下下一个请求需要一个连接,但是如果开启了长连接,那么一个连接可以对应多个请求.
# Reading: nginx读取到客户端的Header信息数,请求头
# Waiting: nginx返回给客户端的Header信息数,响应头,如果这个值飙升,说明后面的节点挂掉了,例如数据库等.
# Waiting: 开启keep-alive的情况下,这个值等于active - (reading + writing),意思就是Nginx说已经处理完正在等候下一次请求指令的驻留连接.处理完等待下次请求的数量
# 一般监控都是通过此模块监控状态比如蓝鲸,zabbix;如果需要监控进程和端口需要

网站过滤

替换网站响应内容: ngx_http_sub_module

server里面加入下面两行代码.
location / {
root /usr/share/nginx/html;
index index.html index.htm;
sub_filter nginx 'flying'; # 默认只替换第一个nginx为flying,如果有多的nginx是不会替换的.
} location / {
root /usr/share/nginx/html;
index index.html index.htm;
sub_filter nginx 'flying';
sub_filter_once off; # 替换全部nginx为flying
}

实用用法

如果我们用模板生成网站的时候,因为疏漏或者别的原因造成代码不如意,但是此时因为文件数量巨大,不方便全部重新生成,那么这个时候我们就可以用此模块来暂时实现纠错,另一方面,我们也可以利用这个实现服务器端文字过滤的效果.

Nginx流量控制(连接和请求)

连接频率限制限制模块

ngx_http_limit_conn_module

(nginx的连接频率限制模块可以根据定义的key来限制每个键值的连接数.)

# Syntax: limit_req_zone key zone=name:size rate=rate;(设置速率每秒多少个请求)
# Default: —
# Context: http # Syntax: limit_req zone=name [burst=number] [nodelay];(burst可以设置前多少个请求不限制,也可以设置是否延迟访问)
# Default: —
# Context: http, server, location # Example:
yum -y install httpd-tools vim /etc/nginx/nginx.conf
http {
limit_req_zone $binary_remote_addr zone=req_zone:10m rate=1r/s; vim /etc/nginx/conf.d/default.conf
location / {
root /usr/share/nginx/html;
index index.html index.htm;
limit_req zone=req_zone;
#limit_req zone=req_zone burst=5; #5个请求时不限制的,但有延迟
#limit_req zone=req_zone burst=5 nodelay; #无延迟,只要拿到令牌就可以处理
} ab -n 100 -c 10 http://39.108.140.0/
Time taken for tests: 0.940 seconds # 请求花费的总时间
Complete requests: 100
Failed requests: 99 # 请求了100,失败了99
(Connect: 0, Receive: 0, Length: 99, Exceptions: 0)
Write errors: 0
Non-2xx responses: 99 # 非200请求99个

防盗链

图片防盗链

防止网站资源被盗用 ngx_http_referer_module

# 盗链是本网站的url显示其他网站图片,而直接用它的URL是转发,宣传的也是人家的URL.
# 主机proxy准备一张图片放到根目录
mv 1.png /usr/share/nginx/html/ # 主机rearend修改index.html
cat /usr/share/nginx/html/index.html
<html>
<head>
<meta charset="utf-8">
<title>hello everyone</title>
</head>
<body style="background-color:red;">
<img src="http://39.108.140.0/1.png"/>
</body>
</html>

此时用windows10谷歌浏览器访问rearend主机,但是日志在proxy主机上,消耗资源也是proxy主机

tail -1 /var/log/nginx/access.log

114.242.249.222 - - [03/Nov/2019:17:00:31 +0800] "GET /1.png HTTP/1.1" 304 0 "http://49.233.69.195/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.87 Safari/537.36" "-"

修改proxy主机配置文件

vim /etc/nginx/conf.d/default.conf
location ~ \.(img|png|gif)$ {
root /usr/share/nginx/html/images;
index index.html;
valid_referers none blocked *.youmen.cn server_names ~youmen ~\.google
\. ~baidu;
if ($invalid_referer) {
return 403;
}
}
systemctl reload nginx

此时再用浏览器访问rearend主机就会显示一张破碎的图片标志,图片资源也加载不出来

如何区分哪些是不正常的用户?

http referer是header的一部分,当浏览器向web服务器发送请求的时候,一般会带上referer,告诉服务器我是从那个页面链接过来的,服务器借此可以获得一些信息用于处理,例如防止未经允许的网站盗链图片、文件等,因此Http Referer头信息是可以通过程序伪装生成的,所以通过Referer信息防盗链并非100%可靠,但是他能限制大部分盗链情况。

07 . Nginx常用模块及案例的更多相关文章

  1. nginx常用模块(三)

    Nginx常用模块(三) ngx_http_proxy_module模块配置(http或https协议代理) proxy_pass URL; 应用上下文:location, if in locatio ...

  2. Nginx 常用模块

    Nginx 常用模块 1. ngx_http_autoindex_module # ngx_http_autoindex_module模块处理以斜杠字符(' / ')结尾的请求,并生成一个目录列表. ...

  3. (转)nginx 常用模块整理

    原文:http://blog.51cto.com/arm2012/1977090 1. 性能相关配置 worker_processes number | auto: worker进程的数量:通常应该为 ...

  4. 9.Nginx常用模块

    1.nginx开启目录浏览 提供下载功能 默认情况下,网站返回index指定的主页,若该网站不存在主页,则将请求交给autoindex模块 如果开启autoindex模块,则提供一个下载的页面, 如果 ...

  5. nginx常用模块(一)

    1.Nginx目录索引 1.1Nginx默认是不允许列出整个目录浏览下载.Syntax: autoindex on | off;Default: autoindex off;Context: http ...

  6. Nginx常用模块安装命令

    将目录切换至Nginx安装包目录下,使用./configure命令进行安装.一些第三方模块需要先下载过来,指定下解压后的目录即可. ./configure --prefix=/usr/local/ng ...

  7. nginx常用模块

    Nginx模块介绍 核心模块:core module 标准模块:stand modules HTTP modules: Standard HTTP modules Optional HTTP modu ...

  8. Nginx常用模块及作用

    Nginx模块详解 nginx模块分为两种,官方和第三方,我们通过命令 nginx -V 查看 nginx已经安装的模块! [root@localhost ~]# nginx -V nginx ver ...

  9. NGINX常用模块(二)

    5.Nginx日志配置 Nginx有非常灵活的日志记录模式.每个级别的配置可以有各自独立的访问日志.日志格式 通过log_format命令定义格式 1.log_format指令 # 配置语法:包括:e ...

随机推荐

  1. Java——TCP/IP超详细总结

    网络的基础知识 一.协议 1.简介: 在计算机网络与信息通信领域里,人们经常提及“协议”一词.互联网中常用的具有代表性的协议有IP.TCP.HTTP等.而LAN(局域网)中常用的协议有IPX/SPX” ...

  2. 【Hadoop离线基础总结】Hue与Hadoop集成

    目录 1.更改所有hadoop节点的core-site.xml配置 2.更改所有hadoop节点的hdfs-site.xml 3.重启hadoop集群 4.停止hue的服务,并继续配置hue.ini ...

  3. asp.net core计划任务探索之hangfire+redis+cluster

    研究了一整天的quartz.net,发现一直无法解决cluster模式下多个node独立运行的问题,改了很多配置项,仍然是每个node各自为战.本来cluster模式下的各个node应该是负载均衡的, ...

  4. python3语法学习第五天--函数(1)

    函数:函数能提高应用的模块性,和代码的重复利用率,是一段可重复使用的代码块 自定义函数: 1.函数代码块以 def 关键词开头,后接函数标识符名称和圆括号 (). 2.任何传入参数和自变量必须放在圆括 ...

  5. JDBC10 Blob二进制对象

    //将图片输入到数据库中 // String sql="insert into t_user2 (username,headImg) values (?,?)"; // ps=co ...

  6. Java爬虫Ins博主所有帖子的点赞和评论导出excel

    前言 某天朋友说,能不能帮忙扒下ins的博主帖子,要所有帖子的点赞和评论,我本来准备让会python的同事写的,最后还是自己顺手写了,本来一开始准备用nodejs或者js写的,想着前端本地测试代理和导 ...

  7. EOS基础全家桶(十一)智能合约IDE-EOS_Studio

    简介 我们马上要进入智能合约的开发了,以太坊最初提供了智能合约的功能,并宣告区块链进入2.0时代,而EOS的智能合约更进一步,提供了更多的便利性和可能性.为了进一步了解智能合约,并进行开发,我们需要先 ...

  8. PHP对象基础

    class demo1 { public function test1(){ echo '这是一个公有方法,可以随意调用!' } protected function test2(){ $this-& ...

  9. 应用视觉设计——CSS实现线性渐变效果

    在freeCodeCamp中应用视觉设计的课程中,介绍了一种通过使用CSS属性实现线性渐变效果. 1.线性渐变: background:linear-gredient(gradient-directi ...

  10. java ->IO流_字节流

    字节流 在前面的学习过程中,我们一直都是在操作文件或者文件夹,并没有给文件中写任何数据.现在我们就要开始给文件中写数据,或者读取文件中的数据. 字节输出流OutputStream OutputStre ...