Day53-nginx常用模块精讲-多企业案例

云原生、SRE、DevOPS
1.nginx开启目录浏览下载功能
2.nginx实现访问控制:1)基于IP控制。2)基于用户名密码控制
3.nginx实现流量限制:1)请求数限制。2)连接数限制。3)速率限制。
4.nginx7种状态指标
5.nginx location匹配、匹配优先级(*****)
6.nginx日志、访问日志、错误日志、日志过滤、日志切割
7.nginx错误页面,错误页面优雅显示

1.Nginx常用模块介绍

在生产环境中,配置、调整及优化Nginx软件,主要就是根据这些模块的功能修改相应的参数来实现的。通过官方地址链接: http://nginx.org/en/docs/可以查看到上述及更多模块的详细使用帮助。
链接: https://www.nginx.com/resources/wiki/modules/index.html

ngx_http_core_module         # 包括一些核心的http参数配置,对应Nginx的配置为http区块部分
ngx_http_access_module       # 访问控制模块,用来控制网站用户对Nginx的访问
ngx_http_gzip_module         # 压缩模块,对Nginx返回的数据压缩,属于性能优化模块
ngx_http_fastcgi_module      # fastcgi模块,和动态应用相关的模块,例如PHP
ngx_http_proxy_module        # proxy代理模块
ngx_http_upstream_module     # 负载均衡模块,可以实现网站的负载均衡功能及节点的健康检查
ngx_http_rewrite_module      # URL地址重写模块
ngx_http_limit_conn_module 	 # 限制用户并发连接数及请求数模块
ngx_http_limit_req_module 	 # 根据定义的key限制Nginx请求过程的速率
ngx_http_log_module	         # 访问日志模块,以指定的格式记录Nginx客户访问日志等信息
ngx_http_auth_basic_module	 # Web认证模块,设置Web用户通过账号密码访问Nginx
ngx_http_ssl_module	         # ssl模块,用于加密的http连接,如https
ngx_http_stub_status_module	 # 记录Nginx基本访问状态信息等的模块

2.查看Nginx加载了哪些模块

[root@web01 ~]# nginx -V

3.autoindex_module(目录浏览功能模块):

ngx_http_autoindex_module
以目录的形式呈现文件内容,点击可深入浏览或下载。

第三方模块介绍:nginx第三方模块

4.Nginx站点目录浏览功能配置实践

gzip /etc/nginx/conf.d/default.conf 
cat >/etc/nginx/conf.d/mirrors.etiantian.org.conf<<EOF
server {
    listen 80;
    server_name mirrors.etiantian.org;
    #charset utf-8;      #设定字符集,防止中文字符乱码显示。
    #autoindex on;       #启用目录列表功能。
    #autoindex_exact_size off;
    #autoindex_localtime on;
    location / {
        root /data/;
	    index  index.html;
    }
}
EOF
#检测语法并重启
nginx -t && pkill nginx && lsof -i :80
systemctl start nginx && lsof -i :80
#创建测试目录和文件
mkdir /data
echo oldboyedu >/data/index.html
cp /bin/{ls,cp} /data

1)不配置首页测试,403权限问题

[root@web01 conf.d]# curl -H "host:mirrors.etiantian.org" 10.0.0.7
<html>
<head><title>403 Forbidden</title></head>
<body>
<center><h1>403 Forbidden</h1></center>
<hr><center>nginx/1.20.1</center>
</body>
</html>

403的3个原因:
1)没有首页,并且禁止目录浏览功能。
2)站点目录没有访问权限。
3)通过访问控制限制了访问。

2)配置首页index.html

[root@web01 conf.d]# echo oldboyedu >/data/index.html
[root@web01 conf.d]# curl -H "host:mirrors.etiantian.org" 10.0.0.7
oldboyedu

3)开启配置浏览功能,并删掉首页文件,增加文件后测试结果

server {
    listen 80;
    server_name mirrors.etiantian.org;
    #charset utf-8;      #设定字符集,防止中文字符乱码显示。
    autoindex on;        #启用目录列表功能。
    #autoindex_exact_size off;
    #autoindex_localtime on;
    #location / {
         root /data/;
	     index  index.html;
    }
}
#注意:只开启1行: autoindex on;        #启用目录列表功能。
nginx -t && systemctl start nginx

#删除首页文件增加其他文件
[root@web01 conf.d]# rm -f /data/index.html 
[root@web01 conf.d]# cp /bin/ls /bin/cp /data
[root@web01 conf.d]# curl -H host:mirrors.etiantian.org 10.0.0.7
<html>
<head><title>Index of /</title></head>
<body>
<h1>Index of /</h1><hr><pre><a href="../">../</a>
<a href="cp">cp</a>                                      02-Jul-2030 02:15               155176
<a href="ls">ls</a>                                      02-Jul-2030 02:15              117608
</pre><hr></body>
</html>
###可以看到目录下列表了。可以使用浏览器解析,访问查看。

