当前版本在配置文件中增加了verbose,request_body_max_size,request_header_max_size,request_url_max_size,pidfile配置,可以设置日志模式,设置用于保存主进程的进程ID的文件等。

    页面导航:

项目下载地址:

    zenglServer源代码的相关地址:https://github.com/zenglong/zenglServer  当前版本对应的tag标签为:v0.17.0

zenglServer v0.17.0:

    当前版本在config.zl配置文件中,增加了以下几个配置:

def TRUE 1;
def FALSE 0;
def KBYTE 1024;

...................................................

verbose = TRUE; // 使用详细日志模式,还是精简日志模式,默认是TRUE即详细日志模式,设置为FALSE可以切换到精简日志模式,在详细日志模式中,会将每个请求的请求头和响应头都记录到日志中

request_body_max_size = 200 * KBYTE; // 设置每个请求的主体数据所允许的最大字节值
request_header_max_size = 5 * KBYTE; // 设置请求头所允许的最大字节值
request_url_max_size = 1024; // 设置url资源路径(包括请求参数在内)所允许的最大字符数

pidfile = "zenglServer.pid"; // 设置记录主进程的进程ID的文件名(该文件名可以是相对于当前工作目录的路径)

    这几个配置在下面会进行介绍。

    此外,当前版本在编译时,可以自定义main.h头文件中的URL_PATH_SIZE和FULL_PATH_SIZE宏对应的值,只要在make命令后面加入URL_PATH_SIZE=xxx和FULL_PATH_SIZE=xxx即可(xxx表示需要自定义的数值):

[parallels@localhost zenglServerTest]$ make URL_PATH_SIZE=200 FULL_PATH_SIZE=300 USE_MYSQL=yes USE_MAGICK=6 USE_PCRE=yes USE_CURL=yes
...................................................
gcc -g3 -ggdb -O0 -std=c99 main.c http_parser.c .....  -o zenglServer zengl/linux/libzengl.a crustache/libcrustache.a -D URL_PATH_SIZE=200 -D FULL_PATH_SIZE=300 -lpthread -lm -DUSE_MYSQL `mysql_config --cflags --libs`  -D USE_MAGICK=6 `pkg-config --cflags --libs Wand` -DUSE_PCRE `pcre-config --cflags --libs` -DUSE_CURL `curl-config --cflags --libs`

mysql module is enabled!!!
magick module is enabled!!!
pcre module is enabled!!!
curl module is enabled!!!
[parallels@localhost zenglServerTest]$ 

    当处于详细日志模式时(当配置文件中的verbose为TRUE时),可以在日志中看到每个请求的url_path和full_path,URL_PATH_SIZE可以控制url_path所允许的最大长度(最多可以容纳多少个字符),FULL_PATH_SIZE则可以控制full_path所允许的最大长度,此外,很多模块函数中也是用FULL_PATH_SIZE作为文件路径的最大长度。

    如果没有在make命令中自定义URL_PATH_SIZE和FULL_PATH_SIZE的话,URL_PATH_SIZE的默认值会是120,FULL_PATH_SIZE的默认值则是200。在自定义这两个宏值时,自定义的值必须大于30,且小于等于4096。

verbose:

    当前版本在配置文件中增加了verbose配置,可以设置需要使用的日志模式,有两种日志模式:一种是详细日志模式,另一种是精简日志模式。

    在详细日志模式中,每个请求的请求头和响应头信息都会被记录到日志中,而在精简日志模式中,只会记录每个请求的url之类的路径信息,不会去记录请求头和响应头信息。

    默认情况下就是详细日志模式,要切换到精简日志模式,只需将配置文件中的verbose的值设置为FALSE即可:

def TRUE 1;
def FALSE 0;
def KBYTE 1024;

....................................................

verbose = FALSE; // 使用详细日志模式,还是精简日志模式,默认是TRUE即详细日志模式,设置为FALSE可以切换到精简日志模式,在详细日志模式中,会将每个请求的请求头和响应头都记录到日志中

