歡迎您光臨本站 註冊首頁

將 Django 應用程序部署到生產伺服器

←手機掃碼閱讀     火星人 @ 2014-03-12 , reply:0
  
Django 是一個基於 Python 的開源 Web 應用程序框架,其目的是使創建資料庫驅動的 Web 站點和 Web 應用程序更加容易。開發 Django 應用程序很簡單,因為該框架包含了一個開發 Web 伺服器。但是這個框架不適合在生產環境中使用,因此需要進一步將 Django 應用程序部署到 Web。在本文中,您將了解 Django 框架,以及如何在本地機器上安裝它。探索 Django 應用程序是如何開發的,以及為您的應用程序創建的自動管理界面。接著您將了解如何在運行 Apache 和 mod_python 的伺服器上將 Django 應用程序部署到 Web。最後,了解如何根據應用程序需求的增長而擴展 Django 應用程序。

Django

Django 是一個針對 Python 語言的開源 Web 開發框架,其目的是儘可能自動化更多的開發流程,使您能夠專註於軟體開發。這個框架既是鬆散耦合的,又是緊密相連的,因為框架的各個部分可以相互連接,但它們之間是彼此獨立的。框架的獨立性意味著您可以僅使用所需的 Django 部分,而不用擔心依賴性帶來的問題。

Django 加快了 Web 應用程序的編寫,並且大大減少了所需的代碼,從而使維護應用程序更加容易。Django 嚴格遵循 Don't Repeat Yourself (DRY) 原則,因此每個不同的代碼片段或數據僅在一個位置上出現。這意味著需要進行更改時,只修改一個地方就行,從而使更改軟體更快、更輕鬆。

Django 是由 Lawrence Journal-World 報的 Web 開發團隊在 2003 年開發的。當時該團隊需要在很緊迫的時間內發布應用程序和改進,因此他們決定創建一個能節省時間的 Web 框架,以在期限內交付產品。該團隊在 2005 年 7 月以開源軟體的方式發布了這個框架,現在由來自世界各地的開發人員進行維護和開發。

Django 框架是在 Berkeley Software Distribution (BSD) 開源許可下發布的,因此能夠再分發或重用這些源代碼和二進位文件(可以修改),但必須在再分發包中保留版權需知、許可條款和免責聲明。這些注意事項必須包含在再分發軟體的文檔和補充材料中。該許可規定,在未獲得書面許可的情況下,不得使用 Django 這個名稱或 Django 貢獻者的名稱冠名或促銷衍生產品。





設置基本的 Django 開發環境

由於 Django 的安裝非常直觀,所以能夠輕鬆地設置開發環境。Django 完全是用 Python 編寫的,因此在安裝 Django 之前必須先安裝 Python。如果您使用 Mac OS X 或 Linux® 操作系統,可能已經安裝了 Python。僅需在 shell 中運行 python(在 Mac 上使用 Terminal.app),您就可以看見清單 1 所示的內容。


清單 1. 確保 Python 正在運行
				  $ python  Python 2.5.1 (r251:54863, Nov 11 2008, 17:46:48)   [GCC 4.0.1 (Apple Inc. build 5465)] on darwin  Type "help", "copyright", "credits" or "license" for more information.  Listing 1 - Checking for Python on Mac OS X  

只要您的系統安裝了 2.3 至 2.6 版本的 Python,就能夠安裝 Django。如果您是 Microsoft® Windows® 用戶,或者您需要升級到更新的版本,請 下載 Python。有一個針對 Windows 用戶的簡單的安裝包,因此安裝 Python 應該不會很難。

當您確定您的計算機已經安裝了 Python 之後,就可以進一步安裝 Django 了。Django 有 3 個安裝選項:安裝官方發布版,安裝用於分發的安裝包,或安裝來自 Subversion 的最新的 “trunk” 版本。對於本文,我只介紹官方發布版的安裝。關於 trunk 版本的安裝信息,請參閱官方文檔說明(見 參考資料)。

安裝官方 Django 發布版的第一步是從 Django 下載頁面獲取 tarball。下載這個文件之後,對其進行解壓縮。在 Linux 中,僅需在 shell 提示符處發出以下命令(確保導航到下載該包的目錄)。注意,V1.0.2 是撰寫本文時的最新版本,因此要用您下載的包的文件名替換這個文件名:tar zxvf Django-1.0.2-final.tar.gz。

在 Mac OS X 中,Web 瀏覽器很可能會在下載完成之後自動解壓縮這個包,因此得到的文件是 Django-1.0.2-final.tar。使用以下命令解壓縮這個文件:tar xvf Django-1.0.2-final.tar。如果您使用的是 Windows,您可以使用類似於 7-Zip 的工具解壓縮這個 tarball。

解壓縮 tarball 之後(可能解壓縮到硬碟上類似於 Django-1.0.2-final 的位置),在命令提示符中導航到相應的文件夾。要安裝 Django,發出以下命令(Mac OS X 或 Linux):sudo python setup.py install。對於 Windows 用戶,確保已經使用管理員特權打開命令提示符,併發出以下命令:setup.py install。

