Nginx 基础入门篇(3)

目录

 

 7.Nginx 日志Log

1 日志配置

日志的格式和命令 log_format

日志格式允许包含的变量

访问日志和错误日志

2 日志轮转/切割

3 日志分析

8.Nginx WEB模块

随机主页

替换模块sub_module

文件读取

模块

原理介绍

启用模块

文件压缩

启用模块

页面缓存

启用缓存

理解nginx服务器缓存

防盗链

启动防盗链

连接状态stub_status_module

启动状态模块

关于链接的问题


 7.Nginx 日志Log

1 日志配置

日志模块

官方文档:http://nginx.org/en/docs/http/ngx_http_log_module.html

日志模块的名称:ngx_http_log_module

相关指令

log_format   //日志格式

access_log   //访问日志

error_log    //  错误日志
open_log_file_cache   // 日志缓存


日志的格式和命令 log_format
 

 简介   :

Nginx有非常灵活的日志记录模式。每个级别的配置可以有各自独立的访问日志。日志格式通过log_format命令定义。

语法

Syntax: log_format name [escape=default|json] string ...;

name 表示格式名称

string 表示定义的格式

默认值

Default: log_format combined "...";

log_format 有默认的无需设置的combined日志格式,相当于apache的combined日志格式

环境 Context: http        context

网站        例如代理服务器的日志格式就不同
代理
LB

如果Nginx位于负载均衡器,squid,nginx反向代理之后,web服务器无法直接获取到客户端真实的IP地址。
$remote_addr获取的是反向代理的IP地址。反向代理服务器在转发请求的http头信息中,可以增加X-Forwarded-For信息,
用来记录客户端IP地址和客户端请求的服务器地址。

nginx代理日志格式如下

log_format porxy '$http_x_forwarded_for - $remote_user [$time_local] '
' "$request" $status $body_bytes_sent '
' "$http_referer" "$http_user_agent" ';

全局和局部

定义设置位置

vim /etc/nginx/nginx.conf

日志部分配置

Nginx 基础入门篇(3)_第1张图片

    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

 

日志格式允许包含的变量

$remote_addr,  远程地址: 记录客户端IP地址

$remote_user      远程用户:记录客户端用户名称

[$time_local]     本地时间:服务器自身时间

$request             请求:记录请求的URL和HTTP协议  "GET /1.html HTTP/1.1"

$status                  状态:记录请求状态     例:200 ,304, 403,404

$body_bytes_sent           发送给客户端的字节数,不包括响应头的大小

 $http_referer              记录从哪个页面链接访问过来的  (超链接)

$http_user_agent                记录客户端浏览器相关信息 如:火狐,IE

$http_x_forwarded_for             代理IP

old

$request_length            请求的长度(包括请求行,请求头和请求正文)。

$request_time              请求处理时间,单位为秒,精度毫秒; 从读入客户端的第一个字节开始,直到把最后一个字符发送给客户端后进行 日志写入为止。

$time_iso8601                  ISO8601标准格式下的本地时间。

$bytes_sent                      发送给客户端的总字节数    (可在主配置文件中,增加此项观c)

$msec                             日志写入时间。单位为秒,精度是毫秒。   

404提示

总有一个404提示

Nginx 基础入门篇(3)_第2张图片

favicon.ico 文件是浏览器收藏网址时显示的图标,当第一次访问页面时,浏览器会自动发起请求获取页面的favicon.ico文件。当/favicon.ico文件不存在时,服务器会记录404日志。

    127.0.0.1 - - [26/Jul/2015:22:25:07 +0800] “GET /favicon.ico HTTP/1.1” 404 168 “-” “Mozilla/5.0 (Macintosh; Intel Mac OS X 10.10; rv:36.0) Gecko/20100101 Firefox/36.0” “-”
    127.0.0.1 - - [26/Jul/2015:22:25:07 +0800] “GET /favicon.ico HTTP/1.1” 404 168 “-” “Mozilla/5.0 (Macintosh; Intel Mac OS X 10.10; rv:36.0) Gecko/20100101 Firefox/36.0” “-“

解决办法

当一个站点没有设置favicon.ico时,access.log会记录了大量favicon.ico 404信息。

