1、nginx 是一个高性能的 HTTP 和反向代理服务器,也是一个 IMAP/POP3/SMTP 服务器。
2、nginx 的 web 优势:
① 支持高并发(解决 C10k 问题:connect 10000 万级并发)
② 反向代理:负载均衡和缓存服务器。nginx 作为代理器,接收各种用户的访问,将用户请求分发给服务器 ;nginx 还能实现动静分离技术,将动态页面和静态页面分给不同的服务器。
③ IMAP/POP3/SMTP:邮局协议,nginx 可以做邮箱服务器。
3、nginx IO 多路复用
(1) 频分多路复用:一个信道不同频段分开,传递不同的信息,再组合到一起。
(2) 时分多路复用:将时间分成不同的时间块,处理不同的任务
(3) IO 多路复用:
① 传统的多进程并发模型:每进来一个新的 I/O 流会分配一个新的进程管理。
一个程序生成多个线程,处理不同用户的请求。
弊端: 只要一个线程故障,整个进程都会故障(影响同进程中的其他线程)
② I/O 多路复用:单个线程跟踪每个 I/O 流的状态,同时管理多个 I/O 流(一个线程同时传输多个 I/O 流)
一个程序服务多个用户,接收 A 的访问请求,交给后台服务器处理,期间的时延,程序再去接受 B 的请求,以此完成 I/O 多路复用。
③ epoll 模型实现 I/O 多路复用
特点:异步,非阻塞
异步:用户请求时,程序不是同时处理;
非阻塞:处理 A 请求的时延过程中,去处理 B 的请求
阻塞:一个用户请求占用了整个进程,处理完后才能处理下一个用户的请求
/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:文件关联程序,包含网站文件类型和相关处理程序
运行 nginx -V,会显示 Nginx 服务器的编译参数和配置选项的信息
① 版本信息:显示 Nginx 的版本号。
② 编译器信息:显示用于编译 Nginx 的编译器类型和版本。
③ 编译时间:显示 Nginx 服务器编译的日期和时间。
④ 配置参数:显示用于配置 Nginx 服务器的编译参数。这包括启用或禁用的模块、安装路径、调试选项等。
① CoreModule 核心模块
影响 nginx 全局的指令,有运行 nginx 服务器的用户组 ;nginx 处理客户端请求的进程数 ;错误日志存放位置 ;pid 存放路径
② EventModule 事件驱动模块
影响 nginx 服务器与用户的网络连接,配置每个进程的最大连接数。事件驱动模块默认是 epoll(异步连接)
③ HttpCoreModule http 内核模块
include /etc/nginx/mime.types; 定义文件扩展名和与之关联的程序类型
default_type application/octet-stream; 应用程序流:字节流处理方式
/etc/nginx/conf.d/default.conf
sever 文件嵌套在 http 下
nginx 每个级别的配置有各自独立的访问日志,日志格式通过 log_format 定义
log_format name string
name 表示日志格式 ;string 表示定义的格式
主配置文件在日志部分的配置
用另一台客户机访问 nginx 服务器,观察 /var/log/nginx/access.log 即可查询到客户机的访问记录:
① 日志配置包含的变量:
$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:服务器作为网关或代理,未及时从上游服务器接收到响应。
① 查询错误日志:tailf /var/log/nginx/error.log
② 404 页面:
● 404 文件配置的位置:
● 创建错误反馈页面:/usr/share/nginx/html/404.html
● 观察 404 界面:
(1) 简介:访问到来时,对于每一条日志记录,都是先打开文件,再写入日志,然后关闭,占用系统 IO
(2) 节省 IO 的办法:在配置文件中启用日志缓存 open_log_file_cache(默认关闭)
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
● create 0640 nginx root:日志轮转后产生新文件,权限 640,属主 nginx ,属组 root
● daily:轮转周期,以天为单位
● rotate 10:保留10份
● missingok:丢失不提示
● notifempty:空文件不轮转
● compress:压缩日志
● delaycompress:延迟压缩操作
$remote_addr $1 远程客户端 IP 地址
$time_local $4 本地时间
$request $7 请求 URL
$status $9 状态码
$body_bytes_sent $10 请求文件体积
① 统计 2017年9月5日的网站 pv 量
网站 PV 量:指一个网站被用户访问的次数,也就是页面浏览量。每秒钟有多少次用户访问网站,就会被记录为一次 PV
grep '05/Sep/2017' cd.mobiletrain.org.log | wc -l
统计 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
● awk '$4>="[05/Sep/2017:08:00:00]" && $4<"[05/Sep/2017:09:00:00]" {print $0}' sz.mobiletrain.org.log | wc -l
匹配时间在 05/Sep/2017:08:00:00 - 05/Sep/2017:09:00:00 的访问信息, {print $0}:打印整行
② 统计 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:倒序
统计 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
③ 统计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:用户访问的界面
④ 统计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] 中,以统计文件总大小。
⑤ 统计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 数组中
统计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