在Apache上部署Django項目

  • 2019 年 12 月 25 日
  • 筆記

0.概述

Django是一個基於Python的web開發框架,在實際生產環境中部署的時候,還需要用Apache容器來部署。這裡記錄下如何在Debian系統中用Aapche和mod_wsgi模塊來部署Django項目。

1.系統信息

$ uname -a  Linux iZ284ov0vfwZ 3.2.0-4-amd64 #1 SMP Debian 3.2.81-1 x86_64 GNU/Linux  $ lsb_release -a  No LSB modules are available.  Distributor ID: Debian  Description:    Debian GNU/Linux 7.11 (wheezy)  Release:        7.11  Codename:       wheezy  $ sudo apachectl -v  Server version: Apache/2.2.22 (Debian)  Server built:   Aug 18 2015 09:49:50

我用的是Debian發行版,Apache的配置與別的發行版有較大不同,這裡以Debian為例進行說明,別的發行版需要進行一定的修改。

2. 安裝Django和Apache

Django可以通過如下命令安裝:

sudo pip install Django==1.9.0 #設置版本號為1.9.0

Apache通過不同發行版的包管理命令安裝。在debian下,是:

sudo apt-get install apache2

3. 安裝mod_wsgi模塊

mod_wsgi可以通過pip安裝,但是需要提前在系統安裝apache-dev包,但是在Debian發行版上,這個包名叫apache2-prefork-dev,詳情參考這裡。通過如下命令安裝

sudo apt-get install apache2-prefork-dev

此外,還需要安裝python-dev包,如果要使用python3,則需要安裝python3-dev包:

sudo apt-get install python-dev  # 如果要使用python3,則安裝如下包  #sudo apt-get install python3-dev

然後pip 安裝mod_wsgi:

sudo pip install mod_wsgi

此外也可以自己編譯mod_wsgi:首先從這裡下載文件包,然後解壓,編譯。假設版本是4.5.3,全部命令如下:

wget https://github.com/GrahamDumpleton/mod_wsgi/archive/4.5.3.tar.gz  tar -xvf 4.5.3.tar.gz  cd mod_wsgi-4.5.3  ./configure  make  sudo make install

如果要使用python3,則./configure那條命令改為./configure --with-python=/usr/bin/python3.4。 如果沒有報錯,那麼mod_wsgi就編譯好了! 編譯好後,會在apache的模塊目錄/usr/lib/apache2/modules/生成mod_wsgi.so文件。

4.Apache配置文件目錄結構

Apache的配置文件目錄是/etc/apache2,該目錄下的文件結構如下:

