最近因需求,需要將 Djnago 佈署至 Linux 系統上,所以選用了 Apache 來進行架設,其中架設需要使用 wsgi 來橋接 Apache2.4 與 Django2 服務,將服務搭建完成之後還需要加上 SSL,本篇文章簡單記錄了一下架設過程。
前言
開頭有稍微提到,因為一些專案開發是透過 Python,並且使用 Django 的 Web 框架,為了脫離 runserver 的測試環境,將環境整合至 Apache 中,而為什麼不使用 Nginx,單純就只是因為 Apache 用習慣了,由於環境沒有申請 Domain,也還沒要公開,所以先行使用自簽的 SSL。
關於服務
下列為幾個重點服務的簡單介紹。
- Apache:
- HTTP Server是Apache軟體基金會的一個開放原始碼的網頁伺服器軟體,可以在大多數電腦作業系統中運行。[WiKi]
- SSL:
- 傳輸層安全性協定(英語:Transport Layer Security,縮寫作 TLS),及其前身安全通訊協定(Secure Sockets Layer,縮寫作 SSL)是一種安全協定,目的是為網際網路通訊,提供安全及資料完整性保障。[WiKi]
- Django:
- 是個用 Python 寫成的,免費而且開放原始碼的 Web 應用程式框架。他是個 Web 框架 – 就是一堆零件的組成,可以幫助你輕鬆快速的開發網站。[Doc]
- wsgi:
- Web伺服器閘道介面(Python Web Server Gateway Interface,縮寫為WSGI)是為Python語言定義的Web伺服器和Web應用程式或框架之間的一種簡單而通用的介面。自從WSGI被開發出來以後,許多其它語言中也出現了類似介面。[Wiki]
環境介紹
- VM-ware 14
- Linux Ubuntu 16.04
- Apache 2.4
- Python 3.5+
- Django 2.0+
環境建置
如果你是一個全新的環境,可以透過以下指令來安裝相關服務。
$ sudo apt install apache python3 python3-pip libapache2-mod-wsgi-py3
補充:由於使用 Python3 所以 wsgi 安裝 libapache2-mod-wsgi-py3。
Step1: 建立 Django2 服務
這邊以 MyProject 為例子,這是一個空的 Django 專案,可以透過以下指令下載。
$ git clone https://github.com/MksYi/Django-Empty-Model
將專案 clone 載下來之後,可以嘗試啟動服務。
$ cd MyProject $ python3 manage.py runserver System check identified no issues (0 silenced). August 13, 2018 - 16:43:28 Django version 2.0.4, using settings 'MyProject.settings' Starting development server at http://127.0.0.1:8000/ Quit the server with CTRL-BREAK.
當服務確認沒有問題之後就可以透過 ‘Ctrl + C’ 終止服務。
Step2: Djnaog2 相關設定(無使用虛擬環境可略過)
查看專案中的 wsgi.py 路徑: MyProject\MyProject\wsgi.py,如果有使用「虛擬環境」可以參考下列 wsgi.py 設定檔中的 if Use ENV 區段。
補充:可以使用 vim、gedit 等相關編輯器進行編輯,ex: vim wsgi.py。
Step3: Apache2.4 相關設定
透過以下指令 複製一份預設的設定檔,並編輯。
$ cd /etc/apache2/sites-available/ $ sudo cp 000-default.conf myweb.conf $ sudo vim myweb.conf
設定參考:
補充:如果使用非 80 Port,則需要調整設定檔 ‘<VirtualHost *:80>’上的 Port 號,以及在 /etc/apache2/ports.conf 中,加上一行 Listen <Port_Number>。
啟動設定檔,並且重新啟動 apache2 服務,操作指令如下。
$ sudo a2ensite myweb $ sudo service apache2 reload
接著直接使用瀏覽器查看服務是否有成功啟用。
補充:如果使用非本機,記得在 myweb.conf 的部份開啟相關 IP 的權限。
權限設定參考資料: https://dywang.csie.cyut.edu.tw/dywang/rhel7/node41.html
安裝 SSL
來到了本篇文章的主角了,前面的步驟快速建立簡單的 Django 專案,並且在佈署在 Apache 上,接著安裝 SSL。
Step1: 產生 SSL 公私鑰對
路徑可以依照個人需求調整,這邊我把 SSL 的文件建置在 /etc/apache2/ssl 底下。
$ sudo /mkdir/etc/apache2/ssl/ $ sudo openssl req -x509 -nodes -days 730 -newkey rsa:2048 -out /etc/apache2/ssl/server.crt -keyout /etc/apache2/ssl/server.key Generating a 2048 bit RSA private key ....+++ ....................................+++ writing new private key to '/etc/apache2/ssl2/server.key' ----- You are about to be asked to enter information that will be incorporated into your certificate request. What you are about to enter is what is called a Distinguished Name or a DN. There are quite a few fields but you can leave some blank For some fields there will be a default value, If you enter '.', the field will be left blank. ----- Country Name (2 letter code) [AU]:TW State or Province Name (full name) [Some-State]:Taiwan Locality Name (eg, city) []:Tainan Organization Name (eg, company) [Internet Widgits Pty Ltd]:STUST Organizational Unit Name (eg, section) []:CSIE Common Name (e.g. server FQDN or YOUR name) []:Yi Email Address []:m8ax327@hotmail.com
參考資料: https://hallard.me/enable-ssl-for-apache-server-in-5-minutes/
Step2: Django2 相關設定
Django 要加上 SSL 的功能,有 settings.py 及 wsgi.py 兩個部分需要調整。
settings.py 需加上以下程式碼:
檔案路徑:MyProject/MyProject/settings.py
# SSL # secure proxy SSL header and secure cookies SECURE_PROXY_SSL_HEADER = ('HTTP_X_FORWARDED_PROTO', 'https') SESSION_COOKIE_SECURE = True CSRF_COOKIE_SECURE = True # session expire at browser close SESSION_EXPIRE_AT_BROWSER_CLOSE = True # wsgi scheme os.environ['wsgi.url_scheme'] = 'https'
wsgi.py 需加上以下程式碼:
檔案路徑:MyProject/MyProject/wsgi.py
# SSL os.environ['HTTPS'] = "on"
以上完成即可。
Step3: Apache2.4 相關設定
與非 SSL 版本雷同,但加上 8 – 10 行。
設定完成之後,接著啟動 Apache 的 SSL 功能。
$ sudo a2enmod ssl $ sudo service apache2 reload
嘗試透過瀏覽器開啟 https://localhost:443/
參考資料:https://www.systutorials.com/docs/linux/man/8-a2enmod/