本文主要是介绍Day53-nginx常用模块精讲-多企业案例,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
Day53-nginx常用模块精讲-多企业案例
- 1.Nginx常用模块介绍
- 2.查看Nginx加载了哪些模块
- 3.autoindex_module(目录浏览功能模块):
- 4.Nginx站点目录浏览功能配置实践
- 5.实际场景案例:模拟搭建阿里云镜像站及yum仓库
- 6.nginx中文乱码解决方案
- 7.Nginx访问控制功能
- 7.1 ngx_http_access_module模块
- 7.2 ngx_http_auth_basic_module模块
- 8.Nginx请求限制、并发限制、限速3个模块
- 9.补充源码
云原生、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; #拒绝所有的地址}
}
这篇关于Day53-nginx常用模块精讲-多企业案例的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!