「學習日誌」架設 Apache2.4 + SSL + Django2 + wsgi on Ubuntu 自簽環境

最近因需求,需要將 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 []:[email protected]

參考資料: 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/

MksYi

透過網路分享知識的學習者。

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *

這個網站採用 Akismet 服務減少垃圾留言。進一步了解 Akismet 如何處理網站訪客的留言資料