將django程式碼搭建到亞馬遜AWS虛擬機器的apache2上,並繫結指定域名
前提:
伺服器上各軟體的版本一覽(部分預設已安裝,部分需要自己安裝)
1) 伺服器是:亞馬遜AWS免費版EC2
2) 伺服器的作業系統是:Ubuntu 16.04
3) 伺服器上安裝的python版本為:python 2.7.12
4) 伺服器上django版本為:django 1.9.5
5 ) 伺服器上apache版本為: apache 2.4.18 (Ubuntu)
6) 伺服器上mysql版本為: mysql 5.7.19
下面進入正題
1. apache2預設設定及介紹(本節可跳過)
ubuntu上apache2的配置檔案在如下目錄中: /etc/apache2/
有如下幾個檔案:
|—— apache2.conf 主配置檔案,apache啟動後先讀取它,全域性配置
|—— ports.conf 配置http的埠資訊,預設是80
|—— sites-available 配置可用站點資訊(域名/IP和埠),預設埠是80。該目錄中預設有000-default.conf, default-ss1.conf兩個站點資訊。
|—— sites-enabled 已啟用站點資訊。先在sites-available配置,apache2 reload一下就會在site-enabled中出現
|—— mods-available 已安裝模組
|—— mods-enabled 已啟用模組
|—— conf-available
|—— conf-enabled
|—— magic
|—— envvars 環境變數
apache配置解決的3個問題:apache需要知道自己對應哪個域名(IP地址)?,哪個埠開放以允許客戶端來訪問自己(預設是80埠)?網站程式碼放在哪裡(預設在/var/www/的html目錄裡)?
驗證ubuntu上的apache是否能夠使用的方法是,在客戶端瀏覽器輸入你的伺服器IP地址,開啟成功的話顯示下面的畫面
這個網頁來自 /var/www/html/index.html。
2. 安裝mod_wsgi
因為這裡python的版本是2.7,所以使用如下命令安裝mod_wsgi :
sudo apt-get install libapache2-mod-wsgi
3. 將網站程式碼拷貝到伺服器裡,並告訴apache放在了哪裡
(1)這裡把程式碼拷貝到 /var/www/下面,假設網站程式碼的工程目錄為ed,結構如下:
/var/www/ed/ 【資料夾,工程目錄】
|—— ed 【資料夾,裡面有settings.py和wsgi.py檔案】
|—— edtable 【app相關檔案,裡面有static、media資料夾】
|—— manage.py 【django的管理檔案】
注0,因為apache預設的網站程式碼放置地址是/var/www/中,如放在其他地方(/var/otherdir/),需要告訴apache你換了網站程式碼的位置,
需要修改檔案/etc/apache2/apache2.conf中的<Directory /var/www/>為<Directory /var/otherdir/>,如下圖紅框:
同時,在apache2.conf中加入一行程式碼: ServerName localhost
4. 修改wsgi.py檔案,啟用wsgi
這裡wsgi.py的位置是 /var/www/ed/ed/wsgi.py檔案,最終程式碼如下:
import os
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "ed.settings") #設定預設環境變數,指出網站的settings檔案位置
os.environ.setdefault("PYTHON_EGG_CACHE", "/tmp/.python-eggs") #注1,設定環境變數,指出系統快取位置
from os.path import join,dirname,abspath
PROJECT_DIR = dirname(dirname(abspath(__file__)))
import sys
sys.path.insert(0,PROJECT_DIR)
from django.core.wsgi import get_wsgi_application
application = get_wsgi_application()
注1處的內容很關鍵,如果網站需要和mysql資料庫互動,在互動的過程中,資料需要在系統中先快取起來,需要有寫快取的地方,在ubuntu中即快取目錄,寫快取的目錄必須具有寫的許可權,tmp就是ubuntu中預設有讀、寫、執行許可權的目錄,.python-eggs是指定的檔案。如果不做這樣的配置,在最終訪問網站時,會出現如下的錯誤:
mod_wsgi (pid=3522): Target WSGI script '/var/www/ed/ed/wsgi.py' cannot be loaded as Python module.
mod_wsgi (pid=3522): Exception occurred processing WSGI script '/var/www/ed/ed/wsgi.py'.
..................................................................................
ExtractionError: Can't extract file(s) to egg cache
The following error occurred while trying to extract file(s) to the Python egg cache: Permission denied:........................
出現這個錯誤的原因,就是沒有指定有寫入許可權的快取目錄。
5. 在sites-available目錄中配置可用站點資訊,通過指定wsgi.py的位置連線apache和django
首先,新建一個站點資訊配置檔案yoursite.conf,使用下面的命令:
sudo vi /etc/apache2/sites-available/yoursite.conf
然後在裡面寫入如下程式碼:
<VirtualHost *:80> #注2,伺服器開放的網路埠,預設為80
ServerName www.yoursite.com #你的網站域名,也可以是伺服器的IP地址
#ServerAlias otherdomain.com #指向這個網站的其他域名
ServerAdmin [email protected]
DocumentRoot /var/www/ed
Alias /media/ /var/www/ed/edtable/media/ #指定使用者上傳到網站的圖片視訊的位置
Alias /static/ /var/www/ed/edtable/static/ #指定存放網站靜態檔案(如js/css/圖片)的位置
<Directory /var/www/ed/edtable/media> #允許網站使用者上傳內容
Require all granted
</Directory>
<Directory /var/www/ed/edtable/static> #允許網站使用者獲取靜態檔案
Require all granted
</Directory>
WSGIScriptAlias / /var/www/ed/ed/wsgi.py #告訴apache你的網站wsgi放置位置,別忘了前面的 /
<Directory /var/www/ed/ed>
<Files wsgi.py>
Require all granted
</Files>
</Directory>
</VirtualHost>
注2處的內容,告訴伺服器開放那個埠給網路,預設是80。但是電信可能會封80埠,就需要改成其他埠了。
如果這裡改成其他埠,如8001,那麼同時需要修改/etc/apache2/ports.conf中偵聽的埠資訊,即將
Listen 80 修改為Listen 8001 ,這樣,apache就知道只開放8001埠了。
PS:如果將埠設定成80以外的埠,如修改為8001,在客戶端瀏覽器訪問伺服器時(即輸入ip加埠***.***.***.***:8001),會出現“拒絕了連線請求”的提示,如下圖。
這是因為AWS伺服器的安全組設定機制,預設“入站”型別只允許http的80埠,需要新增入站型別。操作如下圖所示,點選1“安全組”,出現右邊的畫面,
注意2處選擇的組名應該是伺服器當前使用的“安全組”,點選3處的編輯,新增一個如4處的規則,記得把埠設定為8001就好了。
6. 配置網站程式碼的setting.py檔案
(1)因為sites-available指定了static、media檔案,那麼setting.py中需要指定他們兩個的路徑,程式碼如下:
STATIC_URL = '/static/'
STATIC_ROOT = os.path.join(BASE_DIR, 'static')
MEDIA_URL = '/media/'
MEDIA_ROOT = os.path.join(BASE_DIR, 'media')
(2)因為sites-available指定了網站域名為www.yoursite.com,setting.py檔案也需要接受這個域名,
即將裡面的ALLOWED_HOSTS=[ ]修改為ALLOWED_HOSTS=['www.yoursite.com']
7. 設定目錄和檔案許可權
網站程式碼中的目錄和檔案需要有正確的許可權(目錄許可權為755,檔案許可權為644,注3),否則無法開啟網站。
本文網站工程放在/var/www/下,進入該目錄,即
cd /var/www/
分別輸入如下命令:
sudo chmod -R 755 ed #注3
sudo find ed -type f | xargs chmod 644 #注4
注3處命令的意思是修改目錄ed及其內部檔案的許可權,-R代表目錄下所有檔案。755代表使用者的許可權為7,第一個5指使用者組的許可權為5,第二個5其他人的許可權為5。數字7代表讀寫執行許可權,理解方法是讀r的許可權=4,寫w=2,執行x=1, 那麼7=4+2+1, 5=4+1,即5代表讀和執行許可權。
注4處的意思是找到(find)目錄ed下型別(type)為檔案(f)的檔案,然後給他們傳入引數(xargs),修改這些檔案的許可權為644。
8. 關閉apache2預設站點資訊,啟用新站點資訊
apache2啟用的站點資訊可以在/etc/apache2/sites-enabled/目錄下看到,預設會有一個000-default.conf,也就是說,預設apache2啟用這個網站。
然而,需要啟動的是yoursite這個網站,也就需要第5步中新增的配置yoursite.conf生效,命令如下:
sudo a2ensite /var/www/sites-available/yoursite.conf
同時,需要停用000-default,輸入如下命令即可:
sudo a2dissite /var/www/sites-available/000-default.conf
然後,輸入sudo service apache2 reload 使剛剛的使用和停用命令生效。
這個時候,在sites-enabled目錄下會看到yousite.conf,而000-default.conf消失了。
9. 通過域名訪問網站
如果域名已經解析為你的IP地址,就可以使用域名訪問網站了。
注意5,亞馬遜AWS的EC2的IP地址為其對應的IPv4公有IP,但如EC2重新啟動,該IP地址會改變,可以嘗試使用EC2的彈性IP。
注意6,如果將apache中的預設埠改為非80埠,在域名解析的時候,需要使用“隱形URL”的記錄型別來解析。
10. 其他
在配置的過程中,難免會出錯。可以通過以下命令檢視錯誤日誌:
cat /var/log/apache2/error.log