部署清單

2021-10-19 19:32 更新

部署清單

互聯(lián)網(wǎng)是一個(gè)敵對(duì)的環(huán)境。在部署Django項(xiàng)目之前,您應(yīng)該花一些時(shí)間在考慮安全性,性能和操作的情況下檢查設(shè)置。

Django包含許多安全功能。有些是內(nèi)置的,并且始終啟用。其他選項(xiàng)是可選的,因?yàn)樗鼈儾⒉豢偸呛线m的,或者因?yàn)樗鼈儾环奖汩_發(fā)。例如,強(qiáng)制HTTPS可能不適用于所有網(wǎng)站,并且對(duì)于本地開發(fā)而言是不切實(shí)際的。

性能優(yōu)化是另一種權(quán)衡取舍的方法。例如,緩存在生產(chǎn)中很有用,而對(duì)于本地開發(fā)則沒有用。錯(cuò)誤報(bào)告的需求也大不相同。

以下清單包括以下設(shè)置:

  • 必須正確設(shè)置Django以提供預(yù)期的安全級(jí)別;
  • 預(yù)期在每種環(huán)境中都會(huì)有所不同;
  • 啟用可選的安全功能;
  • 實(shí)現(xiàn)性能優(yōu)化;
  • 提供錯(cuò)誤報(bào)告。

其中許多設(shè)置都是敏感的,應(yīng)視為機(jī)密。如果要發(fā)布項(xiàng)目的源代碼,通常的做法是發(fā)布合適的設(shè)置進(jìn)行開發(fā),并使用私有設(shè)置模塊進(jìn)行生產(chǎn)。

運(yùn)行manage.py check --deploy

使用該選件可以自動(dòng)執(zhí)行以下所述的某些檢查。確保按照選件文檔中的說明針對(duì)生產(chǎn)設(shè)置文件運(yùn)行它。

check --deploy

關(guān)鍵設(shè)置

SECRET_KEY

密鑰必須是一個(gè)較大的隨機(jī)值,并且必須保密。

確保生產(chǎn)中使用的密鑰不在其他任何地方使用,并避免將其提交給源代碼管理。這減少了攻擊者可以從中獲取密鑰的向量的數(shù)量。

可以考慮從環(huán)境變量加載密鑰,而不是在設(shè)置模塊中對(duì)密鑰進(jìn)行硬編碼:

import os
SECRET_KEY = os.environ['SECRET_KEY']

或來自文件:

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

DEBUG

您絕不能在生產(chǎn)中啟用調(diào)試。

當(dāng)然,您正在使用開發(fā)您的項(xiàng)目,因?yàn)檫@將啟用方便的功能,例如瀏覽器中的完整追溯。DEBUG = True

但是,對(duì)于生產(chǎn)環(huán)境而言,這是一個(gè)非常糟糕的主意,因?yàn)樗鼤?huì)泄露有關(guān)項(xiàng)目的大量信息:源代碼的摘錄,局部變量,設(shè)置,使用的庫等。

特定于環(huán)境的設(shè)置

ALLOWED_HOSTS

那時(shí),如果沒有合適的值,Django根本無法工作。DEBUG = FalseALLOWED_HOSTS

需要此設(shè)置來保護(hù)您的站點(diǎn)免受某些CSRF攻擊。如果使用通配符,則必須對(duì)HostHTTP標(biāo)頭執(zhí)行自己的驗(yàn)證,否則,請(qǐng)確保您不容易受到此類攻擊。

您還應(yīng)該配置位于Django前面的Web服務(wù)器以驗(yàn)證主機(jī)。它應(yīng)該以靜態(tài)錯(cuò)誤頁面響應(yīng)或忽略對(duì)不正確主機(jī)的請(qǐng)求,而不是將請(qǐng)求轉(zhuǎn)發(fā)給Django。這樣,您將避免在Django日志(或電子郵件(如果您以這種方式配置了錯(cuò)誤報(bào)告)中)出現(xiàn)虛假錯(cuò)誤。例如,在nginx上,您可以設(shè)置默認(rèn)服務(wù)器以在無法識(shí)別的主機(jī)上返回“ 444 No Response”:

server {
    listen 80 default_server;
    return 444;
}

CACHES

如果您使用緩存,則連接參數(shù)在開發(fā)和生產(chǎn)中可能會(huì)有所不同。Django默認(rèn)對(duì)每個(gè)進(jìn)程進(jìn)行本地內(nèi)存緩存,這可能是不希望的。

緩存服務(wù)器通常具有弱認(rèn)證。確保它們僅接受來自您的應(yīng)用程序服務(wù)器的連接。

DATABASES

數(shù)據(jù)庫連接參數(shù)在開發(fā)和生產(chǎn)中可能有所不同。

數(shù)據(jù)庫密碼非常敏感。您應(yīng)該像保護(hù)他們一樣 SECRET_KEY。

為了獲得最大的安全性,請(qǐng)確保數(shù)據(jù)庫服務(wù)器僅接受來自應(yīng)用程序服務(wù)器的連接。

如果您尚未為數(shù)據(jù)庫設(shè)置備份,請(qǐng)立即執(zhí)行!

EMAIL_BACKEND和相關(guān)設(shè)置

