Nginx的模块从功能上分为如下三类:Handlers处理器模块、Filters过滤器模块、Proxies代理类模块。
一、列表
-
- 可能原因
- http连接太多没有关闭导致的。
- 机器的内存不够了。
- 由于请求频率过快,被目标网站封IP了
- 请求的url地址错误
- 解决方案
- 增加重试连接次数:
requests.adapters.DEFAULT_RETRIES = 5
- 关闭多余的连接:requests使用了urllib3库,默认的http connection是keep-alive的,requests设置False关闭。
- 增加重试连接次数:
- 可能原因
FastCGI sent in stderr: “Unable to open primary script
配置
1 | #字符集 |
常见日志处理
- 统计每个ip访问的次数
awk '{i=$1;a[i]+=1;}END{for(i in a)printf("%d %s \n",a[i],i)}' access.log
1
2
3
4
5
6
7
8
9
10
11
12
13
142093 192.168.10.1
2 192.168.10.2
2 192.168.10.3
1 127.0.0.1
1259 127.0.0.1
1 192.168.10.10
2 192.168.10.4
2 192.168.10.5
2 192.168.10.6
2 192.168.10.7
2 192.168.10.8
1 192.168.10.9
1 192.168.10.18
1 192.168.10.0- 统计访问最多的前10个ip
awk '{i=$1;a[i]+=1;}END{for(i in a)printf("%d %s \n",a[i],i)}' access.log | sort -nr |head -n 10
1
2
3
4
5
6
7
8
9
102093 192.168.10.1
1259 127.0.0.1
2 192.168.10.8
2 192.168.10.7
2 192.168.10.6
2 192.168.10.5
2 192.168.10.4
2 192.168.10.3
2 192.168.10.2
1 192.168.10.9获取具体时间段内的日志
- 日志格式access.log((打印Jun15-20号的日志,不做年份的限制))
1
10.2.24.141 - - [19/Jun/2020:09:56:57 +0800] "POST /index.php?mod=api&ver=0.1&SESSION=%7B%22rid%22:%228201_186%22, %22sec%22:%228201%22,%22pGroup%22:%22default%22,%22tls%22:0%7D HTTP/1.1" 200 121 "-" "-" "-"
- 处理脚本
awk '{split($4, a, "/"); d=substr(a[1],2); if(d>=15 && d<=20 && a[2]=="Jun") { print $0;} }' access.log
- 日志格式打印Apr 26号的日志)
1
127.0.0.1 - - [26/Apr/2018:11:12:48 +0800] "GET /inc.php HTTP/1.1" 200 62437 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.85 Safari/537.36"
- 处理脚本
awk '{split($4, a, "/"); d=substr(a[1],2); if(d==26 && a[2]=="Apr") { print $0;} }' access.log
- 统计每个ip访问的次数
502 upstream sent too big header while reading response header from upstream ...
1
2
3
4
5
6
7fastcgi_intercept_errors off;
fastcgi_buffer_size 16k;
fastcgi_buffers 4 16k;
proxy_buffer_size 128k;
proxy_buffers 16 256k;
proxy_busy_buffers_size 256k;epoll:举个例子:假设进程有10万个TCP连接,且只有几百个连接是有事件需要处理的。那么在每一个时刻进程只需要处理这几百个有事件(即TCP连接上有数据需要交互)需要处理的连接即可。
- select和poll这样处理的:在某一时刻进程收集所有的连接,并把所有连接的套接字传给操作系统(这个过程其实是用户态内存到内核态内存的复制),而由操作系统内核寻找这那几百个有事件需要处理的连接并处理,然后返回数据给用户。
- 这个过程需要操作系统把全部的连接处理一边,极大浪费系统资源。
- epoll是这样做的:
- 调用epoll_creat函数建立一个epoll对象(一颗红黑树,一个准备就绪list链表)。
- 调用epoll_ctl函数把socket放到红黑树上,给内核中断处理程序注册一个回调函数,告诉内核如果这个句柄的中断到了,就把这个socket放到准备就绪list链表里。
- 调用epoll_wait到准备就绪list链表中处理socket,并把数据返回给用户。
- 不需要把全部的连接处理一遍,只需要去list链表里处理socket。
- select和poll这样处理的:在某一时刻进程收集所有的连接,并把所有连接的套接字传给操作系统(这个过程其实是用户态内存到内核态内存的复制),而由操作系统内核寻找这那几百个有事件需要处理的连接并处理,然后返回数据给用户。
reported about an closed connection (54: Connection reset by peer)
- php内存设置过小导致运行过程中进程异常终止
- php.ini设置:
memory_limit = 128M
- www.conf设置:`php_admin_value[memory_limit] = 32M`
- php.ini设置:
- Connection reset by peer
- php内存设置过小导致运行过程中进程异常终止
- 高并发nginx调优
- 调整worker_processes数量
- 意为生成的worker数量,最佳实践是每个CPU运行1个工作worker。
- 调整worker_connections数量
- 意为同时提供服务的客户端数量,一般设为1024
- 启用Gzip压缩
- 压缩文件大小,减少了客户端HTTP请求的传输带宽,提高了加载速度
- 启用静态文件缓存
- 减少传输带宽提升速度
- 设置timeout
- client_header_timeout:指定等待client发送一个请求头的超时时间
- 如果在超时时间内client没发送任何东西,nginx返回HTTP状态码408(“Request timed out”)
- client_body_timeout:设置请求体的读超时时间。
- 超时后,nginx返回HTTP状态码408(“Request timed out”)
- keepalive_timeout:指定client的keep-alive连接超时时间,服务器将会在这个时间后关闭连接。
- keepalive可减少打开和关闭连接所需的CPU和网络开销
- send_timeout:指定客户端的响应超时时间。
- 如果在这段时间内客户端没有读取任何数据,nginx就会关闭连接。
- client_header_timeout:指定等待client发送一个请求头的超时时间
- 关闭access_logs
- 调整worker_processes数量