什麼是Apache Access Log中的OPTIONS *的含義
在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的文件中, 有如下的說明:
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 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; } //...有省略 } //...有省略 }
於是, 它就做完清理工作, 然後自我消亡了~~~
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69901823/viewspace-2988055/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Python中的sys.argv是什麼含義Python
- alter system set ... scope=... 中的scope的含義是什麼?
- 安全設計的含義是什麼?
- Web含義是什麼Web
- 什麼是溢價?溢價的含義
- 創業板是什麼意思?創業板的含義是什麼?創業
- killall -HUP xxx含義是什麼
- Cisco Wireless中顯示的slot0, slot1是什麼含義
- 什麼是元宇宙系統開發?它的價值有什麼含義?元宇宙
- 誕生至今,大資料的真正含義到底是什麼?大資料
- SAP UI5 中的數字 5 代表什麼含義?UI
- MySQL 中的 DEFINER(定義者)是什麼MySql
- SAP UI5 裡一個功能的 compatibility version 是什麼含義?UI
- 常見的域名字尾有哪些?不同域名字尾的含義是什麼?
- 談談傳說中的redo log是什麼?有啥用?
- Tomcat 中 catalina.out、catalina.log、localhost.log 和 access_log 的區別Tomcatlocalhost
- 什麼是 Apache Kafka?ApacheKafka
- java中有哪幾種引用?它們的含義和區別是什麼Java
- XCMP 的意義是什麼?
- Makefile中:=, =, ?=和+=的含義
- Java中static的含義Java
- url中#(hash)的含義
- Spring中bean的含義SpringBean
- Java記憶體模型FAQ(六)沒有正確同步的含義是什麼?Java記憶體模型
- 區塊鏈技術開發公司談區塊鏈的含義是什麼區塊鏈
- apache伺服器的特點是什麼Apache伺服器
- fs.exists 與 fs.access的區別是什麼
- SVN中clean up的含義
- C++中&和*的含義C++
- OGG中add trandata的含義
- Chrome 開發者工具裡 JavaScript 檔名後面跟的 'eval' 是什麼含義ChromeJavaScript
- 大資料分析有什麼含義大資料
- (*Type)(nil)有什麼特殊含義嗎?
- Access、Trunk、Hybrid含義及Hybrid埠型別的常見配置應用型別
- 物件導向中類和物件的定義是什麼?物件
- 請問模型管理中的模型的列表定義是什麼意思模型
- Objects.requireNonNull的意義是什麼ObjectUINull
- LAMP環境中Apache,MySQL,PHP的配置檔案路徑是什麼LAMPApacheMySqlPHP