部署檢查清單

網際網路是一個充滿敵意的環境。在部署您的 Django 專案之前,您應該花一些時間檢查您的設定,並考慮安全性、效能和操作。

Django 包含了許多安全功能。有些是內建的且永遠啟用。其他的則是可選的,因為它們並不總是適合,或者因為它們對於開發而言不方便。例如,強制使用 HTTPS 可能不適用於所有網站,而且對於本機開發來說是不切實際的。

效能最佳化是另一種在便利性上進行權衡的類別。例如,快取在生產環境中很有用,但在本機開發中就比較少用。錯誤報告的需求也差異很大。

以下檢查清單包含以下設定:

  • 必須正確設定,Django 才能提供預期的安全等級;

  • 預期在每個環境中都不同;

  • 啟用可選的安全功能;

  • 啟用效能最佳化;

  • 提供錯誤報告。

這些設定中的許多設定都是敏感的,應該視為機密。如果您要發佈專案的原始碼,常見的做法是發佈適合開發的設定,並使用私有設定模組進行生產。

執行 manage.py check --deploy

可以使用 check --deploy 選項來自動化以下描述的一些檢查。請務必按照選項的文件中所述,針對您的生產設定檔執行它。

切換離開 manage.py runserver

runserver 命令並非為生產環境而設計。請務必切換到已準備好生產的 WSGI 或 ASGI 伺服器。如需一些常見選項,請參閱WSGI 伺服器ASGI 伺服器

重要設定

SECRET_KEY

密鑰必須是一個大的隨機值,而且必須保密。

請確保生產環境中使用的金鑰沒有在其他任何地方使用,並避免將其提交到原始碼控制。這會減少攻擊者取得金鑰的途徑。

請考慮從環境變數載入密鑰,而不是在您的設定模組中硬式編碼密鑰

import os

SECRET_KEY = os.environ["SECRET_KEY"]

或從檔案載入

with open("/etc/secret_key.txt") as f:
    SECRET_KEY = f.read().strip()

如果輪換密鑰,您可以使用 SECRET_KEY_FALLBACKS

import os

SECRET_KEY = os.environ["CURRENT_SECRET_KEY"]
SECRET_KEY_FALLBACKS = [
    os.environ["OLD_SECRET_KEY"],
]

請確保及時從 SECRET_KEY_FALLBACKS 中移除舊的密鑰。

DEBUG

您絕不能在生產環境中啟用偵錯。

您肯定正在使用 DEBUG = True 開發您的專案,因為這會啟用方便的功能,例如在您的瀏覽器中顯示完整的追蹤資訊。

但是,對於生產環境來說,這是一個非常糟糕的主意,因為它會洩漏有關您的專案的許多資訊:您的原始碼摘錄、區域變數、設定、使用的程式庫等等。

特定於環境的設定

ALLOWED_HOSTS

DEBUG = False 時,如果沒有適當的 ALLOWED_HOSTS 值,Django 就完全無法運作。

此設定是保護您的網站免受某些 CSRF 攻擊的必要設定。如果您使用萬用字元,您必須自行驗證 Host HTTP 標頭,或確保您沒有受到此類別攻擊的影響。

您也應該設定位於 Django 前面的網路伺服器來驗證主機。它應該回應靜態錯誤頁面,或忽略不正確主機的要求,而不是將請求轉發給 Django。這樣做可以避免在 Django 記錄中出現虛假的錯誤(或者如果您已設定錯誤報告,則會收到電子郵件)。例如,在 nginx 上,您可以設定預設伺服器以在無法辨識的主機上傳回「444 無回應」。

server {
    listen 80 default_server;
    return 444;
}

CACHES

如果您使用快取,則連線參數在開發和生產環境中可能不同。Django 預設為每個程序本機記憶體快取,這可能不理想。

快取伺服器通常具有弱式驗證。請確保它們只接受來自您的應用程式伺服器的連線。

DATABASES

資料庫連線參數在開發和生產環境中可能不同。

資料庫密碼非常敏感。您應該像保護 SECRET_KEY 一樣保護它們。

為了獲得最大的安全性,請確保資料庫伺服器僅接受來自您的應用程式伺服器的連線。

如果您沒有設定資料庫備份,請立即執行!

STATIC_ROOTSTATIC_URL

開發伺服器會自動提供靜態檔案。在生產環境中,您必須定義一個 STATIC_ROOT 目錄,其中 collectstatic 會複製這些檔案。

如需更多資訊,請參閱如何管理靜態檔案(例如圖片、JavaScript、CSS)

MEDIA_ROOTMEDIA_URL

媒體檔案是由您的使用者上傳的。它們是不可信任的!請確保您的網路伺服器絕不會嘗試解讀它們。例如,如果使用者上傳 .php 檔案,則網路伺服器不應執行它。

現在是檢查這些檔案備份策略的好時機。

HTTPS

任何允許使用者登入的網站都應該強制執行全網站 HTTPS,以避免以明碼傳輸存取權杖。在 Django 中,存取權杖包括登入/密碼、會話 Cookie 和密碼重設權杖。(如果您透過電子郵件傳送密碼重設權杖,則無法採取太多措施來保護它們。)

保護使用者帳戶或管理員等敏感區域是不夠的,因為 HTTP 和 HTTPS 使用相同的會話 Cookie。您的網路伺服器必須將所有 HTTP 流量重新導向至 HTTPS,並且只將 HTTPS 請求傳輸到 Django。

設定 HTTPS 後,請啟用下列設定。

效能最佳化

DEBUG = False 設定會停用僅在開發中有用的幾個功能。此外,您可以調整以下設定。

會話

考慮使用快取會話以提高效能。

如果使用以資料庫為基礎的會話,請定期清除舊會話,以避免儲存不必要的資料。

CONN_MAX_AGE

當連線到資料庫佔用大量請求處理時間時,啟用持續性資料庫連線可以帶來良好的速度提升。

這對於網路效能受限的虛擬化主機非常有幫助。

TEMPLATES

啟用快取範本載入器通常可以大幅提升效能,因為它可以避免每次需要渲染時都編譯範本。當 DEBUG = False 時,快取範本載入器會自動啟用。請參閱 django.template.loaders.cached.Loader 以取得更多資訊。

錯誤回報

當您將程式碼推送至生產環境時,希望它已經非常穩定,但您無法排除意外錯誤。幸運的是,Django 可以捕獲錯誤並相應地通知您。

LOGGING

在將您的網站投入生產環境之前,請檢查您的日誌設定,並在收到一些流量後,檢查它是否如預期般運作。

有關日誌記錄的詳細資訊,請參閱 日誌記錄

ADMINSMANAGERS

ADMINS 將會收到 500 錯誤的電子郵件通知。

MANAGERS 將會收到 404 錯誤的通知。IGNORABLE_404_URLS 可以幫助過濾掉虛假的報告。

有關透過電子郵件回報錯誤的詳細資訊,請參閱 如何管理錯誤回報

透過電子郵件回報錯誤的擴展性不佳

在您的收件匣被報告淹沒之前,請考慮使用錯誤監控系統,例如 Sentry。Sentry 也可以聚合日誌。

自訂預設錯誤檢視

Django 包含了幾個 HTTP 錯誤代碼的預設檢視和範本。您可能想要覆寫預設範本,方法是在您的根範本目錄中建立以下範本:404.html500.html403.html400.html。使用這些範本的預設錯誤檢視應該足以應付 99% 的 Web 應用程式,但您也可以自訂它們

回到頂部