1.Nginx日志管理

1.日志简单介绍

  Nginx提供了日志记录的功能,日志文件在对我们管理网站十分有用,通过访问日志(access_log)我们可以获取请求来源、客户端信息、请求的资源等信息;通过错误日志(error_log)可以获取错误发生时间、错误信息等,方便我们及时定位和修复错误。看一下Nginx中日志相关的指令。

  1. #设置访问日志:访问日志文件为nginx/logs/mysite.access.log,格式为main
  2.   access_log logs/mysite.access.log main;
              位置 格式
  3. #设置错误日志:错误日志文件为nginx/logs/mysite.error.log,记录级别为error
  4.   error_log logs/mysite.error.log error;
                位置        级别
  5. #定义main格式的日志
  6. log_format main '$remote_addr - $remote_user [$time_local] "$request" '
  7. '$status $body_bytes_sent "$http_referer" '
  8. '"$http_user_agent" "$http_x_forwarded_for"';

  在Nginx日志中严重程度:debug<info<notice<warn<error<crit,一般记录warn/error级别;定义日志格式中,$开头的是Nginx中的变量,在前面已经总结过了,为了方便查看本篇底部也放了一份。记录网站的访问/错误日志,十分简单,只需要把access_log/error_log指令放在需要记录的server主机内即可。也可以把access_log/error_log指令放在http中用来记录全局日志。

  看一个简单的Nginx配置文件,为了方便演示,这里只配置了默认主机,并删去了Nginx中一些和日志不相关的配置:

  1. worker_processes 2;
  2. events {
  3. worker_connections 1024;
  4. }
  5.  
  6. http {
  7. include mime.types;
  8. default_type application/octet-stream;#定义main格式的日志
  9. log_format main '$remote_addr - $remote_user [$time_local] "$request" '
  10. '$status $body_bytes_sent "$http_referer" '
  11. '"$http_user_agent" "$http_x_forwarded_for"';
  12.   #默认主机
  13.   server{
  14. listen 80;
  15. server_name localhost;
  16. location /{
  17. root html;
  18. index index.html;
  19. }
  20. #访问日志,名字问nginx/logs/mysite.access.log,格式为main格式
  21. access_log logs/mysite.access.log main;
  22. #错误日志,记录级别为error
  23. error_log logs/mysite.error.log error;
  24. }
  25. }

  当我们输入虚拟机IP会访问到默认主机,这时在nginx/logs目录下自动生成访问日志mysite.access.log和错误日志mysite.error.log。内容如下:

mysite.access.log内容

  访问日志的内容为main格式中定义的信息,某些信息不存在没有显示。我们也可以自定义访问日志的格式。

mysite.error.log内容

  可以看到错误原因是favicon.ico文件找不到,我们也可以知道错误发生的时间,请求,客户端和服务端IP等信息。

2.日志切片

  上边我们已经知道怎么去设置访问日志和错误日志,但是这样设置有一个弊端:日志文件都放在同一个文件中,长时间运行后日志文件很大,可能达到几个G,甚至十几个G大小,查看起来很不方便。为了解决这个问题就需要进行日志切片,如每小时或者每天的日志放在一个单独的文件中。怎么实现呢?总体思路是:设置一个定时任务,每隔一段时间将日志文件剪切到一个特定的目录下。

  这里以访问日志切片为例,为了方便演示这里把每分钟的访问日志放在一个单独的文件中,首先,添加一个存放日志文件的目录,执行命令 mkdir /usr/local/nginx/logs/mysitelogs ,我们打算把mysite的所有访问日志都放在这个文件夹下。然后添加一个切割日志的脚本,执行命令 vim /usr/local/nginx/mysitelog.sh ,脚本内容如下:

  1. #mysite.com虚拟主机的日志存放路径
  2. LOGPATH=/usr/local/nginx/logs/mysite.access.log
  3. #日志备份文件目录,mysite虚拟主机的备份日志放在logs下的单独目录下
  4. BASEPATH=/usr/local/nginx/logs/mysitelogs
  5. #一分钟记录一次
  6. bak=$BASEPATH/$(date -d today +%Y%m%d%H%M).mysite.access.log
  7. #重名日志文件
  8. mv $LOGPATH $bak
  9. touch $LOGPATH
  10. #向nginx主进程发送信号,重新写日志
  11. /usr/local/nginx/sbin/nginx -s reopen

