服务器之家:专注于服务器技术及软件下载分享
分类导航

Linux|Centos|Ubuntu|系统进程|Fedora|注册表|Bios|Solaris|Windows7|Windows10|Windows11|windows server|

服务器之家 - 服务器系统 - Linux - 什么是Apache Access Log中的OPTIONS *的含义

什么是Apache Access Log中的OPTIONS *的含义

2023-10-11 20:43未知服务器之家 Linux

访问日志 在Apache的Access Log中会看到很多如下的访问日志: 127.0.0.1--[05/May/2011:10:54:07+0800]OPTIONS*HTTP/1.0200-127.0.0.1--[05/May/2011:10:54:08+0800]OPTIONS*HTTP/1.0200-127.0.0.1--[05/May/2011:10:54:09+0800]OPTIONS*HTTP/1.0200-127.0.0.1--[05/May/2011:10:54:10+0800]OPTIO

访问日志

在Apache的Access Log中会看到很多如下的访问日志:

127.0.0.1--[05/May/2011:10:54:07+0800]"OPTIONS*HTTP/1.0"200-
127.0.0.1--[05/May/2011:10:54:08+0800]"OPTIONS*HTTP/1.0"200-
127.0.0.1--[05/May/2011:10:54:09+0800]"OPTIONS*HTTP/1.0"200-
127.0.0.1--[05/May/2011:10:54:10+0800]"OPTIONS*HTTP/1.0"200-

这是什么意思呢?

Apache的文档的说明

Apache的文档中, 有如下的说明:

When the Apache HTTP Server manages its child processes, it needs a way to wake up processes that are listening for new connections. To do this, it sends a simple HTTP request back to itself. This request will appear in the access_log file with the remote address set to the loop-back interface (typically 127.0.0.1 or ::1 if IPv6 is configured). If you log the User-Agent string (as in the combined log format), you will see the server signature followed by “(internal dummy connection)” on non-SSL servers. During certain periods you may see up to one such request for each httpd child process.

可是,为什么要唤醒呢? 唤醒是为了做什么呢?

什么是Apache Access Log中的OPTIONS *的含义

在Apache Prefork模式下, 启动的时候,Apache就会fork出一些worker进程, 来准备接受请求, 这些worker进程,在完成准备工作以后, 就会进入block模式的监听沉睡中, 等待请求到来而被唤醒。

另外一方面, 在Prefork模式下, 当请求很多, 目前的worker进程数不够处理的时候, 就会额外再fork一些worker进程出来, 以满足当前的请求。

而在这些请求高峰过后, 如果额外fork出来的进程数大于了MaxSpareServers, Apache就会告诉这些worker进程退出, 那么问题就来了。

这些进程都在沉睡中啊, 怎么告诉他们, 并且让他们自我退出呢?

自我退出

Apache会首先发送一个退出状态字(GRACEFUL_CHAR !)给这些Work进程:

staticapr_status_tpod_signal_internal(ap_pod_t*pod)
{
apr_status_trv;
charchar_of_death='!';
apr_size_tone=1;

rv=apr_file_write(pod->pod_out,&char_of_death,&one);
if(rv!=APR_SUCCESS){
ap_log_error(APLOG_MARK,APLOG_WARNING,rv,ap_server_conf,
"writepipe_of_death");
}

.returnrv;
}

但此时, Worker进程不会去读这些状态字, 因为他们还在沉睡。

这个时候Apache就会发送一个OPTIONS请求给自己, 唤醒这些沉睡的进程:

staticapr_status_tdummy_connection(ap_pod_t*pod)
{
//...有省略
/*Createtherequeststring.WeincludeaUser-Agentsothat
*adminstratorscantrackdownthecauseoftheodd-looking
*requestsintheirlogs.
*/
srequest=apr_pstrcat(p,"OPTIONS*HTTP/1.0\r\nUser-Agent:",
ap_get_server_banner(),
"(internaldummyconnection)\r\n\r\n",NULL);
//...有省略
}

这些进程在处理完当前请求以后(OPTIONS请求), 就会发现, oh, 主进程让我退出。

staticvoidchild_main(intchild_num_arg)
{
//...有省略

while(!die_now&&!shutdown_pending){
//...有省略
//1.listen
//2.accept
//3.processrequest

/*Checkthepodandthegenerationnumberafterprocessinga
*connectionsothatwe'llgoawayifagracefulrestartoccurred
*whilewewereprocessingtheconnectionorwearethelucky
*idleserverprocessthatgetstodie.
*/
if(ap_mpm_pod_check(pod)==APR_SUCCESS){/*selectedasidle?*/
die_now=1;
}
//...有省略
}
//...有省略
}

于是, 它就做完清理工作, 然后自我消亡了~~~


延伸 · 阅读

精彩推荐