当前版本在配置文件中增加了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
当前版本在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配置,可以设置需要使用的日志模式,有两种日志模式:一种是详细日志模式,另一种是精简日志模式。
在详细日志模式中,每个请求的请求头和响应头信息都会被记录到日志中,而在精简日志模式中,只会记录每个请求的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的配置,该配置用于设置每个请求的主体数据所允许的最大字节值。
当需要上传较大的文件时,就需要调整该配置值,例如,假设配置值是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的配置,该配置用于设置请求头所允许的最大字节值,当请求中可能包含较大的请求头时,就需要调整该配置的值。
例如,当请求头中包含很多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的配置,该配置用于设置url资源路径(包括请求参数在内)所允许的最大字符数。配置文件中的默认值是1024:
def TRUE 1; def FALSE 0; def KBYTE 1024; ....................................................... request_url_max_size = 1024; // 设置url资源路径(包括请求参数在内)所允许的最大字符数 .......................................................
url资源路径,就是浏览器中输入的请求地址(包括请求参数在内),当该配置的值较小时,就无法获取到完整的请求地址信息。
当前版本在配置文件中,还增加了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.13.0 目录入口文件以及模板路径调整
zenglServer v0.24.0 增加bltVersionCompare,mysqlAffectedRows模块函数,为bltStr增加format可选参数
zenglServer v0.12.0 图形验证码, 新增模块函数
zenglServer v0.15.0 - v0.15.1 增加curl模块,用于执行数据抓取操作
zenglServer v0.5.0 设置响应头, 获取cookie
zenglServer v0.16.0 增加curlSetPostByHashArray,curlSetHeaderByArray模块函数,调整进程名称等