Nginx 基础入门补充2

一 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
日志缓存
open_log_file_cache max=N [inactive=time] [mim_uses=N] [valid=time] | off

该指令默认是禁止的,等同于:
open_log_file_cache off;

open_log_file_cache 指令的各项参数说明如下:
max: 设置缓存中的最大文件描述符数量。如果超过设置的最大文件描述符数量,则采用 LRU (Least Recently Used) 算法清除"较不常使用的文件描述符"。 LRU (Least Recently Used) 算 法的基本概念是:当内存缓冲区剩余的可用空间不够时,缓冲区尽可能地先保留使用者最常使用 的数据,将最近未使用的数据移出内存,腾出空间来加载另外的数据。

inactive: 设置一个时间,如果在设置的时间内没有使用此文件描述符,则自动删除此描述符。 此参数为可选参数,默认的时间为 10 秒钟。

min_uses: 在参数 inactive 指定的时间范围内,如果日志文件超过被使用的次数,则将该日 志文件的描述符记入缓存。默认次数为 1。

valid: 设置多长时间检查一次,看一看变量指定的日志文件路径与文件名是否仍然存在。默 认时间为 60秒。
off: 禁止使用缓存。

open_log_file_cache 指令的设置示例如下:
open_log_file_cache max=1000 inactive=20s min_uses=2 valid=1m;
日志的格式和命令
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地址。
r e m o t e a d d r 获 取 的 是 反 向 代 理 的 I P 地 址 。 反 向 代 理 服 务 器 在 转 发 请 求 的 h t t p 头 信 息 中 , 可 以 增 加 X − F o r w a r d e d − F o r 信 息 , 用 来 记 录 客 户 端 I P 地 址 和 客 户 端 请 求 的 服 务 器 地 址 。 n g i n x 代 理 日 志 格 式 如 下 l o g f o r m a t p o r x y ′ remote_addr获取的是反向代理的IP地址。反向代理服务器在转发请求的http头信息中,可以增加X-Forwarded-For信息, 用来记录客户端IP地址和客户端请求的服务器地址。 nginx代理日志格式如下 log_format porxy ' remoteaddrIPhttpXForwardedForIPnginxlogformatporxyhttp_x_forwarded_for - r e m o t e u s e r [ remote_user [ remoteuser[time_local] ’
’ “$request” $status KaTeX parse error: Double superscript at position 19: …y_bytes_sent ' '̲ "http_referer" “$http_user_agent” ';
全局和局部
定义设置位置
vim /etc/nginx/nginx.conf
日志部分配置

		    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"
					"GET /index.html HTTP/1.1"
			$status 
				状态:记录请求状态
					200
					404
					503
					100
					301
			$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提示
			
			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