4)最终结果和阿里云的镜像对比
在这里插入图片描述

5.实际场景案例:模拟搭建阿里云镜像站及yum仓库

[root@web01 ~]# gzip /etc/nginx/conf.d/mirrors.etiantian.org.conf
[root@web01 ~]# cat /etc/nginx/conf.d/mirrors.etiantian.org.conf
server {
    listen 80;
    server_name mirrors.etiantian.org;
    charset utf-8;
    root /data;   #正常站点目录
    location / {
        index index.html; #阿里云镜像首页
    }
    #yum仓库目录
    location /centos/ {
    autoindex on;
    autoindex_exact_size off;
    autoindex_localtime on;
    }
}
#首页文件
[root@web01 conf.d]# cat /data/index.html 
<html>
<head>
<title>Welcome to oldboyedu!</title>
</head>
<body>
<h1>阿里云镜像首页</h1>
<p><em>Thank you for using oldboyedu阿里云.</em></p>
</body>
</html>
#测试结果

a)访问首页

[root@web01 ~]# curl -H host:mirrors.etiantian.org 10.0.0.7
[root@web01 conf.d]# curl -H host:mirrors.etiantian.org 10.0.0.7
<html>
 <head>
<title>Welcome to oldboyedu!</title>
</head>
<body>
<h1>阿里云镜像首页</h1>
<p><em>Thank you for using oldboyedu阿里云.</em></p>
</body>
</html>

b)访问镜像文件页面

[root@web01 ~]# curl -H host:mirrors.etiantian.org 10.0.0.7/centos/ # 注意结尾斜线
<html>
<head><title>Index of /centos/</title></head>
<body>
<h1>Index of /down/</h1><hr><pre><a href="../">../</a>
<a href="a.txt">a.txt</a>                                02-Jul-2030 02:33       0
<a href="b.txt">b.txt</a>                                02-Jul-2030 02:33       0
<a href="c.txt">c.txt</a>                                 02-Jul-2030 02:33      0
</pre><hr></body>
</html>

# 使用rsync同步官方源到yum仓库
[root@web01 centos]# rsync -avz rsync://rsync.mirrors.ustc.edu.cn/repo/centos/  /data/centos/
receiving incremental file list
./
2 -> 2.1
......
7 -> 7.9.2009
8 -> 8.4.2105
HEADER.html
RPM-GPG-KEY-CentOS-3
.......
RPM-GPG-KEY-CentOS-Testing-7
dir_sizes
filelist.gz

# yum仓库搭建见77期Day24内容
# 针对rpm包目录配置yum仓库及客户端repo配置。

6.nginx中文乱码解决方案

1)Nginx配置文件server里加charset utf-8;
解决目录列表下的名字乱码

2)中文的文件内容utf-8格式(notepad++>格式>转为utf-8编码)。
解决文件内容中文乱码

7.Nginx访问控制功能

实现nginx访问控制主要有两个模块:

  • 基于来源IP访问控制,即 ngx_http_access_module模块。
  • 基于使用用户密码登录 ,即ngx_http_auth_basic_module模块。

7.1 ngx_http_access_module模块

允许限制对某些客户端地址的访问。
访问策略:
通过来源IP地址限制

	1:允许10.0.0.7和10段访问,其他全部拒绝。
	
    allow 10.0.0.7;        #允许单个IP地址
    allow 10.0.0.0/24;     #允许地址或地址段
    deny all;	           #拒绝所有
	
	2:拒绝10.0.0.7或10段访问,其他全部允许。
    deny 10.0.0.7;      #拒绝指定的地址或地址段
    deny 10.0.0.0/24;      #拒绝指定的地址或地址段
    allow all;          #允许所有的地址

测试配置:

[root@web01 conf.d]# cat mirrors.etiantian.org.conf.03 
server {
    listen 80;
    server_name mirrors.etiantian.org;
    charset utf-8;
    root /data;   #正常站点目录
location / {
    index index.html; #阿里云镜像首页
}

#yum仓库目录
location /centos/ {
    autoindex on;
    autoindex_exact_size off;
    autoindex_localtime on;
    #allow 10.0.0.7;        #允许单个IP地址
    #allow 10.0.0.0/24;     #允许地址或地址段
    #deny all;	            #拒绝所有
  
    #deny 10.0.0.7;         #拒绝指定的地址或地址段
    #deny 10.0.0.0/24;      #拒绝指定的地址或地址段
    #allow all;             #允许所有的地址
}
 location /admin/ {           #网站后台,先进行办公源地址访问。
    allow 10.0.0.7;           #允许指定的地址或地址段
    deny all;                 #拒绝所有的地址
    }
}