....................................................

    以下是精简日志模式下,日志中的请求记录示例:

[parallels@localhost zenglServerTest]$ tail -n 30 logfile
....................................................
create master process for daemon [pid:7159] 
use default config: config.zl
*** config is in debug mode ***
run config.zl complete, config: 
port: 8083 process_num: 1
webroot: my_webroot
session_dir: my_sessions session_expire: 1440 cleaner_interval: 3600
remote_debug_enable: False remote_debugger_ip: 127.0.0.1 remote_debugger_port: 9999 zengl_cache_enable: False shm_enable: False shm_min_size: 307200
verbose: False request_body_max_size: 204800, request_header_max_size: 5120 request_url_max_size: 1024
URL_PATH_SIZE: 200 FULL_PATH_SIZE: 300
pidfile: zenglServer.pid
bind done
accept sem initialized.
process_max_open_fd_num: 1024 
Master: Spawning child(0) [pid 7160] 
Master: Spawning cleaner [pid 7163] 
2019/01/12 16:27:31 fd:8 idx:0 pid:7160 tid:7162 | url: /v0_15_0/test.zl | full_path: my_webroot/v0_15_0/test.zl | status: 200, length: 1367 | free [0]/0 epoll:1 pid:7160 tid:7162
2019/01/12 16:27:33 fd:9 idx:0 pid:7160 tid:7162 | url: /favicon.ico | full_path: my_webroot/favicon.ico | status: 200, length: 67646 | free [0]/0 epoll:0 pid:7160 tid:7162
2019/01/12 16:27:34 fd:10 idx:0 pid:7160 tid:7162 | url: /v0_5_0/show_header.zl | full_path: my_webroot/v0_5_0/show_header.zl | status: 200, length: 647 | free [0]/0 epoll:1 pid:7160 tid:7162
2019/01/12 16:27:34 fd:8 idx:0 pid:7160 tid:7162 | url: /favicon.ico | full_path: my_webroot/favicon.ico | status: 200, length: 67646 | free [0]/0 epoll:0 pid:7160 tid:7162
2019/01/12 16:28:52 fd:9 idx:0 pid:7160 tid:7162 | url: /v0_5_0/show_header.zl | full_path: my_webroot/v0_5_0/show_header.zl | status: 200, length: 626 | free [0]/0 epoll:1 pid:7160 tid:7162
[parallels@localhost zenglServerTest]$ 

    可以看到,在精简日志模式下,日志中只记录了每个请求的时间,url资源路径(包括请求参数在内),full_path即完整了路径(请求文件的相对或绝对路径),status即响应状态码,以及length响应数据的长度(响应数据的字节大小)。

request_body_max_size:

    当前版本在配置文件中,增加了request_body_max_size的配置,该配置用于设置每个请求的主体数据所允许的最大字节值。

    当需要上传较大的文件时,就需要调整该配置值,例如,假设配置值是200K,但是上传文件的大小是300K,那么上传就会失败。因为上传文件的请求对应的主体数据的字节大小大于设置的200K,此时,就需要将此配置根据情况调大,例如调到400K等,这样就可以上传较大的文件了。

    配置文件中的request_body_max_size的默认值是200K字节:

def TRUE 1;
def FALSE 0;
def KBYTE 1024;

.......................................................

request_body_max_size = 200 * KBYTE; // 设置每个请求的主体数据所允许的最大字节值
.......................................................

    可以通过my_webroot/v0_2_0/form.html来测试文件上传操作。

request_header_max_size:

    当前版本在配置文件中,增加了request_header_max_size的配置,该配置用于设置请求头所允许的最大字节值,当请求中可能包含较大的请求头时,就需要调整该配置的值。

    例如,当请求头中包含很多Cookie信息时,就会导致请求头比较大,此时就需要适当的调大该配置的值,这样,服务端才能记录到完整的请求头信息。

    配置文件中的request_header_max_size的默认值是5K字节:

def TRUE 1;
def FALSE 0;
def KBYTE 1024;