.  |-- apache2.conf  |-- conf-available  |-- conf-enabled  |-- envvars  |-- magic  |-- mods-available  |-- mods-enabled  |-- ports.conf  |-- sites-available  `-- sites-enabled

其中apache2.conf是主配置文件,裏面包括系統的設置,如Timeout的時長、Log的等級和格式等。ports.conf文件配置了監聽的端口號,以及是否啟用SSL。envvarsmagic裏面設置了一些環境變量相關的東西,我沒怎麼看過。 剩下的6個目錄兩兩一對,availabel文件夾裏面是所有的配置,而enabled目錄裏面則是啟用的配置。而confmodssites可以分別通過命令a2enconfa2enmoda2ensite來啟用,啟用後會在enabled目錄下生成一個軟鏈接,指向available目錄下的同名文件。 在apache2.conf這個文件最後,是一些IncludeOptional 語句,用來將conf-enabledmods-enabledsites-enabled目錄下的配置文件包含到主配置文件中。這樣的好處是每個配置文件配置一個條目,比較清晰明了,易於查錯。

5. 啟用wsgi模塊

我們需要在mods-available目錄下新建mod_wsgi的load文件,具體操作如下:

cd /etc/apache2/mod-available  sudo echo " LoadModule wsgi_module /usr/lib/apache2/modules/mod_wsgi.so" >> wsgi.load  sudo a2enmod wsgi # 啟用wgsi配置  sudo service apache2 restart # 重啟Apache2服務

6. 託管Django站點

假設Django項目的wsgi.py文件的路徑是/home/yunfeng/Dev/git/mysite/mysite/wsgi.py,我們需要下面幾步來完成Apache對Django項目的託管:

1. 修改Django項目中的wsgi.pysettings.py文件

修改wsgi.py文件,增加如代碼中說明的那幾行:

"""  WSGI config for travel_record project.    It exposes the WSGI callable as a module-level variable named ``application``.    For more information on this file, see  https://docs.djangoproject.com/en/1.9/howto/deployment/wsgi/  """    import os    ## 增加下面這幾行  import sys  from os.path import dirname, abspath  from django.core.wsgi import get_wsgi_application  PROJECT_DIR = dirname(dirname(abspath(__file__)))  sys.path.insert(0, PROJECT_DIR)    #os.environ.setdefault("DJANGO_SETTINGS_MODULE", "travel_record.settings")  os.environ["DJANGO_SETTINGS_MODULE"] = "travel_record.settings"  ## 增加結束    application = get_wsgi_application()

增加的這幾行代碼做了2件事:1.將Django項目的的路徑加入到系統路徑中,使得Apache服務器可以找到wsgi.py文件;2. 修改os.environ的值,使得多個Django項目同時被Apache託管的時候不會出現串擾的問題。 接下來修改settings.py文件,主要修改的地方有3個:

  1. DEBUG=True改為DEBUG=False
  2. ALLOWEND_HOSTS裏面寫上服務器的訪問域名或IP地址
  3. TEMPALTES中的DIRS改寫成指向模板目錄的絕對路徑 Django項目裏面需要修改的就這2個文件,下面的內容都是在/etc/apache2目錄下進行操作。

2. 在/etc/apache2/sites-available目錄下增加網站的配置文件

參照該目錄下的000-default.conf和Django的教程,寫出配置文件mysite.conf如下:

  <VirtualHost *:8000>      ErrorLog ${APACHE_LOG_DIR}/error.log      CustomLog ${APACHE_LOG_DIR}/access.log combined        WSGIScriptAlias / /home/yunfeng/Dev/git/mysite/mysite/wsgi.py        Alias /static/ /home/yunfeng/Dev/git/mysite/mysite/static/      Alias /media/ /home/yunfeng/Dev/git/mysite/mysite/media/        <Directory /home/yunfeng/Dev/git/mysite/mysite>          <Files wsgi.py>      		Order deny,allow      		Allow from all          </Files>      </Directory>        <Directory /home/yunfeng/Dev/git/mysite/mysite/static/>      	Order deny,allow      	Allow from all      </Directory>        <Directory /home/yunfeng/Dev/git/mysite/mysite/static/>      	Order deny,allow      	Allow from all      </Directory>  </VirtualHost>

整個配置文件是包含在VirtualHost的尖括號裏面的一些設置,尖括號開始的地方,*:8000表示你希望的項目監聽的端口號。 ErrorLogCustomLog設置錯誤日誌和訪問日誌的路徑和格式。 WSGIScriptAlias設置wsgi文件的路徑,Alias語句託管網站的staticmedia目錄。 然後是<Directory>標籤,用來設置文件和目錄的訪問權限。注意對於版本小於2.4的Apache,需要將<Directory>標籤中的Order deny,allowAllow from all改為Require all granted 修改完後,執行下面的命令啟用這個網站:

sudo a2ensite mysite.conf

3. 修改/etc/apache2目錄下的ports.conf文件

增加針對新建站點的端口號的監聽:

Listen 80  #增加下面這條語句  Listen 8000

執行完這3個步驟後,就可以重啟Apache服務器,訪問站點了:

sudo service apache2 restart

訪問站點,如果出現錯誤的話,可以在Django項目的settings.py中啟用DEBUG模式,查看輸出,進行相應的修改。