注意:deny和allow的顺序是有影响的
默认情况下,从第一条规则进行匹配
如果匹配成功,则不继续匹配下面的内容。
如果匹配不成功,则继续往下寻找能匹配成功的内容。

生产场景:
网站后台限制,允许源IP访问。
#在办公室还是公网访问

location /admin/ {
        allow 10.0.0.7;           #允许指定的地址或地址段,办公室出口IP。
        deny all;                 #拒绝所有的地址
    }
# 回家登录vpn,属于局域网内部访问,然后在访问172.16.1.7/admin。

局限性:

在这里插入图片描述

在nginx反向代理后面的节点机器,如何获取最终网站用户客户端机器的IP?

解答:x_forwarded_for

在这里插入图片描述

7.2 ngx_http_auth_basic_module模块

基于用户名和密码限制
#使用htpaaswd创建新的密码文件, -c创建新文件 -b允许命令行输入密码

[root@oldboy ~]# yum install httpd-tools -y
[root@web01 conf.d]# rpm -ql httpd-tools
/usr/bin/ab   #压测工具
/usr/bin/htpasswd  #生成密码工具
[root@oldboy ~]# htpasswd -b -c /etc/nginx/auth_pass oldboy 123456
[root@web01 conf.d]# cat /etc/nginx/auth_pass
oldboy:$apr1$Cpuo1Dul$pE1Fh8KKf8OiP9SDCF0Xj.

#配置文件

[root@web01 conf.d]# cat mirrors.etiantian.org.conf
server {
    listen 80;
    server_name mirrors.etiantian.org;
    charset utf-8;
    root /data;   #正常站点目录
location / {
    index index.html; #阿里云镜像首页
}
#yum仓库目录
location /centos/ {
    autoindex on;
    autoindex_exact_size off;
    autoindex_localtime on;
}
 location /admin/ {           #网站后台,先进行办公源地址访问。
    #用户名密码验证
    auth_basic "oldboyedu Auth access";
    auth_basic_user_file /etc/nginx/auth_pass;
    }
}

生产场景用途说明及扩展
1.网站后台(结合LDAP统一认证,活动目录域控制),
邮箱、服务器、SVN、GIT、openvpn、PC密码、wiki、wify。
入职后HR开邮箱,一套用户、密码走遍公司。用户角色和权限是分离的。权限归属各部门负责。
www.baidu.com搜 ”ldap 老男孩“,获取老男孩老师讲解此部分内容。

2.ngx_http_auth_basic_module局限性
1)用户信息依赖文件
2)操作管理机械,效率低
解决方式:
1)nginx结合LUA实现高效验证
2)nginx配合LDAP打通,利用nginx-auth-ldap模块

8.Nginx请求限制、并发限制、限速3个模块

1.Nginx请求数、并发连接及下载速度限制主要有三个模块:

  • 请求数频率限制:
    限制某个客户端在单位时间内同时访问的Http请求数,
    由ngx_http_limit_req_module实现。
  • 并发连接频率限制:
    限制同一时间的并发数,使用ngx_http_limit_conn_module实现。
  • 下载限速:
    限制客户端下载资源的速度,使用ngx_http_core_module实现

ngx_http_limit_req_module模块: #limit_req 限制请求
用于限制每一个定义的密钥的请求的处理速率,特别是从一个单一的IP地址的请求的处理速率。限制是使用“泄漏桶”方法完成的

1.什么是限速?
限速分为两类,
1)限制某个客户端在单位时间内同时访问的Http请求数,
2)限制客户端的下载速度

2.限速方式方法
请求数限制:limit_req
限制某个客户端在单位时间内同时访问的Http请求数,由ngx_http_limit_req_module实现。
连接限制:limit_conn
限制同一时间的并发数,使用ngx_http_limit_conn_module实现。
下载限速:
限制客户端下载资源的速度,使用ngx_http_core_module实现

3.限速的原理
网络传输中常用两个的流量控制算法:漏桶算法令牌桶算法。这里的限制是使用“泄漏桶”方法实现的

漏桶算法(leaky bucket)

漏桶算法(leaky bucket)算法思想如图所示:

在这里插入图片描述

漏桶算法说明:

  • 水(请求)从上方倒入水桶,从水桶下方流出(被处理);
  • 来不及流出的水存在水桶中(缓冲队列),慢慢以固定速率流出;
  • 水桶满后水溢出(丢弃请求)

这个算法的核心是:缓存请求、勾速处理、多余请求直接丢弃。

请求限制(limit_req)

limit_req_zone $binary_remote_addr zone=req_one:10m rate=1r/s;
# 定义限制的关键字[$binary_remote_addr],用户来源的IP地址
# 定义内存区域,名称为one,大小10m
# 定义速率每秒处理1个请求。

实测配置:

