阿里云-云小站(无限量代金券发放中)
【腾讯云】云服务器、云数据库、COS、CDN、短信等热卖云产品特惠抢购

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

62次阅读
没有评论

共计 2426 个字符,预计需要花费 7 分钟才能阅读完成。

导读 access_log 为访问日志, 记录所有对 apache 服务器进行请求的访问, 它的位置和内容由 CustomLog 指令控制,LogFormat 指令可以用来简化该日志的内容和格式
访问日志

在 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 进程:

static apr_status_t pod_signal_internal(ap_pod_t *pod)
{
    apr_status_t rv;
    char char_of_death = '!';
    apr_size_t one = 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,
                     "write pipe_of_death");
    }
 
.    return rv;
}

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

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

static apr_status_t dummy_connection(ap_pod_t *pod)
{
//... 有省略
    /* Create the request string. We include a User-Agent so that
     * adminstrators can track down the cause of the odd-looking
     * requests in their logs.
     */
    srequest = apr_pstrcat(p, "OPTIONS * HTTP/1.0\r\nUser-Agent:",
                           ap_get_server_banner(),
                           "(internal dummy connection)\r\n\r\n", NULL);
//... 有省略
}

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

static void child_main(int child_num_arg)
{
//... 有省略
 
    while (!die_now && !shutdown_pending) {
//... 有省略
        //1. listen
        //2. accept
       //3. process request
 
        /* Check the pod and the generation number after processing a
         * connection so that we'll go away if a graceful restart occurred
         * while we were processing the connection or we are the lucky
         * idle server process that gets to die.
         */
        if (ap_mpm_pod_check(pod) == APR_SUCCESS) { /* selected as idle? */
            die_now = 1;
        }
//... 有省略
   }
//... 有省略
}

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

阿里云 2 核 2G 服务器 3M 带宽 61 元 1 年,有高配

腾讯云新客低至 82 元 / 年,老客户 99 元 / 年

代金券:在阿里云专用满减优惠券

正文完
星哥玩云-微信公众号
post-qrcode
 0
星锅
版权声明:本站原创文章,由 星锅 于2024-07-24发表,共计2426字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
【腾讯云】推广者专属福利,新客户无门槛领取总价值高达2860元代金券,每种代金券限量500张,先到先得。
阿里云-最新活动爆款每日限量供应
评论(没有评论)
验证码
【腾讯云】云服务器、云数据库、COS、CDN、短信等云产品特惠热卖中