完成以上操作之後,Django 將被安裝到您的 Python 安裝的 site-packages 文件夾中,您可以開始在 Django 中進行開發了。在剖析 Django 應用程序之前,我們先測試開發環境是否正確。首先,我們檢查 Django 是否安裝正常。打開 shell 或命令提示符,併發出命令 python 啟動 Python 交互工具。現在,在 Python 提示符上發出如清單 2 所示的命令(不要輸入 >>>):


清單 2. 檢查 Django 是否正確安裝
				  >>> import django  >>> django.VERSION  

如果安裝成功,將看到如清單 3 所示的文本。


清單 3. 成功安裝
				  (1, 0, 2, 'final', 0)  >>>  

在檢查到 Django 已正確安裝之後,我們還需要測試開發伺服器是否正常工作。為此,我們需要創建一個項目。創建一個目錄(我的 Mac OS X 系統使用的是 /home/joe/django)來儲存您的 Django 項目,然後導航到該目錄。在這裡,使用命令:django-admin.py startproject testproject。

這將在您的項目目錄內創建一個新的目錄 testproject。這個目錄包含 4 個文件:__init__.py、manage.py、settings.py 和 urls.py。現在還不要考慮這些文件是做什麼的;我們跳過這步,先運行項目。確保您現在在項目文件夾中(在提示符上使用 cd testproject),併發出命令:python manage.py runserver。您應該看到如下所示的輸出。


清單 4. 運行 Django 開發伺服器
				  Validating models...  0 errors found    Django version 1.0.2 final, using settings 'testproject.settings'  Development server is running at http://127.0.0.1:8000/  Quit the server with CONTROL-C.  

這個消息告訴我們開發伺服器在 URL http://127.0.0.1:8000/ 上運行。打開您最喜歡的 Web 瀏覽器,並將這個 URL 粘貼到地址欄。您應該會看到如下所示的頁面。


圖 1. Welcome to Django 頁面


現在,您已經有一個正在運行的 Django 開發環境。需要注意,儘管您可以在這個環境中運行完整的 Django 應用程序,但它並不適合在生產環境中使用。我們將在本文的後面討論部署用於生產的 Django 應用程序。





剖析 Django 應用程序

Django 的架構鬆散地基於模型-視圖-控制器(Model-View-Controller,MVC)模式。在該模式中,應用程序邏輯、用戶界面(UI)和數據訪問層是分開的,從而允許在不影響到其他層的情況下獨立地修改各個層。不過,根據 Django 文檔的描述,Django 採用的是類似的模式:模型-模板-視圖(Model-Template-View,MTV)架構。這裡的模型可以看作數據訪問層,應用程序在這裡與其他資料庫和信息源交互。模板層定義向用戶顯示數據的方式,這相當於 MVC 模式中的視圖層。在 MTV 架構中,視圖層描述應該向用戶顯示哪些數據。它不定義數據的顯示方式;它將這個任務交給模板層處理。至於 MVC 的控制器層,Django 將它看作框架本身,因為它決定向其發送請求的視圖(像在 URL 配置中定義的那樣)。

除了模型、模板和視圖層之外,Django 還提供一些高級的開箱即用的特性,比如 URL 配置、自動管理界面和緩存等。像 Python 一樣,Django 背後的關鍵思想之一就是 “大批包含”,這意味著它自帶了大量由其他包組成的標準庫,您可以在應用程序中直接使用,而不需另外下載。

Django 應用程序的模型層由 Django 的數據訪問層處理。在這個層中,可以找到所有與數據相關的內容:連接設置、驗證參數和關係等等。Django 開箱即用地支持 PostgreSQL(Django 創建者最喜歡的資料庫)、MySQL、SQLite 和 Oracle。在設置文件中儲存了可以使用的資料庫,選擇哪個資料庫對模型層沒有任何影響。

Django 中的模型可以看作是對用 Python 代碼表示的資料庫表架構的描述。Django 使用模型在資料庫中生成和執行 SQL 語句,反過來,這些 SQL 語句會返回一個結果。然後 Django 切換到一個您的 Django 應用程序可以使用的 Python 數據結構。在這裡,一個明顯的優勢就是您可以在不同的資料庫系統之間進行熱切換(例如,從 MySQL 切換到 PostgreSQL),並且不需要更改您的模型。

清單 5 中的代碼是一個示例模型定義。它通常存儲在 Django 應用程序目錄下的 models.py 文件中。


清單 5. 示例 Django 模型
				  from django.db import models    class Person(models.Model):      first_name = models.CharField(max_length=30)      last_name = models.CharField(max_length=30)      email = models.EmailField()      date_of_birth = models.DateField()  

Django 應用程序的模板層允許您將 Web 應用程序的 UI 或顯示布局與它的數據分開。它使用佔位符變數和簡單的邏輯語句定義應該在模板中填充的數據。模板通常輸出 HTML 文檔,但也可以輸出 XML 或其他類型的文檔。

