淺析 Laravel 官方文件推薦的 Nginx 配置

Wi1dcard發表於2019-03-20

Laravel 5.8 文件 為準,淺析 Nginx 配置。可作為 輕鬆部署 Laravel 應用 的擴充閱讀。

方便起見,我在註釋中使用 [] 包裹引用配置中的值。

server {
    # 監聽 HTTP 協議預設的 [80] 埠。
    listen 80;
    # 繫結主機名 [example.com]。
    server_name example.com;
    # 伺服器站點根目錄 [/example.com/public]。
    root /example.com/public;

    # 新增幾條有關安全的響應頭;與 Google+ 的配置類似,詳情參見文末。
    add_header X-Frame-Options "SAMEORIGIN";
    add_header X-XSS-Protection "1; mode=block";
    add_header X-Content-Type-Options "nosniff";

    # 站點預設頁面;可指定多個,將順序查詢。
    # 例如,訪問 http://example.com/ Nginx 將首先嚐試「站點根目錄/index.html」是否存在,不存在則繼續嘗試「站點根目錄/index.htm」,以此類推...
    index index.html index.htm index.php;

    # 指定字符集為 UTF-8
    charset utf-8;

    # Laravel 預設重寫規則;刪除將導致 Laravel 路由失效且 Nginx 響應 404。
    location / {
        try_files $uri $uri/ /index.php?$query_string;
    }

    # 關閉 [/favicon.ico] 和 [/robots.txt] 的訪問日誌。
    # 並且即使它們不存在,也不寫入錯誤日誌。
    location = /favicon.ico { access_log off; log_not_found off; }
    location = /robots.txt  { access_log off; log_not_found off; }

    # 將 [404] 錯誤交給 [/index.php] 處理,表示由 Laravel 渲染美觀的錯誤頁面。
    error_page 404 /index.php;

    # URI 符合正規表示式 [\.php$] 的請求將進入此段配置
    location ~ \.php$ {
        # 配置 FastCGI 服務地址,可以為 IP:埠,也可以為 Unix socket。
        fastcgi_pass unix:/var/run/php/php7.2-fpm.sock;
        # 配置 FastCGI 的主頁為 index.php。
        fastcgi_index index.php;
        # 配置 FastCGI 引數 SCRIPT_FILENAME 為 $realpath_root$fastcgi_script_name。
        fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;
        # 引用更多預設的 FastCGI 引數。
        include fastcgi_params;
    }
    # 通俗地說,以上配置將所有 URI 以 .php 結尾的請求,全部交給 PHP-FPM 處理。

    # 除符合正規表示式 [/\.(?!well-known).*] 之外的 URI,全部拒絕訪問
    # 也就是說,拒絕公開以 [.] 開頭的目錄,[.well-known] 除外
    location ~ /\.(?!well-known).* {
        deny all;
    }
}

關於 X-Frame-OptionsX-XSS-ProtectionX-Content-Type-Options 可參考 這篇文章,自認為作者講得還不錯,通俗易懂並且是中文。

關於 .well-known 目錄的詳細解釋,可參考 這篇問答(英文)。

我感謝自己平凡,敢愛敢恨沒負擔。
我感謝自己不凡,可愛可恨都包攬。

相關文章