分类 apache 下的文章

一、安装环境说明

系统环境:

操作系统 CentOS 6.5 x86_64

软件版本 cronolog 1.6.2,软件下载地址: http://cronolog.org/download/index.html

二、Cronolog 是什么

大家都知道apache服务器,默认日志文件是不分割的,一个整文件既不易于管理,也不易于分析统计,而且导致单个文件过大的情况。本博文主要讲解Web服务器日志切割工具cronolog,下面我们就来详细的讲解一下 cronolog安装和使用。

Welcome to cronolog.org, the home of the cronolog web log rotation program. cronolog is a simple filter program that reads log file entries from standard input and writes each entry to the output file specified by a filename template and the current date and time. When the expanded filename changes, the current file is closed and a new one opened. cronolog is intended to be used in conjunction with a Web server, such asApache, to split the access log into daily or monthly logs.

cronolog 是一款日志轮询(rotation)工具,可以用它来把Apache, Tomcat, Nginx等WEB服务器的输出日志切分按日或者按月保存。cronolog 从标准输入中读取日志内容,然后把他们写到按指定格式命名的日志文件中。当日期改变后, cronolog会把之前的日志文件关闭,再打开一个包含新日期的日志文件。利用cronolog可以完美的解决web服务器日志文件不断增大,且不能在运行时删除的问题。


三、Cronolog 特点

cronolog可以按月、日甚至按小时进行日志轮询,也可以配置每个日志文件的最大值,当文件大小达到这个最大值时,自动记录到下一个日志文件中。

cronolog稳定版本为 1.6.2。但此版本有一个弊端:当日志文件的大小到2G(2150726147字节)时,cronolog进程就变成僵尸进程,即日志无法再写入。 cronolog 1.7 版本解决了这个问题。

需要注意的是,日期改变后,cronolog并不是马上切换日志文件,而是需要有新的日志输出才能触发cronolog切换日志文件。所以如果你想在 2015-06-08 删除 2015-06-07的日志文件,如果从2015-06-08的00:00开始到你执行删除时都没有日志输出,则 2015-08-07的日志文件可能仍然被占用着,导致删除失败。



cronolog主要和Web服务器配置使用,特别是Apache服务器,Apache 默认日志文件是不分割的,一个整文件既不易于管理,也不易于分析统计。安装cronolog后,可以将日志文件按时间分割,易于管理和分析。下面是与Apache配置的一些指令:

TransferLog "|/usr/sbin/cronolog /web/logs/%Y/%m/%d/access.log"
ErrorLog "|/usr/sbin/cronolog /web/logs/%Y/%m/%d/errors.log"

效果:
/web/logs/2015/12/31/access.log /web/logs/2015/12/31/errors.log
/web/logs/2015/01/01/access.log /web/logs/2015/01/01/errors.log

三、Cronolog 安装

1、安装 epel 源(源码编译:可选; yum 安装:必须)

1、安装 epel 源

# wget http://ftp.sjtu.edu.cn/fedora/epel/6/i386/epel-release-6-8.noarch.rpm
# rpm -ivh epel-release-6-8.noarch.rpm

2、安装ntpdate
# yum -y install ntpdate

3、时间同步
# ntpdate time.nist.gov

2、安装cronolog

方式一:直接用yum安装
# yum install -y cronolog

#################################

方式二:源码编译安装
# wget http://cronolog.org/download/cronolog-1.6.2.tar.gz
# tar xf cronolog-1.6.2.tar.gz
# cd cronolog-1.6.2
# ./configure
# make && make install

# which cronolog
/usr/local/sbin/cronolog

不知道是否网络原因, 我这边没办法载下来, 可以到下面的地址下载:

http://download.chinaunix.net/download.php?id=3457&ResourceID=1851

好了,到这里我们的cronolog就安装完成了,下面我们来说一下cronolog如何使用。

四、Cronolog 使用
(1)、基本使用

# cronolog -h
usage: cronolog [OPTIONS] logfile-spec
   -H NAME,   --hardlink=NAME maintain a hard link from NAME to current log
   -S NAME,   --symlink=NAME  maintain a symbolic link from NAME to current log
   -P NAME,   --prev-symlink=NAME  maintain a symbolic link from NAME to previous log
   -l NAME,   --link=NAME     same as -S/--symlink
   -h,        --help          print this help, then exit
   -p PERIOD, --period=PERIOD set the rotation period explicitly
   -d DELAY,  --delay=DELAY   set the rotation period delay
   -o,        --once-only     create single output log from template (not rotated)
   -x FILE,   --debug=FILE    write debug messages to FILE
                              ( or to standard error if FILE is "-")
   -a,        --american         American date formats
   -e,        --european         European date formats (default)
   -s,    --start-time=TIME   starting time
   -z TZ, --time-zone=TZ      use TZ for timezone
   -V,      --version         print version number, then exit