模板層背後的思想就是表示層代碼與業務層代碼分離。這意味著 Python 開發人員可以專註於開發軟體,而由 Web 設計人員處理模板。此外,開發人員和設計人員還可以同時開發同一個項目,因為這兩個組件是完全分離的。

注意,Django 的模板系統不允許直接從模板執行 Python 代碼。它提供一組基礎的編程特性,比如變數、邏輯語句(if 語句)和循環結構(比如 for 循環),這就為數據表示提供充足的邏輯。清單 6 是一個示例 Django 模板。


清單 6. 示例 Django 模板
				  <html> <head>  <title>Your message has been sent</title>  </head>  <body>  <h1>Thank you!</h1>  <p>Just wanted to say a quick thanks, {{ name }}, for the message you have just      sent.</p>  <p>It was sent on {{ sent_date|date:"j F Y" }}. We aim to respond within       48 hours.</p>  <p>Thanks again!</p>  </body>  </html>  

清單 7 顯示了如何在 Django 應用程序中使用這個模板。


清單 7. 在視圖中載入示例 Django 模板
				  def send_message(request):      name = "Joe Lennon"      sent_date = datetime.datetime.now()      return render_to_response('thankyou.html', locals())  

視圖函數(通常稱為 “視圖”)是基礎的 Python 函數,它接受一個請求參數並返回一個響應。這種請求通常來自 Web 伺服器,視圖接受隨該請求一起傳遞的所有參數。然後該視圖在返迴響應之前,執行確定適當的響應所需的邏輯。可以將視圖儲存在 Django 應用程序中的任意位置,但它們通常儲存在名為 views.py 的文件中。清單 5 是一個示例視圖函數 send_message。它接受 request 參數,並返回一個顯示模板(thankyou.html)作為響應。

您剛才了解到可以將視圖儲存在任何位置。但是如果真這樣做的話,Django 如何找到它們呢?這就需要用到 URLconfs,它定義 URL 和與之對應的視圖的關係。URLconfs 儲存在一個稱為 urls.py 的文件中,並且將 URL 映射到視圖函數中。例如,url /send_message/ 將映射到我們的 send_message 視圖,如清單 7 所示。事實上,URLconfs 的工作方式允許它使用更簡潔的 URL — 換句話說,您的 URL 可能不是查詢字元串 myfile.php?param1=value1,而是 /myfile/value1/。

清單 8 中的代碼是一個示例 urls.py 文件,它像在清單 7 中定義的那樣,將 URL /send_message/ 連接到我們的 send_message 視圖函數。


