相关推荐recommended
nginx 配置与日志管理
作者:mmseoamin日期:2023-12-14

nginx 系统配置

一、nginx 简介

1、nginx 是一个高性能的 HTTP 和反向代理服务器,也是一个 IMAP/POP3/SMTP 服务器。

2、nginx 的 web 优势:

① 支持高并发(解决 C10k 问题:connect 10000 万级并发)

② 反向代理:负载均衡和缓存服务器。nginx 作为代理器,接收各种用户的访问,将用户请求分发给服务器 ;nginx 还能实现动静分离技术,将动态页面和静态页面分给不同的服务器。

③ IMAP/POP3/SMTP:邮局协议,nginx 可以做邮箱服务器。

3、nginx IO 多路复用

(1) 频分多路复用:一个信道不同频段分开,传递不同的信息,再组合到一起。

nginx 配置与日志管理,第1张

(2) 时分多路复用:将时间分成不同的时间块,处理不同的任务

nginx 配置与日志管理,第2张

(3) IO 多路复用:

① 传统的多进程并发模型:每进来一个新的 I/O 流会分配一个新的进程管理。

一个程序生成多个线程,处理不同用户的请求。

弊端: 只要一个线程故障,整个进程都会故障(影响同进程中的其他线程)

② I/O 多路复用:单个线程跟踪每个 I/O 流的状态,同时管理多个 I/O 流(一个线程同时传输多个 I/O 流)

一个程序服务多个用户,接收 A 的访问请求,交给后台服务器处理,期间的时延,程序再去接受 B 的请求,以此完成 I/O 多路复用。

nginx 配置与日志管理,第3张

③ epoll 模型实现 I/O 多路复用

特点:异步,非阻塞

异步:用户请求时,程序不是同时处理;

非阻塞:处理 A 请求的时延过程中,去处理 B 的请求

阻塞:一个用户请求占用了整个进程,处理完后才能处理下一个用户的请求

二、nginx 配置文件

1、查询 nginx 所有文件:rpm -ql nginx

/etc/logrotate.d/nginx :日志轮转文件

/etc/nginx/nginx.conf:nginx 主配置文件

/etc/nginx/conf.d:nginx 子配置文件夹

/etc/nginx/conf.d/default.conf:nginx 默认网站配置文件

/etc/nginx/fastcgi_params:动态网站模块

/etc/nginx/mime.types:文件关联程序,包含网站文件类型和相关处理程序

2、nginx 编译参数:nginx -V

运行 nginx -V,会显示 Nginx 服务器的编译参数和配置选项的信息

① 版本信息:显示 Nginx 的版本号。

② 编译器信息:显示用于编译 Nginx 的编译器类型和版本。

③ 编译时间:显示 Nginx 服务器编译的日期和时间。

④ 配置参数:显示用于配置 Nginx 服务器的编译参数。这包括启用或禁用的模块、安装路径、调试选项等。

3、nginx 主配置文件

① CoreModule 核心模块

影响 nginx 全局的指令,有运行 nginx 服务器的用户组 ;nginx 处理客户端请求的进程数 ;错误日志存放位置 ;pid 存放路径

nginx 配置与日志管理,第4张

② EventModule 事件驱动模块

影响 nginx 服务器与用户的网络连接,配置每个进程的最大连接数。事件驱动模块默认是 epoll(异步连接)

nginx 配置与日志管理,第5张

③ HttpCoreModule http 内核模块

include /etc/nginx/mime.types;                  定义文件扩展名和与之关联的程序类型

default_type application/octet-stream;      应用程序流:字节流处理方式

nginx 配置与日志管理,第6张

4、默认虚拟主机配置文件

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

sever 文件嵌套在 http 下

nginx 配置与日志管理,第7张

nginx 日志管理

一、日志配置

1、日志的格式和命令 log_format

(1) 简介

nginx 每个级别的配置有各自独立的访问日志,日志格式通过 log_format 定义

(2) 语法

log_format name string

name 表示日志格式 ;string 表示定义的格式

主配置文件在日志部分的配置

nginx 配置与日志管理,第8张

(3) access_log

用另一台客户机访问 nginx 服务器,观察 /var/log/nginx/access.log 即可查询到客户机的访问记录:

nginx 配置与日志管理,第9张

① 日志配置包含的变量:

$remote_addr:记录远程客户端的 ip 地址 192.168.198.133

$remote_user:远程用户,默认匿名访问

[$time_local]:服务器的本地时间 [09/Sep/2023:14:51:31 +0800]

"$request":记录请求的 URL 和 http 协议 "GET / HTTP/1.1"        GET / 获取根页面

$status:记录请求状态 200 / 404

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

"$http_referer":超链接

"$http_user_agent":记录客户机浏览器相关信息 "Mozilla/5.0 (X11; Linux x86_64; rv:52.0) Gecko/20100101 Firefox/52.0"

"$http_x_forwarded_for":代理 ip

② 补充知识:http 状态码:

HTTP状态码是指在HTTP协议中,服务器向客户端返回的一个三位数字的状态码,表示服务器对客户端请求的响应结果。常见的HTTP状态码及其含义:

1xx - 信息性状态码:

100 Continue:服务器已收到请求的初始部分,客户端继续发送其余部分。

101 Switching Protocols:服务器已经理解客户端的请求,将通过 Upgrade 消息头通知客户端切换协议。

2xx - 成功状态码:

200 OK:请求已成功,服务器返回所请求的资源。

201 Created:请求已经被满足,并在服务器上创建了一个新的资源。

204 No Content:服务器成功处理请求,但不需要返回任何实体主体。

