以往不想要讓人索引、讀取的目錄和檔案都會設定成 deny all:
location ~ /\.git { deny all; }
這樣設定的話,開啟該目錄就會收到
。這個訊息有二個含意:主機上面的確有這份資料、你沒有權限打開。HTTP 403 Forbidden
也就是,檔案在 URL 的連結已經確定了,只要繞過權限管理即可讀取檔案。
與其這樣,不如直接讓主機回傳 HTTP 404
,這樣便無法知道檔案是否存在:
location ~ /\.git { return 404; }
軟體開發、伺服器和生活瑣事
以往不想要讓人索引、讀取的目錄和檔案都會設定成 deny all:
location ~ /\.git { deny all; }
這樣設定的話,開啟該目錄就會收到
。這個訊息有二個含意:主機上面的確有這份資料、你沒有權限打開。HTTP 403 Forbidden
也就是,檔案在 URL 的連結已經確定了,只要繞過權限管理即可讀取檔案。
與其這樣,不如直接讓主機回傳 HTTP 404
,這樣便無法知道檔案是否存在:
location ~ /\.git { return 404; }
一般用 PHP 實作 background task,大多都是先將 task 處理後再處理 user request。
所以程式大概是長這樣:
<?php class Contrller { public function handle() { if (Background::hasTask()) { Background::run(); } $data = List::whereIn('id', [1, 4, 6])->get(); view($data); }
這樣做會有一些缺點,若背景程式跑了很久才結束,會讓使用者有一種「點了按鍵卻感覺沒有回應」的錯覺。
若有時候真的累積不少 background task 需要處理時,為了不讓使用者等太久,通常會 trigger 一些專為 background task 設定的程式去執行,像是一群的 consumer,或者會 trigger gearman 去處理。
而我再某一次很罕見的狀況下必須馬上讓使用者先收到 reponse 之後才去處理 background task。問題來了:通常都要 PHP return / exit 以後,response 才會傳回 client,那有什麼辦法先給已經處理好的 response,讓 client 繼續瀏覽以後再來跑 background task?
沒想到還真的讓我找到解法:fastcgi_finish_request()
。
fastcgi_finish_request()
這個函式會先通知 fastcgi 的上層 (我這邊是 Nginx reverse proxy) 要給 client 的資料都送出去囉,可以 ending 啦。然後 PHP 偷偷摸摸繼續在後面弄東西。
程式上寫起來會有點不一樣:
<?php class Contrller { public function handle() { $data = List::whereIn('id', [1, 4, 6])->get(); view($data); fastcgi_finish_request(); // 這之後不管發生什麼事,client 都不會再收到訊息 Background::run() }
不過要注意,因為不管如何,client 都不再收到訊息,因此若有錯誤發生是很難 debug 的。
用 catch
也好,用 logger
也好,甚至你要請到 register_shutdown_function()
出場也都好,如果不這樣做,基本上沒什麼 debug 手段。
而我使用 fastcgi_finish_request()
也只有在 Nginx + php-fpm 時成功,我不曉得會做其他形式的 web server 架構是否可以使用。如果網友嘗試過,不如回覆讓其他人知道一下。
總之不得已才使用這個方法。
在 HTTP server 上設定 Gzip 壓縮,可以將文字類型 (HTML, *.js, *.css) 的檔案大小減少約 90%,可以加速檔案的傳輸,在頻寬較小的環境下會特別明顯。
WordPress 的外掛,提供了一些建議使用 Gzip 壓縮的檔案類型,可參考:
Nginx 上傳大型檔案,在網路上查到的,基本上就是修改「client_max_body_size」:
client_max_body_size 100m; # 限制上傳大小為 100MB
也可以改成無限制:
client_max_body_size 0;
但要注意的是,若 Nginx 在主機上是當作 reverse proxy 使用時,Nginx 收到檔案預設是先暫存在自己的主機上面,等到資料接收完畢後再一起丟到 server。
當檔案丟到 server 時,超過預設的「client_body_timeout」的 60 秒,就會視為失敗。因此遇到抄道行檔案,使 Nginx 將資料傳至 server 時間比預期的還要長 (不是 local network 等) 時,記得要將「client_body_timeout」延長:
client_body_timeout 300s
有些 bot 很討厭,掃描速度快,而且感覺在猜測網站內容,打出很多 HTTP 404
:
$ grep bot access.log | awk '{print $NF}' |sort | uniq -c | sort -n | tail 298 +http://napoveda.seznam.cz/en/seznambot-intro/)" 525 +http://www.brandwatch.net)" 599 +http://yandex.com/bots)" 1005 bot@linguee.com)" 1233 Safari/537.36" 1421 +http://www.bing.com/bingbot.htm)" 5335 +https://seostar.co/robot/)" 48104 +http://www.semrush.com/bot.html)" 81520 +http://www.google.com/bot.html)" 93660 +http://ahrefs.com/robot/)"
參考了別人 $http_user_agent 的處理方法:
if ($http_user_agent ~* (AhrefsBot|SemrushBot)) { return 444; }
另外要注意的是:
~*
:這個不分大小寫 (case insensitive)~
:這個會區分大小寫ps. 一般來說可以參考 HTTP status code 給 HTTP 403、444 等狀態碼,我是不爽所以給 HTTP 418