Nginx目录索引
- ngx_http_autoindex_module模块处理以斜杠字符("/")结尾的请求,并生成目录列表。
- 当ngx_http_index_module模块找不到索引文件时,通常会将请求传递给目录索引模块。
用法一: 开启索引模块功能,如果index模块找不到/code目录下index.html文件时,不会报错403,会将/code目录下的目录结构生成一个目录列表传递给客户端。
cd /etc/nginx/conf.d/
vim game.conf
server {
listen 80;
server_name game.nana.com;
charset utf-8,gbk; # 解决乱码问题
location / {
root /code;
index index.html index.html;
autoindex on; # 开启目录索引模块功能,如果我们不开启索引模块会报错403
autoindex_exact_size off; # 显示文件大小(kb,M等)
}
}
mv /code/index.html /opt # 移除索引文件
systemctl restart nginx # 重启nginx服务
- 测试:
我们在浏览器中输入http://game.nana.com/时,浏览器中会显示出服务器/code目录下的目录结构。
用法二: 创建目录索引列表
cd /etc/nginx/conf.d
vim autoindex.conf
server {
listen 80;
server_name module.nana.com;
charset utf-8,gbk; # 解决乱码问题
location / {
root /module; # 我们在创建目录索引时,不需要在/module目录下创建index.html文件
autoindex on;
autoindex_exact_size off; # 显示文件大小(kb,M等)
autoindex_localtime on; # 记录本地时区(on是本地时间,off是UTC时间。UTC时间换算本地时间需要加上8个小时)
}
}
mkdir -p /module/{centos,ubuntu,redhat} # 创建目录中对应的文件
systemctl restart nginx
配置域名解析
C:\Windows\System32\drivers\etc
打开hosts文件,添加:
192.168.15.7 module.nana.com
- 测试:
我们在浏览器中输入http://game.nana.com/时,浏览器中会显示出服务器/module目录下的目录结构。
案例
- 给
http://game.nana.com/
添加一个http://game.nana.com/download/
的目录索引。
1. 创建server层配置文件,并添加目录索引列表
cd /etc/nginx/conf.d
vim game.conf
server {
listen 80;
server_name game.nana.com;
charset utf-8,gbk; # 解决乱码问题
location / {
root /code;
index index.html index.html;
}
location /download {
root /mouldle; # 将/mouldle/download目录下的目录结构生成一个目录列表
# alias /module; 忽略/download,直接将module目录下的目录结构生成一个目录列表
autoindex on; # 开启目录索引模块功能
autoindex_exact_size off; # 显示文件大小(kb,M等)
autoindex_localtime on; # 记录本地时区(on是本地时间,off是UTC时间。UTC时间换算本地时间需要加上8个小时)
}
}
2. 创建目录中对应的文件
cd /module/
mkdir download
mv centos/ redhat/ ubuntu/ download/
3. 重启nginx服务
nginx -t
systemctl restart nginx
- 测试:
我们在浏览器中输入http://game.nana.com/时,浏览器会显示/code/index.html的游戏页面
我们在浏览器输入http://game.nana.com/download/时,浏览器会显示/module/download/目录下的目录结构
Nginx状态监控
- ngx_http_stub_status_module模块是提供对基本状态信息的访问。
- 默认情况下不构建此模块,应该是要–with-http_stub_status_module 配置参数启用它。
nginx -V 查看nginx安装默认自带的模块
# --with-http_sub_module 使用yum安装的nginx默认会构建此模块,如果源码编译安装需要增加这个模块
1. 修改配置文件
vim /etc/nginx/conf.d/game.conf
server {
listen 80;
server_name game.nana.com;
charset utf-8,gbk;
location / {
root /code;
index index.html index.html;
}
location /nginx_status {
stub_status; # 启用状态监控模块,nginx状态监控模块产生的页面是官方自动生成的
}
}
2. 重启nginx服务
nginx -t
# nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
# nginx: configuration file /etc/nginx/nginx.conf test is successful
systemctl restart nginx
3. 测试
打开浏览器,输入http://game.nana.com/nginx_status,可以查看到nginx的状态页面。
- nginx 状态页面
Active connections: 2
server accepts handled requests
2 2 17
Reading: 0 Writing: 1 Waiting: 1
Active connections 当前活动客户端的连接数,包括Waiting等待连接数。
accepts 已接受总的Tcp连接数
handled 已处理总的Tcp连接数
requests 客户端总的http请求数
Reading 当前nginx读取请求头的连接数
Writing 当前nginx将响应写回客户端的连接数
Waiting 当前等待请求的空闲客户端连接数
注意:一次Tcp的连接,可以发起多次http的请求,如下参数可配置进行验证
vim /etc/nginx/nginx.conf
keepalive_timeout 0; 类似于关闭长连接
keepalive_timeout 65; 65s没有活动则断开连接
Nginx访问控制
基于IP的访问控制
- ngx_http_access_module模块允许限制对某些客户端地址的访问
vim /etc/nginx/conf.d/game.conf
1. 拒绝指定的IP访问该网站的/nginx_status,其他的IP全部允许访问
location /nginx_status {
stub_status;
deny 192.168.15.7/24; # 拒绝192.168.15.7访问
allow all; # 允许所有的地址访问
}
2. 只允许指定的来源IP能访问/nginx_status,其他的网段全部拒绝
location /nginx_status {
stub_status;
allow 192.168.15.7/24; # 允许192.168.15.7访问
deny all; # 拒绝所有的地址访问
}
3. 实际在配置监控Nginx状态时,仅允许该服务的回环地址访问127.0.0.1
server {
listen 80;
server_name game.nana.com;
charset utf-8,gbk;
location / {
root /code;
index index.html index.html;
}
location /nginx_status {
stub_status;
allow 127.0.0.1; # 允许本地回环地址访问
deny all; # 拒绝所有访问
}
}
基于用户密码的访问控制
- ngx_http_auth_basic_module模块允许使用HTTP基本身份验证,验证用户名和密码来限制对资源的访问。
1. 生成一个密码文件,密码文件的格式 name:password(密码必须是加密的密文形式)
- 建议使用htpasswd命令,创建用户,生成加密密码
yum -y install httpd-tools
htpasswd -c -b /etc/nginx/auth_conf nana 123 # 创建一个nana:123的密码文件写入/etc/nginx/auth_conf文件中
# Adding password for user nana
cat /etc/nginx/auth_conf
# nana:$apr1$piy5/bQK$SM2n8SakYVk8KmTV0XSoF.
2. 配置Nginx,限制对应的资源
server {
listen 80;
server_name game.nana.com;
charset utf-8,gbk;
location / {
root /code;
index index.html index.html;
auth_basic "please password!!!";
auth_basic_user_file /etc/nginx/auth_conf; # 保存密码的路径(写绝对路径,相对路径(auth_conf)都可以)
}
location /nginx_status {
stub_status;
auth_basic "please password!!!";
auth_basic_user_file /etc/nginx/auth_conf; # 保存密码的路径(写绝对路径,相对路径(auth_conf)都可以)
}
}
- 测试
这样配置好之后,我们在浏览器访问http://game.nana.com/或者http://game.nana.com/nginx_status时,
需要输入先输入用户名和密码才能访问到对应的网站。
Nginx访问限制
经常会遇到这种情况,服务器流量异常,负载过大等等。对于大流量恶意的攻击访问,会带来宽带的浪费,服务器压力,影响业务,往往考虑对同一个ip的连接数,请求数,进行限制。
连接限制(限制Tcp协议)
- ngx_http_limit_conn_module模块对于限制定义key的连接数,特别是来自单个IP地址的连接数。并非所有的连接都被计算在内,仅当连接已经读取了整个请求头时才计算连接。
1. 定义连接限制
vim /etc/nginx/nginx.conf
http {
...
limit_conn_zone $binary_remote_addr zone=addr:10m;
# 开辟一个新的空间,空间里面都时存储的一些ip地址,空间名字叫addr,分配10M的空间。
...
}
2. 调用连接限制
vim /etc/nginx/conf.d/game.conf
server {
location / {
...
# 同一个时刻只允许一个客户端连接
limit_conn addr 1; # 限制addr空间里面的ip地址,同一个时刻只允许一个客户端连接
...
}
}
- 测试
在同一个时刻同时用多个客户端去访问该服务器IP地址,只能有一个连接上,其他客户端的访问请求连接,都会默认返回503。
请求限制(限制Http协议)
- ngx_http_limit_req_module模块对于限制定义key的请求的处理速率,特别单一的IP地址的请求的处理速率。
1. 定义请求限制
vim /etc/nginx/nginx.conf
http {
...
limit_req_zone $binary_remote_addr zone=req_zone:10m rate=1r/s;
# 开辟一个新的空间,空间里面都时存储的一些ip地址,空间名字叫req_zone,分配10M的空间,请求的速率为每秒1个请求。
...
}
2. 调用请求限制
vim /etc/nginx/conf.d/game.conf
server {
location / {
...
# 连接成功的客户端,每秒钟只处理一个请求
limit_req zone=req_zone burst=5 nodelay;
# 限制req_zone空间里面的ip地址,请求的速度为每秒钟1个请求。允许延迟处理的请求个数为5,来不及处理的其他请求直接返回错误。
# burst(允许延迟处理的请求个数) nodelay(直接拒绝来不及处理的请求,默认返回503)
limit_req_status 412;
# 将来不及处理请求(默认的响应状态码)503改成412。
...
}
}
- 压力测试
ab -n 50 -c 20 http://192.168.15.7/download/ 总共发起50个请求(-n), 同时并发20个请求(-c)
# Complete requests: 50 总共发起了50个请求
# Failed requests: 44 没有处理的请求有44个
请求限速,如果请求数超过1,则后续全拒绝,会出现412的状态码,412的状态码会被error_page接收。
error_page接收到412状态码后,会将 /code/error.html
文件的内容输出在浏览器上。
1. 修改配置文件
vim /etc/nginx/conf.d/game.conf
limit_req_zone $binary_remote_addr zone=req_zone:10m rate=1r/s;
server {
listen 80;
server_name game.nana.com;
charset utf-8,gbk;
limit_req zone=req_zone burst=5 nodelay;
limit_req_status 412;
error_page 412 /error.html; # 文件必须要存在,如果不存在则报错404
# 注意/error.html指向第一个location /(/code/error.html),后续所有的412报错,都指向第一个/code/error.html。
location / {
root /code;
index index.html index.html;
}
location /download {
root /module; # 如果我们在/module/download目录下也创建error.html,是无法生效的
autoindex on;
autoindex_exact_size off;
}
}
2. 编辑输出在浏览器的内容
echo "你能慢一点吗,这谁顶得住!" > /code/error.html
- 测试
我们在浏览器输入http://game.nana.com/或者http://game.nana.com/download/,快速刷新,会显示"你能慢一点吗,这谁顶得住!"
- 请求限制与连接限制的差别
HTTP协议是建立在TCP协议基础之上的。假设我们同一时刻只允许一个客户端通过TCP协议连接至客户端,但是连接成功的客户端可以通过HTTP向服务端发起多次请求。所以我们对请求限制,会比对连接的限制更加的有效。
我们在实际工作中,大部分对访问的限制都是使用请求限制。
Nginx Location
使用Nginx Location可以控制访问网站的路径,一个server可以有多个location配置,多个location的优先级该如何区分??
- location匹配符
匹配符 匹配规则 优先级
= 精确匹配 1
^~ 以某个字符串开头 2
~ 区分大小写的正则匹配 3
~* 不区分大小写的正则匹配 4
!~ 区分大小写不匹配的正则 5
!~* 不区分大小写不匹配的正则 6
/ 通用匹配,任何请求都会匹配到 7
- 优先级测试
1. 创建配置文件
vim /etc/nginx/conf.d/test.conf
server {
listen 80;
server_name test.com;
location / {
default_type text/html;
return 200 "location /";
}
location = / {
default_type text/html;
return 200 "location =/";
}
location ~ / {
default_type text/html;
return 200 "location ~/";
}
}
2. 配置域名解析
C:\Windows\System32\drivers\etc
打开hosts文件,添加:
192.168.15.7 test01.com
- 测试
我们打开浏览器输入http://test.com/,通过测试可以得出
优先级: =/ 优先于 ~/ 优先于 /
- location应用场景
通用匹配,任何请求都会匹配到
location / {
...
}
严格区分大小写,匹配以.php结尾的都走这个location
location ~ \.php$ {
...
}
严格区分大小写,匹配以.jsp结尾的都走这个location
location ~ \.jsp$ {
...
}
不区分大小写匹配,只有用户访问.jpg\.gif\.png\.js\.css结尾的都走这个location
location ~* .*\.(jpg|gif|png|js|css)$ {
...
}
不区分大小写匹配
location ~* "\.(sql|bak|tgz.gz|git)$" {
...
}