Nginx常用模块
1、Nginx目录索引
syntax:autoindex on | off;
Default: autoinde off;
Context: http,server,location
autoindex_exact_size off;
默认值on,显示出文件的确切大小,单位是bytes
修改为off,显示出文件的大概大小,单位是MB或者GB。
autoindex_localtime on;
默认值off,显示的文件时间为GMT时间。
修改为on,显示的文件时间为服务器的时间。
charset utf-8,gbk;
默认中文目录乱码,添加上解决乱码。
Examples:
[root@web02 conf.d]# vim /etc/nginx/conf.d/nfzl.conf
server {
listen 80;
server_name nfzl.com;
location / {
root /code;
index index.html;
}
location /download {
root /code;
autoindex on;
charset utf-8,gbk;
autoindex_exact_size off;
autoindex_localtime on;
}
}
2、Nginx状态监控
1)ngx_http_stub_status_moduld用于展示Nginx连接状态信息,需要--with-http_stub_status_module模块支持
Syntax: stub_status;
Default: -
Context:server,location
2) 配置Nginx status
location /nginx_status {
stub_status;
access_log off;
}
3) 使用浏览器访问http://IP/nginx_status访问后得到的结果
Active connections: 2
server accepts handled requests
2 2 2
Reading: 0 Writing: 1 Waiting: 1
Active connections: 2 #当前活动的连接数
accepts 2 #当前的总连接数TCP
handled #成功的连接数TCP
requests #总的http请求数
注意:如果使用systemctl restart nginx 会清空连接数
3、Nginx访问控制
基于IP的访问控制http_access_modul
基于用户登录认证http_auth_basic_modul
1)Nginx基于IP的访问控制
//允许配置语法
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
Examples:
示例1、拒绝192.168.1.218访问download,其他全部允许
[root@web02 conf.d]# cat nfzl.conf
server {
listen 80;
server_name 192.168.1.174;
location / {
root /code;
index index.html;
}
location /nginx_status {
stub_status;
access_log off;
allow 192.168.1.218;
deny all;
}
location /download {
root /code;
autoindex on;
charset utf-8,gbk;
autoindex_exact_size off;
autoindex_localtime on;
deny 192.168.1.218;
allow all;
}
}
示例2、只允许192.168.1.218访问nginx_status,其他全部拒绝
[root@web02 conf.d]# cat nfzl.conf
server {
listen 80;
server_name 192.168.1.174;
location / {
root /code;
index index.html;
}
location /nginx_status {
stub_status;
access_log off;
allow 192.168.1.218;
deny all;
}
location /download {
root /code;
autoindex on;
charset utf-8,gbk;
autoindex_exact_size off;
autoindex_localtime on;
deny 192.168.1.218;
allow all;
}
}
2) 基于用户登录认证http_auth_basic_modul
//配置语法
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
//需要安装依赖组件
[root@web02 ~]#yum install httpd-tools
[root@web02 ~]# htpasswd -b -c /etc/nginx/auth_conf superman talent #用户名superman,密码talent
//可在httpd,server,location下添加如下信息
auth_basic "Auth access Download Input your Passwd!";
auth_basic_user_file /etc/nginx/auth_conf;
Examples:
[root@web02 conf.d]# cat nfzl.conf
server {
listen 80;
server_name 192.168.1.174;
location / {
root /code;
index index.html;
}
location /nginx_status {
stub_status;
access_log off;
allow 192.168.1.218;
deny all;
}
location /download {
root /code;
autoindex on;
charset utf-8,gbk;
autoindex_exact_size off;
autoindex_localtime on;
auth_basic "Auth access Download Input your Passwd!";
auth_basic_user_file /etc/nginx/auth_conf;
}
}
4、Nginx访问限制
经常会遇到这种情况,服务器流量异常,负载过大等等。对于大流量恶意的攻击访问,会带来带宽的浪费,服务器压力,影响业务,往往考虑对同一个IP的连接数,并发数进行限制
ngx_http_limit_conn_module 模块可以根据定义的KEY来限制每个键值的连接数,如同一个IP来源的连接数
limit_conn_module 连接频率限制
limit_req_module 请求频率限制
http协议的连接与请求
HTTP是建立在TCP,在完成http请求需要先建立TCP三次握手(称为TCP连接),在连接的基础上HTTP请求.
HTTP请求建立在一次TCP连接基础上,一次TCP请求至少产生一次HTTP连接。
1)nginx连接限制配置实战
//nginx连接限制语法
Syntax:limit_conn_zone key zone=name:size;
Default: -
Context: http
Syntax:limit_conn zone number;
Default: -
Context: http,server,location
//nginx连接限制实战
http {
//http段配置连接限制,同一时刻只允许一个客户端IP连接
limit_conn_zone $binary_remote_addr zone=conn_zone:10m;
...
server {
...
location / {
//同一时刻只允许一个客户端IP连接
limit_conn conn_zone 1;
}
}
}
变量:
$binary_remote_addr #变量的长度是固定的4个字节
$remote_addr #变量的长度7-15字节
建议使用$binary_remote_addr,因一个IP地址=32bit=4字节
10M=10*1024K=10*1024*1024B/4 可存储IP数量
//示例:http段配置连接限制,同一时刻只允许一个客户端IP连接
[root@web02 conf.d]# cat nfzl.conf
limit_conn_zone $binary_remote_addr zone=conn_zone:10m;
server {
listen 80;
server_name 192.168.1.174;
location / {
root /code;
index index.html;
limit_conn conn_zone 1;
}
location /nginx_status {
stub_status;
access_log off;
allow 192.168.1.218;
deny all;
}
location /download {
root /code;
autoindex on;
charset utf-8,gbk;
autoindex_exact_size off;
autoindex_localtime on;
auth_basic "Auth access Download Input your Passwd!";
auth_basic_user_file /etc/nginx/auth_conf;
}
}
//使用ab工具进行压力测试
[root@web02 ~]#yum install httpd-tools
[root@web02 ~]#ab -n 50 -c 20 http://127.0.0.1/index.html
2)nginx请求限制配置实战
//nginx请求限制语法
Syntax:limit_req_zone key zone=name:size rate=rate;
Default: -
Context: http
Syntax:limit_conn zone number [burst=number] [nodelay];
Default: -
Context: http,server,location
//nginx请求限制实战
http {
//http段配置请求限制,rate限制速率,限制一秒钟最多一个IP请求
limit_req_zone $binary_remote_addr zone=conn_zone:10m rate=1r/s;
...
server {
...
location / {
//1r/s只接收一个请求,其余请求拒绝处理并返回错误码给客户端
limit_req zone=conn_zone;
//请求超过1r/s,剩下的将被延迟处理,请求数超过burst定义的数量,多余的请求返回503错误
#limit_req zone=conn_zone burst=3 nodelay;
}
}
}
//示例:http段配置请求限制,限制一秒钟最多一个IP请求
[root@web02 conf.d]# cat nfzl.conf
#limit_conn_zone $binary_remote_addr zone=conn_zone:10m;
limit_req_zone $binary_remote_addr zone=conn_zone:10m rate=1r/s;
server {
listen 80;
server_name nfzl.com;
location / {
root /code;
index index.html;
# limit_conn conn_zone 1;
limit_req zone=conn_zone burst=8 nodelay;
}
location /nginx_status {
stub_status;
access_log off;
allow 192.168.1.218;
deny all;
}
location /download {
root /code;
autoindex on;
charset utf-8,gbk;
autoindex_exact_size off;
autoindex_localtime on;
auth_basic "Auth access Download Input your Passwd!";
auth_basic_user_file /etc/nginx/auth_conf;
}
}
//使用ab工具进行压力测试
[root@web02 ~]#yum install httpd-tools
[root@web02 ~]#ab -n 50 -c 20 http://127.0.0.1/index.html
//思考:Nginx连接限制没有请求限制有效吗?
我们前面说过,多个请求可以建立一次的TCP连接之上,那么我们对请求的精度限制,当然比对一个连接的限制会更加有效
因为同一时刻只允许一个连接请求进入。但是同一时刻多个请求可以通过一个连接进入。所以请求限制才是比较优的解决方案。
5、Nginx日志配置
//配置语法
Syntax:log_format name [escape=default|json] string ...;
Default: log_format combined "...";
Context:http
//默认Nginx定义日志语法
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
//Nginx日志格式允许包含的变量
参数 说明
$remote_addr 记录客户端地址
$remote_user 记录客户端用户
$time_local 记录访问时间和时区
$time_iso8601 记录ISO8601标准格式下的本地时间
$request 记录请求的方法以及请求的HTTP协议
$status 记录HTTP请求状态
$body_bytes_sent 发送给客户端文件内容大小
$bytes_sent 发送给客户端的总字节数
$msec 日志写入世间。单位为秒,精度是毫秒
$http_referer 记录从那个页面链接访问过来的
$http_user_agent 记录用户终端浏览器等信息
$http_x_forwarded_for 记录客户端IP地址
$request_length 请求的长度(包括请求行,请求头和请求正文)
$request_time 整个请求的总时间
//access_log语法
syntax:access_log path [format [buffer=size] [gzip[=level]] [flush=time] [if=condition]];
access_log off;
Default:access_log logs/access.log combined;
Context: http,server,location,if in location,limit_except
Example:
server {
...
access_log /var/log/nginx/www_log.log main;
...
}
//示例 修改日志格式$request_time(请求时间),$time_iso8601(修改日志显示时间)
log_format main '$remote_addr - $remote_user [$time_iso8601] $request_time "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log /var/log/nginx/access.log main;
6、Nginx虚拟站点
所谓虚拟主机,及在一台服务器上配置多个网站
如:公司主页、博客、论坛看是三个网站,实则可以运行在一台服务器上
需求:公司需要有三个站点,分别是www,bbs,blog
1)创建web站点目录
[root@web02 ~]# mkdir -p /code/{www,bbs,blog}
[root@web02 ~]# echo www > /code/www/index.html
[root@web02 ~]# echo bbs > /code/bbs/index.html
[root@web02 ~]# echo blog > /code/blog/index.html
示例一:基于IP的虚拟主机
[root@web02 ~]#vim /etc/nginx/conf.d/www.conf
server {
listen 192.168.1.174:80;
server_name www.nfzl.com;
location / {
root /code/www;
index index.html;
}
}
[root@web02 ~]#vim /etc/nginx/conf.d/bbs.conf
server {
listen 192.168.1.175:80;
server_name bbs.nfzl.com;
location / {
root /code/bbs;
index index.html;
}
}
[root@web02 ~]#vim /etc/nginx/conf.d/blog.conf
server {
listen 192.168.1.176:80;
server_name blog.nfzl.com;
location / {
root /code/blog;
index index.html;
}
}
示例二:基于端口的虚拟主机
[root@web02 ~]#vim /etc/nginx/conf.d/www.conf
server {
listen 80;
server_name www.nfzl.com;
location / {
root /code/www;
index index.html;
}
}
[root@web02 ~]#vim /etc/nginx/conf.d/bbs.conf
server {
listen 81;
server_name bbs.nfzl.com;
location / {
root /code/bbs;
index index.html;
}
}
[root@web02 ~]#vim /etc/nginx/conf.d/blog.conf
server {
listen 82;
server_name blog.nfzl.com;
location / {
root /code/blog;
index index.html;
}
}
示例三:基于域名的虚拟主机
[root@web02 ~]#vim /etc/nginx/conf.d/www.conf
server {
listen 80;
server_name www.nfzl.com;
location / {
root /code/www;
index index.html;
}
}
[root@web02 ~]#vim /etc/nginx/conf.d/bbs.conf
server {
listen 80;
server_name bbs.nfzl.com;
location / {
root /code/bbs;
index index.html;
}
}
[root@web02 ~]#vim /etc/nginx/conf.d/blog.conf
server {
listen 80;
server_name blog.nfzl.com;
location / {
root /code/blog;
index index.html;
}
}
2)语法测试并重启nginx
[root@web02 conf.d]# nginx -t
[root@web02 conf.d]# systemctl restart nginx
3)写hosts解析
192.168.1.174 www.nfzl.com bbs.nfzl.com blog.nfzl.com
4)访问测试
http://www.nfzl.com
http://bbs.nfzl.com
http://blog.nfzl.com
5) 增加需求:实现每个站点日志独立
[root@web02 conf.d]#mkdir -p /code/log
[root@web02 conf.d]# vim www.conf
access_log /code/log/www.nfzl.com_access.log main;
server {
listen 80;
server_name bbs.nfzl.com;
access_log /code/log/bbs.nfzl.com_access.log main;
location / {
root /code/bbs;
index index.html;
}
}
~
[root@web02 conf.d]#vim bbs.conf
access_log /code/log/bbs.nfzl.com_access.log main;
[root@web02 conf.d]#vim blog.conf
access_log /code/log/blog.nfzl.com_access.log main;
7、Nginx Location
使用Nginx Location可以控制访问网站的路径,但是一个server可以有多个location配置,多个location的优先级该如何区分
1)Location语法示例
location [=|~|~*|^~|!~*|!~|/] /uri/ { … }
2)Location语法优先级排序
匹配符 匹配规则 优先级
= 精确匹配 1
^~ 以某个字符串开头 2
~ 区分大小写的正则匹配 3
~* 不区分大小写的正则匹配 4
!~ 区分大小写不匹配的正则 5
!~* 不区分大小写不匹配的正则 6
/ 通用匹配,任何请求都会匹配到 7
3)配置网站验证location优先级
[root@web02 conf.d]# cat test.conf
server {
listen 80;
server_name www.nfzl.com;
access_log /code/log/www.nfzl.com_access.log main;
location / {
default_type text/html;
return 200 "location /";
}
location =/ {
default_type text/html;
return 200 "location =/";
}
location ~ / {
default_type text/html;
return 200 "location ~/";
}
# location ^~ / {
# default_type text/html;
# return 200 "location ^~";
# }
}
4)location应用场景
#通用匹配,任何请求都会匹配到
location / {
}
#严格区分大小写,匹配以.php结尾的都走这个location
location ~ \.php$ {
fastcge_pass http://127.0.0.1:9000;
}
#严格区分大小写,匹配以.jsp结尾的都走这个location
location ~ \.jsp$ {
fastcge_pass http://127.0.0.1:8080;
}
#不区分大小写,只要用户访问.jpg,gif,png,js,css都走这条location
location ~* .*\.(jpg|gif|png|js|css)$ {
rewrite (.*)http://cdn.nfzl.com$request_uri;
}
#不区分大小写匹配
location ~* "\.(sql|bak|tar.gz|tgz|.git)$" {
default_type text/htm;
return 403 "启动访问控制成功";
}