cronolog 一般是采取管道的方式来工作的,采用如下的形式:

# loggenerator | cronolog log_file_pattern

其中,loggenerator为产生log的程序,而log_file_pattern是日志文件的路径,可以在其中加入cronolog所支持的时间相关的pattern字符,如/www/log/%y/%m/%d/access.log。其pattern  %为占位符,其后跟一特殊字符,简述如下:

% 占位符后可跟下面的字符:

## 转义符
%    %字符
n    换行
t    水平制表符

## 时间域
H    小时(00..23)
I    小时(01..12)
p    该locale下的AM或PM标识
M    分钟(00..59)
S    秒 (00..61, which allows for leap seconds)
X    该locale下时间表示符(e.g.: "15:12:47")
Z    时区。若时区不能确定,则无意义

## 日期域
a    该locale下的工作日简名(e.g.: Sun..Sat)
A    该locale下的工作日全名(e.g.: Sunday ..  Satur-ay)
b    该locale下的月份简称(e.g.: Jan .. Dec)
B    该locale下的月份全称(e.g.:  January .. December)
c    该locale下的日期和时间(e.g.: "Sun Dec 15  14:12:47 GMT 1996")
d    当月中的天数 (01 .. 31)
j    当年中的天数 (001 .. 366)
m    月数 (01 .. 12)
U    当年中的星期数,以周日作为一周开始,其中第一周为首个含星期天的星期(00..53)
W    当年中的星期数,以星期一作为一周的开始,其中第一周为首个含星期天的星期(00..53)
w    工作日数(0 .. 6, 0表示星期天)
x    该locale下的日期表示(e.g. "13/04/97")
y    两位数的年份(00 .. 99)
Y    四位数的年份(1970 .. 2038)

(2)、结合apache使用

编辑httpd.conf文件,将其中的

[root@localhost ~]# vim /etc/httpd/httpd.conf
将默认日志: 
CustomLog "logs/access_log" combined

修改为:
CustomLog "|/usr/local/sbin/cronolog /log/www/access_%Y%m%d.log" combined 
其中%Y%m%d为日志文件分割方式,即为“年月日”。

[root@localhost ~]# service httpd restart

[root@localhost www]# ll
total 15072
-rw-r--r-- 1 root root   16028 Dec 26 15:16 access_20131225.log
-rw-r--r-- 1 root root 2406307 Dec 26 23:59 access_20131226.log
-rw-r--r-- 1 root root 8292792 Dec 27 23:59 access_20131227.log
-rw-r--r-- 1 root root 4682211 Dec 28 18:56 access_20131228.log

关键点在于: 被轮询的日志一定要是绝对路径,不能是相对路径。

老男孩学习笔记:

请输入图片描述
请输入图片描述

五、Windows 下使用Cronolog 轮询日志

Windows平台下也有 cronolog 对应的版本。我们下载Win32版本: cronolog-1.6.1.win32.zip

安装:

1、解压cronolog-1.6.1.win32.zip, 复制 cronolog.exe到 apache 的bin 目录。

2、编辑 httpd.conf

CustomLog "|bin/cronolog.exe D:/apache/logs/access_%Y%m%d.log" combined
ErrorLog "|bin/cronolog.exe D:/apache/logs/error_%Y%m%d.log"

这句话可以取代主要的CustomLog语句,也可以在虚拟主机中使用,如:
<VirtualHost *:80>
ServerName www.xxx.com
CustomLog "|bin/cronolog.exe D:/apache/logs/xxxcom/access%Y%m%d.log" combined
ErrorLog "|bin/cronolog.exe D:/apache/logs/xxxcom/error%Y%m%d.log"
</VirtualHost>

## Apache配置中即便是windows系统,目录分隔符也必须按照unix格式填写"/"而不是"\"

3、重启 apache

其实不管是在linux还是windows下,cronolog接受的日期格式都是“%Y%m%d%H%M“这样的格式。%Y表年,%m表月,%d表日,%H表小时,%M表分钟。只有使用这样的格式指定日志输出文件的名称,cronolog才会按日期、时间的变化生成新的日志文件。

然而,在Windows下需要分两种情况(刚在cronolog-1.6.1.win32所带的INSTALL说明中看到):