清單 8. 示例 URLconf
				  from django.conf.urls.defaults import *  from testproject.views import send_message    urlpatterns = patterns('',      ('^send_message/

最有趣、最經常被提起的 Django 特性之一就是它的自動管理界面。有些項目不僅需要開發前端界面,而且還要開發後端管理界面,參與這些項目的 Web 應用程序開發人員將會嘗到沮喪和煩惱的滋味。管理界面通常很枯燥,並且沒有什麼技巧可談,您的編程能力在此也無用武之地。Django 的自動管理界面特性在這裡能幫上大忙,因為它通過自動化整個任務輕鬆滿足這一需求。

當您為應用程序創建了模型並設置好資料庫之後,您就可以為它啟用管理界面了。完成之後,將瀏覽器指向 http://127.0.0.1:8000/admin/ 並登錄以管理 Django 應用程序的後端。這個界面是高度可定製的,並且具有優秀的基於用戶和組的身份認證控制項。下面是它的屏幕截圖。


圖 2. Django 自動管理界面的實際效果


我們已經概述過如何創建 Django 應用程序,以及它所基於的 MTV 模式是如何工作的。我們查看了模型、模板、視圖和 URLconfs 等概念;並且稍微了解了 Django 優秀的自動管理界面系統。如果您想深入了解如何開發 Django 應用程序,請訪問 Django 項目的官方 Web 站點,閱讀其中的文檔或 Django Book(見 參考資料)。它們出色地介紹了關於 Django 的各個方面,並且非常詳盡。

接下來,檢查一下 Django 應用程序,然後將其部署到生產伺服器。





準備部署 Django 應用程序

我們在前面已經看到,Django 框架還包含了一個開發伺服器,用它調試和測試 Django 應用程序非常方便。不幸的是,這個伺服器只能在本地環境中運行,不能承受由許多用戶同時使用的生產 Web 應用程序產生的負載。因此,您需要將 Django 應用程序部署到生產級 Web 伺服器,比如 Apache 或 lighttpd。通過一些步驟使您的應用程序成為生產級應用程序,然後學習如何準備 Web 伺服器,讓它能夠為 Django 應用程序提供服務。

在討論如何為 Django 應用程序設置生產環境之前,我們先要對 Django 應用程序進行一些設置。這些設置更改很重要,因為 Django 應用程序的任何漏洞都將暴露在 Web 上。

您通常不希望在開發環境中更改這些設置,因為調試消息和錯誤對應用程序的維護十分有用。為了解決這個問題,您可以保留 2 個獨立的設置文件:一個用於開發伺服器,一個用於生產伺服器。此外,您也可以通過以下技巧將這兩個設置放在相同的文件中,並讓 Django 在開發環境中只使用開發設置。為了實現這個目的,您必須按照以下方式布置 settings.py 文件(很明顯,將使用您的開發伺服器的主機名替換 joe-mac-mini,如清單 9 所示)。


清單 9. 分離開發和生產環境的設置
				  import socket  if socket.get_hostname() == 'joe-mac-mini':      #Development Server Settings go here  else:      #Production Server Settings go here  

現在,已經將用於兩個環境的設置分開,我們將更改用於生產環境的設置。在生產環境中必須更改的兩個設置是 DEBUG 和 TEMPLATE_DEBUG。在您使用 django-admin.py startproject 創建 Django 應用程序時,它們的默認設置為 True。在生產環境中,您必須將其更改為 False,這十分關鍵。在 Procduction 部分的 settings.py 中,這行代碼應該為:DEBUG = TEMPLATE_DEBUG = False。

默認情況下,當 Django 應用程序出現無法解決的異常時,Django 將發送一個電子郵件。要啟用這個特性,必須告訴 Django 電子郵件的接收者是誰。這可以通過在 settings.py 文件中使用 ADMINS 設置來實現。


清單 10. 定義應用程序管理員
				  ADMINS = (      ('Joe Lennon', '[email protected]'),  )  

如果您在開發 Django 應用程序時遇到錯誤,就會注意到 Django 生成的錯誤頁面,它包含大量有用信息,幫助您找到問題的根源。當您關閉調試模式時,這些錯誤頁面就會消失,因為它們是潛在的安全威脅。因此,如果某人遇到一個錯誤(例如,404 Page Not Found、403 Forbidden 或 500 Internal Server Error 等錯誤),他將看到一個難看的錯誤代碼頁面。為了解決這個問題,我們建議創建一個美觀的說明性錯誤模板頁面,然後將其放到應用程序的模板文件夾中。應該根據每個模板所表示的錯誤代碼對其進行命名。對於 Page Not Found,應該對 404.html 文件進行命名;對於 Internal Server Error,應該對 500.html 進行命名,等等。

現在已經配置好用於生產環境的設置,接下來我們將演示如何為 Django 應用程序設置生產環境。雖然也可以使用 FastCGI 和 lighttpd 運行 Django 應用程序,但我們通常使用 Apache 和 mod_python。我們現在看看如何將 Django 應用程序部署到運行 Apache 和 mod_python 的伺服器。然後粗略了解一下如何將 Django 應用程序部署到共享的 Web 宿主環境,在這裡不能訪問 httpd.conf。





將 Django 應用程序部署到運行 mod_python 的 Apache

根據 Django 文檔,建議對運行 mod_python 的 Apache Web 伺服器進行設置,然後再部署 Django 應用程序。Django 支持對 Apache HTTP Server V2.0 和 mod_python V3.0 或更高版本進行設置。mod_python 是一個 Apache 模塊,它將對 Python 編程語言的支持集成到 Web 伺服器中。與用傳統的 CGI 方法執行 Python 腳本相比,這種方法要快得多。

為了將 mod_python 模塊載入到 Apache,需要將以下幾行代碼添加到您的伺服器的 httpd.conf 文件中:LoadModule python_module /usr/lib/apache2/modules/mod_python.so。

除了載入 mod_python 模塊之外,您還需要設置一個 Location 指令,它將告訴 Apache 將您的 Django 應用程序關聯到哪個 URL。為了方便演示,這裡的設置適用於前面創建的 testproject 項目。


清單 11. testproject Location 指令
				  <Location "/testproject">      SetHandler python-program      PythonHandler django.core.handlers.modpython      SetEnv DJANGO_SETTINGS_MODULE testproject.settings      PythonDebug Off  </Location>  

它將告訴 Apache 可以通過 /testproject URL 訪問您的 Django testproject 項目。例如,如果您的伺服器域名為 example.com,通過 http://www.example.com/testproject/ 就可以訪問您的應用程序。為了將這個新設置載入到 Apache,僅需重啟 Apache 伺服器。

Django 開發人員極力建議不要在您的 Web 應用程序所在的 Web 伺服器上提供媒體文件(比如圖像、視頻和音頻等),但在很多情況下,您可以添加媒體文件。為了在 Web 站點上設置一個可以提供媒體文件的區域,您可以將以下指令添加到 httpd.conf 文件中。


清單 12. 告訴 Apache 不對媒體文件使用 mod_python
				  <LocationMatch "\.(png|gif|jpg|mov|mp3|avi|wav)___FCKpd___11quot;>      SetHandler None  </LocationMatch>  

現在已經完全設置好 Apache 和 mod_python,您可以將 Django 應用程序部署到生產 Web 伺服器了。接下來,我們看看一個常見的部署場景:將 Django 應用程序部署到不能修改 httpd.conf 文件的共享 Web 宿主伺服器。





將 Django 應用程序部署到共享 Web 宿主環境

不幸的是,專用伺服器和虛擬私有伺服器非常昂貴,因此這不是針對大眾的可行選擇。常見的做法是先將 Web 應用程序部署到共享宿主環境,當應用程序變得流行時再升級到專用伺服器。好消息是,大部分 Web 宿主伺服器都支持 Python,因此在這個場景中可以部署 Django 應用程序。

與專用環境不同,終端用戶通常不能選擇運行獨立的伺服器進程,或編輯 httpd.conf 配置文件。這意味著他們不能完成前面小節描述的更改,因此就不能以這種方式運行 Django。幸運的是,可以使用執行 FastCGI 程序的 Web 伺服器衍生進程,從而將 Django 部署到共享宿主環境。接下來,創建一個名為 .htaccess 的文件,並將其放到 Django 應用程序所在的目錄。


清單 13. .htaccess 文件
				  AddHandler fastcgi-script .fcgi  RewriteEngine On  RewriteCond %{REQUEST_FILENAME} !-f  RewriteRule ^(.*)$ testproject.fcgi/$1 [QSA,L]  

然後創建一小段 Python 腳本,告訴 Apache 您的 Django 項目的不同設置,並執行 FastCGI 程序。這個文件的名稱並不重要,但它必須與 .htaccess 中 RewriteRule 行的文件名相同。在清單 14 中,我們使用的文件名為 testproject.fcgi,因此我的腳本也使用這個名稱。


清單 14. testproject.fcgi 文件
				  #!/usr/bin/python  import sys, os  sys.path.insert(0, "/home/joelennon/python")  os.environ['DJANGO_SETTINGS_MODULE'] = "testproject.settings"    from django.core.servers.fastcgi import runfastcgi  runfastcgi(method="threaded", daemonize="false")  

確保這個文件能夠執行。如果能夠通過 shell 訪問共享宿主伺服器,請登錄該伺服器,並轉到包含該文件的目錄,然後運行 chmod 755 testproject.fcgi。

如果不能通過 shell 訪問,可以通過更正規的 FTP 客戶端更改文件授權。每次更改應用程序代碼之後,都需要更改該文件的時間戳。這告訴 Apache 應用程序已經更新,然後它會重啟 Django 應用程序。如果能夠通過 shell 訪問,僅需運行 touch testproject.fcgi。如果不能通過 shell 訪問,那麼您可以重新載入或進行編輯保存,這樣也能更新文件的時間戳。

如果您不希望處理這些配置文件,那麼可以使用支持 Django 應用程序的宿主服務。最流行的 MediaTemple 宿主提供商隨 GridService 產品提供一個 Django GridContainer 插件,256 MB RAM 的價格為 20 美元/月。GridContainer 運行預先調好的 lighttpd/FastCGI 設置,並且以後可以根據應用程序的需求增加 RAM。





擴展 Django 部署

如果您的 Django 應用程序非常成功,那麼您將希望部署具有很強的伸縮能力。在一般的負載下,Web 應用程序都能夠很好地工作,但是 Digg 之類的操作會給應用程序提交大量數據,應用程序難以承受突然增加的負載。還好,Django 和 Python 本身是高度可伸縮的,但隨著應用程序使用的增加,您還需要考慮其他問題。

如果您在共享宿主環境中運行 Django 應用程序,並且感覺到現有的資源已經不夠用,您的當務之急就是升級到專用伺服器。如果難以承受昂貴的成本,那麼可以使用虛擬私有伺服器,它的價格介於共享宿主和專用伺服器之間。

隨著應用程序的增長,專用伺服器的資源也會很快就變得捉襟見肘。下面的方法能夠減輕伺服器的負擔:

  • 關閉不使用的進程或守護進程,比如郵件伺服器、流伺服器、遊戲伺服器或其他不必要的進程,它們佔用寶貴的 CPU 時間和 RAM。
  • 將媒體文件轉移到雲平台,比如 Amazon S3。這樣您的 Web 伺服器就專門用於 Django 請求,而媒體文件則放在另一個伺服器上。
  • 關閉 Apache 的 Keep-Alive 選項。Keep-Alive 是 HTTP 協議的一個擴展,它允許通過 HTTP 持久地進行連接。這允許使用同一個 TCP 連接發送多個請求,從而大大提高呈現靜態 HTML 和圖像的速度。不幸的是,這個擴展對 Django 應用程序的性能有負面影響。記住,如果您已經將媒體文件移動到其他伺服器,那麼請關閉這個選項。要關閉 Keep-Alive,請在 httpd.conf 文件中找到相關的行,並將其改為 Keep-Alive Off。
  • 使用 Django 的內置緩存框架。它受流行的分散式內存對象緩存系統 memcached 支持。高效的緩存能夠極大地提升 Django 應用程序的性能。
  • 升級伺服器。Upgrade your server. 盡量加大 RAM,如果磁碟空間比較勉強,可以考慮添加一個新磁碟。如果伺服器反應緩慢,很可能是 RAM 耗盡引起的。不要將錢花在升級處理器上,而是考慮加大 RAM。
  • 購買一台伺服器。您的伺服器總有一天會無法滿足 Django 應用程序負載。碰到這種情況時,可以添加一台伺服器。這樣,Web 伺服器和資料庫伺服器分別運行在不同機器上。不過,一定要將 RAM 更多的機器分配給資料庫伺服器。如果需要,可以加大新機器的 RAM 和磁碟空間。
  • 使用資料庫複製。如果資料庫伺服器的資源耗盡,您可以將其複製到多個伺服器。複製就緒之後,您就在需要時添加更多伺服器,以提供額外資源。
  • 添加冗餘。對於大型應用程序而言,Web 伺服器或資料庫伺服器的單點失敗都是災難性的。您應該在需要的地方添加冗餘伺服器,它們在主伺服器失敗時接管其工作。另外,使用負載平衡硬體或軟體(比如 mod_proxy)在多個伺服器間分配數據流量,這樣能大大提高伺服器的性能。

您應該儘早為 Django 應用程序找到一種擴展方法,這非常重要。這樣,您就能夠在各種場景下實施計劃。因此,如果 Digg 操作嚴重影響到您的應用程序,那麼您必須開始考慮一個擴展計劃。這樣,不僅能夠愉快地歡迎新用戶,而且也使應用程序的運行更快。





結束語

在本文中,我們從兩個角度去看待 Django 框架,一是剛開始使用該框架的開發人員,二是已經準備好 Django 應用程序,為將其部署到 Web 尋找指導的開發人員。我們還討論了未來擴展時需要考慮的事項。我們查看了 Django 應用程序的組成,並了解它基於的 Model-Template-View (MTV) 模式。如我們所見,Django 是一個輕量級、容易安裝、容易掌握的框架。它具有優秀的文檔和充滿活力的社區,因此 Django 是為您的下一個 Web 應用程序提供的出色框架。(責任編輯:A6)

, send_message), )

