[Python] Linux(Apache2) で Djangoアプリを公開する

## この記事について

DjangoアプリのLinux(Apache2)へのデプロイ手順をまとめました。

**開発環境で作ったものをとりあえずapacheで動かすための最小限の設定作業です。本番環境設定やセキュリティ対策、パフォーマンス対応は別途必要です。**

### 確認した環境

- Ubuntu 17.10 (Azure) 16.04 (AWS)
- Amazon-Linux2 2017.12 (AWS)
- Django 2.0.5


[ 注意 ]
RHEL(CentOS)はPythonへの対応が遅く、通常の方法でPython3が入りません。トラブルを避けるため、可能ならRHEL(CentOS)は避けましょう。インストールが必要な場合は以下のサイトが参考になります。

**naritoブログ CentOS7でDjangoを動かすシリーズ**
https://torina.top/detail/448/

### ここでのプロジェクトの前提条件

- ＯＳユーザー名は「**ubuntu**」「**ec2-user**」
- プロジェクト名は「**project**」
- requirements.txt を作成済み
- settings.pyに以下の設定がある。

```
ALLOWED_HOSTS = ['*'] 
STATIC_ROOT =  os.path.join(BASE_DIR, 'static')
```

## Ubuntu の場合

### ディレクトリ構成

```tree
/etc
    └ /apache2
        └ /sites-available
            └ /django.conf  # apache 設定ファイル（新規作成）
/home
    └ /ubuntu
        └ /project          # プロジェクト git cloneで作成(コピーでも可)
            ├─ /env         # 仮想環境 venvで作成
            └─ /static      # 静的ファイル collectstaticで作成
```

### 作業手順

####１．パッケージのインストール

```bash
sudo apt-get update
sudo apt install -y python3 python3-pip python3-setuptools python3-wheel python3-venv python3-dev apache2 apache2-dev git
```

####２．プロジェクトの配置

```bash
git clone https://github.com/<project>.git
```

※ SCP等でコピーでもＯＫ

####３．仮想環境の作成

```bash
cd project
python3 -m venv env
source env/bin/activate
```

※ これより仮想環境で実行

```bash
pip install wheel
pip install -r requirements.txt
pip install mod_wsgi
```

####４．Django 管理コマンドの実行

```bash
python manage.py migrate         #DB定義更新
python manage.py collectstatic   #静的ファイル収集
python manage.py createsuperuser #管理ユーザー作成
```
※必要な操作だけでOK

####５．ディレクトリ権限の変更

```bash
chmod 755 /home/ubuntu
```
※データベースにsqlite3を使う場合は、ディレクトリとファイルに書き込み権限を与える

```bash
chmod 777 /home/ubuntu/project
chmod 777 /home/ubuntu/project/db.sqlite3
```

####６．apacheの設定

#####６－１．mod_wsgiのパスを確認

```bash
mod_wsgi-express module-config
... 以下、実行結果
LoadModule wsgi_module "/home/ubuntu/project/env/lib/python3.6/site-packages/mod_wsgi/server/mod_wsgi-py36.cpython-36m-x86_64-linux-gnu.so"
WSGIPythonHome "/home/ubuntu/project/env"

```

実行結果の「LoadModule wsgi_module "パス"」をコピーしておき、次のdjango.confの最初の行で使う

#####６－２ 設定ファイル作成

```bash
sudo vim /etc/apache2/sites-available/django.conf
```

以下の内容を入力して保存

```django.conf
LoadModule wsgi_module /home/ubuntu/project/env/lib/python3.6/site-packages/mod_wsgi/server/mod_wsgi-py36.cpython-36m-x86_64-linux-gnu.so

WSGIPythonHome /home/ubuntu/project/env
WSGIScriptAlias / /home/ubuntu/project/project/wsgi.py
WSGIPythonPath /home/ubuntu/project:/home/ubuntu/project/env/lib/python3.6/site-packages

<Directory /home/ubuntu/project/project>
  <Files wsgi.py>
    Require all granted
  </Files>
</Directory>

Alias /static/ /home/ubuntu/project/static/
<Directory /home/ubuntu/project/static>
  Require all granted
</Directory>
```