这样有两个缺点:
1.使access.log文件变大,记录很多没有用的数据。
2.因为大部分是favicon.ico 404信息,当要查看信息时,会影响搜寻效率。

解决方法如下:
在nginx的配置中加入

location = /favicon.ico {
  log_not_found off;
  access_log off;
}


以上配置说明:
location = /favicon.ico 表示当访问/favicon.ico时,
log_not_found off 关闭日志
access_log off 不记录在access.log

完整配置如下:

server {
  listen        80;
  server_name   fdipzone.com;
  root          /Users/fdipzone/home;

  access_log /var/log/nginx/access.log main;
  error_log /var/log/nginx/error.log debug;

  location = /favicon.ico {
    log_not_found off;
    access_log off;
  }

  location / {
    index  index.html index.htm index.php;
    include      /usr/local/etc/nginx/conf.d/php-fpm;
  }
}


访问日志和错误日志

access_log 

某条日志记录

192.168.100.254 - - [17/Dec/2017:14:45:59 +0800] "GET /nginx-logo.png HTTP/1.1" 200 368 "http://192.168.100.10/" "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:57.0) Gecko/20100101 Firefox/57.0" "-"

某条日志记录含义

192.远程主机IP
- -   用户
【2017】时间
get获得,下载,还有post提交。
 /nginx-logo.png  下载图片
http版本
状态码 什么结果。对,还是错
368 大小
引用自哪个连接,主页http://192.168.100.10/
Mozilla 5.0浏览器的版本
Windows NT 客户端系统类型
-远程客户端主机地址  (请看注释)

error_log  个性化404

1 修改主配置文件

vim  /etc/nginx/nginx.conf

http {
        error_page 404 /404.html;
}

子配置中

vim /etc/nginx/conf.d/xuleilinux.conf

server{
            location = /404.html {
                root            /aaa;
        }

}

systemctl restart nginx

2 创建错误反馈页面

vim /aaa/404.html

3 访问 :访问不存在的页面

4 查看404日志:观察404页面的现象。

日志缓存

简介:大量访问到来时,对于每一条日志记录,都将是先打开文件,再写入日志,然后关闭.占用了系统的IO,与业务无关。
可以使用open_log_file_cache来设

Syntax:open_log_file_cache max=1000 inactive=20s min_uses=3 valid=1m ;

max 1000 指的是日志文件的FD,最大的缓存数量为1000。超了怎么办,看下面

min_users 3    20秒内小于3次访问的FD,就给你清掉,结合inactive 20s 的时间。

valid  1m  检查周期为1分钟。 

总结:缓存最多1000个,到了极限,每分钟开始清除掉  20秒内小于3次的文件FD.

Default:open_log_file_cache off;

Context:http, server, locatition

http{} 将整个服务器所有网站,所有页面的日志进行缓存

server{} 将某一个网站的所有页面日志,进行缓存

location{}某一个页面的日志,进行缓存。

2 日志轮转/切割

前言:Nginx安装,会默认启动日志轮转。

rpm  -ql nginx| grep log 

  etc/logrotate.d/nginx

/var/log/nginx

观察

vim /etc/logrotate.d/nginx 