最有趣、最經常被提起的 Django 特性之一就是它的自動管理界面。有些項目不僅需要開發前端界面,而且還要開發後端管理界面,參與這些項目的 Web 應用程序開發人員將會嘗到沮喪和煩惱的滋味。管理界面通常很枯燥,並且沒有什麼技巧可談,您的編程能力在此也無用武之地。Django 的自動管理界面特性在這裡能幫上大忙,因為它通過自動化整個任務輕鬆滿足這一需求。

當您為應用程序創建了模型並設置好資料庫之後,您就可以為它啟用管理界面了。完成之後,將瀏覽器指向 http://127.0.0.1:8000/admin/ 並登錄以管理 Django 應用程序的後端。這個界面是高度可定製的,並且具有優秀的基於用戶和組的身份認證控制項。下面是它的屏幕截圖。


圖 2. Django 自動管理界面的實際效果


我們已經概述過如何創建 Django 應用程序,以及它所基於的 MTV 模式是如何工作的。我們查看了模型、模板、視圖和 URLconfs 等概念;並且稍微了解了 Django 優秀的自動管理界面系統。如果您想深入了解如何開發 Django 應用程序,請訪問 Django 項目的官方 Web 站點,閱讀其中的文檔或 Django Book(見 參考資料)。它們出色地介紹了關於 Django 的各個方面,並且非常詳盡。