**[注意] Pythonのバージョン、ユーザー名、プロジェクト名、mod_wsgiのパスは環境で異なる**

#####６－３．デフォルトの設定ファイル場所を変更する

```bash
sudo a2dissite 000-default
sudo a2ensite django
sudo systemctl restart apache2
sudo systemctl enable apache2
```

これで作業は完了。ブラウザより結果を確認する。

#### ７．うまくいかないとき

以下の確認方法がある

```bash
sudo cat /var/log/apache2/error.log #エラーログ表示
systemctl status apache2            #apache2ステータスチェック
apachectl configtest                #confの文法チェック
```

## Amazon-Linux 2 の場合

### ディレクトリ構成

```tree
/etc
    └ httpd
        └ conf.d
            └ django.conf  # apache 設定ファイル（新規作成）

/home
    └ ec2-user
        └ project         # プロジェクト（git clne か scpで作成） 
            ├─ env       # 仮想環境 （venvで作成）
            └─ static    # 静的ファイル （collectstaticで作成）
```

### 作業手順

####１．パッケージのインストール

```bash
sudo yum update -y 
sudo yum install -y python3 python3-pip python3-setuptools python3-wheel python3-devel httpd-devel gcc git
```

####２．プロジェクトの配置

```bash
git clone https://github.com/<project>.git
```

※ SCP等でコピーでもＯＫ

####３．仮想環境の作成

```bash
cd project
python3 -m venv env
source env/bin/activate
```

※ これより仮想環境で実行

```bash
pip install -r requirements.txt
pip install mod_wsgi
```

####４．Django 管理コマンドの実行

```bash
python manage.py migrate         #DB定義更新
python manage.py collectstatic   #静的ファイル収集
python manage.py createsuperuser #管理ユーザー作成
```
※必要な操作だけでOK

####５．ディレクトリ権限の変更

```bash
chmod 755 /home/ec2-user
```
※データベースにsqlite3を使う場合は、ディレクトリとファイルに書き込み権限を与える

```bash
chmod 777 /home/ec2-user/project
chmod 777 /home/ec2-user/project/db.sqlite3
```

####６．apacheの設定

#####６－１．mod_wsgiのパスを確認

```bash
mod_wsgi-express module-config
... 以下、実行結果
LoadModule wsgi_module "/home/ec2-user/project/env/lib64/python3.7/site-packages/mod_wsgi/server/mod_wsgi-py37.cpython-37m-x86_64-linux-gnu.so"
WSGIPythonHome "/home/ec2-user/project/env"

```

実行結果の「LoadModule wsgi_module "パス"」をコピーしておき、次のdjango.confの最初の行で使う

#####６－２ 設定ファイル作成

```bash
sudo vim /etc/httpd/conf.d/django.conf
```

以下の内容を入力して保存

```django.conf
LoadModule wsgi_module "/home/ec2-user/project/env/lib64/python3.7/site-packages/mod_wsgi/server/mod_wsgi-py37.cpython-37m-x86_64-linux-gnu.so"

WSGIPythonHome "/home/ec2-user/project/env"
WSGIScriptAlias / /home/ec2-user/project/project/wsgi.py
WSGIPythonPath /home/ec2-user/project:/home/ec2-user/project/env/lib/python3.7/site-packages

<Directory /home/ec2-user/project/project>
  <Files wsgi.py>
    Require all granted
  </Files>
</Directory>

Alias /static/ /home/ec2-user/project/static/
<Directory /home/ec2-user/project/static>
  Require all granted
</Directory>
```

**[注意] Pythonのバージョン、ユーザー名、プロジェクト名、mod_wsgiのパスは環境で異なる**

#####６－３．サービス再起動

```bash
sudo systemctl restart httpd
sudo systemctl enable httpd
```

これで作業は完了。ブラウザより結果を確認する。

#### ７．うまくいかないとき

以下の確認方法がある

```bash
sudo cat /var/log/httpd/error_log  #エラーログ表示
systemctl status httpd             #apache2ステータスチェック
apachectl configtest               #confの文法チェック
```