.......................................................
request_header_max_size = 5 * KBYTE; // 设置请求头所允许的最大字节值
.......................................................

    可以通过my_webroot/v0_5_0/show_header.zl脚本测试显示请求头信息,当request_header_max_size配置的值很小时,例如只有50时,测试脚本显示的请求头信息就会不完整。

request_url_max_size:

    当前版本在配置文件中,增加了request_url_max_size的配置,该配置用于设置url资源路径(包括请求参数在内)所允许的最大字符数。配置文件中的默认值是1024:

def TRUE 1;
def FALSE 0;
def KBYTE 1024;

.......................................................
request_url_max_size = 1024; // 设置url资源路径(包括请求参数在内)所允许的最大字符数

.......................................................

    url资源路径,就是浏览器中输入的请求地址(包括请求参数在内),当该配置的值较小时,就无法获取到完整的请求地址信息。

pidfile:

    当前版本在配置文件中,还增加了pidfile的配置,该配置用于设置记录主进程的进程ID的文件名(该文件名可以是相对于当前工作目录的路径),配置文件中的默认文件名是zenglServer.pid:

.......................................................

pidfile = "zenglServer.pid"; // 设置记录主进程的进程ID的文件名(该文件名可以是相对于当前工作目录的路径)

    由于pidfile对应的文件中存储了主进程的进程ID,因此,要退出zenglServer的话,可以直接使用该文件来kill主进程:

[parallels@localhost zenglServerTest]$ kill `cat zenglServer.pid`

日志分割:

    当前版本增加了对SIGUSR1信号的处理,在主进程接收到该信号时,会重新打开日志文件,同时增加了log_backup.sh脚本,该脚本就利用SIGUSR1信号来实现日志分割:

[parallels@localhost zenglServerTest]$ cat log_backup.sh 
#!/bin/bash
if [ $# -ne 2 ]; then
	echo "usage: ./log_backup.sh logfile_name pidfile_name"
	exit 1
else
	logfile_name=$1
	pidfile_name=$2
fi
log_backup_path="log_backup/"
target_log_file=${log_backup_path}${logfile_name}_$(date +"%Y%m%d").log
mv ${logfile_name} ${target_log_file}
kill -USR1 `cat ${pidfile_name}`
[parallels@localhost zenglServerTest]$ ./log_backup.sh
usage: ./log_backup.sh logfile_name pidfile_name
[parallels@localhost zenglServerTest]$ ./log_backup.sh logfile zenglServer.pid
[parallels@localhost zenglServerTest]$ ls -l log_backup
总用量 0
-rw-r--r--. 1 zengl zengl 10909 1月  12 16:03 logfile_20190112.log
[parallels@localhost zenglServerTest]$ 

    log_backup.sh脚本后面需要跟随日志文件名,例如上面的logfile,然后还要跟随pidfile对应的文件名,例如上面的zenglServer.pid,该脚本会将logfile备份到log_backup目录中。

    同时,该脚本还会通过SIGUSR1信号让主进程重新打开一个新的日志文件。可以将此脚本加入计划任务,从而实现按天来分割日志:

[parallels@localhost zenglServerTest]$ crontab -l
18 16 * * * cd /media/psf/Home/zenglServerTest && ./log_backup.sh logfile zenglServer.pid
[parallels@localhost zenglServerTest]$ 

结束语:

    让我花掉一整幅青春, 用来寻你。

—— 《迷藏》

 

上下篇

下一篇: zenglServer v0.18.0 直接在命令行中执行脚本

上一篇: zenglServer v0.16.0 增加curlSetPostByHashArray,curlSetHeaderByArray模块函数,调整进程名称等

相关文章

zenglServer v0.4.0 daemon守护进程, epoll事件驱动

zenglServer v0.25.1 使用v1.9.1版本的zengl语言库

zenglServer v0.3.0 mysql模块

zenglServer v0.7.0-v0.7.1 mustache模板解析

zenglServer v0.6.0 session会话

zenglServer v0.8.0-v0.8.1