接下來,檢查一下 Django 應用程序,然後將其部署到生產伺服器。





準備部署 Django 應用程序

我們在前面已經看到,Django 框架還包含了一個開發伺服器,用它調試和測試 Django 應用程序非常方便。不幸的是,這個伺服器只能在本地環境中運行,不能承受由許多用戶同時使用的生產 Web 應用程序產生的負載。因此,您需要將 Django 應用程序部署到生產級 Web 伺服器,比如 Apache 或 lighttpd。通過一些步驟使您的應用程序成為生產級應用程序,然後學習如何準備 Web 伺服器,讓它能夠為 Django 應用程序提供服務。

在討論如何為 Django 應用程序設置生產環境之前,我們先要對 Django 應用程序進行一些設置。這些設置更改很重要,因為 Django 應用程序的任何漏洞都將暴露在 Web 上。

您通常不希望在開發環境中更改這些設置,因為調試消息和錯誤對應用程序的維護十分有用。為了解決這個問題,您可以保留 2 個獨立的設置文件:一個用於開發伺服器,一個用於生產伺服器。此外,您也可以通過以下技巧將這兩個設置放在相同的文件中,並讓 Django 在開發環境中只使用開發設置。為了實現這個目的,您必須按照以下方式布置 settings.py 文件(很明顯,將使用您的開發伺服器的主機名替換 joe-mac-mini,如清單 9 所示)。


清單 9. 分離開發和生產環境的設置
___FCKpd___8

現在,已經將用於兩個環境的設置分開,我們將更改用於生產環境的設置。在生產環境中必須更改的兩個設置是 DEBUG 和 TEMPLATE_DEBUG。在您使用 django-admin.py startproject 創建 Django 應用程序時,它們的默認設置為 True。在生產環境中,您必須將其更改為 False,這十分關鍵。在 Procduction 部分的 settings.py 中,這行代碼應該為:DEBUG = TEMPLATE_DEBUG = False。

