暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

nginx 日志优化配置演示

爱婷如命一生一世 2018-12-25
426


所谓虚拟机别名 ,就是为虚拟主机设置除了主域名意外的一个或多个域名的名字,在实际场景中,可以实现用户访问的多个域名对应同一个虚拟主机网站的功能,例如我在浏览器中输入baidu.com

系统会默认的给你跳转到www.baidu.com中去,不管你是否输入www都是一样的,会跳转到百度首页的web界面中去。




我在做实验的时候,突然发现vm14的虚拟机黑屏了,但是系统却正常!

解决方案如下:

别名的实现的方式

①修改虚拟相关的.conf文件。

百度就在用这种方法。(建议用这个,比第二种方法少一种请求方式,效率不高。)

②利用 rewrite 规则------301跳转思路配置。

我集团公司目前使用的就是这个办法,淘宝网站使用的是302跳转。

修改虚拟主机别名的配置

我站在/application/nginx/conf/extra路径下,以www.conf文件为例。[root@Centos6 extra]# vim www.conf


 编辑完毕后,可以用diff对比的方式对比下文件的不同:明显的发现在server { }标签中 server_name 后面多了一个域名并且空一格,这样的话,当用户请求这个域名的时候,就会依据这个域名找到html/www里的主页文件了。(图中有个错误,后面会介绍)

检查语法:

重新加载nginx服务:


在本次实验中,检查语法的时候,报错如下:

经过错误的提示,我找到了问题所在,原来系统提示我在第三行的结尾要以;结尾。但是这个提示我原本以为是第四行的错误。

修改完主机别名配置文件后不要忘记本地hosts文件解析:

Linux客户端访问fengxin.com 直接跳转到www.fengxin.com的首页文件。

但在微软客户端中,却不用修改hosts(即使重启Nginx)直接访问即可跳转www.fengxin.com的首页文件。

这样的话,我们就可以在企业实际生产环境下,通过别名的配置实现多域名访问同一个站点



实验中,出现这样的错误:代表了nginx没有启动,点击启动nginx.即可



第二种方法利用 rewirte 301跳转的思路

众所周知,HTTP的状态码有很多,其中301状态码代表了:永久跳转,所请求的网页将永久跳转到被设定的新位置。

其中,我们通过 -I的参数可以查看到HTTP响应的数字状态码等信息。

初学者注意的是,HTTP/1.1比HTTP/1.0新增了24个状态响应码。

中大型网站不会用到这样的跳转,这里不做演示。




Nginx状态信息功能演示

Nginx软件的功能模块中有一个模块

这个模块的主要功能是记录Nginx的基本访问状态信息,方便运维人员了解Nginx的工作状态,在实战部署中往往会用监控软件来获取连接数的信息,这时候就需要使用这个状态模块,因此我之前在编译安装Nginx是必须增加此模块。......  --with-http_stub_status_module .....

查询在编译安装时,是否设定了  --with-http_stub_status_module 模块

[root@Centos6 /]# /application/nginx/sbin/nginx -V

查询到已经编译安装了。

虚拟主机的方式配置nginx状态信息

[root@Centos6 extra]# touch status.conf

nginx satus  server标签模板如下:

##status

server {

   listen 80;

   server_name  status.fengxin.com;

   location / {

     stub_status on ;    打开信息状态开关。

     access_log  off;

     }


}

不要忘了之前,我们做过nginx的包含优化:

将 status.fengxin.com的server标签优化包含到nginx.conf中去。


配置完成后,检查相应的的语法。

语法检查正常后,重启nginx服务:

[root@Centos6 extra]# /application/nginx/sbin/nginx -s reload


在实验过程中,我检查语法出现以下问题:提示中明显告诉我结尾是少一个分号的。


重启没有问题之后,还需要去客户端DNS文件中解析这个域名主机(windows客户端演示):

C:\Windows\System32\drivers\etc

更改完毕之后,需要在客户端上ping 这个域名,检查是否返回192.168.0.130这个IP地址


在客户端上打开浏览器,输入以下内容:

这个页面呈现的结果建议不要让外部用户能够查看到。实战中主要监控Active connections,看看总共有多少链接数。

Active connections: 5 代表正处理的活动(激活)链接数为5个;
server 代表Nginx启动到现在共处理了7个链接;
accepts: 代表Nginx启动到现在共成功创建了7个链接;
handled requests 代表总共处理了6次请求;(请求丢失数=握手数-连接数,
可以看出本子状态显示有一个丢失的请求。)
Reading :代表为Nginx读取到的客户端Header信息数;
Writing: 代表Nginx返回给客户端的Header信息数;
Waiting: 代表为NGInx已经处理完正在等候下次请求指令的驻留链接。



Nginx增加错误日志

人生病的时候,医生除了依据先进的医疗设备,还要主动去询问病人的症状,同样在Nginx软件也会把自身运行的姑臧信息及用户访问的日志信息记录到指定的日志文件中去,供运维人员查看。

实战中,配置记录Nginx的错误信息是调试Nginx服务的重要手段,它属于核心功能模块的参数:http://nginx.org/en/docs/ngx_core_module.html

查看到用法实例如下:可放在Main区块中全局配置,也可防止不同的虚拟主机中单独记录。

error_log语法及格式如下:

error_log(关键字不能改变)跟文件类型跟日志级别

错误日志的常见级别有如下:

error        (常用)

crit           (常用)

debug     (常用)

info         (勿配置,低级别)

notice     (勿配置,低级别)

warn       (勿配置,低级别)

aler         (勿配置,低级别)

emerg    (勿配置,低级别)

勿配置的原因在于级别越高记信息越少,反之,配置低级别会给磁盘性能带来巨大消耗

