Apache2 LogFormat Log 加上毫秒紀錄

Apache 的 Access log 一般都是以秒為單位,開啟詳細的 Log 格式為下述:

  • LogFormat "%h %l %u %t \"%r\" %>s %O \"%{Referer}i\" \"%{User-Agent}i\"" combined

官方說明:Log Files - Apache HTTP Server Version 2.4

  • %t 的格式:[day/month/year:hour:minute:second zone], e.g: [01/Oct/2020:13:55:36 +0800]
[10/Oct/2000:13:55:36 -0700] (%t) The time that the request was received. The format is:

[day/month/year:hour:minute:second zone]
  day = 2digit
  month = 3letter
  year = 4digit
  hour = 2digit
  minute = 2digit
  second = 2digit
  zone = (`+' | `-') 4digit

想要將精確度到毫秒、微秒等級,要怎麼做呢?

  • 註:Debian、Ubuntu Linux 設定檔:/etc/apache2/apache2.conf

閱讀全文〈Apache2 LogFormat Log 加上毫秒紀錄〉

Apache2 2.4.33 後 mod_http2 不支援 mpm_prefork

升級 Apache2 套件看到的訊息:

apache2 (2.4.25-3+deb9u5) stretch; urgency=medium

* This package upgrades mod_http2 to the version from apache2 2.4.33. This fixes a lot of bugs and some security issues, but it also removes the support for using HTTP/2 when running with mpm_prefork. HTTP/2 support is only provided when running with mpm_event or mpm_worker.

-- Stefan Fritsch <[email protected]> Sat, 02 Jun 2018 09:51:46 +0200

2.4.33 之後,mod_http2 不支援 mpm_prefork,只有支援 mpm_event 和 mpm_worker,詳細內容可見:

Apache2 抓取 Load Balancer Client IP 的設定

Apache2 前面加上 Load Balancer (F5 Big IP LTM),走得就類似 Reverse Proxy 的模式,會由 F5 將 X-Forwarded-For 轉送到 Apache,要怎麼設定格式才能跟原始 combined 一樣呢?

閱讀全文〈Apache2 抓取 Load Balancer Client IP 的設定〉

Apache2 砍掉 Gracefully 狀態的程式

Apache2 在 apache2ctl status 看到 G 的狀態,這些 process 都已經無法回應了,可以寫隻 script 來砍掉。

註:砍掉只是治標,建議還是看看這些 pid,研究看看卡在哪裡,治本才是重點。

閱讀全文〈Apache2 砍掉 Gracefully 狀態的程式〉

Apache2 mod_rewrite 遇到 %20 和 加號混合的解法

PHP 的 urlencode 有兩種:

  • rawurlencode('c & c++'); // 20%26%20c%2B%2B
  • urlencode('c & c++'); // c+%26+c%2B%2B
  • 由上述看到主要差異在於空白(%20 vs +),+ 會被轉成 %2B

平常使用 urlencode() / rawurlencode() 在 Apache rewrite 轉回來都不會有問題,但是從其它程式語言來得,有遇到同時有 %20 和 +,但是這些在 Apache 端都會被轉成空白讓 PHP 吃,該怎麼避免 + 被轉成空白呢?

閱讀全文〈Apache2 mod_rewrite 遇到 %20 和 加號混合的解法〉

使用 Apache Proxy 統整多個 Port 服務

現在可以執行的 Daemon 太多了, PHP、Python、Ruby、Node.js、Go... 等等, 都會想要拿來跑 Web service,但是 80 Port 只有一個,所以前面只好擋一層 Apache 來達成。

於是使用 Apache 的 Proxy 功能來將後面各種服務的 Port 接上。

閱讀全文〈使用 Apache Proxy 統整多個 Port 服務〉

依照時間來刪除非固定檔名的 Apache2 Log 檔

依照此篇作法:Apache Log檔 使用日期格式 當 檔名設定,客製化 Log 檔名,卻會造成檔名砍不乾淨的問題,要怎麼正確清掉過期得檔案呢?

閱讀全文〈依照時間來刪除非固定檔名的 Apache2 Log 檔〉