Ricky 叩叮俱樂部

在開始之前,先來杯長島冰茶吧~

0%

Ubuntu 18.04 LTS+Apache+Django

前言

最近有大學朋友正在找工作,他希望能夠把自己開發的Django小專案部署至GCP
因此剛好了有這個機會,可以把當初在公司摸索到的經驗記錄下來。

Ubuntu

這邊使用的是GCP平台,因此在建立Ubuntu時可先賦予root密碼

1
$ sudo passwd root

可切換至root帳號

1
$ su -

這樣在操作下列步驟時,執行指令前就不用另外加sudo

環境

先把所需要的套件裝起來
更新APT

1
$  sudo apt-get update

我一般習慣會把專案放置在/var/app裡,因此我們先建立並切換至專案路徑
當然你也可以自行更換路徑,這沒有絕對

1
2
$ mkdir /var/app
$ cd /var/app

Django

使用Git將你的專案複製下來並切換目錄

1
2
$ git clone <YOUR PROJECT URL>
$ cd <PROJECT>

以下步驟我都會用我平常的專案架構去部署

1
2
3
4
5
6
7
8
9
10
11
12
project
├─manage.py
└─core
└─settings.py
└─urls.py
└─wsgi.py
└─__init__.py
├─.gitignore
├─requirements.txt
├─common_static
├─<App1>
├─<App2>

Virtualenv

1
2
3
4
5
6
安裝虛擬環境
$ sudo apt-get install python3-venv
建立虛擬環境
$ python3 -m venv env
執行虛擬環境
$ . env/bin/activate

pip

要特別注意的是,在安裝mysqlclient時要根據版本來下載相關的Ubuntu套件
而我這裡使用的則是mysqlclient 2.0.1

1
2
3
4
5
6
更新pip
$ pip3 install --upgrade pip
安裝mysqlclient相關套件
$ apt-get install python3-dev default-libmysqlclient-dev build-essential
安裝第三方套件庫
$ pip3 install -r requirements.txt

MySQL 8.0

MySQL的部分我直接拆開來獨立成一篇了,可以直接點進去看

資料庫遷移

先切換至專案目錄

1
$ cd /var/app/<PROJECT>

env/lib/python3.6/site-packages/django/db/backends/mysql/base.py註解下列程式碼

1
2
3
version = Database.version_info
# if version < (1, 3, 13):
# raise ImproperlyConfigured('mysqlclient 1.3.13 or newer is required; you have %s.' % Database.__version__)

Python版本可能依系統而有所不同

core/stteing.py設定Database config NAME USER PASSWORD

HOST PORT 預設為本機開發使用

1
2
3
4
5
6
7
8
9
10
11
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': '<NAME>',
'USER': '<USER>',
'PASSWORD': '<PASSWORD>',
'HOST': '127.0.0.1',
'PORT': '3306',
'OPTIONS': {'charset': 'utf8mb4'},
}
}

由資料庫遷移檔建立資料表

1
$ python3 manage.py migrate

需先確認MySQL是否有該資料庫

靜態資源

我的core/setting.py的配置如下

1
2
3
4
5
6
7
8
9
10
11
12
STATIC_URL = '/static/'
# 部署靜態資源路徑 配合以下指令
# $ python manage.py collectstatic
STATIC_ROOT = os.path.join(BASE_DIR, "static/")
# 開發靜態資源路徑
STATICFILES_DIRS = [
os.path.join(BASE_DIR, 'common_static/')
]

# 附件路由
MEDIA_URL = '/media/'
MEDIA_ROOT = os.path.join(BASE_DIR, 'media')

將靜態資源複製到STATIC_ROOT目錄底下

1
$ python3 manage.py collectstatic

建立超級使用者

這步視專案需求可執行/略過

1
$ python3 manage.py createsuperuser

Email可任意填寫,若密碼過於簡單系統會再次詢問是否要使用這組密碼,輸入y即可

Apache2

架站教學:網址

安裝Apache套件

1
2
$ sudo apt update
$ sudo apt install apache2 libapache2-mod-wsgi-py3

開機自動啟動Apache

1
$ sudo systemctl enable apache2

/etc/apache2/sites-available/django.conf新增下列設定

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<VirtualHost *:80>
DocumentRoot /var/app/<PROJECT>

Alias /static /var/app/<PROJECT>/static
<Directory /var/app/<PROJECT>/static>
Require all granted
</Directory>

<Directory /var/app/<PROJECT>/core>
<Files wsgi.py>
Require all granted
</Files>
</Directory>

WSGIDaemonProcess core python-path=/var/app/<PROJECT> python-home=/var/app/<PROJECT>/env
WSGIProcessGroup core
WSGIScriptAlias / /var/app/<PROJECT>/core/wsgi.py

</VirtualHost>

可使用vi/Vim取代::%s/<SEARCH_FROM>/<REPLACE_TO>/g

啟用自訂設定 & 關閉預設設定

1
2
3
$ sudo a2ensite django.conf
$ sudo a2dissite 000-default.conf
$ sudo service apache2 reload

檔案&圖片上傳

/etc/apache2/sites-available/django.conf新增下列設定

1
2
3
4
5
6
7
8
<VirtualHost *:80>
...
Alias /media /var/app/<PROJECT>/media
<Directory /var/app/<PROJECT>/media>
Require all granted
</Directory>
...
</VirtualHost>

設定Apache寫入權限

1
chown -R www-data /var/app/<PROJECT>

Django Rest Framework JWT

/etc/apache2/sites-available/django.conf新增下列設定

1
2
3
4
<VirtualHost *:80>
...
WSGIPassAuthorization On
</VirtualHost>

部署完成:)

http://localhost:80/