Nginx 輕量高效,透過模組與變數可實現多種進階功能。本文整理四大常見需求的設定範例與注意事項。
# 建立密碼檔(需安裝 httpd-tools 或 apache2-utils)
htpasswd -bc /usr/local/nginx/htpasswd username password
# nginx.conf 中的 server 區塊內
location ~ /admin { # 保護 /admin 目錄
auth_basic "PLEASE LOGIN";
auth_basic_user_file /usr/local/nginx/htpasswd;
}
location ~ \.php$ { # PHP 處理區塊**必須放在保護區塊之後**
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME /var/www/bbs$fastcgi_script_name;
include fastcgi_params;
}
關鍵順序: 目錄保護
location必須置於location ~ \.php$**之前**,否則 PHP 檔案會繞過驗證直接執行。
location ~* \.(txt|ico|gif|png|bmp|jpg|jpeg|zip|rar|gz|7z|exe|mp3|flv|swf)$ {
valid_referers none blocked example.com www.example.com;
if ($invalid_referer) {
rewrite ^/ https://example.com/403.html permanent;
# 或 return 403;
}
}
valid_referers:允許的 Referer 來源,none 允許無 Referer(直接輸入網址),blocked 允許被防火牆過濾的 Referer。$invalid_referer:若 Referer 不在名單中,值為 1。access_log 驗證成效,勿只用瀏覽器測試(CDN/搜尋引擎可能快取圖片)。# http 區塊定義共享記憶體區
limit_zone crawler $binary_remote_addr 20m;
# server 區塊套用
location ~ \.(zip|rar|gz|tar|exe|mp3|flv|swf|jpg|jpeg)$ {
limit_conn crawler 1; # 限制單 IP 單連線
limit_rate 500k; # 限速 500 KB/s
}
# 或針對特定目錄
# location /download/ {
# limit_conn crawler 1;
# limit_rate 500k;
# }
注意: Nginx 1.1.7+ 應使用
limit_conn_zone取代limit_zone,語法為limit_conn_zone $binary_remote_addr zone=crawler:20m;。
SERVER_NAME 優化設定 server_name www.example.com *.example.com example.com; 時,PHP $_SERVER['SERVER_NAME'] 永遠回傳第一個域名(www.example.com),導致泛域名應用失效。
# 修改 fastcgi_param 來源為 $host(實際請求的 Host 標頭) fastcgi_param SERVER_NAME $host; # 關閉內部重導向時自動使用 server_name 第一個域名 server_name_in_redirect off;
重新載入 Nginx 後,PHP 即可正確取得實際請求域名。
location 順序。valid_referers + $invalid_referer 實作。limit_conn_zone + limit_rate。fastcgi_param SERVER_NAME $host; 與 server_name_in_redirect off;。