默認情況下,當 Django 應用程序出現無法解決的異常時,Django 將發送一個電子郵件。要啟用這個特性,必須告訴 Django 電子郵件的接收者是誰。這可以通過在 settings.py 文件中使用 ADMINS 設置來實現。


清單 10. 定義應用程序管理員
___FCKpd___9

如果您在開發 Django 應用程序時遇到錯誤,就會注意到 Django 生成的錯誤頁面,它包含大量有用信息,幫助您找到問題的根源。當您關閉調試模式時,這些錯誤頁面就會消失,因為它們是潛在的安全威脅。因此,如果某人遇到一個錯誤(例如,404 Page Not Found、403 Forbidden 或 500 Internal Server Error 等錯誤),他將看到一個難看的錯誤代碼頁面。為了解決這個問題,我們建議創建一個美觀的說明性錯誤模板頁面,然後將其放到應用程序的模板文件夾中。應該根據每個模板所表示的錯誤代碼對其進行命名。對於 Page Not Found,應該對 404.html 文件進行命名;對於 Internal Server Error,應該對 500.html 進行命名,等等。

現在已經配置好用於生產環境的設置,接下來我們將演示如何為 Django 應用程序設置生產環境。雖然也可以使用 FastCGI 和 lighttpd 運行 Django 應用程序,但我們通常使用 Apache 和 mod_python。我們現在看看如何將 Django 應用程序部署到運行 Apache 和 mod_python 的伺服器。然後粗略了解一下如何將 Django 應用程序部署到共享的 Web 宿主環境,在這裡不能訪問 httpd.conf。





將 Django 應用程序部署到運行 mod_python 的 Apache

根據 Django 文檔,建議對運行 mod_python 的 Apache Web 伺服器進行設置,然後再部署 Django 應用程序。Django 支持對 Apache HTTP Server V2.0 和 mod_python V3.0 或更高版本進行設置。mod_python 是一個 Apache 模塊,它將對 Python 編程語言的支持集成到 Web 伺服器中。與用傳統的 CGI 方法執行 Python 腳本相比,這種方法要快得多。

為了將 mod_python 模塊載入到 Apache,需要將以下幾行代碼添加到您的伺服器的 httpd.conf 文件中:LoadModule python_module /usr/lib/apache2/modules/mod_python.so。

除了載入 mod_python 模塊之外,您還需要設置一個 Location 指令,它將告訴 Apache 將您的 Django 應用程序關聯到哪個 URL。為了方便演示,這裡的設置適用於前面創建的 testproject 項目。


清單 11. testproject Location 指令
___FCKpd___10

它將告訴 Apache 可以通過 /testproject URL 訪問您的 Django testproject 項目。例如,如果您的伺服器域名為 example.com,通過 http://www.example.com/testproject/ 就可以訪問您的應用程序。為了將這個新設置載入到 Apache,僅需重啟 Apache 伺服器。

Django 開發人員極力建議不要在您的 Web 應用程序所在的 Web 伺服器上提供媒體文件(比如圖像、視頻和音頻等),但在很多情況下,您可以添加媒體文件。為了在 Web 站點上設置一個可以提供媒體文件的區域,您可以將以下指令添加到 httpd.conf 文件中。


清單 12. 告訴 Apache 不對媒體文件使用 mod_python
___FCKpd___11

現在已經完全設置好 Apache 和 mod_python,您可以將 Django 應用程序部署到生產 Web 伺服器了。接下來,我們看看一個常見的部署場景:將 Django 應用程序部署到不能修改 httpd.conf 文件的共享 Web 宿主伺服器。





將 Django 應用程序部署到共享 Web 宿主環境

不幸的是,專用伺服器和虛擬私有伺服器非常昂貴,因此這不是針對大眾的可行選擇。常見的做法是先將 Web 應用程序部署到共享宿主環境,當應用程序變得流行時再升級到專用伺服器。好消息是,大部分 Web 宿主伺服器都支持 Python,因此在這個場景中可以部署 Django 應用程序。

與專用環境不同,終端用戶通常不能選擇運行獨立的伺服器進程,或編輯 httpd.conf 配置文件。這意味著他們不能完成前面小節描述的更改,因此就不能以這種方式運行 Django。幸運的是,可以使用執行 FastCGI 程序的 Web 伺服器衍生進程,從而將 Django 部署到共享宿主環境。接下來,創建一個名為 .htaccess 的文件,並將其放到 Django 應用程序所在的目錄。


清單 13. .htaccess 文件
___FCKpd___12

然後創建一小段 Python 腳本,告訴 Apache 您的 Django 項目的不同設置,並執行 FastCGI 程序。這個文件的名稱並不重要,但它必須與 .htaccess 中 RewriteRule 行的文件名相同。在清單 14 中,我們使用的文件名為 testproject.fcgi,因此我的腳本也使用這個名稱。


清單 14. testproject.fcgi 文件
___FCKpd___13

確保這個文件能夠執行。如果能夠通過 shell 訪問共享宿主伺服器,請登錄該伺服器,並轉到包含該文件的目錄,然後運行 chmod 755 testproject.fcgi。