Configuration for use with NT service:
TransferLog "|c:/apache/bin/convlog.exe  c:/apache/logs/access%Y%m%d.log"

       

Configuration for use from command line:
TransferLog "|c:/apache/bin/convlog.exe  c:/apache/logs/access%%Y%%m%%d.log"


这是因为批处理机制所致,命令行必须用%%引用。

六、引入 rotatelogs (不推荐使用)
好了,到这里我们的cronolog工具就讲解完成了。有博友会问为什么不用apache自带的日志分割工具?apache自带的日志分割工具rotatelogs,据专家说在进行日志切割时容易丢日志,所以这里我们就用cronolog来做日志切割。

=========== 华丽分割线 ===========

apache自带日志轮询工具rotatelogs(不推荐使用 rotatelogs 进行日志轮询)

■ rotatelogs 日志轮询
___________________________________________________________
ErrorLog "|/usr/local/apache1.3.33/bin/rotatelogs /logs/%Y%m%d.error.log 604800"
CustomLog "|/application/apache/bin/rotatelogs /logs/access_www_%Y%m%d..log 86400 480" combined
CustomLog "|/application/apache/bin/rotatelogs /logs/access_www_%Y%m%d..log 86400" combined

提示:也可以按照达到多大文件而轮询日志,此处就不提了。

_
■ rotatelogs 日志轮询说明
_
语法
rotatelogs [ -l ] logfile [ rotationtime [ offset ]] | [ filesizeM ]

选项
-l
使用本地时间代替GMT时间作为时间基准。注意:在一个改变GMT偏移量(比如夏令时)的环境中使用-l会导致不可预料的结果。
logfile
它加上基准名就是日志文件名。如果logfile中包含"%",则它会被视为用于strftime()的格式字符串;
否则它会被自动加上以秒为单位的".nnnnnnnnnn"后缀。这两种格式都表示新的日志开始使用的时间。
rotationtime
日志文件滚动的以秒为单位的间隔时间。
offset
相对于UTC的时差的分钟数。如果省略,则假定为"0"并使用UTC时间。比如,要指定UTC时差为
"-5小时"的地区的当地时间,则此参数应为"-300"。
filesizeM
指定以filesizeM文件大小滚动,而不是按照时间或时差滚动。

# 限制错误日志文件为 500M
#ErrorLog "|bin/rotatelogs.exe -l logs/error-%Y-%m-%d.log 500M"
 
# 每天生成一个错误日志文件
#ErrorLog "|bin/rotatelogs.exe -l logs/error-%Y-%m-%d.log 86400"
 
# 限制访问日志文件为 500M
#CustomLog "|bin/rotatelogs.exe -l logs/access-%Y-%m-%d.log 500M" common
 
# 每天生成一个访问日志文件
#CustomLog "|bin/rotatelogs.exe -l logs/access-%Y-%m-%d.log 86400" common

在windows下, rotatelogs.exe有个坑儿。 当apache服务器运行时间久了之后,或者说日志文件过多时。 进程列表中会产生很多 rotatelogs.exe , 以及 cmd.exe 进程, 占用大量内存。而且他们不会停止,这是一个BUG

总结:不推荐使用 rotatelogs 进行日志轮询

参考:

tomcat:

http://blog.csdn.net/mqboss/article/details/7466736

http://oldboy.blog.51cto.com/2561410/584513/

转载:https://blog.51cto.com/skypegnu1/1695187

首先检查您的PHP是线程安全性的还是非安全性的,因为我们需要知道要下载正确的模块。你可以在Windows中运行一个简单的命令来检查这个。代码如下:

php -i | findstr "Thread"

如果结果输出是Thread Safety => enabled,那说明你的PHP版本是线程安全性的,反之亦然。
当然你也可以新建个PHP文件,用php_info();来获取你PHP的信息。

接下来,在Jan-E这里下载完整的编译好的PHP版本:
https://www.apachelounge.com/viewtopic.php?t=6359
然后你可以从里面提取出你需要的文件,将它们解压到各自的文件夹中:
\php\ 文件夹:

  • v8.dll
  • v8_libbase.dll
  • v8_libplatform.dll
  • icui18n.dll (php7)
  • icuuc.dll (php7)

\php\ext\文件夹:

  • php_v8js.dll

还有最后一步,配置你的php.ini文件:

; V8 Javascript Engine Module
extension=php_v8js.dll

最后重启你的服务就可以了!!!

提供个简单的例子:

<?php

