Nginx模块
1.目录索引
目录索引模块
Module ngx_http_autoindex_module
Nginx默认不允许列出整个目录浏览下载
location / {
autoindex on;
}
Syntax: autoindex on | off;
Default:
autoindex off;
Context: http, server, location
# autoindex常用参数
autoindex_exact_size on;
默认为on,显示的文件的确切大小,单位是bytes。
修改为off,显示的文件的大概大小,单位是kb或者mb或者GB。
autoindex_localtime on | off;
默认为off,显示的文件时间为GMT时间
修改为on,显示的文件时间为文件的服务器时间
charset utf-8,gbk;
默认中文目录乱码,添加上解决乱码
例子:
location /images {
root /usr/local/www/htdocs;
autoindex on;
charset utf-8;
autoindex_exact_size off;
autoindex_localtime on;
}
Nginx监控模块
ngx_http_stub_status_module
stub_statis;
location /nginx {
stub_status;
}
Active connections: 2
server accepts handled requests
170 170 157
Reading: 0 Writing: 1 Waiting: 1
Active connections 当前活动的连接数
accepts 当前的总连接数TCP
handled 当前成功的连接数TCP
requests 总的http请求数
注意:
1)如果使用restart重置访问,会清空所有的连接数
2)reload重载不会清空之前的连接数
3)通过状态监控,可以验证区分长连接和短连接
vim nginx.conf
keepalive_timeout 0;讲长连接变为短连接
nginx访问控制
1.Nginx基于IP的访问控制 ngx_http_access_module
允许配置语法
Syntax: allow address | CIDR | unix: | all;
Default: —
Context: http, server, location, limit_except
拒绝配置语法
Syntax: deny address | CIDR | unix: | all;
Default: —
Context: http, server, location, limit_except
访问控制规则查看流程:
从上往下,依次匹配,满足就停止
企业中反问控制的思路:
先写允许,默认拒绝所有
allow 125.120.226.74;
deny all;
先写拒绝,默认允许所有
2.基于用户登录认证 ngx_http_auth_basic_module
//配置语法
Syntax: auth_basic string | off;
Default:
auth_basic off;
Context: http, server, location, limit_except
//用户密码记录配置文件
Syntax: auth_basic_user_file file;
Default: —
Context: http, server, location, limit_except
//需要安装依赖组件
yum install httpd-tools
htpasswd -b -c /etc/nginx/auth_conf xu 123456
配置文件书写:
auth_basic "请输入账户密码!";
auth_basic_user_file /etc/nginx/.auth_conf;
Nginx访问限制
经常会遇到这种情况,服务器流量异常,负载过大等等。对于大流量恶意的攻击访问,会带来带宽的浪费,服务器压力,影响业务,往往考虑对同一个ip的连接数,并发数进行限制。
ngx_http_limit_conn_module 模块可以根据定义的key来限制每个键值的连接数,如同一个ip来源的连接数。
limit_conn_module 连接频率限制
limit_req_module 请求频率限制
http请求建立在一次TCP连接基础上,一次TCP连接至少产生一次HTTP请求。
Nginx连接限制配置实战:
1)Nginx连接限制语法
Syntax: limit_conn_zone key zone=name:size;
Default: —
Context: http
Syntax: limit_conn zone number;
Default: —
Context: http, server, location
示例:
limit_conn_zone $binary_remote_addr zone=addr:10m;
server {
location /download/ {
limit_conn addr 1;
}
变量:$binary_remote_addr 变量的长度是固定的4字节
$remote_addr 变量的长度是7-15字节
一个ip地址=32bit=4字节
2)Nginx请求限制语法
Syntax: limit_req_zone key zone=name:size rate=rate [sync];
Default: —
Context: http
Syntax: limit_req zone=name [burst=number] [nodelay | delay=number];
Default: —
Context: http, server, location
示例:
limit_req_zone $binary_remote_addr zone=perip:10m rate=1r/s;
limit_req zone=perip;
压力测试:
ab -n 50 -c(并发) 20 访问链接
ab -n 50 -c 20 http://127.0.0.1/index.html
日志模块:
可以在不同的server中写入不同的log文件用来保存日志文件。
Nginx有非常灵活的日志记录模式。每个级别的配置都可以由各自独立的访问日志。日志格式通过log_format命令定义格式。
使用log_format自定义日志格式
Nginx预定义了名为combined日志格式,如果没有明确指定日志格式默认使用该格式:
log_format combined '$remote_addr - $remote_user [$time_local] '
'"$request" $status $body_bytes_sent '
'"$http_referer" "$http_user_agent"';
85.119.151.252 - - [16/Apr/2020:14:58:21 +0800] "POST http://check.best-proxies.ru/azenv.php?s=158702030011382PC201849796308080 HTTP/1.1" 404 153 "https://best-proxies.ru/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:65.0) Gecko/20100101 Firefox/65.0" "-"
变量 含义
$bytes_sent 发送给客户端的总字节数
$body_bytes_sent 发送给客户端的字节数,不包括响应头的大小
$connection 连接序列号
$connection_requests 当前通过连接发出的请求数量
$msec 日志写入时间,单位为秒,精度是毫秒
$pipe 如果请求是通过http流水线发送,则其值为"p",否则为“."
$request_length 请求长度(包括请求行,请求头和请求体)
$request_time 请求处理时长,单位为秒,精度为毫秒,从读入客户端的第一个字节开始,直到把最后一个字符发送张客户端进行日志写入为止
$status 响应状态码
$time_iso8601 标准格式的本地时间,形如“2017-05-24T18:31:27+08:00”
$time_local 通用日志格式下的本地时间,如"24/May/2017:18:31:27 +0800"
$http_referer 请求的referer地址。
$http_user_agent 客户端浏览器信息。
$remote_addr 客户端IP
#$http_x_forwarded_for 当前端有代理服务器时,设置web节点记录客户端地址的配置,此参数生效的前提是代理服务器也要进行相关的x_forwarded_for设置。
$request 完整的原始请求行,如 "GET / HTTP/1.1"
$remote_user 客户端用户名称,针对启用了用户认证的请求
$request_uri 完整的请求地址,如 "https://daojia.com/"
Nginx虚拟主机(站点)
所谓虚拟主机,及在一台服务器上配置多个网站
实现虚拟主机方式:
基于ip
不同ip
基于端口
相同的ip,不同的端口
基于域名
相同的ip,系统的端口,不同的域名
示例1基于IP的虚拟主机
1)创建目录
创建不同的目录
2)创建对应的配置文件
vim /etc/nginx/conf.d/www.conf
server{
listen 120.121.120.12:80;
server_name
location / {
root /usr/local/www
}
}
server{
listen 120.121.120.13:80;
server_name
location / {
root /usr/local/www1
}
}
基于端口的:
vim /etc/nginx/conf.d/www.conf
server{
listen 80;
server_name www.test1.com;
location / {
root /usr/local/www
}
}
server{
listen 81;
server_name www.test2.com;
location / {
root /usr/local/www1
}
}
hosts解析:
120.79.213.171 www.test.com www.test1.com
http://www.test.com:82/
http://www.test1.com:81/
Nginx Location
使用Nginx Location可以控制访问网站的路径,但一个server可以有多个location配置,多个location的优先级该如何区分。
1.location语法示例
location [=|~|~*|^~] /uri/ { … }
location匹配优先级
符号
符号 匹配规则 优先级
= 精确匹配 1
^~ 以某个字符串开头 2
# ~ 区分大小写的正则匹配 3
# ~* 不缺乏大小写的正则匹配 4
!~ 区分大小写不匹配的正则 5
!~* 不区分大小写不匹配的正则 6
# / 通用匹配,如何请求都会匹配到 7