良许Linux教程网 干货合集 详解Apache Access Log中的OPTIONS *

详解Apache Access Log中的OPTIONS *

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 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;
       }
//...有省略
  }
//...有省略
}

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

以上就是良许教程网为各位朋友分享的Linu系统相关内容。想要了解更多Linux相关知识记得关注公众号“良许Linux”,或扫描下方二维码进行关注,更多干货等着你 !

img
本文由 良许Linux教程网 发布,可自由转载、引用,但需署名作者且注明文章出处。如转载至微信公众号,请在文末添加作者公众号二维码。
良许

作者: 良许

良许,世界500强企业Linux开发工程师,公众号【良许Linux】的作者,全网拥有超30W粉丝。个人标签:创业者,CSDN学院讲师,副业达人,流量玩家,摄影爱好者。
上一篇
下一篇

发表评论

联系我们

联系我们

公众号:良许Linux

在线咨询: QQ交谈

邮箱: yychuyu@163.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

关注微博
返回顶部