如果您的站點(diǎn)發(fā)送電子郵件,則需要正確設(shè)置這些值。

默認(rèn)情況下,Django從webmaster @ localhost和root @ localhost發(fā)送電子郵件。但是,某些郵件提供商拒絕來自這些地址的電子郵件。要使用其他發(fā)件人地址,請(qǐng)修改DEFAULT_FROM_EMAIL和 SERVER_EMAIL設(shè)置。

STATIC_ROOT和STATIC_URL

靜態(tài)文件由開發(fā)服務(wù)器自動(dòng)提供。在生產(chǎn)中,必須定義一個(gè)STATIC_ROOT目錄,collectstatic將它們復(fù)制到該目錄中 。

有關(guān)更多信息,請(qǐng)參見管理靜態(tài)文件(例如,圖像,JavaScript,CSS)。

MEDIA_ROOT和MEDIA_URL

媒體文件由您的用戶上傳。他們是不信任的!確保您的Web服務(wù)器從不嘗試解釋它們。例如,如果用戶上傳 .php文件,則Web服務(wù)器不應(yīng)執(zhí)行該文件。

現(xiàn)在是檢查這些文件的備份策略的好時(shí)機(jī)。

HTTPS 

任何允許用戶登錄的網(wǎng)站都應(yīng)實(shí)施站點(diǎn)范圍的HTTPS,以避免明文傳輸訪問令牌。在Django中,訪問令牌包括登錄名/密碼,會(huì)話cookie和密碼重置令牌。(如果要通過電子郵件發(fā)送密碼重置令牌,則無法做很多事情來保護(hù)它們。)

保護(hù)敏感區(qū)域(例如用戶帳戶或管理員)是不夠的,因?yàn)镠TTP和HTTPS使用相同的會(huì)話cookie。您的網(wǎng)絡(luò)服務(wù)器必須將所有HTTP通信重定向到HTTPS,并且只能將HTTPS請(qǐng)求傳輸?shù)紻jango。

設(shè)置HTTPS后,請(qǐng)啟用以下設(shè)置。

CSRF_COOKIE_SECURE

進(jìn)行設(shè)置True以避免在HTTP上意外傳輸CSRF cookie。

SESSION_COOKIE_SECURE

進(jìn)行設(shè)置True以避免在HTTP上意外傳輸會(huì)話cookie。

性能優(yōu)化

設(shè)置將禁用僅在開發(fā)中有用的幾個(gè)功能。此外,您可以調(diào)整以下設(shè)置。DEBUG = False

會(huì)話

考慮使用緩存的會(huì)話來提高性能。

如果使用數(shù)據(jù)庫支持的會(huì)話,請(qǐng)定期清除舊會(huì)話,以避免存儲(chǔ)不必要的數(shù)據(jù)。

CONN_MAX_AGE

如果在請(qǐng)求處理時(shí)間的很大一部分時(shí)間內(nèi)連接到數(shù)據(jù)庫帳戶,則啟用持久性數(shù)據(jù)庫連接可以大大提高速度。

這對(duì)網(wǎng)絡(luò)性能有限的虛擬主機(jī)有很大幫助。

TEMPLATES

啟用緩存的模板加載器通常會(huì)大大提高性能,因?yàn)樗苊饬嗣看涡枰秩久總€(gè)模板時(shí)都對(duì)它們進(jìn)行編譯。有關(guān)更多信息,請(qǐng)參見 模板加載器文檔。

錯(cuò)誤報(bào)告

當(dāng)您將代碼推向生產(chǎn)時(shí),它有望變得健壯,但不能排除意外錯(cuò)誤。值得慶幸的是,Django可以捕獲錯(cuò)誤并相應(yīng)地通知您。

LOGGING

在將網(wǎng)站投入生產(chǎn)之前,請(qǐng)查看日志記錄配置,并在收到一些流量后立即檢查它是否按預(yù)期工作。

有關(guān)日志記錄的詳細(xì)信息,請(qǐng)參見日志記錄。

ADMINS和MANAGERS

ADMINS 將通過電子郵件通知500個(gè)錯(cuò)誤。

MANAGERS將會(huì)收到404錯(cuò)誤的通知。 IGNORABLE_404_URLS可以幫助過濾掉虛假報(bào)告。

有關(guān)通過電子郵件報(bào)告錯(cuò)誤的詳細(xì)信息,請(qǐng)參見錯(cuò)誤報(bào)告。

通過電子郵件報(bào)告的錯(cuò)誤無法很好地?cái)U(kuò)展

在您的收件箱被報(bào)告淹沒之前,請(qǐng)考慮使用諸如Sentry之類的錯(cuò)誤監(jiān)視系統(tǒng)。哨兵也可以匯總?cè)罩尽?/p>

自定義默認(rèn)錯(cuò)誤視圖

Django包含一些HTTP錯(cuò)誤代碼的默認(rèn)視圖和模板。您可能希望通過在根模板目錄中創(chuàng)建以下模板來覆蓋缺省模板:404.html,500.html,403.html,和 400.html。使用這些模板的默認(rèn)錯(cuò)誤視圖足以滿足99%的Web應(yīng)用程序的要求,但是您也可以對(duì)其進(jìn)行 自定義。

詳情參考: https://docs.djangoproject.com/en/3.0/


以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)