- 1. Nginx目录索引
- nginx配置文件
[root @web01 mirror]#cat /etc/nginx/conf.d/mirror.oldhou.com.conf
- 2. Nginx访问控制
- @web01 mirror]#
cat /etc/nginx/conf.d/mirror.oldhou.com.conf
">nginx配置文件
[root@web01 mirror]#cat /etc/nginx/conf.d/mirror.oldhou.com.conf
- 3.Nginx的限流限速
- 综合案例
- nginx配置文件
[root @web01 mirror]#cat /etc/nginx/conf.d/limit.oldhou.com.conf
- 4. 状态模块
- *5. Location匹配—-优先级
- 添加/,默认上/test目录下寻找index.html文件,如果没有index.html 则会直接返回403
- 6. nginx日志
- 我们更希望能将此页面保存为HTML,然后通过浏览器访问,那么我们则需要配置日志格式
mkdir /code/log
goaccess -f /var/log/nginx/access.log -o /code/log/index.html -p /etc/goaccess/goaccess.conf --real-time-html &
查看nginx加载了哪些模块: [root@web01 ~]# nginx -V
1. Nginx目录索引
1.1 实现目录浏览下载功能
实战模拟搭建企业内网YUM仓库( 生产 )
——> 详细搭建过程
nginx配置文件
[root@web01 mirror]# cat /etc/nginx/conf.d/mirror.oldhou.com.conf
server {
listen 80;
server_name mirror.oldxu.com;
charset utf-8; #设置中文字符集
root /mirror; #全局设置路径
location / { #这里的 / 其实就是一个相对(/mirror)路径
index index.html; #提供yum源的仓库
location /repo {
autoindex on; #打开目录浏览功能!!!!
autoindex_exact_size off; #关闭字节显示(会以MB的方式显 示)
autoindex_localtime on;
#打开会显示文件上传的本地的时间(默认格林威治时间-8h)
}
}
拉取资源同步至本地
[root@web01 mirror]# rsync -avz rsync://rsync.mirrors.ustc.edu.cn/repo/centos/ /mirror/repo/
——> 可配置定时任务 定时跟新源
2. Nginx访问控制
2.1 基于来源的IP实现访问控制
仅允许哪些IP可以访问
拒绝某个IP访问,其他IP都可以 正常访问
注意:deny和allow的顺序是有 影响的。 默认情况下从第一条规则开始匹配 如果匹配成功,检查规则是允许还是拒绝。但不在继续匹配下面的内容 如果匹配不成功,则继续往下匹配。
nginx配置文件
[root@web01 mirror]# cat /etc/nginx/conf.d/mirror.oldhou.com.conf
server {
listen 80;
server_name mirror.oldxu.com;
charset utf-8;
location / {
root /mirror;
index index.html;
}
location /repo {
root /mirror/yum;
autoindex on;
allow 10.0.0.1/32; #10.0.0.100 规则匹配不成功,继续往下匹配
allow 10.0.0.100/32; #10.0.0.100 规则匹配成功,动作,放行,结束匹配。
deny all; #放行其他用户
}
}
测试 curl -H http://mirror.oldhou.com 172.16.1.62 以上配置公司里可以配合VPN使用,管理员在家连接网站后台
2.2 基于用户名和密码的访问控制
① 准备一个密码文件
[root@web01 mirror]# yum install httpd-tools -y
(安装阿帕奇工具包以便生成密码)
[root@web01 mirror]# htpasswd -cb /etc/nginx/auth_pass 【用户xxx】 【密码xxx】
-c创建 -b命令行 创建密码
② 给mirror.oldhou.com/repo的url 添加用户密码认证
#nginx配置文件
[root@web01 mirror]# cat /etc/nginx/conf.d/mirror.oldhou.com.conf
server {
listen 80;
server_name mirror.oldxu.com;
charset utf-8;
root /mirror;
location / {
index index.html;
}
location /repo {
autoindex on;
autoindex_exact_size off;
autoindex_localtime on;
auth_basic "hello"; #密码框上边提示站点信息
auth_basic_user_file "/etc/nginx/auth_pass"; #密码文件位置
}
}
报错处理: 查看root / 站点目录 是否是server层。 否则只有一个uri生效,其他报404错误。
3.Nginx的限流限速
作用于http层
3.1 请求限制
(limit_req_module)
[root@web01 mirror]# cat /etc/nginx/conf.d/limit.oldhou.com.con
limit_req_zone $binary_remote_addr zone=req_one:10m rate=1r/s;
#开辟一个区域 针对的来源的IP地址 zone区域名称,大小10M,处理速度1个请求/s
server {
listen 80;
server_name limit.oldxu.com;
limit_req zone=req_one burst=3 nodelay;
#请求超过1r/s频次的,剩下的将被延迟处理,请求数超过burst定义的数量,则返回503
location / {
root /limit;
index index.html;
}
}
压测工具的使用:( 及得做本地域名解析) ab -n 10 -c2 -HHost’域名’ http://IP地址/
3.2 tcp连接、下载速度、访问限制
(limit_conn_module)、 core_module
[root@web01 mirror]# cat /etc/nginx/conf.d/limit.oldhou.com.conf
limit_conn_zone $binary_remote_addr zone=conn_od:10m;
#连接限制 针对的是来源的IP 名称叫conn_od定义了一个10m内存空间
server {
listen 80;
server_name limit.oldxu.com;
limit_conn conn_od 2;
limit_rate_after 100m; #100M后开始限速 (迅雷)
limit_rate 200k; #限速
location / {
root /limit;
}
}
综合案例
限制web服务
请求评率被限制原理
请求频率限速原理:倒入水的会被漏掉(请求被处理)多余的水 会在水桶等待漏掉(等待数据处理)多余的水会满出来(请求会被丢掉)
器请求数处理为1秒一个,触发值为5、 #请求限制
限制用户仅可同时下载一个文件。 #连接限制
当下载超过100M则限制下载速度为500k。如果同时下载超过2个视频,则返回提示 “请联系oldhou进行会员充值”。
nginx配置文件
[root@web01 mirror]# cat /etc/nginx/conf.d/limit.oldhou.com.conf
limit_req_zone $binary_remote_addr zone=req_one:10m rate=1r/s;
limit_conn_zone $binary_remote_addr zone=conn_od:10m;
server {
listen 80;
server_name limit.oldxu.com;
charset utf-8;
limit_req zone=req_one burst=5 nodelay; #请求限制
limit_conn conn_od 1; #连接限制
limit_rate_after 100m; #100m不限速
limit_rate 500k; #限速500k
location / {
root /limit;
index index.html;
}
#异常页面捕捉
error_page 503 @pay; #错误接收 @是一个特殊的重定向跳转自定义uri
location @pay {
default_type text/html;
return 200 '请联系oldxu充值,联系qq:xxxxx';
}
}
http,server,location 层 具体具体配置在那一层,需要还要看需求 http:多个网站作配置生效 server: 整个页面做配置生效 localtion 指定的页面座配置生效
4. 状态模块
监控Nginx连接 监控Nginx请求 模拟长连接和短连接效果
server {
...
location /status { #开启Nginx的状态监控
stub_status;
}
...
}
*4.1 开启Nginx的状态监控(取值用于zabbix监控)
浏览器访问: http://mirror.oldhou.com/status
--->>
Active connections: 1
server accepts handled requests
3 3 39
Reading: 0 Writing: 1 Waiting: 0
提供以下状态信息7种状态指标含义
状态 | 含义 |
---|---|
Active connections | 当前活跃连接数,包括Waiting等待连接数。 |
accepts | 已接收的总TCP连接数量。 |
handled | 已处理的TCP连接数量。 |
requests | 当前总http请求数量。 |
Reading | 当前读取的请求头数量。 |
Writing | 当前响应的请求头数量。 |
Waiting | 当前等待请求的空闲客户端连接数 |
*5. Location匹配—-优先级
5.1 location匹配规则
# 匹配规则(匹配路径uri) | 优先级 |
---|---|
= 精确匹配 | 1 必须是百分百匹配 |
^~ 以某个字符串开头 | 2 |
~ 区分大小写的正则匹配 | 3 |
~* 不区分大小写的正则匹配 | 4 |
/ 通用匹配,任何请求都会匹配到 | 5 |
整不好就404了
官方文档:
The “/” request will match configuration A, the “/index.html” request will match configuration B the “/documents/document.html” request will match configuration C, the “/images/1.gif” request will match configuration D, the “/documents/1.jpg” request will match configuration E.
[root@web01 conf.d]# cat /etc/nginx/conf.d/location2.oldhou.com.conf
server {
listen 80;
server_name location2.oldhou.com;
# 通用匹配,任何请求都会匹配到
location / {
root html;
index index.html;
}
# 精准匹配,必须请求的uri是/nginx_status
location = /nginx_status {
stub_status;
}
# 严格区分大小写,匹配以.php结尾的都走这个location xx.com/1.php
location ~ \.php$ {
default_type text/html;
return 200 'php访问成功';
}
# 严格区分大小写,匹配以.jsp结尾的都走这个location
location ~ \.jsp$ {
# \ 转义符 点是特殊字符
default_type text/html;
return 200 'jsp访问成功';
}
# 不区分大小写匹配,只要用户访问.jpg,gif,png,js,css 都走这条location
location ~* \.(jpg|gif|png|js|css)$ {
return 403;
}
# 不区分大小写匹配
location ~* \.(sql|bak|tgz|tar.gz|.git)$ {
deny all;
}
}
测试
一:
curl -H Host:location.etiantian.org http://10.0.0.7/index.html
curl -H Host:location.etiantian.org http://10.0.0.7/documents/document.html
curl -H Host:location.etiantian.org http://10.0.0.7/images/1.gif
curl -H Host:location.etiantian.org http://10.0.0.7/documents/1.jpg
二:
curl -H Host:location2.etiantian.org http://10.0.0.7/test.php
curl -H Host:location2.etiantian.org http://10.0.0.7/test.jsp
curl -H Host:location2.etiantian.org http://10.0.0.7/1.jpg
curl -H Host:location2.etiantian.org http://10.0.0.7/dadasdas/dsadsa/dsadsa/1.jpg
curl -H Host:location2.etiantian.org http://10.0.0.7/dadasdas/dsadsa/dsadsa/1.sql
6.2 location优先级参考6.1表格
6.3 location @ 内部重定向
error_page 404 403 401 @err;
location @err {
default_type text/html;
return 200 '你可能是不小心走丢了。';
} #将错误404,403,401统一跳转一个页面
6.4 location uri 添加 / 和不添加 / 的区别?
#不添加/,默认上/code/test目录下找index.html文件,如果没有 index.html则会查找/code/test文件
location /test {
root /code;
index index.html;
}
添加/,默认上/test目录下寻找index.html文件,如果没有index.html 则会直接返回403
location /test/ {
root /code;
}
6. nginx日志
6.1 访问日志,错误日志,日志切割
cat /etc/nginx/nginx.conf 日志格式 log_format 访问日志 access_log 错误日志 error_log
- log_format: 定义日志格式:
关键字 变量
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
访问日志如何调用
- nginx配置文件添加:
access_log /var/log/nginx/access.log main;
$remote_addr # 记录客户端IP地址
$remote_user # 记录客户端用户名
$time_local # 记录通用的本地时间
$time_iso8601 # 记录ISO8601标准格式下的本地时间
$request # 记录请求的方法以及请求的http协议
$status # 记录请求状态码(用于定位错误信息)
$body_bytes_sent # 发送给客户端的资源字节数,不包括响应头的大小
$bytes_sent # 发送给客户端的总字节数
$msec # 日志写入时间。单位为秒,精度是毫秒。
$http_referer # 记录从哪个页面链接访问过来的
$http_user_agent # 记录客户端浏览器相关信息
$http_x_forwarded_for #记录客户端IP地址
$request_length # 请求的长度(包括请求行, 请求头和请求正文)。
$request_time # 请求花费的时间,单位为秒,精度毫秒
access_log 可以定义在 http、server、location?
每一个server都会定义一个access_log 为了区分网站的访问记录 http { access_log /var/log/nginx/access.log main; server { # access_log /var/log/nginx/log.oldxu.com.log main; } #如果某个网站不想记录日志,则可以通过如下两种方式去实现? server { access_log off; #access_log /dev/null; } }
推荐server层配置access_log方便区分每个网站的日志信息。
error_log:错误日志
error_log /var/log/nginx/error.log warn;
#几乎是所有Nginx统一的一个位置。(全局,作用于所有的网站)
如果Nginx在访问的时候没有达到你的预期,请检查错误日志,
总结:常用模块
autoindex allow、deny auth_basic limit_req limit_conn stub_status location log
6.2 goaccess基本使用
- 安装
[root@web01 ~]# yum install goaccess -y
- goaccess进行简单配置修改
[root@web01 ~]# grep "^[a-Z]" /etc/goaccess/goaccess.conf
time-format %H:%M:%S
date-format %d/%b/%Y
log-format %h %^[%d:%t %^] “%r” %s %b “%R” “%u”
- 手动测试
[root@web01 ~]# goaccess -f /var/log/nginx/access.log
- 定义一个访问goaccess的网站
- [root@web01 ~]# cat /etc/nginx/conf.d/goaccess.etiantian.org.conf
[root@web01 ~]#server { listen 80; server_name goaccess.etiantian.org; root /code/log; location / { index index.html; } }
nginx -t
[root@web01 ~]#systemctl reload nginx
我们更希望能将此页面保存为HTML,然后通过浏览器访问,那么我们则需要配置日志格式
mkdir /code/log
goaccess -f /var/log/nginx/access.log -o /code/log/index.html -p /etc/goaccess/goaccess.conf --real-time-html &
netstat -lntp
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 0.0.0.0:7890 0.0.0.0:* LISTEN 5695/goaccess