最后添加一个定时任务,执行命令 crontab -e ,编辑内容如下,表示每分钟执行一次mysitelog.sh脚本:

  1. * * * * * sh /usr/local/nginx/mysitelog.sh

到这里日志切片就结束了,我们看一个日志文件, cd /usr/local/nginx/logs/mysitelogs 到日志文件夹下,看到日志文件为每分钟存储一次,前缀格式为yyyyMMddhhmm:

补充:我们在实际使用时一般把一天的日志放在一个文件中(高并发量的除外),下边的脚本实现每天晚上11:30分存储一次日志文件:

  1. #-------------------shell脚本
  2. #该虚拟主机的日志存放路径
  3. LOGPATH=/usr/local/nginx/logs/mysite.access.log
  4. #日志备份文件目录,mysite虚拟主机的备份日志放在logs下的单独目录下
  5. BASEPATH=/usr/local/nginx/logs/mysitelogs
  6. #一天记录一次,格式为20190326mysite.access.log
  7. bak=$BASEPATH/$(date -d yesterday +%Y%m%d)mysite.access.log
  8. #重名日志文件
  9. echo $bak
  10. mv $LOGPATH $bak
  11. touch $LOGPATH
  12. #向nginx主进程发送信号,重新打开日志
  13. /usr/local/nginx/sbin/nginx -s reopen
  14.  
  15. #------------------定时任务
  16. 30 23 * * * sh /usr/local/nginx/mysitelog.sh

2.常用Nginx配置总结

  Nginx的介绍到这里就基本结束了,这里汇总了一些Nginx中最常用的配置