$v8 = new V8Js();

/* basic.js */
$JS = <<< EOT

var string1 = 'Hello' + ' ' + 'World!';
len = print(string1+"\\n");
var string2 = 'Hello' + ' ' + 'World2!';
len2 = print(string2+"\\n");
string1+","+string2;
EOT;

try {
  $temp = $v8->executeString($JS, 'basic.js');
  $temp = explode(",",$temp);
  print_r($temp);
} catch (V8JsException $e) {
  print_r($e);
}

运行结果如下:

[Running] php "e:worktest.php"
Hello World!
Hello World2!
Array
(

[0] => Hello World!
[1] => Hello World2!
)

[Done] exited with code=0 in 0.622 seconds
按照上面的方法设置后在windows + iis + php 环境可用。
如果使用的是apache,则需要把复制到\php\同目录下的几个文件复制到apache\bin目录下才行。

如何在 Apache 中启用 HTTP/2
从 Apache httpd 2.4.17 开始终于支持 HTTP/2 了。这个页面给出了一些如何构建/部署/配置的建议。目的是为了大家发现 bugs 时能升级它,或者给一些能更好工作的建议。

最后,这会归并回到官方 Apache 文档,这里只会留下一个到那里的链接。暂时我们还没做到。
编译支持 HTTP/2
一个给服务器的好建议是为 http2 模块设置合适的日志等级。添加下面的配置:

# 放在某个地方的这样一行
LoadModule http2_module modules/mod_http2.so
<IfModule http2_module>
  LogLevel http2:info
</IfModule>

当你启动服务器的时候,你可以在错误日志中看来类似的一行:

[timestamp] [http2:info] [pid XXXXX:tid numbers] 
 mod_http2 (v1.0.0, nghttp2 1.3.4), initializing...

然后可以用新的 Protocols 指令启用 HTTP/2 协议:

# 对于 https 服务器
Protocols h2 http/1.1
...
# 对于 http 服务器
Protocols h2c http/1.1

相关文章:
https://www.jb51.net/article/76432.htm

在我windows + apache2.4.38 上尝试了网上很多方法无效,最后找到一个答案就是:

apache SSL支持协议是全局设置,需要放在VirtualHost外面。

开启ocsp需要保持格式在命令上一行注释,否则可能会报错。不要问为什么,完全靠试出来的。

我的VirtualHost配置记录:


Listen 443

# 添加 SSL 协议支持协议,去掉不安全的协议
SSLProtocol All -TLSv1

#开启ocsp
SSLUseStapling on   
SSLCompression off 
#缓存位置  需要mod_socache_shmcb模块
SSLStaplingCache "shmcb:logs/stapling-cache(150000)" 
#ocsp装订正常缓存超时3600秒
SSLStaplingStandardCacheTimeout 3600    
#ocsp装订错误缓存超时600秒
SSLStaplingErrorCacheTimeout 600    

<VirtualHost *:443>
DocumentRoot "D:/blog"
ServerName blog.gamecf.cn
# SSL功能打开,如果在Virtualhost 出现这句,则仅作用于虚拟机站点配置范围,这个虚拟机站点全部使用SSL通信,如果出现在Virtualhost外,则作用于全局,整个服务器都使用 SSL(HTTPS)通信,不能采用HTTP通信,所以通常都在Virtualhost中加这句。
SSLEngine on
# 修改加密套件
SSLCipherSuite HIGH:!RC4:!MD5:!aNULL:!eNULL:!NULL:!DH:!EDH:!EXP:+MEDIUM
SSLHonorCipherOrder on
# 证书公钥配置
SSLCertificateFile D:/gamecf.cn.crt
# 证书私钥配置
SSLCertificateKeyFile D:/gamecf.cn.key
# 开启HTTP/2.0
Protocols h2 http/1.1
# 支持HTTP严格传输安全(HSTS)
Header always set Strict-Transport-Security "max-age=63072000; includeSubdomains; preload"
# 支持HPKP
Header set Public-Key-Pins "pin-sha256=\"klO23nT2ehFDXCfx3eHTDRESMz3asj1muO+4aIdjiuY=\"; pin-sha256=\"633lt352PKRXbOwf4xSEa1M517scpD3l5f79xMD9r9Q=\"; max-age=2592000; includeSubDomains"
<Directory "/">
    Require all granted 
    AllowOverride All
    Options Indexes FollowSymLinks ExecCGI
    Require host ip
</Directory>
</VirtualHost>

相关文章:
https://codeday.me/bug/20181107/358027.html