一、连接状态
1、基本配置
stub_status_module
1、目的
展示用户和nginx链接数量信息
2、context
location
3、查看模块是否安装
nginx -V 2>&1|grep stub_status
--with-http_stub_status_module
##yum安装一般自带了,如果是源码编译不太清楚
4、配置状态模块
vim /etc/nginx/conf.d/default.conf
#写在server内
location /nginx_status {
stub_status;
allow all;
}
systemctl restart nginx
5、观察
curl http://192.168.10.133/nginx_status
++++++++++++++++++++++++++++++++++++++++++++
Active connections: 1
server accepts handled requests
3 3 2
Reading: 0 Writing: 1 Waiting: 0
+++++++++++++++++++++++++++++++++++++++++++++
6、解释
Active connections: 1 ##当前活动的连接数
server accepts handled requests ##服务器接受处理请求
3 3 2
3 总连接数connection(TCP)
3 成功的连接数connection(TCP)
2 总共处理的请求数requests(HTTP)
Reading: 0 读取客户端Header的信息数 请求头
Writing: 1 返回给客户端的Header的信息数 响应头
Waiting: 0 等待的请求数,开启了keepalived
2、keepalived长连接设置
1、简介
Httpd守护进程,一般都提供了keep-alive timeout时间设置参数。比如nginx的keepalive_timeout,和Apache的KeepAliveTimeout。
这个 keepalive_timout时间值意味着:一个http产生的tcp连接在传送完最后一个响应后,还需要hold住 keepalive_timeout秒后,才开始关闭
这个连接。当httpd守护进程发送完一个响应后,理应马上主动关闭相应的tcp连接,设置 keepalive_timeout后,httpd守护进程会想说:”再等等
吧,看看浏览器还有没有请求过来”,这一等,便是 keepalive_timeout时间。如果守护进程在这个等待的时间里,一直没有收到浏览发过来http请
求,则关闭这个http连接。
2、关闭长连接测试
vi /etc/nginx/nginx.conf
#keepalive_timeout 65;
"访问以后,连接保持65s,如果再次访问,重新开始65秒倒计时,所以需要另一个参数keepalive_time限制总的连接时常"
keepalive_timeout 0;
systemctl restart nginx
3、再次刷新状态观察
会发现总连接数和成功连接数,刷一次就加一,没有任何延迟(原先是过了65秒才加一)
二、随机主页
random_index_module
1、目的
将主页设置成随机页面,是一种微调更新机制
2、context
location
3、创建多个主页
touch /app/{blue.html,red.html,green.html,.yellow.html}
echo "blue" >/app/blue.html
echo "red" >/app/red.html
echo "green" >/app/green.html
echo "yellow" >/app/.yellow.html
4、启动随机主页
vim /etc/nginx/conf.d/default.conf
location / {
root /app;
random_index on;
}
5、重启
systemctl restart nginx
6、刷新页面观察
httl://192.168.10.133
#.yellow.html不会显示,隐藏文件不会被读取
三、替换模块
sub_module
1、目的
网页内容替换
如果我们用模板生成网站的时候,因为疏漏或者别的原因造成代码不如意,但是此时因为文件数量巨大,不方便全部重新生成,那么这个时候
我们就可以用此模块来暂时实现纠错,另一方面,我们也可以利用这个实现服务器端文字过滤的效果
2、context
http server location
3、创建页面
vi /app/index.html
test ketty </br>
this is a ketty html </br>
4、配置
http {
sub_filter 'ketty' 'timo'; ##替换模块,将ketty替换为timo
sub_filter_once on; ##单次替换 开启,只替换第一次出现的ketty单词
#sub_filter_once off; ##单次替换关闭,会替换页面中所有要替换的ketty单词
}
5、重启
systemctl restart nginx
四、文件读取
ngx_http_core_module
1、sendfile
Syntax: sendfile on | off;
Default: sendfile on;
Context: http, server, location, if in location
未使用sendfile()的传统网络传输过程
硬盘 >> kernel buffer >> user buffer >> kernel socket buffer >> 协议栈
使用sendfile()来进行网络传输的过程
硬盘 >> kernel buffer(快速拷贝到kernel socket buffer) >> 协议栈
senfile()不但能减少切换次数而且还能减少拷贝次数
2、tcp_nopush
Syntax: tcp_nopush on | off;
Default: tcp_nopush off;
Context: http, server, location
未使用tcp_nopush网络资源浪费
应用程序每产生一次操作就会发送一个包,而典型情况下一个包会拥有一个字节的数据以及40个字节长的包头,于是产生4000%的过载,很容易
地就能令网络发生拥塞,同时也浪费资源
使用tcp_nopush网络传输效率提升
当包累计到一定大小后再发送
3、tcp_nodelay
Syntax: tcp_nodelay on | off;
Default: tcp_nodelay on;
Context: http, server, location
开启或关闭nginx使用TCP_NODELAY选项的功能,这个选项仅在将连接转变为长连接的时候才被启用
TCP_NODELAAY是禁用Nagle算法,即数据包立即发送出去
由于Nagle和DelayedACK的原因,数据包的确认信息需要积攒到两个时才发送,长连接情况下,奇数包会造成延时40ms,所以TCP_NODELAY
会将ack立刻发出去,如果不在长连接时,可以关闭此模块,因为ack会被立刻发出去
4、配置
http {
sendfile on;
tcp_nopush on;
tcp_nodelay on;
}
五、文件压缩
ngx_http_gzip_module
启动该模块,使文件传输前进行压缩,提升传输效率
1、语法
Syntax: gzip on | off;
Default: gzip off;
Context: http, server, location, if in location
Syntax: gzip_comp_level level; #设置响应的 gzip 压缩level。可接受的值在 1 到 9 的范围内
Default: gzip_comp_level 1;(1~9)
Context: http, server, location
Syntax: gzip_http_version 1.0 | 1.1; #设置压缩响应所需的请求的最低 HTTP 版本
Default: gzip_http_version 1.1;
Context: http, server, location
2、启用压缩
gzip on;
gzip_http_version 1.1;
gzip_comp_level 2;
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_static on; #nginx对于静态文件的处理模块
3、解释
压缩包和图片类对象本身已经自带压缩功能。所以压缩比例较小低。
文本类对象在压缩试验中,压缩比例体现优越。
Enables gzipping of responses for the specified MIME types in addition to “text/html”.
The special value “*” matches any MIME type (0.8.29). Responses with the “text/html” type are always compressed.
六、页面缓存
ngx_http_headers_module
expires起到控制页面缓存的作用,合理的配置expires可以减少很多服务器的请求Nginx(expires 缓存减轻服务端压力)
1、语法
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"的值
2、原理介绍
无缓存,每次访问服务器,均是全文传输。 开启缓存可以加速浏览网站
3、启用缓存
第一次返回状态码200.页面对象全文传输
第二次返回状态304.页面对象部分传输。
解析缓存原理
4、开启缓存
location / {
root /usr/share/nginx/html;
index index.html index.htm;
expires 24h;
}
systemctl restart nginx
5、浏览页面,观察响应头中出现服务器回复的缓存时间
Cache-Control: max-age=86400
6、缺点时效性降低
七、防盗链
ngx_http_referer_module
盗链是指服务提供商自己不提供服务的内容,通过技术手段绕过其它有利益的最终用户界面(如广告),直接在自己的网站上向最终用户提供其它服务
提供商的服务内容,骗取最终用户的浏览和点击率。受益者不提供资源或提供很少的资源,而真正的服务提供商却得不到任何的收益。
1、语法
Syntax: valid_referers none | blocked | server_names | string ...;
Context: server, location
valid_referers解释
可以同时携带多个参数,表示多个 referer 头部都生效。
参数值
none:允许没有 referer 信息的请求访问,即直接通过url访问。
blocked:请求头Referer字段不为空(即存在Referer),但是值可以为空(值被代理或者防火墙删除了),并且允许refer不以“http://”或
“https://”开头,通俗点说就是允许“http://”或"https//"以外的请求。
server_names:若 referer 中站点域名与 server_name 中本机域名某个匹配,则允许该请求访问
其他字符串类型:检测referer与字符串是否匹配,如果匹配则允许访问,可以采用通配符*
正则表达式:若 referer 的值匹配上了正则,就允许访问
invalid_referer 变量
允许访问时变量值为空
不允许访问时变量值为 1
2、原理
日志格式中的http_referer是记录,访问点引用的URL。也就是超链接的上一级地址。 通过这段地址,可以发现一种网络行为——盗链。非法盗链会
影响站点的正常访问。 通过http_referer模块可以控制这一点。防止非法盗链现象。
3、nginx配置
vi /etc/nginx/conf.d/a.conf
server {
access_log /var/log/nginx/a.com.log main;
#分离日志文件
listen 80;
server_name a.com;
location / {
root /data/nginx/a;
index index.html;
}
}
vi /etc/nginx/conf.d/b.conf
server {
access_log /var/log/nginx/b.com.log main;
#分离日志文件
listen 80;
server_name b.com;
location / {
root /data/nginx/b;
index index.html;
}
}
vi /data/nginx/a/index.html
this a.com</br>
<img src='1.jpg' />
vi /data/nginx/b/index.html
this is b.com</br>
<img src='http://a.com/1.jpg' />
systemctl restart nginx
4、window配置域名
C:\WINDOWS\system32\drivers\etc\hosts
192.168.10.133 a.com b.com
5、访问a.com,b.com
a.log:
192.168.10.1 - - [14/Aug/2022:16:40:37 +0800] "GET / HTTP/1.1" 304 0 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/100.0.4896.60 Safari/537.36" "-"
192.168.10.1 - - [14/Aug/2022:16:40:37 +0800] "GET /1.jpg HTTP/1.1" 304 0 "http://a.com/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/100.0.4896.60 Safari/537.36" "-"
192.168.10.1 - - [14/Aug/2022:16:40:40 +0800] "GET /1.jpg HTTP/1.1" 304 0 "http://b.com/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/100.0.4896.60 Safari/537.36" "-"
b.log:
192.168.10.1 - - [14/Aug/2022:16:40:40 +0800] "GET / HTTP/1.1" 304 0 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/100.0.4896.60 Safari/537.36" "-"
6、启用防盗链
location / {
root /data/nginx/a;
index index.html;
valid_referers none blocked a.com;
if ($invalid_referer) {
return 403;
}
}
systemctl restart nginx
白名单功能
location / {
root /a.com;
index index.html index.htm;
valid_referers none blocked *.a.com server_name 192.168.19.* ~tianyun ~\.google\. ~\.baidu\. .com;
if ($invalid_referer) {
return 403;
}
}
对某些静态页面设置
location ~*\.(gif|jpg|png|bmp)$ {
root /a.com;
valid_referers none blocked *.a.com server_name 192.168.19.* ~tianyun ~\.google\. ~\.baidu\. .com;
if ($invalid_referer) {
return 403;
}
}