在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。envvars
和magic
裏面設置了一些環境變量相關的東西,我沒怎麼看過。 剩下的6個目錄兩兩一對,availabel
文件夾裏面是所有的配置,而enabled
目錄裏面則是啟用的配置。而conf
、mods
和sites
可以分別通過命令a2enconf
、a2enmod
、a2ensite
來啟用,啟用後會在enabled
目錄下生成一個軟鏈接,指向available
目錄下的同名文件。 在apache2.conf
這個文件最後,是一些IncludeOptional
語句,用來將conf-enabled
、mods-enabled
、sites-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.py
和settings.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個:
- 將
DEBUG=True
改為DEBUG=False
- 將
ALLOWEND_HOSTS
裏面寫上服務器的訪問域名或IP地址 - 將
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
表示你希望的項目監聽的端口號。 ErrorLog
和CustomLog
設置錯誤日誌和訪問日誌的路徑和格式。 WSGIScriptAlias
設置wsgi文件的路徑,Alias
語句託管網站的static
和media
目錄。 然後是<Directory>
標籤,用來設置文件和目錄的訪問權限。注意對於版本小於2.4的Apache,需要將<Directory>
標籤中的Order deny,allow
和Allow 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模式,查看輸出,進行相應的修改。