1. 程式人生 > >將django程式碼搭建到亞馬遜AWS虛擬機器的apache2上,並繫結指定域名

將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