error_log
案例
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 修改主配置文件
server{

    error_page 404 /404.html;
        location = /404.html {
            root            /xuleilinux;
    }

}
systemctl restart nginx
2 创建错误反馈页面
vim /xuleilinux/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= ( d a t e − d ′ − 1 m i n u t e ′ + a w k − v d a t e = (date -d '-1 minute' +%d/%b/%Y:%H:%M); awk -v date= (dated1minute+awkvdate=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= ( d a t e − d ′ − 1 m i n u t e ′ + (date -d '-1 minute' +%Y:%H:%M); awk -v date= (dated1minute+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%

二 Nginx WEB模块

连接状态
stub_status_module
目的
展示用户和nginx链接数量信息。
查询模块是否安装
nginx -V 2>&1 | grep stub_status
–with-http_stub_status_module
启动状态模块
1 访问默认站点的状态模块(注意:错误验证)
http://10.18.41.64/nginx_status

			未启用
		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)
TCP三次握手/四次断开

					17		成功的连接数connection (TCP)
						    失败连接=(总连接数-成功连接数)
					24 	        总共处理的请求数requests(HTTP)
						connection    连接数,tcp连接                             
						request		    http请求,GET/POST/DELETE/UPLOAD
					Reading: 2	        读取客户端Header的信息数	     请求头
					Writing: 1		返回给客户端的header的信息数	 响应头
					Waiting: 19	        等待的请求数,开启了keepalive
				关于链接的问题
					1.什么是链接
						OSI封装回顾
							
						TCP封装结构
							
						TCP三次握手
							
						TCP四次挥手/四次断开
							
						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.再次刷新状态也观察

随机主页
微更新
random_index_module
目的
将主页设置成随机页面,是一种微调更新机制
启动随机主页
1 创建主页目录
mkdir /app
2 创建多个主页
touch /app/{blue.html,green.html,red.html,.yellow.html}
在不同的页面书写不同的内容,例如

green color

green color!

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
刷新主页,观察变化
4 请注意隐藏文件并不会被随机选取
替换模块
sub_module
目的
网页内容替换
如果我们用模板生成网站的时候,因为疏漏或者别的原因造成代码不如意,但是此时因为文件数量巨大,不方便全部重新生成,那么这个时候我们就可以用此模块来暂时实现纠错。另一方面,我们也可以利用这个实现服务器端文字过滤的效果。
启动替换1
vim /etc/nginx/conf.d/default.conf
启动nginx默认页面
server {
在server{下面插入
sub_filter nginx ‘QianFeng’;
sub_filter_once on;
location / {
root /usr/share/nginx/html;
index index.html index.htm;
}
说明
替换模块 将nginx 替换成 QianFeng
单次替换 开启
重启服务,测试页面

			1.只替换了一处。
			2.将单次替换关闭,再次刷新页面,即可看见全文替换。
				sub_filter_once off
	启动替换2
		1 准备一个被替换的java脚本
			vim /usr/share/nginx/html/hello.js 
				function Hello() {

alert(“Hello World”)
}
2 主页插入按钮
vim /usr/share/nginx/html/index.html

请注意body和h1是已有的。 3 启动替换 vim /etc/nginx/nginx.conf sub_filter nginx 'QianFeng'; sub_filter ''; sub_filter_once off; 在刚才的实验旁边,再加一条sub_filter 4 重启服务,测试页面。

文件读取
模块
统称
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() 的传统网络传输过程:
硬盘 >> kernel buffer >> user buffer>> kernel socket buffer >>协议栈
图示

		使用 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包至网站主目录
			压缩包的后缀使用.html
			
		拷贝文本至文件主目录
			
		通过浏览器下载文件并观察下载后大小。
	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
3 观察压缩传输
注意缓存
压缩包和图片类对象本身已经自带压缩功能。所以压缩比例较小低。
文本类对象在压缩试验中,压缩比例体现优越。
再通过浏览器下载文件并观察下载后大小。
页面缓存
模块
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服务器缓存
		4 开启服务器缓存模块
			vim /etc/nginx/nginx.conf
			    location / {
    root   /usr/share/nginx/html
    index  index.html index.htm;
    expires 24h;
}
		5 再次浏览页面,观察响应头中出现服务器回复的缓存时间
			
		6 理解nginx服务器启动缓存时间,加速浏览。
			缺点是时效性降低。

防盗链
模块
ngx_http_referer_module
语法
Syntax: valid_referers none | blocked | server_names | string …;
Default: —
Context: server, location
日志原理介绍
log_format main '$remote_addr - r e m o t e u s e r [ remote_user [ remoteuser[time_local] “KaTeX parse error: Double superscript at position 37: … '̲status b o d y b y t e s s e n t " body_bytes_sent " bodybytessent"http_referer” ’
‘“ h t t p u s e r a g e n t " " http_user_agent" " httpuseragent""http_x_forwarded_for”’;

日志格式中的http_referer是记录,访问点引用的URL。也就是超链接的上一级地址。
通过这段地址,可以发现一种网络行为——盗链。非法盗链会影响站点的正常访问。
通过http_referer模块可以控制这一点。防止非法盗链现象。
启动防盗链
展现盗链现象,启动防盗链
1 搭建一个a.com网站
在主页中插入图片
vim index.html

注意要将1.jpg图片拷贝至网站主目录。
2 搭建一个b.com网站
在主页中盗链A网站的图片
vim index.html

盗用链接
注意网站主目录中,根本没有图片。
3 访问两个网站页面。均能正常显示图片。
4 注意b.com网站的日志
日志正常。
192.168.100.254 - - [20/Sep/2017:15:10:27 +0800] “GET / HTTP/1.1” 200 42 “-” “Mozilla/5.0 (Windows NT 6.1; WOW64; rv:57.0) Gecko/20100101 Firefox/57.0” “-”
5 注意a.com网站的日志
日志不正常。日志莫名其妙的产生了。
观察referer字段,发现被盗链了。
192.168.100.254 - - [20/Sep/2017:15:10:27 +0800] “GET /1.jpg HTTP/1.1” 200 1635350 “http://192.168.100.20/” “Mozilla/5.0 (Windows NT 6.1; WOW64; rv:57.0) Gecko/20100101 Firefox/57.0”
6 启动a.com防盗链功能
location / {
root /a.com;
index index.html index.htm;

    valid_referers none blocked *.a.com;
    if ($invalid_referer) {
        return 403;
    }
}
			重启服务
		7 再次访问b.com网站,盗链失败。
		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;
}
}
location / {
root /a.com;
index index.html index.htm;

    valid_referers none blocked *.a.com        server_name  192.168.100.*  ~tianyun ~\.google\. ~\.baidu\.   b.com;
    if ($invalid_referer) {
        return 403;
    }
}
		9 再次盗链,合法盗链成功。

三 Nginx 访问限制

ngx_http_limit_req_module
目的
启动请求频率限制
0 测试未限制情况下的访问
yum install -y httpd-tools
ab -n 100 -c 10 http://tianyun.me/
1 启动限制
vim /etc/nginx/nginx.conf
定义
limit_req_zone $binary_remote_addr zone=req_zone:10m rate=1r/s;
限制请求 二进制地址 限制策略的名称 占用10M空间 允许每秒1次请求
引用
limit_req zone=req_zone;
引用 限制策略的名称
配置
http {
limit_req_zone $binary_remote_addr zone=req_zone:10m rate=1r/s; 定义

server {
    location / {
        root /usr/share/nginx/html;
        index index.html index.htm;
        limit_req zone=req_zone;  		引用
        #limit_req zone=req_zone burst=5;
        #limit_req zone=req_zone burst=5 nodelay; 
    }
}


引用限制
引用限制,但是令牌桶有5个。有延迟。速度慢
引用限制,但是令牌桶有5个。无延迟。速度快
burst=5 表示最大延迟请求数量不大于5。 如果太过多的请求被限制延迟是不需要的 ,这时需要使用nodelay参数,服务器会立刻返回503状态码。
2 重启服务,并测试
yum install -y httpd-tools
ab -n 100 -c 10 http://tianyun.me/
This is ApacheBench, Version 2.3 <$Revision: 1430300 $>
Benchmarking localhost (be patient)…done

Server Software: nginx/1.12.1
Server Hostname: tianyun.me
Server Port: 80

Document Path: /
Document Length: 671 bytes

Concurrency Level: 10
Time taken for tests: 0.006 seconds
Complete requests: 100
Failed requests: 99 失败的请求
(Connect: 0, Receive: 0, Length: 99, Exceptions: 0)
Write errors: 0
Non-2xx responses: 99 有问题的相应。
Total transferred: 73273 bytes
HTML transferred: 53834 bytes
Requests per second: 16131.63 [#/sec] (mean)
Time per request: 0.620 [ms] (mean)
Time per request: 0.062 [ms] (mean, across all concurrent requests)
Transfer rate: 11543.10 [Kbytes/sec] received
3 观察错误日志
tail -f /var/log/nginx/error.log
2017/10/08 01:05:08 [error] 23287#23287: *720 limiting requests, excess: 5.109 by zone “req_zone”,
client: 27.216.240.201, server: localhost, request: “GET / HTTP/1.0”, host: “tianyun.me”
limiting requests
由于限制请求导致。
ngx_http_limit_conn_module
目的
通过IP地址,限制链接(TCP)。但是实验环境无法测试
启动连接频率限制
1 启动连接频率限制
vim /etc/nginx/nginx.conf
http {
limit_conn_zone $binary_remote_addr zone=conn_zone:10m;
}
server {
location / {

limit_conn conn_zone 1;
}
}
limit_conn_zone:全局定义限制对象(IP),存储区限制空间(10M)字节
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) 错误。
 limit_conn_zone $binary_remote_addr zone=conn_zone:10m模块开启对单个ip、单个会话同时存在的连接数的限制。这里定义一个记录区conn_zone,conn_zone的总容量是10m,该记录区针对于变量 b i n a r y r e m o t e a d d 生 效 , 这 里 是 针 对 单 个 I P 生 效 。 该 模 块 只 是 一 个 定 义 , 配 置 在 h t t p 配 置 段 , 需 要 配 合 l i m i t c o n n 指 令 使 用 才 生 效 , l i m i t c o n n c o n n z o n e 1 表 示 该 l o c a t i o n 段 使 用 c o n n z o n e 定 义 的 l i m i t c o n n z o n e , 对 单 个 I P 限 制 同 时 存 在 一 个 连 接 。 单 个 I P , 同 时 只 允 许 有 一 个 t c p 连 接 2 测 试 y u m i n s t a l l − y h t t p d − t o o l s a b − n 100 − c 10 h t t p : / / 服 务 器 I P 地 址 / T h i s i s A p a c h e B e n c h , V e r s i o n 2.3 < binary_remote_add生效,这里是针对单个IP生效。该模块只是一个定义,配置在http配置段,需要配合limit_conn指令使用才生效, limit_conn conn_zone 1表示该location段使用conn_zone定义的 limit_conn_zone ,对单个IP限制同时存在一个连接。 单个IP,同时只允许有一个tcp连接 2 测试 yum install -y httpd-tools ab -n 100 -c 10 http://服务器IP地址/ This is ApacheBench, Version 2.3 < binaryremoteaddIPhttplimitconn使limitconnconnzone1location使connzonelimitconnzoneIPIPtcp2yuminstallyhttpdtoolsabn100c10http://IP/ThisisApacheBench,Version2.3<Revision: 1430300 $>
Benchmarking localhost (be patient)…done

Server Software: nginx/1.12.1
Server Hostname: tianyun.me
Server Port: 80

Document Path: /
Document Length: 671 bytes 文档长度

Concurrency Level: 10 当前并发数
Time taken for tests: 0.006 seconds 消耗总时间
Complete requests: 100 完成请求数
Failed requests: 0 失败请求数
Write errors: 0
Total transferred: 90400 bytes 总的传输大小
HTML transferred: 67100 bytes http传输大小
Requests per second: 15873.02 [#/sec] (mean) 每秒钟处理多少个请求。
3 效果不明显
4 了解不同的网站压力测试工具

四 Nginx 访问控制

基于主机(ip)
module
ngx_http_access_module
Directives
allow
允许某些主机
deny
拒绝某些主机
Syntax:
Syntax: allow address | CIDR | unix: | all;
Context: http, server, location, limit_except
启用控制
1 限制主机访问
vim /etc/nginx/conf.d/default.conf
server {
allow 10.18.45.65;
allow 10.18.45.181;
deny all;
}
2 测试
服务器无法访问
基于用户(username&password)
module
ngx_http_auth_basic_module
Syntax:
方法一
Syntax: auth_basic string | off;
Context: http, server, location, limit_except
方法二
Syntax: auth_basic_user_file file;
Context: http, server, location, limit_except
启用控制
1. 建立认证文件
yum install -y httpd-tools
生成秘钥的工具是由apache提供
htpasswd -cm /etc/nginx/conf.d/passwd user10
会话密码
htpasswd -m /etc/nginx/conf.d/passwd user20
会话密码
cat /etc/nginx/conf.d/passwd
观察口令文件是否生成。已生成
user10: a p r 1 apr1 apr1UE/tLtDM n V m 686 k A M Y b / A r q Q D U i 8 U / u s e r 20 : nVm686kAMYb/ArqQDUi8U/ user20: nVm686kAMYb/ArqQDUi8U/user20:apr1 b m n 0 E / g K bmn0E/gK bmn0E/gKenkXKb2V5uFvUy9wdIHlP.
2. 启动认证
vim /etc/nginx/conf.d/default.conf
server {
找到server{字段,在下一行插入认证字段。
auth_basic “nginx access test!”;
auth_basic_user_file /etc/nginx/conf.d/passwd;
提示消息
引用认证文件

}
3.重启并验证

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值