性能瓶颈分析—Nginx

nginx基本运行原理

  • 用户连接master中开的端口,控制connect
  • control连接worker
  • 有多少worker就有多少线程
  • worker连接其他服务器

nginx配置参数介绍

  • 全局配置

    • worker_processes:worker进程数。最优值取决于CPU核的数量、存储数据的硬盘数量及负载模式。
    • worker_rlimit_nofile:worker进程的最大打开文件数限制。避免“too many open files”问题(同时要更改系统连接数,使用ulimit -n查看)
  • Evebts模块

    • worker_connections:设置可由一个worker进程同时打开的最大链接数。如果设置了worker_rlimit_nofile,我们可以将这个值设的很高。最大客户数也由系统的可用socket连接数限制(~64K)。
    • multi_accpet:允许多链接。
    • use:使用哪种时间模型轮询。epoll最高效。
  • HTTP模块

    参数名 含义
    AIO on/off 利用系统缓存,内核2.6.22以后版本支持的参数
    directio 521k AIO生效阈值
    sendfile on/off 直接发送出去,不走系统缓存
    tcp_nopush on/off 在一个数据包里发送所有头文件,而不是一个接一个的发送
    tcp_nodelay on/off 不要缓存数据,而是一段一段的发送
    access_log on/off 是否存储访问日志。off则表示不存储,提高性能,但无日志可分析
    error_log crit/notice 只记录严重的错误
    参数名 含义
    keepalive_timeout 10s 链接超时时间
    client_header_timeout
    client_body_timeout
    10s 设置请求头和请求体(各自的)超时时间
    reset_timeout_connection on/off 关闭不响应的客户端链接
    send_timeout 10s 指定客户端的响应超时时间。这个设置不会用于整个转发器,而是在两次客户端读取操作之间。如果在这个时间段内,客户端没有读取任何数据,nginx就会关闭连接
    limit_conn_zone $binary_remote_addr
    zone=addr:5m:
    保存各种key(比如当前链接数)的共享内存
    limit_conn addr 100 为给定的key设置最大连接数
    参数名 含义
    gzip on 采用gzip压缩的形式发送数据
    gzip_disable “msie6” 为指定的客户端禁用gzip功能
    gzip_static on 先查找是否有预先gzip处理过的资源
    gzip_proxied any 压缩所有的请求
    gzip_min_length 1000 小于1000字节的不压缩
    gzip_comp_level 1-9 压缩等级
    gzip_type text/plain
    text/css
    application/json
    设置需要压缩的数据格式
    参数名 含义
    open_file_cache max=100000
    inactive=20s
    指定了缓存最大数目,一级缓存的时间
    open_file_cache_valid 30s 指定检测正确信息的间隔时间
    open_file_cache_min_uses 2 定义了open_file_cache中指令参数不活动时间期间最小的文件数

    Linux存储栈中DirectIo

    image-20221110171020709

Nginx中的请求时间和响应时间

Nginx:统计PV、UV、独立IP

image-20221110172707002

Nginx请求时间

image-20221110173028433

安装goaccess日志分析工具

wget http://tar.goaccess.io/goaccess-1.1.tar.gz
yum install glib2 glib2-devel GeoIP-devel ncurses-devel
tar xvf goaccess-1.1.tar.gz -C /usr/local
cd /usr/local/
cd goaccess-1.1/
./configure --enable-geoip --enable-utf8  --with-openssl
   ###如果提示:
   ###error: ssl library missing
   ###解决办法:
   ###yum -y install openssl-devel
make && make install

goaccess配置时间日期和日志格式匹配Nginx

如果Nginx的日志格式是下面的例子,goaccess对应使用下列格式。不同的查看操作手册
nginx日志格式:
log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                  '$status $body_bytes_sent "$http_referer" '
                  '"$http_user_agent" "$http_x_forwarded_for" $upstream_addr $request_time';
                  
access_log	/var/log/nginx/nginx_access_test1.log main;

goaccess时间日期日志格式:
time-format %H:%M:%S
date-format %d/%b/%Y
log-format %h - %^ [%d:%t %^] "%r" %s %b "%R" "%u" - %^ - %^ %T

操作手册:
https://www.goaccess.cc/?mod=man

使用命令:统计Nginx日志文件里的数据

1. 获取PV数  
cat /var/log/nginx/nginx_access_test1.log | wc -l

2. 获取IP数
cat /var/log/nginx/nginx_access_test1.log | awk '{print $1}' | sort -k1 | uniq -c | wc -l

3. 获取最耗时的请求时间、url、耗时,前10名, 可以修改后面的数字获取更多,不加则获取全部
cat /var/log/nginx/nginx_access_test1.log | awk '{print $4,$7,$NF}' | awk -F '"' '{print $1,$2,$3}' | sort -k3 -rn | head -10

4. 获取某一时刻的请求数量,可以把秒去掉得到分钟的数据,把分钟去掉得到小时的数据,以此类推
cat /var/log/nginx/nginx_access_test1.log | grep 2021:15:22:32 | wc -l

5. 获取每分钟的请求数量,输出成csv文件,然后用excel打开,可以生成柱状图
cat /var/log/nginx/nginx_access_test1.log | awk '{print substr($4,14,5)}' | uniq -c | awk '{print $2","$1}' > access.csv

6. 配置go-access来分析nginx日志
cat /var/log/nginx/nginx_access_test1.log | goaccess --time-format="%H:%M:%S" --date-format="%d/%b/%Y" --log-format="%h - %^ [%d:%t %^]; \"%r\" %s %b \"%R\" - %^\"%u\" - %^ %T" > index.html

  • wc -l :统计行数
  • awk ‘{print $1}’:取分割出来的第一个字段
  • sort -k1:按第一个字段正序排序
  • uniq -c:相邻数据相同合并,即去重
  • awk -F ‘”‘ ‘{print $1,$2,$3}’:已“为分隔符分割,去第一、第二、第三字段
  • sort -k3 -rn:-r逆序,-rn逆序数字排序
  • head -10:取前10个

Linux的优化点

  • 压缩参数gzip
  • 缓存open_file_cache
  • worker_processes
  • keepalive_timeout

原文地址:http://www.cnblogs.com/novice77/p/16880725.html

1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长! 2. 分享目的仅供大家学习和交流,请务用于商业用途! 3. 如果你也有好源码或者教程,可以到用户中心发布,分享有积分奖励和额外收入! 4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解! 5. 如有链接无法下载、失效或广告,请联系管理员处理! 6. 本站资源售价只是赞助,收取费用仅维持本站的日常运营所需! 7. 如遇到加密压缩包,默认解压密码为"gltf",如遇到无法解压的请联系管理员! 8. 因为资源和程序源码均为可复制品,所以不支持任何理由的退款兑现,请斟酌后支付下载 声明:如果标题没有注明"已测试"或者"测试可用"等字样的资源源码均未经过站长测试.特别注意没有标注的源码不保证任何可用性