以前一直誤會 gzip_types
可以使用 wildcrad *
來表示:
gzip on; gzip_types text/* ;
事實上,上面的表達方式 Nginx 不吃,必須一條一條詳細列出來。
軟體開發、伺服器和生活瑣事
以前一直誤會 gzip_types
可以使用 wildcrad *
來表示:
gzip on; gzip_types text/* ;
事實上,上面的表達方式 Nginx 不吃,必須一條一條詳細列出來。
default packages 更新速度比較慢,所以後來都改用 3rd-party 的 PPA 來裝 LNMP 環境。
以 PHP 來說的話,主要會以 oerdnj 的 PPA 為主:https://launchpad.net/~ondrej/+archive/ubuntu/php
其他則是:
MySQL / Percona / MariaDB 更新、patch 速度沒那麼快的,則是直接使用預設的 packages 來安裝。
網站上常見的資源,像是 HTML、CSS、JacaScript、JSON 等等,其實都是文字組成的,而文字壓縮以後大小可以縮小到剩下 10% 左右,因此有些人主張先將圖片轉成 data URI 在用 gzip 壓縮。
Nginx 可以在遇到特定類型的檔案內容時,啟用 gzip 壓縮後再傳輸資料,透過這個方法來加快傳輸速度:
server { .... gzip on; gzip_disable "MSIE [1-6].(?!.*SV1)"; # 排除不支援的瀏覽器 }
再來要注意,不是所有類型的檔案壓縮以後檔案會變小,像是圖片、影片就不適合使用 gzip 壓縮。這邊新增 MIME type 類型,讓 Nginx 只壓縮真正有效的檔案類型:
所以用 gzip_types
來更新一下 Nginx 的設定檔:
server { gzip on; gzip_disable "MSIE [1-6].(?!.*SV1)"; gzip_types text/x-component text/css application/x-javascript application/javascript text/javascript text/x-js text/richtext text/plain text/xml; }
另外有個注意事項,gzip 可以調整壓縮等級:使用較高的的壓縮率,可以讓檔案盡可能的縮小,但壓縮會花掉較多的時間;使用較低的壓縮率,檔案大小只會縮小一點點,但是只需要一瞬間的時間。所以這個參數就要取決於網站的特性、主機的硬體配備來調整。比較中庸的設定如下:
server { gzip on; gzip_disable "MSIE [1-6].(?!.*SV1)"; gzip_types text/x-component text/css application/x-javascript application/javascript text/javascript text/x-js text/richtext text/plain text/xml; gzip_comp_level 6; # from 0 to 9 }
追 logs 時,留意到一些 bot 都會特別去戳 HTTP CONNECT 這個 method,看了文件才知道可能是在偵測主機是否可以當成跳板來使用,因此針對這些 methods 建立規則。
多數平台應該都會使用 RESTful 的概念來設計 API,所以會用到的應該是 GET
, POST
, PUT
, DELETE
:
if ($request_method !~ ^(GET|HEAD|POST|DELETE)$ ) { return 444; }
這個方法用了一陣子,直到有次發現 WordPress 的某些 API 一直故障、出錯,但又不是功能導致的問題,使用開發人員工具以後,才知道不是只有 RESTful 定義的幾個 HTTP method 會被用到。
最後改成只擋比較有風險的二個 HTTP method:
if ($request_method ~ ^(CONNECT|TRACE)$ ) { return 444; }
Nginx 目前已經支援 HTTP/2 協定,但若在 listen 參數中使用一般的語法來做設定,Nginx 會讓所有的 virtual host 全部一起走相同的 HTTP 協定:
server { listen 443 ssl http2; # ... }
上面這個寫法,會讓所有 listen 443 的 virtual host 全部都走 HTTP/2。
要讓不同 host 使用不同 HTTP 協定,必須使用不同的 IP 來設定 virtual host:
server { listen IP:443 ssl; # ... } server { listen NEW_IP:443 ssl http2; # ... }
參考資料:Can I enable HTTP/2 for specific server blocks (virtual hosts) only, on Nginx?