0%

nginx收集

Nginx的模块从功能上分为如下三类:Handlers处理器模块、Filters过滤器模块、Proxies代理类模块。

一、列表

  1. Max retries exceeded with url

    • 可能原因
      • http连接太多没有关闭导致的。
      • 机器的内存不够了。
      • 由于请求频率过快,被目标网站封IP了
      • 请求的url地址错误
    • 解决方案
      • 增加重试连接次数:requests.adapters.DEFAULT_RETRIES = 5
      • 关闭多余的连接:requests使用了urllib3库,默认的http connection是keep-alive的,requests设置False关闭。
  2. upstream response is buffered to a temporary file

  3. FastCGI sent in stderr: “Unable to open primary script

  4. 配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#字符集
charset utf-8;
#域名长度限制加长
server_names_hash_bucket_size 128;
#client 报头和包体设置
client_header_buffer_size 2k;
large_client_header_buffers 4 4k;
client_max_body_size 20m;
#出错时调起报错邮件发送
sendfile off;
#设置超时
keepalive_timeout 180;
tcp_nodelay on;
#开启压宿
gzip on;
gzip_disable "MSIE [1-6]\.(?!.*SV1)";
gzip_min_length 1k;
gzip_buffers 4 16k;
gzip_http_version 1.0;
gzip_comp_level 2;
gzip_types text/plain application/x-javascript text/css
#fastcgi的相关设置
fastcgi_connect_timeout 300;
fastcgi_send_timeout 300;
fastcgi_read_timeout 300;
  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
    14
    2093 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个ipawk '{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
    10
    2093 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
  2. 502 upstream sent too big header while reading response header from upstream ...

    1
    2
    3
    4
    5
    6
    7
    fastcgi_intercept_errors off;
    fastcgi_buffer_size 16k;
    fastcgi_buffers 4 16k;

    proxy_buffer_size 128k;
    proxy_buffers 16 256k;
    proxy_busy_buffers_size 256k;
  3. epoll:举个例子:假设进程有10万个TCP连接,且只有几百个连接是有事件需要处理的。那么在每一个时刻进程只需要处理这几百个有事件(即TCP连接上有数据需要交互)需要处理的连接即可。

    • select和poll这样处理的:在某一时刻进程收集所有的连接,并把所有连接的套接字传给操作系统(这个过程其实是用户态内存到内核态内存的复制),而由操作系统内核寻找这那几百个有事件需要处理的连接并处理,然后返回数据给用户。
      • 这个过程需要操作系统把全部的连接处理一边,极大浪费系统资源。
    • epoll是这样做的:
      • 调用epoll_creat函数建立一个epoll对象(一颗红黑树,一个准备就绪list链表)。
      • 调用epoll_ctl函数把socket放到红黑树上,给内核中断处理程序注册一个回调函数,告诉内核如果这个句柄的中断到了,就把这个socket放到准备就绪list链表里。
      • 调用epoll_wait到准备就绪list链表中处理socket,并把数据返回给用户。
        • 不需要把全部的连接处理一遍,只需要去list链表里处理socket。
  4. reported about an closed connection (54: Connection reset by peer)

  1. 高并发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就会关闭连接。
    • 关闭access_logs