2.1 基本配置

  1. # 用户和用户组
  2. user wyy wyy
  3.  
  4. #工作进程个数,通常设置和逻辑cpu个数一致
  5. worker_processes 8;
  6. #cpu亲和性,每个进程分配一个cpu 00000001表示第一个cpu,00000010表示第二个cpu,依次类推
  7. worker_cpu_affinity 00000001 00000010 00000100 00001000 00010000 00100000 01000000 10000000;
  8. #如果是两个逻辑cpu,可以设置worker_processes 2; worker_cpu_affinity 01 10;
  9.  
  10. #一个nginx工作进程最多可以打开的文件描述符个数 ,最好和linux最多能打开的文件描述符个数(查看命令:ulimit-n)保持一致。
  11. #出现报错:too open many file,这时我们把worker_rlimit_nofile 值设置大一些就可以了。
  12. worker_rlimit_nofile 65535
  13.  
  14. #记录的级别严重程度:debug<info<notice<warn<error<crit],一般记录warn/error级别
  15. #错误日志,级别为error
  16. error_log logs/error.log error;
  17.  
  18. #记录nginx的master进程的pid
  19. pid logs/nginx.pid;
  20.  
  21. events {
  22. use epoll ; #多路复用IO的一种方式,效率很高,支持linux2.6以上内核
  23. worker_connections 1024; #每个工作进程的最大连接数,一台nginx的理论最大连接数就是(单个工作进程的最大连接数*工作进程个数)
  24. multi_accept on; #尽可能多地接受请求
  25. }
  26.  
  27. http {
  28. #媒体类型,定义在nginx/conf/mine.types中
  29. include mime.types;
  30. #默认的媒体类型
  31. default_type application/octet-stream;
  32. #main日志格式
  33. log_format main '$remote_addr - $remote_user [$time_local] "$request" '
  34. '$status $body_bytes_sent "$http_referer" '
  35. '"$http_user_agent" "$http_x_forwarded_for"';
  36.   #访问日志
  37. access_log logs/access.log main;
  38.   #nginx是否调用sendfile函数(zero,copy等)来输出文件,普通应用都应该设置成on
  39. sendfile on;
  40.   #默认开启,nginx接受到数据包不马上发送,等到数据包达到一定大小再发送,使用Nagle算法控制。减少tcp传输次数,防止网络阻塞
  41. tcp_nopush on;
  42.   #tcp不延迟,和tcp_nopush相反,接收到数据包就发送,提高数据的实时响应
  43.   #tcp_nodelay off;
  44. #长连接,请求资源获取完毕后不断开连接,60s后关闭该连接
  45. keepalive_timeout 60;
  46.  
  47.  #上传时单个文件最大为10M
  48.   client_max_body_size 10m;
  49.   #客户端的请求头缓冲区大小,一般设置为系统分页大小即可(查询系统分页命令:getconf PAGESIZE)
  50.   #client_header_buffer_size 4k;
  51.   #客户端的请求体缓冲区大小,超过这个大小存放在临时文件中,
  52.   #client_body_buffer_size 8k;
  53.  
  54.   ######超时管理 代理服务器时才有用 (超时都返回502超时错误)
  55.   #nginx连接后台服务器超时时间,
  56.   proxy_connect_timeout 90;
  57.   #后台服务器回传数据超时时间,90s传输数据未完成就报错
  58.   proxy_send_timeout 90;
  59.   #连接成功,等待后台服务器响应的超时时间
  60.   proxy_read_timeout 90;
  61.  
  62.   #为打开文件设定缓存,默认是不启用的,max指定缓存数量,建议和最多能打开文件描述符个数(查询命令:ulimit -n)一致,inactive是指经过多长时间文件没被请求后删除缓存
  63.   open_file_cache max=65535 inactive=60s;
  64.   #多久检查一次缓存的有效信息
  65.   open_file_cache_valid 30s;
  66.   
  67.   #定义负载均衡模块,
  68.   upstream mysiteServers{
  69.    server 123.11.1.2:8080 weight=1 max_fails=2 fail_timeout=30s;
  70.    server 123.11.1.3:8080 weight=2 max_fails=2 fail_timeout=30s;
  71.    server 123.11.1.4:8080 weight=3 max_fails=2 fail_timeout=30s;
  72.   }
  73.  
  74.   server{
  75.   servername :www.site1.com www.site1.cn;
  76. #首页 
  77.   location = / {
  78.   proxy_pass http:/123.11.1.1:8080/Home/Index;
  79.     }
  80.  
  81.   #静态文件
  82.   location ~* \.(gif|jpg|jpeg|png|css|js|ico)$ {
  83.   root /webroot/res/;
  84.     #缓存十分钟
  85.     expires:600;
  86.     }
  87.   #通用规则,用来转发动态请求到后端应用服务器
  88.   location / {
  89.   proxy_pass http://mysiteServers;
  90.     }
  91. }

2.2 压缩配置

  gzip可以放在http/server/location/if下,用于压缩请求资源,减小网络传输的数据尺寸。gzip压缩常用于文本类型(css/js等)文件压缩,二进制文件(如图片,视频)压缩比不大,建议使用缓存(expires)进行优化:

  1. #开启gzip压缩
  2. gzip on;
  3. #最小压缩大小4000字节,小于4000字节就不压缩了
  4. gzip_min_length 4000;
  5. #压缩的缓冲设置,缓冲32块开始输出,每块4k大小
  6. #gzip_buffers 32 4k;
  7. #压缩采用的版本
  8. gzip_http_version 1.1;
  9. #压缩级别,级别越大压缩后尺寸越小方便传输,但同时压缩时耗费cpu资源也越大(最大为9,一般不要超过6)
  10. gizp_comp_level 4;
  11. #压缩的文件类型,不属于这些类型的就不压缩(可以通过 cat nginx/conf/mine.types查看文件类型),注:二进制文件如图片/视频的压缩比不大,不建议压缩
  12. gzip_types application/javascript text/plain text/css text/xml;
  13. # 是否传输gzip压缩标志,请求头中有vary标志的返回压缩版本文件,没有vary头的返回原始文件
  14. gzip_vary on;

2.3 负载均衡配置

  1. #1.weight
  2. #指定轮询权重,weight越大,转发几率越大,一般用于后端服务器性能不均的情况。
  3.   upstream mysiteServers{
  4.     server 192.168.70.1:8080 weight=1;
  5.     server 192.168.70.2:8080 weight=3;
  6.   }
  7. #2.ip_hash
  8. #每个请求按访问ip的hash结果分配,这样每个访客固定访问一个后端服务器,适用后台服务器缓存多的场合,也可以解决session的问题。
  9.   upstream mysiteServers{
  10.     ip_hash;
  11.     server 192.168.70.1:8080;
  12.     server 192.168.70.2:8080;
  13.   }
  14.  
  15. #一些参数
  16.   upstream mysiteServers{
  17.     server 192.168.70.1:8080 down;
  18.     server 192.168.70.1:8081 weight=2;
  19.     server 192.168.70.2:8080;
  20.     server 192.168.70.2:8081 backup;
  21.   }
  22. #1.down表示的server暂时不参与负载均衡,请求不会转发给这台服务器;
  23. #2.weight为weight越大,负载的权重就越大;
  24. #3.max_fails续请求失败的次数默认为1.当超过最大次数时,不再转发请求给这台服务器;
  25. #4.fail_timeout:max_fails次失败后,暂停多久后再向这台服务器转发请求;
  26. #5.backup: 其它所有的非backup机器down或者忙的时候,请求backup机器。所以这台机器压力会最轻。
  27.  
  28. 补充:也可以使用第三方模块实现其他负载均衡模式:
  29. ①添加nginx-upstream-fair模块可以实现按响应性能进行负载均衡,响应速度越快的服务器分发请求的几率越大;
  30. ②添加nginx_upstream_hash模块可以实现按请求url来进行转发请求,url相同的请求由同一个服务器处理,适用于缓存较多场景。

补充:Nginx的一些全局变量

变量

含义

$args

请求中的参数,同$query_string

$content length

请求头中的Content-length字段。

$content_type

请求头中的Content-Type字段。

$document_root

当前请求在root指令中指定的值。

$host

请求主机头字段,否则为服务器名称。

$http_user_agent

用户代理,一般为用户浏览器信息

$http_cookie

客户端cookie信息

$limit_rate

这个变量可以限制连接速率。

$request_method

客户端请求的动作,通常为GET或POST。

$remote_addr

客户端的IP地址。

$remote_port

客户端的端口。

$remote_user

已经经过Auth Basic Module验证的用户名。

$request_filename

当前请求的文件路径,由root或alias指令与URI请求生成。

$scheme

协议名(如http,https)。

$server_protocol

请求使用的协议,通常是HTTP/1.0或HTTP/1.1。

$server_addr

服务器地址,在完成一次系统调用后可以确定这个值。

$server_name

服务器名称。

$server_port

请求到达服务器的端口号。

$request_uri

包含请求参数的原始URI,不包含主机名,如”/user/getuser?id=100”。

$uri

不带请求参数的当前URI,$uri不包含主机名,如”/user/getuser”。

$document_uri

与$uri相同

$http_x_forwarded_for

代理过程的IP

快速掌握Nginx(四) —— Nginx日志切片和常用配置总结的更多相关文章

  1. Nginx(四) nginx+consul+upasync 在ubnutu18带桌面系统 实现动态负载均衡

    1.1 什么是动态负载均衡 传统的负载均衡,如果Upstream参数发生变化,每次都需要重新加载nginx.conf文件,因此扩展性不是很高,所以我们可以采用动态负载均衡,实现Upstream可配置化 ...

  2. Django - 日志工作中常用配置

    工作中常用配置 # 日志配置 BASE_LOG_DIR = os.path.join(BASE_DIR, "log") LOGGING = { 'version': 1, # 保留 ...

  3. 使用logrotate轮询nginx和apache日志

    使用logrotate轮询nginx和apache日志     文章目录 [隐藏] 配置nginx 配置apache 使用logrotate轮询日志很方便,配置也很简单. 配置nginx 1.建立/e ...

  4. 使用Docker快速部署ELK分析Nginx日志实践(二)

    Kibana汉化使用中文界面实践 一.背景 笔者在上一篇文章使用Docker快速部署ELK分析Nginx日志实践当中有提到如何快速搭建ELK分析Nginx日志,但是这只是第一步,后面还有很多仪表盘需要 ...

  5. 使用Docker快速部署ELK分析Nginx日志实践

    原文:使用Docker快速部署ELK分析Nginx日志实践 一.背景 笔者所在项目组的项目由多个子项目所组成,每一个子项目都存在一定的日志,有时候想排查一些问题,需要到各个地方去查看,极为不方便,此前 ...

  6. nginx学习笔记(四)-----日志切割脚本及定时任务

    一.日志切割脚本 #!/bin/sh #nginx目录 BASE_DIR=/usr/local/nginx #生成的日志 BASE_FILE_NAME=jonychen.access.log CURR ...

  7. Nginx日志切割,以及脚本上传nginx的切割日志

    一:日志切割步骤 命令都在root下进行 1.创建目录 mkdir -p /etc/opt/modules/bin ## 创建文件夹 2.上传cut 3.观察目录 4.修改的cut文件 5.检测 需要 ...

  8. 快速掌握Nginx(二) —— Nginx的Location和Rewrite

    1 location详解 1.location匹配规则 Nginx中location的作用是根据Url来决定怎么处理用户请求(转发请求给其他服务器处理或者查找本地文件进行处理).location支持正 ...

  9. 093实战 Nginx日志切割,以及脚本上传nginx的切割日志

    一:日志切割步骤 命令都在root下进行 1.创建目录 mkdir -p /etc/opt/modules/bin ## 创建文件夹 2.上传cut 3.观察目录 4.修改的cut文件 5.检测 需要 ...

随机推荐

  1. linux查看硬盘占用情况

    Linux命令 : df -hl 使用后文件系统 容量 已用 可用 已用% 挂载点Filesystem Size Used Avail Use% Mounted on/dev/vda1 197G 5. ...

  2. 关于写作那些事之github告诉我构建失败,然后呢?

    The page build failed for the master branch with the following error 问题描述 看到这封邮件,一脸懵逼,本地运行 gitbook 服 ...

  3. Linux学习历程——Centos 7 chown命令

    一.命令介绍 Linux是多人多工操作系统,所有的文件皆有拥有者.利用 chown 将指定文件的拥有者改为指定的用户或组, 用户可以是用户名或者用户ID:组可以是组名或者组ID:文件是以空格分开的要改 ...

  4. mysql No query specified

    MySQL SHOW CREATE TABLE tablename \G; 会出现 ERROR: No query specified 原因 去掉分号 ; \g \G三者选其一即可.

  5. vcenter 忘记 administrator@vsphere.local 密码怎么办

    现有一个windows版本的vcenter5.5管理员密码丢失,我们可以使用vmware的工具vdcadmintool,在命令行进入到vdcadmintool所在的目录,然后执行下vdcadminto ...

  6. Windows上安装MySQL的完整教程

    1.     首先去官方网站下载压缩文件:https://dev.mysql.com/downloads/mysql/ 2.     解压下载的文件. 3.     将解压的所有文件放在一个文件夹里( ...

  7. 如何保持Redis和MySQL数据一致

    原文:https://blog.csdn.net/thousa_ho/article/details/78900563 1. MySQL持久化数据,Redis只读数据 redis在启动之后,从数据库加 ...

  8. [认证授权] 5.OIDC(OpenId Connect)身份认证(扩展部分)

    在上一篇[认证授权] 4.OIDC(OpenId Connect)身份认证(核心部分)中解释了OIDC的核心部分的功能,即OIDC如何提供id token来用于认证.由于OIDC是一个协议族,如果只是 ...

  9. Recovering Low-Rank Matrices From Few Coefficients In Any Basis

    目录 引 主要结果 定理2,3 定理4 直观解释 Recovering Low-Rank Matrices From Few Coefficients In Any Basis-David Gross ...

  10. C#字符串和ASCII码的转换

    //字符转ASCII码: public static int Asc(string character) { if (character.Length == 1) { System.Text.ASCI ...