3xx - 重定向状态码:

301 Moved Permanently:请求的资源已永久移动到新的 URI ,客户端更新其链接。

302 Found (临时重定向):请求的资源临时移动到新的 URI ,客户端继续使用原始 URI。

304 Not Modified:客户端的缓存资源是最新的,不需要下载。

4xx - 客户端错误状态码:

400 Bad Request:请求无效,服务器无法理解客户端的请求。

401 Unauthorized:请求要求身份验证,客户端未提供有效的身份验证信息。

403 Forbidden:服务器拒绝了客户端的请求。

404 Not Found:服务器未找到请求的资源。

5xx - 服务器错误状态码:

500 Internal Server Error:服务器遇到了意外的错误,无法完成请求。

502 Bad Gateway:服务器作为网关或代理,从上游服务器接收到无效的响应。

503 Service Unavailable:服务器当前无法处理请求,通常是因为过载或维护。

504 Gateway Timeout:服务器作为网关或代理,未及时从上游服务器接收到响应。

(4) error_log

① 查询错误日志:tailf /var/log/nginx/error.log

nginx 配置与日志管理,第10张

② 404 页面:

● 404 文件配置的位置:

nginx 配置与日志管理,第11张

● 创建错误反馈页面:/usr/share/nginx/html/404.html

nginx 配置与日志管理,第12张

● 观察 404 界面:

nginx 配置与日志管理,第13张

2、日志缓存

(1) 简介:访问到来时,对于每一条日志记录,都是先打开文件,再写入日志,然后关闭,占用系统 IO

(2) 节省 IO 的办法:在配置文件中启用日志缓存 open_log_file_cache(默认关闭)

nginx 配置与日志管理,第14张

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

● max=1000:日志文件最大缓存数量为 1000

● inactive=20s min_uses=3:20秒内小于3次访问的日志文件就清除掉

● valid=1m:检查周期为一分钟。

总结:缓存最大量为1000,到达1000后开始每分钟清除20秒内小于3次的日志文件。

二、日志轮转 / 切割

日志轮转文件:/etc/logrotate.d/nginx

nginx 配置与日志管理,第15张

● create 0640 nginx root:日志轮转后产生新文件,权限 640,属主 nginx ,属组 root

● daily:轮转周期,以天为单位

● rotate 10:保留10份

● missingok:丢失不提示

● notifempty:空文件不轮转

● compress:压缩日志

● delaycompress:延迟压缩操作

三、日志分析

1、日志分析常用字段

$remote_addr $1 远程客户端 IP 地址

$time_local $4 本地时间

$request $7 请求 URL

$status $9 状态码

$body_bytes_sent $10 请求文件体积

2、日志文件实例

(1) 准备日志

nginx 配置与日志管理,第16张

(2) 示例:

① 统计 2017年9月5日的网站 pv 量

网站 PV 量:指一个网站被用户访问的次数,也就是页面浏览量。每秒钟有多少次用户访问网站,就会被记录为一次 PV 

grep '05/Sep/2017' cd.mobiletrain.org.log | wc -l

nginx 配置与日志管理,第17张

统计 2017年9月5日8点-9点 间的 pv 量

● grep '05/Sep/2017:08' sz.mobiletrain.org.log | wc -l

'05/Sep/2017:08':08 → 08:00:00 - 08:59:59

nginx 配置与日志管理,第18张

● awk '$4>="[05/Sep/2017:08:00:00]" && $4<"[05/Sep/2017:09:00:00]" {print

}' sz.mobiletrain.org.log | wc -l

匹配时间在 05/Sep/2017:08:00:00 - 05/Sep/2017:09:00:00 的访问信息, {print $0}:打印整行

nginx 配置与日志管理,第19张

② 统计 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

{ ips[$1]++ } :把第一列的索引放进 ips 数组中,并递增;

END{for(i in ips):行处理后,循环遍历 ips 数组

{print i,ips[i]}:打印出 ip 地址和访问的次数

sort -k2 -rn:k2:第2列 ;-rn:倒序

nginx 配置与日志管理,第20张

统计 2017年9月5日 访问大于50次的IP

grep '05/Sep/2017' cd.mobiletrain.org.log | awk '{ ips[$1]++ } END{for(i in ips) {if(ips[i]>50) {print i,ips[i]}} } '| sort -k2 -rn | head -n10

nginx 配置与日志管理,第21张

③ 统计2017年9月5日 访问最多的10个页面($request top 10)

grep '05/Sep/2017' cd.mobiletrain.org.log | awk '{urls[$7]++} END{for(i in urls){print i,urls[i]}}' | sort -k2 -rn | head -n10

{urls[$7]++}:$7:用户访问的界面

nginx 配置与日志管理,第22张

④ 统计2017年9月5日 每个URL访问内容总大小($body_bytes_sent)

grep '05/Sep/2017' cd.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

size[$7]+=$10:$10:$body_bytes_sent 文件字节数 ;只要出现 $7($request) 就将访问的文件字节数加到 size[$7] 中,以统计文件总大小。

nginx 配置与日志管理,第23张

⑤ 统计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

awk '{ ip_code[$1" "$9]++}:把 ip 地址和状态码添加至 ip_code 数组中

nginx 配置与日志管理,第24张

统计2017年9月5日 每个IP访问状态码为 404 及出现的次数

grep '05/Sep/2017' cd.mobiletrain.org.log | awk '$9=="404"{ip_code[$1" "$9]++} END{for(i in ip_code){print i,ip_code[i]}}' | sort -k3 -rn | head -n10

nginx 配置与日志管理,第25张