Tagged: Nginx

Apache、Nginx 如何按天分割日志

默认情况下 Nginx 和 Apache 等web服务器,是没有帮我们按天分日志的,而是把所有日志放到一个文件,当流量大而日志多的时候,管理起来非常方便,一方面是内容多不易查找定位问题,另一方面文件也会越来越大,无效内容越来越多。
所以我们需要把日志按天分割,网上很多通过 写脚本+定时任务 来做的,这其实有点多余,而且不好维护,Linux本身自带了很多日志处理程序,比如:logrotate ,它可以实现日志的自动滚动,日志归档等功能。
下面我们介绍使用 logrotate 实现「Apache按天分割日志」「Nginx按天分割日志」

Apache

Apache自身即成了 logrotate,一般在 /usr/local/apache2/bin/rotatelogs
先找到你的 rotatelogs 路径

[root@TENCENT64 ~]# locate rotatelogs
/usr/local/apache2/bin/rotatelogs

在你的 VirtualHost 模块添加或替换

<VirtualHost *:80>;
    ......
    ErrorLog "| /usr/local/apache2/bin/rotatelogs /data/logs/apache/979137.com-error_log-%Y%m%d 86400 480"
    CustomLog "| /usr/local/apache2/bin/rotatelogs /data/logs/apache/979137.com-access_log-%Y%m%d 86400 480" common
</VirtualHost>

指定分割时间:86400 默认单位为s。也就是24小时
指定分区时差:480 默认单位m,也就是8小时

清理日志Shell脚本:

#!/bin/bash

LOG_PATH_APACHE="/data/logs/apache/"
DAYS_AGO=date -d "-7 day" +%Y%m%d

\rm -rf ${LOG_PATH_APACHE}*log-${DAYS_AGO}

加入到crontab,每天执行一次即可

0 4 * * * /bin/bash /data/cron/clear_logs.sh > /dev/null 2&>1

Nginx

所以我们也可以用它做日期分割,假设:
a. 日志在 /data/logs/nginx/ 下面
b. Nginx 安装在 /usr/local/nginx/

1、在 /etc/logrotate.d 目录下创建一个 Nginx 的配置文件 Nginx 配置内容如下

/data/logs/nginx/xxx.qq.com-access_log /data/logs/nginx/xxx.qq.com-error_log {
    su nobody nobody
    daily
    rotate 30
    notifempty
    sharedscripts
    postrotate
    if [ -f /usr/local/nginx/logs/nginx.pid ]; then
        /bin/kill -USR1 /bin/cat /usr/local/nginx/logs/nginx.pid
    fi
    endscript
}

配置解释:

1)配置需要分割的日志文件,也可以用 * 代替
2)su nobody nobody :一般我们的日志目录是允许所有用户进行写操作的,logrotate 认为这不是不安全的,这时 logrotate
会报错如下:

error: skipping “/data/logs/nginx/cafe.qq.com-error_log” because parent directory has insecure permissions (It’s world writable or writable by group which is not “root”) Set “su” directive in config file to tell logrotate which user/group should be used for rotation.

所以我们需要在配置里使用 su 切换身份执行
3)daily :日志文件每天进行滚动
4)rotate 30 :保留30天的日志
5)notifempty:日志文件为空不进行滚动
6)sharedscripts :运行postrotate脚本
9)/bin/kill -USR1 \/bin/cat /usr/local/nginx/logs/nginx.pid\ :Nginx平滑重启,也即让Nginx重新生成文件

2、执行logrotate

/usr/sbin/logrotate -f /etc/logrotate.d/nginx

4行代码,Web服务器(Apache/Nginx)挂了自动重启

有时候,我们的Web服务器如Apache、Nginx 可能因为某些原因退出了,这时候如果没有及时发现,就会影响服务,
所以搞个监控,是很有必要滴

#!/bin/sh
HTTPD_NUM=`ps aux | grep -P "(bin/httpd)|(./httpd)" | grep -v "vim" | grep -v "grep" | wc -l`
if [ ${HTTPD_NUM} -eq 0 ]; then
    /usr/local/apache/bin/apachectl restart
fi

如果是Nginx

!/bin/sh
NGINX_NUM=`ps aux | grep -P "nginx" | grep -v "vim" | grep -v "grep" | wc -l`
if [ ${NGINX_NUM} -eq 0 ]; then
    /usr/local/nginx/sbin/nginx
fi
crontab -e

* * * * * /bin/bash /data/cron/apache_restart.sh > /dev/null 2>&1
* * * * * /bin/bash /data/cron/nginx_restart.sh > /dev/null 2>&1

加入crontab,每分钟检查一次
原理很简单,就是判断是否有httpd进程,如果木有了,执行重启操作!

Nginx同时支持http和https访问请求

server {
    listen  80; 
    listen  443;
    server_name 979137.com;
    ...
    ssl  on
    ssl_certificate  /home/www/hosts/979137.com.crt;
    ssl_certificate_key  /home/www/hosts/979137.com.key;
    ssl_session_timeout  5m;
    ssl_protocols SSLv2 SSLv3 TLSv1;
    ssl_ciphers ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP;
    ssl_prefer_server_ciphers on;
    ...
}

给 nginx 配置SSL证书之后,https可以正常访问,http访问显示400错误(400 Bad Request)
报错如下:

The plain HTTP requset was sent to HTTPS port

说是 http 的请求被发送到https的端口上去了,所以才会出现这样的问题。

把 ssl on;这行去掉,ssl 写在443端口后面。这样http和https的链接都可以用,完美解决!

server {
    listen  80; 
    listen  443 ssl;
    server_name 979137.com;
    ...
    #ssl  on
    ssl_certificate  /home/www/hosts/979137.com.crt;
    ssl_certificate_key  /home/www/hosts/979137.com.key;
    ssl_session_timeout  5m;
    ssl_protocols SSLv2 SSLv3 TLSv1;
    ssl_ciphers ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP;
    ssl_prefer_server_ciphers on;
    ...
}

如果你想强制使用https访问,对端口进行判断,然后rewrite即可:

if ($server_port != 443) {
    rewrite (.*) https://$host$1 permanent;
}

最新文章

Return Top