nginx模块
nignx -V #查看版本和当前安装的模块
如果是源码安装的使用绝对路径加-V也可以查看
nginx -V 2>&1 | grep 模块 #查看某个模块有没有安装
配置文件:
server { # 默认网站配置文件
listen 80; # 监听端口
server_name localhost; # FQDN
#charset koi8-r; # 网页字符类型
#access_log /var/log/nginx/host.access.log main; 日志
location / {
root /usr/share/nginx/html; # 网站主目录
index index.html index.htm; # 默认主页名
}
#error_page 404 /404.html; # 错误页面
# redirect server error pages to the static page /50x.html
error_page 500 502 503 504 /50x.html; # 错误页面
location = /50x.html { # 错误页面
root /usr/share/nginx/html; # 错误页面主目录
}
# proxy the PHP scripts to Apache listening on 127.0.0.1:80 代理设置
#location ~ \.php$ {
# proxy_pass http://127.0.0.1;
#}
# pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000 动态网站设置
#location ~ \.php$ {
# root html;
# fastcgi_pass 127.0.0.1:9000;
# fastcgi_index index.php;
# fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name;
# include fastcgi_params;
#}
# deny access to .htaccess files, if Apache's document root
# concurs with nginx's one
#location ~ /\.ht {
# deny all;
#}
}
连接状态
模块-with-http_stub_status_module
# 目的:展示用户和nginx连接数量的信息
nginx -V 2>&1 | grep stub_status #查看模块有没有安装
#模块配置:
$ vim /etc/nginx/conf.d/default.conf
server内添加:
location /nginx_status { #/nginx_status 自定义参数访问这个就会跳转到连接状态
stub_status; #开启模块
allow all; #允许所有ip访问
}
$ systemctl restart nginx # 重新启动使配置文件生效
# 访问网站: http//ip地址/nginx_status
Active connections: 1
server accepts handled requests
5 8 27
Reading: 0 Writing: 1 Waiting: 0
# 解释:
`Active connections: 1` #当前活动的连接数
`server accepts handled requests` #服务器接受处理请求
`5` #总连接数connection(TCP)连接数
`8` #成功的连接数connection (TCP)请求数
`27` #总共处理的请求数requests(HTTP)
`Reading:0` #读取客户端Header的信息数 请求头
`Writing:1` #返回给客户端的header的信息数 响应头
`Waiting:0` #等待的请求数,开启了keepalive
替换模块
# 目的:网页内容替换,替换文字
#模块配置
$ vim /etc/nginx/conf.d/default.conf
server内添加
$ sub_filter nginx 'apache'; #将nginx替换成为apache
$ sub_filter_once on; #开启单次替换,改成off的话就是替换所有
location / {
root /usr/share/nginx/html;
index index.html index.htm;
}
$ systemctl restart nginx # 重新启动使配置文件生效
文件读取
# 模块:ngx_http_core_module
默认都是开启的
# 语法:
Syntax: sendfile on | off;
Default: sendfile on;
Context: http, server, location, if in location
------------------------------------------------------
Syntax: tcp_nopush on | off;
Default: tcp_nopush off;
Context: http, server, location
------------------------------------------------------
Syntax: tcp_nodelay on | off;
Default: tcp_nodelay on;
Context: http, server, location
# sendfile模块:
使用开启或关闭是否使用sendfile()传输文件,普通应用应该设为on,下载等IO重负荷的应用应该设为off,因为大文件不适合放到buffer中。
传统文件传输中(read/write方式)在实现上3其实是比较复杂的,需要经过多次上下文切换,当需要对一个文件传输时,传统方式是:
- 调用read函数,文件数据被copy到内核缓冲区
- read函数返回,数据从内核缓冲区copy到用户缓冲区
- write函数调用,将文件数据从用户缓冲区copy到内核与socket相关的缓冲区
- 数据从socket缓冲区copy到相关协议引擎
从上面可以看出来,传统readwrite进行网络文件传输的方式,在过程中经历了四次copy操作。
硬盘->内核buffer->用户buffer->socket相关缓冲区->协议引擎
而sendfile系统调用则提供了一种减少多次copy,提高文件传输性能的方法。流程如下:
- sendfile系统效用,文件数据被copy至内核缓冲区
- 记录数据文职和长度相关的数据保存到socket相关缓存区
- 实际数据由DMA模块直接发送到协议引擎
$ sendfile on; #默认打开
# tcp_nopush模块:
sendfile为on时这里也应该设为on,数据包会累积一下再一起传输,可以提高一些传输效率。
$ tcp_nopush on; #默认打开
# tcp——nodelay模块:
看上去是和tcp_nopush相反的功能,但是两边都为on时nginx也可以平衡这两个功能的使用这个能够提高高频发送小数据报文的实时性。系统存在高频发送小数据报文的时候,打开它。
$ tcp_nodelay on; #小的数据包不等待直接传输。默认为on。
文件压缩
# 原理介绍:启动该模块,使文件传输前进行压缩,提升传输效率。
语法:
Syntax: gzip on | off;
Default: gzip off;
Context: http, server, location, if in location
-----------------------------------------------------
#开启压缩,对数据进行实时压缩
$ gzip on;
#在响应这些种类的客户端请求时不使用GZIP压缩"msie6"对IE6浏览器的数据不进行GZIP压缩
$ gzip_disable "msie6"
#小于1K的文件不启动压缩,小于1k的数据有可能越压越大
$ gzip_min_length 1k;
#压缩的级别,1-9个级别9是最高的但是压缩速度慢
$ gzip_comp_level 4;
#让前边的缓存服务器识别压缩后的文件
$ gzip_vary on;
#开启时,如果客户端浏览器不支持Gzip处理,Nginx服务器将返回解压后的数据,如果客户端浏览器支持Gzip处理,Nginx 服务器忽略该指令设置。仍然返回压缩数据
$ gzip_static on;
#该指令用于设置Gzip压缩文件使用存储空间的大小,
`number`: 指定Nginx服务器需要向系统申请存储空间的个数,
`size`: 指定每个缓存空间的大小。
根据配置项,Nginx服务器在对响应输出数据进行Gzip压缩时需向系统申请number*size大小的空间用于存储压缩数据。默 认情况下,number*size的值为128,其中size的值为系统内存页一页的大小,用`getconf PAGESIZE`来获取
$ gzip_buffers 4 32k; #压缩过程都写到buffer里面,压缩完成才发给客户端
#Nginx服务器可以根据MIME类型选择性开启Gzip压缩功能。该指令涌来设置MIME类型。设置需要压缩的数据格式
$ gzip_types text/plain application/javascript application/x-javascript text/css application/xml text/javascript application/x-httpd-php image/jpeg image/gif image/png;
#默认值: gzip_http_version 1.1(就是说对HTTP/1.1协议的请求才会进行gzip压缩)
注:99.99%的浏览器基本上都支持gzip解压了。但是假设我们使用的是默认值1.1,如果我们使用了proxy_pass进行反向 代理,那么nginx和后端的upstream server之间是用HTTP/1.0协议通信的,如果我们使用nginx通过反向代理做Cache Server,而且前端的nginx没有开启gzip,同时,我们后端的nginx上没有设置gzip_http_version为1.0,那么Cache 的url将不会进行gzip压缩
$ gzip_http_version 1.1;
#gzip模块可以在nginx主配置优化中查看
页面缓存
# 作用:简单的说,nginx expire功能就是为用户访问的访问内容设定一个过期时间,当用户第一次访问到这些内容时,会把这些内容存储在用户浏览器本地,这样用户第二次访问该网站,浏览器会加载检查已经缓存在用户浏览器恩地的内容,就不去服务器下载了开启缓存可以加速浏览网站,合理的配置expires可以减少很多服务器的请求要配置expires。
#语法:
Syntax: expires [modified] time;
expires epoch | max | off;
Default: expires off;
Context: http, server, location, if in location
-------------------------------------------------------
#解释:
epoch:指定“Expires”的值为 1 January,1970,00:00:01 GMT
max:指定“Expires”的值为10年。
-1:指定“Expires”的值为当前服务器时间-1s,即永远过期。
off:不修改“Expires”和"Cache-Control"的值
#使用方法一:
location / {
root /app/tianyun.me;
index index.html index.htm;
expires 24h; #缓存保存24小时
}
#使用方法二:
location ~* .*\.(gif|jpg|jpeg|png|bmp|swf)$ {
root /app/tianyun.me;
expires 3650d; #保存缓存3650天
}
防盗链
# 盗链:日志格式中的http_referer是记录,访问点引用的URL。也就是超链接的上一级地址。通过这段地址,可以发现一种网络行为——盗链。非法盗链会影响站点的正常访问。通过http_referer模块可以控制这一点。防止非法盗链现象。如果开启防盗链的话别人就不会盗取你的链接地址
语法:
Syntax: valid_referers none | blocked | server_names | string ...;
Default: —
Context: server, location
--------------------------------------------------------------------------------
#用法一:
$ location ~* .*\.(gif|jpg|jpeg|png|bmp|swf)$ {
root /usr/share/nginx/html;
valid_referers none blocked www.a.com; #开启www.a.com网站防盗链
if ( $invalid_referer ) { #如果来源域名不在这个列表中,那么$invalid_referer等于1
return 403; #等于 1 返回403
}
}
#用法二:
$ location ~* .*\.(gif|jpg|jpeg|png|bmp|swf)$ {
root /usr/share/nginx/html;
valid_referers none blocked www.a.com server_user ~\.baidu\. www.b.com;
#上面的就是开启www.a.com网站防盗链,允许baidu www.c.com 盗取链接
if ( $invalid_referer ) { #如果来源域名不在这个列表中,那么$invalid_referer等于1
return 403; #等于 1 返回403
}
}
#如果在valid_referers none blocked *.www.a.com #这样的话所有的网页都打不开,包括自己的
访问请求频率限制
定义: 在http内定义: limit_req_zone $binary_remote_addr zone=req_zone:10m rate=1r/s; limit_req_zone: # 限制请求 $binary_remote_addr: # 二进制地址 zone=req_zone: # 限制策略的名称, 10m: # 占用10M空间 rate=1r/s; # 允许每秒1次请求 #1秒内只能相应10个请求超出得直接返回503引用: limit_req zone=rep_zone; #限制策论名称 limit_req zone=req_zone burst=5; limit_req zone=req_zone burst=5 nodelay;
实例:
配置: 先在http定义: http { limit_req_zone $binary_remote_addr zone=req_zone:10m rate=1r/s; } 在server内引用: server { location / { root /usr/share/nginx/html; index index.html index.htm; limit_req zone=req_zone; #引用限制1秒内只能相应10个请求超出得直接返回503 limit_req zone=req_zone burst=5; #引用限制,但是令牌桶有5个。有延迟。速度慢1秒内访问10次会成功 如果访问20次10会显 示成功5次放在burst缓存区里剩下得直接返回503 limit_req zone=req_zone burst=5 nodelay; #引用限制,但是令牌桶有5个。无延迟。速度快如果1秒发送20个请求, 前15个请求正常响应, 后5个请求返回503, 第2秒发送6个请求, 正常响应。加brust=5和nodelay的情况下,有一个容量为5的缓冲区, rate=10r/s每秒能执行15次请求, 15=10+5。多的直接返回503错误。 } } #burst=5 表示最大延迟请求数量不大于5。 如果太过多的请求被限制延迟是不需要的 ,这时需要使用nodelay参数,服务器会立刻返回503状态码。
#情况 1: limit_req zone=req_zone;
第1秒发送10个请求, 正常响应。
第1秒发送13个请求, 前10个请求正常响应, 后3个请求返回503(Service Temporarily Unavailable)。不加brust和nodelay的情况下, rate=10r/s每秒只能执行10次请求, 多的直接返回503错误。
#情况 2: limit_req zone=req_zone brust=5;
第1秒发送10个请求, 正常响应。
第1秒发送13个请求, 前10个请求正常响应, 后3个请求放入brust等待响应。
第1秒发送20个请求, 前10个请求正常响应, 后5个请求放入brust等待响应, 最后5个请求返回503(Service Temporarily Unavailable), 第2秒执行brust中的5个请求。
第1秒发送20个请求, 前10个请求正常响应, 后5个请求放入brust等待响应, 最后5个请求返回503(Service Temporarily Unavailable), 第2秒发送6个请求, 执行brust中的5个请求, 将5个请求放入brust等待响应, 剩下的1个请求返回503(Service Temporarily Unavailable)。加brust=5不加nodelay的情况下, 有一个容量为5的缓冲区, rate=10r/s每秒只能执行10次请求, 多的放到缓冲区中, 如果缓冲区满了, 就直接返回503错误。而缓冲区在下一个时间段会取出请求进行响应, 如果还有请求进来, 则继续放缓冲区, 多的就返回503错误。
#情况 3: limit_req zone=req_zone brust=5 nodelay;
第1秒发送10个请求, 正常响应。
第1秒发送13个请求, 13个请求正常响应。
第1秒发送20个请求, 前15个请求正常响应, 后5个请求返回503(Service Temporarily Unavailable)。
第1秒发送20个请求, 前15个请求正常响应, 后5个请求返回503(Service Temporarily Unavailable), 第2秒发送6个请求, 正常响应。加brust=5和nodelay的情况下, 有一个容量为5的缓冲区, rate=10r/s每秒能执行15次请求, 15=10+5。多的直接返回503错误。
访问连接频率限制
# 通过IP地址,限制链接(TCP)。但是实验环境无法测试
定义:
在http段定义:
http {
limit_conn_zone $binary_remote_addr zone=conn_zone:10m; #conn_zone 定义的名称
}
limit_conn_zone:全局定义限制对象(IP),存储区限制空间(10M)字
#limit_conn_zone $binary_remote_addr zone=conn_zone:10m模块开启对单个ip、单个会话同时存在的连接数的限制。这里定义一个记录区conn_zone,conn_zone的总容量是10m,该记录区针对于变量 $binary_remote_add生效,这里是针对单个IP生效。该模块只是一个定义,配置在http配置段,需要配合limit_conn指令使用才生效, limit_conn conn_zone 1表示该location段使用conn_zone定义的 limit_conn_zone ,对单个IP限制同时存在一个连接
引用配置:
server {
location / {
.....
limit_conn conn_zone 1; #单个ip,同时只允许有一个tcp连接
}
}
limit_conn:该指令指定每个给定键值的最大同时连接数,当超过这个数字时返回503(Service )错误。如(同一IP同一时间只允许有2个连接):
#客户端的IP地址作为键。注意,这里使用的是 binary_remote_addr 变量,而不是 remote_addr变量remote_addr变量的长度为7字节到15字节,而存储状态在32位平台中占用32字节或64字节,在64位平台中占用64字节。binary_remote_addr变量的长度是固定的4字节,存储状态在32位平台中占用32字节或64字节,在64位平台中占用64字节。1M共享空间可以保存3.2万个32位的状态,1.6万个64位的状态,如果共享内存空间被耗尽,服务器将会对后续所有的请求返回 503 (Service Temporarily Unavailable) 错误。
访问控制基于主机
$ allow #允许的主机
$ deny #拒绝的主机
语法:
Context: http, server, location, limit_except
---------------------------------------------------
启动控制:
server的字段内添加:
server {
....
allow 10.0.111.28 #允许这个ip地址访问
deny 10.0.111.27 #禁止这个ip地址访问
}
#这个是有优先级存在的
访问控制基于用户
$ yum -y install httpd-tools #下载一个工具因为生成秘钥的工具是由apache提供
$ htpasswd -cm /etc/nginx/conf.d/passwd pass
ht=表示超文本
-c=固定参数
-m=第一次没有文件的时候+m创建文件
/etc/nginx/conf.d/passwd :创建文件的路径
pass = 创建的用户
#启动模块:
在配置配置文件中添加:
auth_basic “请输入用户密码”; #登陆时得提示消息
auth_basic_user_file /etc/nginx/conf.d/passwd; #前面是模块 后面得是存放密码得路径
#只有创建的用户才可以登陆,创建的用户和密码都在/etc/nginx/conf.d/passwd内