# http标签段定义请求限制, rate限制速率,限制一秒钟最多一个IP请求
[root@web01 conf.d]# cat mirrors.etiantian.org.conf
limit_req_zone $binary_remote_addr zone=req_one:10m rate=1r/s;  #这个放此处即可
server {
    listen 80;
    server_name mirrors.etiantian.org;
    charset utf-8;
    root /data;   #正常站点目录
location / {
    index index.html; #阿里云镜像首页
    }

#yum仓库目录
location /centos/ {
    autoindex on;
    autoindex_exact_size off;
    autoindex_localtime on;
    limit_req zone=req_one burst=5 nodelay;
   # 请求超过1r/s,剩下的将被延迟处理,请求数超过burst定义的数量,则返回503
    }
 location /admin/ {           #网站后台,先进行办公源地址访问。
    auth_basic "oldboyedu Auth access";
    auth_basic_user_file /etc/nginx/auth_pass;
    }
}
#burst与nodelay
#通过设置burst参数,可以允许Nginx缓存处理一定程度的突发,多余的请求可以先放到队列里,慢慢处理,这起到了平滑流量的作用。但是如果队列设置的比较大,请求排队的时间就会比较长,这对用户很不友好。

#有什么解决办法呢?nodelay参数允许请求在排队的时候就立即被处理,也就是说只要请求能够进入burst队列,就会立即被后台worker处理,请注意,这意味着burst设置了nodelay时,系统瞬间的QPS可能会超过rate设置的阈值。nodelay参数要跟burst一起使用才有作用。

9.补充源码

# 01_test.etiantian.org.conf
server{
	listen 80;
	server_name _default;
	return 404;
}

server {
    listen       80;
    server_name  test.etiantian.org;
    charset        utf-8;
    location / {
        root   /usr/share/nginx/html/test;
        index  index.html index.htm;
    }
}

# 02_game.etiantian.org.conf
server {
    listen       80;
    server_name  game.etiantian.org etiantian.org;
    charset        utf-8;
    location / {
        root   /usr/share/nginx/html/game;
        index  index.html index.htm;
    }
}

# mirrors.etiantian.org.conf
server {
    listen 80;
    server_name mirrors.etiantian.org;
    charset utf-8;
    root /data;   #正常站点目录

    location / {
        index index.html; #阿里云镜像首页
    }

    #yum仓库目录
    location /centos/ {
        autoindex on;
        autoindex_exact_size off;
        autoindex_localtime on;
        #allow 10.0.0.7;        #允许单个IP地址
        #allow 10.0.0.0/24;     #允许地址或地址段
        #deny all;	           #拒绝所有
      
        #deny 10.0.0.7;      #拒绝指定的地址或地址段
        #deny 10.0.0.0/24;      #拒绝指定的地址或地址段
        #allow all;          #允许所有的地址
   
    }
     location /admin/ {           #网站后台,先进行办公源地址访问。
        #用户名密码验证
        auth_basic "oldboyedu Auth access";
        auth_basic_user_file /etc/nginx/auth_pass;
        #来源IP限制
        #allow 10.0.0.7;           #允许指定的地址或地址段
        #deny all;                 #拒绝所有的地址
    }
}

# mirrors.etiantian.org.conf.01
server {
    listen 80;
    server_name mirrors.etiantian.org;
    charset utf-8;
    autoindex on;
    autoindex_exact_size off;
    autoindex_localtime on;
    
    location / {
        root /data/;
	index  index.html;
    }
}

# mirrors.etiantian.org.conf.02
server {
    listen 80;
    server_name mirrors.etiantian.org;
    charset utf-8;
    root /data;   #正常站点目录

    location / {
        index index.html; #阿里云镜像首页
    }

    #yum仓库目录
    location /centos/ {
        autoindex on;
        autoindex_exact_size off;
        autoindex_localtime on;
    }
}

# mirrors.etiantian.org.conf.03
server {
    listen 80;
    server_name mirrors.etiantian.org;
    charset utf-8;
    root /data;   #正常站点目录

    location / {
        index index.html; #阿里云镜像首页
    }

    #yum仓库目录
    location /centos/ {
        autoindex on;
        autoindex_exact_size off;
        autoindex_localtime on;
        #allow 10.0.0.7;        #允许单个IP地址
        #allow 10.0.0.0/24;     #允许地址或地址段
        #deny all;	           #拒绝所有
      
        #deny 10.0.0.7;      #拒绝指定的地址或地址段
        #deny 10.0.0.0/24;      #拒绝指定的地址或地址段
        #allow all;          #允许所有的地址
   
    }
     location /admin/ {           #网站后台,先进行办公源地址访问。
        allow 10.0.0.7;           #允许指定的地址或地址段
        deny all;                 #拒绝所有的地址
    }
}
  • 23
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值