如果不能通過 shell 訪問,可以通過更正規的 FTP 客戶端更改文件授權。每次更改應用程序代碼之後,都需要更改該文件的時間戳。這告訴 Apache 應用程序已經更新,然後它會重啟 Django 應用程序。如果能夠通過 shell 訪問,僅需運行 touch testproject.fcgi。如果不能通過 shell 訪問,那麼您可以重新載入或進行編輯保存,這樣也能更新文件的時間戳。

如果您不希望處理這些配置文件,那麼可以使用支持 Django 應用程序的宿主服務。最流行的 MediaTemple 宿主提供商隨 GridService 產品提供一個 Django GridContainer 插件,256 MB RAM 的價格為 20 美元/月。GridContainer 運行預先調好的 lighttpd/FastCGI 設置,並且以後可以根據應用程序的需求增加 RAM。





擴展 Django 部署

如果您的 Django 應用程序非常成功,那麼您將希望部署具有很強的伸縮能力。在一般的負載下,Web 應用程序都能夠很好地工作,但是 Digg 之類的操作會給應用程序提交大量數據,應用程序難以承受突然增加的負載。還好,Django 和 Python 本身是高度可伸縮的,但隨著應用程序使用的增加,您還需要考慮其他問題。

如果您在共享宿主環境中運行 Django 應用程序,並且感覺到現有的資源已經不夠用,您的當務之急就是升級到專用伺服器。如果難以承受昂貴的成本,那麼可以使用虛擬私有伺服器,它的價格介於共享宿主和專用伺服器之間。

隨著應用程序的增長,專用伺服器的資源也會很快就變得捉襟見肘。下面的方法能夠減輕伺服器的負擔:

  • 關閉不使用的進程或守護進程,比如郵件伺服器、流伺服器、遊戲伺服器或其他不必要的進程,它們佔用寶貴的 CPU 時間和 RAM。
  • 將媒體文件轉移到雲平台,比如 Amazon S3。這樣您的 Web 伺服器就專門用於 Django 請求,而媒體文件則放在另一個伺服器上。
  • 關閉 Apache 的 Keep-Alive 選項。Keep-Alive 是 HTTP 協議的一個擴展,它允許通過 HTTP 持久地進行連接。這允許使用同一個 TCP 連接發送多個請求,從而大大提高呈現靜態 HTML 和圖像的速度。不幸的是,這個擴展對 Django 應用程序的性能有負面影響。記住,如果您已經將媒體文件移動到其他伺服器,那麼請關閉這個選項。要關閉 Keep-Alive,請在 httpd.conf 文件中找到相關的行,並將其改為 Keep-Alive Off。
  • 使用 Django 的內置緩存框架。它受流行的分散式內存對象緩存系統 memcached 支持。高效的緩存能夠極大地提升 Django 應用程序的性能。
  • 升級伺服器。Upgrade your server. 盡量加大 RAM,如果磁碟空間比較勉強,可以考慮添加一個新磁碟。如果伺服器反應緩慢,很可能是 RAM 耗盡引起的。不要將錢花在升級處理器上,而是考慮加大 RAM。
  • 購買一台伺服器。您的伺服器總有一天會無法滿足 Django 應用程序負載。碰到這種情況時,可以添加一台伺服器。這樣,Web 伺服器和資料庫伺服器分別運行在不同機器上。不過,一定要將 RAM 更多的機器分配給資料庫伺服器。如果需要,可以加大新機器的 RAM 和磁碟空間。
  • 使用資料庫複製。如果資料庫伺服器的資源耗盡,您可以將其複製到多個伺服器。複製就緒之後,您就在需要時添加更多伺服器,以提供額外資源。
  • 添加冗餘。對於大型應用程序而言,Web 伺服器或資料庫伺服器的單點失敗都是災難性的。您應該在需要的地方添加冗餘伺服器,它們在主伺服器失敗時接管其工作。另外,使用負載平衡硬體或軟體(比如 mod_proxy)在多個伺服器間分配數據流量,這樣能大大提高伺服器的性能。

您應該儘早為 Django 應用程序找到一種擴展方法,這非常重要。這樣,您就能夠在各種場景下實施計劃。因此,如果 Digg 操作嚴重影響到您的應用程序,那麼您必須開始考慮一個擴展計劃。這樣,不僅能夠愉快地歡迎新用戶,而且也使應用程序的運行更快。





結束語

在本文中,我們從兩個角度去看待 Django 框架,一是剛開始使用該框架的開發人員,二是已經準備好 Django 應用程序,為將其部署到 Web 尋找指導的開發人員。我們還討論了未來擴展時需要考慮的事項。我們查看了 Django 應用程序的組成,並了解它基於的 Model-Template-View (MTV) 模式。如我們所見,Django 是一個輕量級、容易安裝、容易掌握的框架。它具有優秀的文檔和充滿活力的社區,因此 Django 是為您的下一個 Web 應用程序提供的出色框架。(責任編輯:A6)



[火星人 ] 將 Django 應用程序部署到生產伺服器已經有1283次圍觀

http://coctec.com/docs/linux/show-post-68907.html