/var/log/nginx/*log {             待切割的日志
    
    create 0644 nginx nginx                      创建新的日志文件,属主
    
    daily                                天
    
    rotate 10                              10份
  
    missingok                               丢失不提示
  
    notifempty                                 空文件的话,不转储
    
    compress                                      压缩
    
    sharedscripts                              轮转后脚本
  
    postrotate
        /bin/kill -USR1 `cat /run/nginx.pid 2>/dev/null` 2>/dev/null || true
    USR1亦通常被用来告知应用程序重载配置文件;例如,向Apache HTTP服务器发送一个USR1信号将导致以下步骤的发生:停止接受新的连接,等待当前连接停止,重新载入配置文件,重新打开日志文件,重启服务器,从而实现相对平滑的不关机的更改。
    endscript
}

轮转语句

指令 /usr/sbin/logrotate -s /var/lib/logrotate/logrotate.status /etc/logrotate.conf

切割原理回顾(扩展)

1.cron每小时呼唤一次anacron           vim /etc/cron.hourly/0anacron

2.anacrontab以天,周,月循环往复          vim /etc/anacrontab

3.天循环                                               vim /etc/cron.daily/logrotate

4.立刻循环                指令 /usr/sbin/logrotate -s /var/lib/logrotate/logrotate.status /etc/logrotate.conf

5.anacron当天的时间戳             vim /var/spool/anacron/cron.daily             20180731

6.anacron循环后的时间戳         vim /var/lib/logrotate/logrotate.status                "/var/log/nginx/host.404.log" 2017-11-19-0:8:56

根据该时间确定是否轮转。

3 日志分析

日志格式
日志条目
常用字段
    $remote_addr    $1
        远程客户端地址
    $time_local        $4
        本机时间
    $request           $7
        请求URL
    $status             $9
        状态码
    $body_bytes_sent $10
        请求体积
案例样本
    校内网
        wget ftp://10.18.40.100/solution/log.tar.gz
1. 统计2017年9月5日 PV量
    grep '05/Sep/2017' cd.mobiletrain.org.log |wc -l
        1260条
    8点-9点间
        1
            grep '05/Sep/2017:08' sz.mobiletrain.org.log  |wc -l
        2
            awk '$4>="[05/Sep/2017:08:00:00" && $4<="[05/Sep/2017:09:00:00" {print $0}'  sz.mobiletrain.org.log | wc -l
2. 统计2017年9月5日 一天内访问最多的10个IP(ip top10)
    grep '05/Sep/2017' cd.mobiletrain.org.log | awk '{ ips[$1]++ } END{for(i in ips){print i,ips[i]} } '| sort -k2 -rn | head -n10
        121.29.54.122 95
        121.29.54.124 84
        121.29.54.59 73
        121.29.54.101 73
        121.29.54.62 62
        121.29.54.60 56
        58.216.107.23 52
        119.147.33.22 50
        121.31.30.169 42
3. 统计2017年9月5日 访问大于100次的IP
     grep '05/Sep/2017' cd.mobiletrain.org.log | awk '{ ips[$1]++ } END{for(i in ips){ if(ips[i]>100)  {print i,ips[i]}} } '| sort -k2 -rn | head -n10
        182.140.217.111 138
4. 统计2017年9月5日 访问最多的10个页面($request top 10)
    grep '05/Sep/2017' cd.mobiletrain.org.log |awk '{urls[$7]++} END{for(i in urls){print urls[i],i}}' |sort -k1 -rn |head -n10
        60 /
            主页访问量最大
        41 /img/banner_btn.png
        23 /js/jquery-1.8.3.min.js
        21 /img/kbxx_bg.png
        21 /css/cd_index.css
        20 /d/file/works/2017-04-28/afed3f12498e47572f7a31dad04c4717.jpg
        19 /js/ymcore.js
        18 /img/ico.png
        17 /img/huanglaoshi.jpg
        17 /e/admin/DoTimeRepage.php
5. 统计2017年9月5日 每个URL访问内容总大小($body_bytes_sent),和次数
    grep '05/Sep/2017' sz.mobiletrain.org.log |
awk '{ urls[$7]++; size[$7]+=$10}
END{for(i in urls){print urls[i],size[i],i}}'|
sort -k1 -rn | head -n10
        44 4040481 /
        34 5372 /e/admin/DoTimeRepage.php
        25 75026 /js/jquery-1.11.3.min.js
        25 678973 /skin/sz/js/minkh.php
        22 173642 /skin/sz/js/page/jquery-1.4.2.min.js
        21 1906 /skin/sz/js/page/ready.js
        19 3312 /skin/sz/js/table.js
        18 10184 /skin/sz/js/page/core.js
        16 7818 /img/kbxx_bg.png
        16 42120 /img/sz_home/sz_js.png
6. 统计2017年9月5日 每个IP访问状态码数量($status)
    grep '05/Sep/2017' cd.mobiletrain.org.log | 
awk '{ ip_code[$1" "$9]++}
END{ for(i in ip_code){print i,ip_code[i]} }' | 
sort -k1 -rn | head -n10
        220.112.25.173 304 1
        220.112.25.173 200 30
        183.214.128.195 304 18
        183.214.128.195 200 10
        183.214.128.152 200 10
        183.214.128.142 304 18
        183.214.128.142 200 5
        182.140.217.111 404 7
        182.140.217.111 304 109
        182.140.217.111 200 22
7. 统计2017年9月5日 每个IP访问状态码为404及出现次数($status)
    grep '05/Sep/2017' cd.mobiletrain.org.log |
 awk '$9=="404"{ccc[$1" "$9]++}
END{for(i in ccc){print i,ccc[i]}}'  | 
sort -k3 -rn
    grep '05/Sep/2017' sz.mobiletrain.org.log | 
awk '{if($9="404"){ip_code[$1" "$9]++}}
END{for(i in ip_code){print i,ip_code[i]}}'
        58.216.107.21 404 5
        139.215.203.174 404 67
        125.211.204.174 404 10
        58.216.107.22 404 25
        106.117.249.12 404 6
        119.147.33.21 404 50
        42.56.76.44 404 5
        119.147.33.22 404 117
        106.117.249.36 404 9
        58.216.107.23 404 2
        119.147.33.18 404 118
        58.216.107.11 404 7
        42.56.76.21 404 5
        111.1.57.20 404 6
        183.203.65.18 404 28
        58.216.107.12 404 21
        106.117.249.13 404 4
        121.29.54.60 404 38
        121.29.54.122 404 67
        58.216.107.36 404 43
        58.216.107.24 404 10
        119.147.33.19 404 47
        182.140.217.111 404 18
        42.56.76.22 404 6
        183.214.128.151 404 15
        106.117.249.14 404 4
        42.56.76.11 404 6
        183.214.128.152 404 15
        153.37.238.173 404 41
        58.250.143.116 404 25
        121.29.54.124 404 91
        120.221.31.44 404 24
        121.31.30.169 404 90
        121.29.54.62 404 71
        121.29.54.101 404 76
        42.56.76.12 404 3
        111.1.57.19 404 6
        183.214.128.141 404 29
        121.29.54.59 404 51
        106.117.249.43 404 8
        1.31.173.43 404 27
        58.216.107.111 404 5
        119.147.33.26 404 147
        183.214.128.142 404 45
        58.216.107.31 404 4
        220.112.25.173 404 12
        111.161.109.103 404 27
        124.14.1.173 404 18
        106.117.249.11 404 35
        183.214.128.195 404 6
        123.151.76.53 404 49
        119.147.33.20 404 94
8. 统计前一分钟的PV量
    date=$(date -d '-1 minute' +%d/%b/%Y:%H:%M);
awk  -v date=$date '$0 ~ date {i++} 
END{print i}'  sz.mobiletrain.org.log
        无
        shell中的变量在awk程序中无法使用,因为在执行AWK时,是一个新的进程去处理的,因此就需要-v 来向awk程序中传参数了,你比如在shell程序中有一个变量a=15,你在awk程序中直接使用变量a是不行的,而你用awk -v b=a, 这样在AWK程序中就可以使用变量b了!也就相当于使用a了! 
    # date=$(date -d '-1 minute' +%Y:%H:%M);  awk -v date=$date '$0 ~ date{i++}END{print i}' /var/log/nginx/xuleilinux.access.log 
9. 统计2017年9月5日 8:30-9:00,每个IP,出现404状态码的数量
    awk '$4>="[05/Sep/2017:08:30:00" && 
$4<="[05/Sep/2017:09:00:00" 
{if($9="404"){ip_code[$1" "$9]++}}
END{for(i in ip_code){print i,ip_code[i]}}' 
sz.mobiletrain.org.log 
        121.31.30.169 404 2
        183.214.128.152 404 10
        121.29.54.101 404 1
        119.147.33.19 404 1
        58.250.143.116 404 2
        121.29.54.59 404 1
        121.29.54.60 404 1
10. 统计2017年9月5日 各种状态码数量
    grep '05/Sep/2017' sz.mobiletrain.org.log  | 
awk '{code[$9]++} END{for(i in code){print i,code[i]}}'
        301 1
        304 821
        200 625
        404 290
        405 1
    百分比
        grep '05/Sep/2017' sz.mobiletrain.org.log | awk '{code[$9]++;total++} END{for(i in code){printf i" ";printf code[i]"\t";printf "%.2f",code[i]/total*100;print "%"}}'
            301 1    0.06%
            304 821    47.24%
            200 625    35.96%
            404 290    16.69%
            405 1    0.06%

8.Nginx WEB模块

随机主页

微更新

random_index_module

目的:将主页设置成随机页面,是一种微调更新机制

启动随机主页

1 创建主页目录

mkdir /app

2 创建多个主页

touch /app/{blue.html,green.html,red.html,yellow.html}

在不同的页面书写不同的内容,例如



green color              

             

green color!



Nginx 基础入门篇(3)_第3张图片

3 启动随机主页

vim /etc/nginx/conf.d/default.conf

server{

location / {
     #root   /usr/share/nginx/html;
     #index  index.html index.htm;
     root /app;
     random_index on;
}
}

systemctl restart nginx

刷新主页,观察变化

Nginx 基础入门篇(3)_第4张图片

Nginx 基础入门篇(3)_第5张图片

Nginx 基础入门篇(3)_第6张图片

Nginx 基础入门篇(3)_第7张图片

替换模块sub_module

目的

网页内容替换

如果我们用模板生成网站的时候,因为疏漏或者别的原因造成代码不如意,但是此时因为文件数量巨大,不方便全部重新生成,那么这个时候我们就可以用此模块来暂时实现纠错。另一方面,我们也可以利用这个实现服务器端文字过滤的效果。

启动替换

vim /etc/nginx/conf.d/default.conf

    在server{下面插入

sub_filter nginx 'QianFeng';
sub_filter_once on;

说明:替换模块  将nginx  替换成 QianFeng
      单次替换 开启

Nginx 基础入门篇(3)_第8张图片

1.只替换了一处。

2.将单次替换关闭,再次刷新页面,即可看见全文替换。

sub_filter_once off

 

文件读取

模块

模块  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_nopush on | off;
Default:     tcp_nopush off;
Context: http, server, location

原理介绍

sendfile

未使用sendfile() 的传统网络传输过程:

硬盘 >> kernel buffer >> user buffer>> kernel socket buffer >>协议

图示

Nginx 基础入门篇(3)_第9张图片

使用 sendfile() 来进行网络传输的过程:

硬盘 >> kernel buffer (快速拷贝到kernelsocket buffer) >>协议栈

sendfile() 不但能减少切换次数而且还能减少拷贝次数。

tcp_nopush

未使用tcp_nopush()网络资源浪费

应用程序每产生一次操作就会发送一个包,而典型情况下一个包会拥有一个字节的数据以及40个字节长的包头,于是产生4000%的过载,很轻易地就能令网络发生拥塞。同时也浪费资源

使用tcp_nopush()网络传输效率提升

当包累计到一定大小后再发送。

tcp_nodelay

开启或关闭nginx使用TCP_NODELAY选项的功能。 这个选项仅在将连接转变为长连接的时候才被启用。
TCP_NODELAY是禁用Nagle算法,即数据包立即发送出去。
由于Nagle和DelayedACK的原因,数据包的确认信息需要积攒到两个时才发送,长连接情况下,奇数包会造成延时40ms,所以tcp_nodelay会将ack立刻发出去。 如果不在长连接时,可以关闭此模块,因为ack会被立刻发出去。

启用模块

location /video/ {
    sendfile        on;
    tcp_nopush  on;
}

默认启动,无需验证

 

文件压缩

原理介绍

启动该模块,使文件传输前进行压缩,提升传输效率。

模块  ngx_http_gzip_module

语法

Syntax:     gzip on | off;
Default:     gzip off;
Context: http, server, location, if in location

Syntax:     gzip_comp_level level;
Default:     gzip_comp_level 1;(1~9)
Context: http, server, location

Syntax:     gzip_http_version 1.0 | 1.1;
Default:     gzip_http_version 1.1;
Context: http, server, location

启用模块

1 观察未压缩传输

拷贝图片至网站主目录

拷贝tar包至网站主目录

Nginx 基础入门篇(3)_第10张图片

拷贝文本至文件主目录

Nginx 基础入门篇(3)_第11张图片

通过浏览器下载文件并观察下载后大小。

2 启用压缩功能

http {              在http标签中启动该功能

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;                                                   gzip_static on;# nginx对于静态文件的处理模块

......

}

systemctl  restart nginx      //重启nginx

3 观察压缩传输

注意缓存

压缩包和图片类对象本身已经自带压缩功能。所以压缩比例较小低。
文本类对象在压缩试验中,压缩比例体现优越。

再通过浏览器下载文件并观察下载后大小。

示范:

Nginx 基础入门篇(3)_第12张图片

 

Nginx 基础入门篇(3)_第13张图片

 

Nginx 基础入门篇(3)_第14张图片

页面缓存

模块 ngx_http_headers_module

expires起到控制页面缓存的作用,合理的配置expires可以减少很多服务器的请求要配置expires,可以在http段中或者server段中或者location段中加入。
Nginx(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"的值

原理介绍

无缓存,每次访问服务器,均是全文传输。
开启缓存可以加速浏览网站。

启用缓存

观察浏览器缓存

1 开启浏览器缓存,浏览页面。(默认)

第一次返回状态码200.页面对象全文传输

第二次返回状态304.页面对象部分传输。

2 禁用缓存。浏览页面

返回码200.全文传输

理解浏览器缓存作用。

3 解析缓存原理

Nginx 基础入门篇(3)_第15张图片

 

理解nginx服务器缓存

4 开启服务器缓存模块

vim /etc/nginx/conf.d/default.conf

    location / {
        root   /usr/share/nginx/html
        index  index.html index.htm;
        expires 24h;
    }

5 再次浏览页面,观察响应头中出现服务器回复的缓存时间

Nginx 基础入门篇(3)_第16张图片

6 理解nginx服务器启动缓存时间,加速浏览。缺点是时效性降低。

 

防盗链

模块 ngx_http_referer_module

语法

Syntax:     valid_referers none | blocked | server_names | string ...;
Default:     —
Context: server, location

日志原理介绍

log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                         '$status $body_bytes_sent "$http_referer" '
                         '"$http_user_agent" "$http_x_forwarded_for"';

日志格式中的http_referer是记录,访问点引用的URL。也就是超链接的上一级地址。
通过这段地址,可以发现一种网络行为——盗链。非法盗链会影响站点的正常访问。
通过http_referer模块可以控制这一点。防止非法盗链现象。

 

启动防盗链

展现盗链现象,启动防盗链

1 搭建一个a.com网站

创建a.com.conf配置文件

在主页中插入图片

# vim /a/index.html

分离a.com的日志

Nginx 基础入门篇(3)_第17张图片

# vim /etc/nginx/conf.d/a.conf

server {
     listen       80;
     server_name  a.com;
     location / {
        root /a;
        index index.html;
       }
   access_log  /var/log/nginx/a.log  main;

}

       systemctl reatart nginx   //重启nginx

2 搭建一个b.com网站

创建b.com.conf配置文件

# vim /etc/nginx/conf.d/b.conf

server {
     listen       80;
     server_name  a.com;
     location / {
        root /a;
        index index.html;
       }
   access_log  /var/log/nginx/a.log  main;

}

在主页中盗链A网站的图片

# vim /b/index.html

3 访问两个网站页面。均能正常显示图片。

Nginx 基础入门篇(3)_第18张图片

Nginx 基础入门篇(3)_第19张图片

4 注意b.com网站的日志

日志正常。

192.168.121.1 - - [24/Sep/2020:20:19:21 +0800] "GET / HTTP/1.1" 304 0 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:81.0) Gecko/20100101 Firefox/81.0" "-"

5 注意a.com网站的日志

tailf /var/log/nginx/a.log 

日志不正常。日志莫名其妙的产生了。
观察referer字段,发现被盗链了。

6  启动a.com防盗链功能

# vim /etc/nginx/conf.d/a.conf

location / {
        root   /a:;
        index  index.html index.htm;
     
        valid_referers none blocked *.a.com;
        if ($invalid_referer) {
            return 403;
        }
    }

重启服务

7 再次访问b.com网站,盗链失败。

Nginx 基础入门篇(3)_第20张图片

8 如果希望某些网站能够使用(盗链)资源:

生产环境


location ~* \.(gif|jpg|png|bmp)$ {
root /a.com
    valid_referers none blocked  *.qfcloud.top server_names ~tianyun ~\.google\. ~\.baidu\.;
    if ($invalid_referer) {
        return 403;
        #rewrite .* http://qfcloud.top/403.jpg;
    }
}

测试环境

Nginx 基础入门篇(3)_第21张图片

重启nginx

9 再次盗链,合法盗链成功。

Nginx 基础入门篇(3)_第22张图片

连接状态stub_status_module

目的

展示用户和nginx链接数量信息。

查询模块是否安装

nginx -V 2>&1 | grep stub_status 

--with-http_stub_status_module

启动状态模块

1 访问默认站点的状态模块(注意:错误验证)

http://192.168.121.152/nginx_status

Nginx 基础入门篇(3)_第23张图片

未启用

2 配置状态模块

vim /etc/nginx/conf.d/default.conf

请写在server内

server {

location /nginx_status {    
stub_status;                                启用该模块
allow all;
}

}

3 重启服务再次访问

systemctl restart nginx

示例

观察连接数 和请求数。

解释

Active connections: 22    当前活动的连接数

server accepts handled requests     

服务器接受处理请求 

17 17 24

17        总连接数connection(TCP)

17        成功的连接数connection (TCP)

24             总共处理的请求数requests(HTTP)

TCP三次握手/四次断开

Nginx 基础入门篇(3)_第24张图片

    失败连接=(总连接数-成功连接数)

Reading: 2            读取客户端Header的信息数         请求头

Writing: 1        返回给客户端的header的信息数     响应头

Waiting: 19            等待的请求数,开启了keepalive

关于链接的问题

1.什么是链接

OSI封装回顾

Nginx 基础入门篇(3)_第25张图片

TCP封装结构

Nginx 基础入门篇(3)_第26张图片

TCP三次握手

Nginx 基础入门篇(3)_第27张图片

 

TCP四次挥手/四次断开

 

Nginx 基础入门篇(3)_第28张图片

TCP机制四大计时器

重传计时器(Retransmession)
    为了防止数据报丢失,当TCP发送一个报文时,就启动重传计时器,有2种情况:
    1.若在计时器超时之前收到了特定报文的确认,则撤消这个计时器;
    2.特定数据报在计时器超时前没有收到确认,则重传该数据报,并把计时器复位
持久计时器(Persistance)
    前面在流量控制篇提到死锁现象
    要解开死锁,TCP为每一个连接使用一个持久计时器
    当发送端TCP接收到rwnd=0的确认时,就启动持久计时器,当计时器截止时间到时,发送端TCP需要发送一个特殊的报文,叫做探测报文
    该报文只有1字节,有序号,但无需确认
    探测报文提醒接收端TCP:确认已丢失,必须重传
    持久计时器截止时间设置为重传时间的数值,但是,如果没有收到从接收端回来的响应,则需要发送另外一个探测报文,并将持久计时器的值 加倍和复位
    如果结果和上面一样,发送端继续发送探测报文,直到其截止时间增大到阈值(通常为60s)为止
    在这以后,发送端每60s发送一个探测报文,直到窗口重新打开
保活计时器(keep-alive)
    在某些实现中要使用keeplive timer来防止两个TCP之间出现长时间的空闲
    比如客户端打开了服务器端的连接,传送了一些数据,然后就保持静默了
    也许该客户端除了故障,在这种情况下,这个连接就永远处于打开状态
    保活计时器的解决方法为,当服务器端收到客户端的信息时,就把计时器复位,超时通常设置2小时
    若服务器2小时还没有收到客户的信息,就发送探测报文
    若发送10个同样的报文(每个相隔75s)还没有收到响应,就认为客户端出了故障,终止这个连接
时间等待(time-wait)
    如果最后一个ACK报文丢失了,那么服务器TCP(它为最后的FIN设置了计时器)以为它的FIN丢失了,因而重传

TCP流控/拥塞管理

原理
    接收端处理数据的速度是有限的,如果发送方的速度太快,就会把缓冲区u打满。这个时候如果继续发送数据,就会导致丢包等一系列连锁反应。
    所以TCP支持根据接收端能力来决定发送端的发送速度。这个机制叫做流控制。

窗口大小
    (接收端向发送端主机通知自己可以接受数据的大小,这个大小限制就叫做窗口大小)

2.什么是请求

一次HTTP查询

3.keepalived长连接设置
    
        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连接。

4.关闭长连接会如何

systemctl restart nginx

5.再次刷新状态也观察

 

 

 

 

 

 

 

你可能感兴趣的:(nginx,linux,centos,服务器)