编辑主配置文件 Nginx.conf,添加如下代码:error_log logs/error.log;

检查语法并重启nginx




Nginx 访问日志

这个小节,初学者要作为一个重点来掌握,这里的学习思路是先定义日志文件格式,再用访问日志的记录结果去对比定义之后的日志格式

不论是Nginx软件还是其他的web软件,都会把每个用户访问网站的日志信息记录到指定的日志文件中去,方便网站管理者去分析用户的浏览行为,为日后网站推广以及各类业务提供数据支撑。

这个功能是由这个模块负责,

我通过nginx的官方网站去查询:http://nginx.org/en/docs/http/ngx_http_log_module.html

并得到了Nginx的访问日志主要有图中的以下两个参数来控制:

log_format   用来定义记录日志的格式(可以定义多种日志格式,取不同名字即可。)

access_log  用来指定日志文件的路径及使用何种日志格式记录日志





定义日志log_format配置格式说明


观察log_format这个参数的来源和配置写法:我们编辑nginx.conf.default这个文件,并用set nu取行命令找到其参数的来源格式写法。

[root@Centos6 conf]# vim nginx.conf.default

利用sed命令将其格式写法去注释取出:

[root@Centos6 conf]# sed -n '21,23 s/#//gp' nginx.conf.default

log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '

                      '$status $body_bytes_sent "$http_referer" '

                      '"$http_user_agent" "$http_x_forwarded_for"';


把上述取到的文件内容取到nginx.con的http标签的首部,注意的是:log_format日志格式关键参数,是不能变的。因此,采用默认配置即可。

图中这些Nginx日志变量具体的说明如下:

main 是为日志格式的指定标签,记录日志时,通过这个main标签选择指定格式,后面跟着的所有内容是可以记录日志信息并以日志变量输出给用户。


具体日志变量说明如下:

到访问记录日志成功后,我会对照这张表做详细说明


记录日志access_log参数说明

查看官网http://nginx.org/en/docs/http/ngx_http_log_module.html

这里如不指定日志格式就会用默认的combined格式记录日志。

从这张图中记住访问日志的配置参数的buffer和flush选项,这两个选项调整可用作高并发场景下网站的访问性能。(这些参数这里不讲,保持默认,只有在淘宝那种级别的网站做极端优化的时候用的到。)

buffer=size 为存放访问日志的缓冲区大小。

flush=time 为将缓冲区的日志刷到磁盘的时间。

gizp ....表示压缩级别。


记录用户的访问日志都是基于每个虚拟主机,因此,我们在虚拟主机中添加默认配置即可:

[root@Centos6 extra]# vim www.conf 

以www文件为例实战中请放在每个站点文件中去,访问日志文件放置在location标签外配置即可

access_log logs/access_www.log main;

检查语法,一切正常,并重启nginx服务

用浏览器模拟用户访问www.fengxin.com 会生成访问日志

在服务器上追踪日志文件结尾变化来查看客户端访问网站的访问结果:(生产场景中,高并发一秒钟上万条的访问,你看都看不过来!)

[root@Centos6 /]# tail -f /application/nginx/logs/access_www.log 

从日志中显示的反馈,我们按照之前定义的格式对应说明日志参数:

这个IP代表 日志格式中的 $remote_addr 客户端的IP地址。

- 对应$remote_user 代表没有远程用户所有用 -  填充

 对应$time_local  记录访问时区和时间。

对应¥request 用户的HTTP请求起始行信息。

$status 对应200状态码。200表示访问正常:

对应$body_bytes_sent  服务器发送给客户端的相应body字节数。这里面显示没有

对应$http_referer ,(记录此次请求是从哪个连接访问过来的。)由于是直接打开域名浏览的,因此这里的referer是没有值得!

对应$http_user=agent  我们能从这张图划线的部分看出客户端访问信息(浏览器、手机客户端的版本,硬件信息。)

$http_xforwarded_for  因为web服务器没哟使用代理,因此此处为 “ - ”


Nginx访问日志轮询切割

在实际的生产场景中,我们将所有的访问日志生成到一个指定的日志文件中,如图所示:

会造成随着时间推移,文件容量会非常庞大,不利于我们对于日志的分析和处理,在运维工作专用,是由必要对日志进行按天或者按小时进行切割,使其分成不同的文件保存。


按天切割日志演示

由于Nginx没有自带的工具进行自动轮询,对比这点就不如apache!

但是我们可以通过脚本来实现!建立相应的路径,编写相应脚本文件内容

编写完脚本之后,我们尝试去执行此脚本文件:

[root@Centos6 scripts]# ll /application/nginx/logs/

这个脚本实现的原理思想:将正在写入的Nginx日志(access_www.log)改名为带日期的格式文件,如图所示:然后平滑重启Nginx,生成新的nginx日志

随着时间的推移,日志会被切割出来,为了加快天数,我这里手动修改下时间为12月26好,执行脚本,并查看切割日志:

[root@Centos6 scripts]# date -s "2018-12-26"

[root@Centos6 scripts]# sh cut_nginx_log.sh        

[root@Centos6 scripts]# ll /application/nginx/logs/

切割日志配置完成后,在生产场景中,我们要利用定时任务实现每天00点整定时执行脚本的切割日志操作,具体定时任务配置如下:

[root@Centos6 cron]# crontab -e

####nginx_log#######

00 00 * * * /bin/sh /server/scripts/cut_nginx_log.sh >/dev/null 2>&1

当然在如今大数据趋势下,通过分析用户浏览行为,我们运维工作中常用的日志分析收集工具也有很多,如图所示:架构师级别的大牛都是搭建ELK去分析用户日志。


文章转载自爱婷如命一生一世,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论