Ubuntu18.04にDjangoで作ったWebアプリをデプロイ



Python3.7.8
Django3.2.8
Postgre14.2
Apache2.4.29

## 1．インストール手順

### パッケージインストール
pythonやapcheなどを一括でインストールします。

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

#### Pythonのバージョンが合っていない場合
一括でインストールを行った際に、実際の開発環境のPythonのバージョンと違うバージョンがインストールされることが多いと思います。
なので今回はpyenvを使用してpythonのバージョンを合わせました。
下の方で一度一括で入れたPythonをアンインストールしています。
これは後程行うpip install mod_wsgiのインストールの際にエラーが発生したからです。
下記のサイトを参考に解決しました。
https://t44or2.hatenablog.com/entry/2018/11/04/mod_wsgi_%E3%81%8C%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB%E3%81%A7%E3%81%8D%E3%81%AA%E3%81%84

	- sudo apt update
	- sudo apt upgrade
	- sudo apt install -y \
	  libffi-dev libssl-dev zlib1g-dev liblzma-dev tk-dev \
	  libbz2-dev libreadline-dev libsqlite3-dev libopencv-dev \
	  build-essential git
	- git clone https://github.com/pyenv/pyenv.git ~/.pyenv
	- echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.profile
	- echo 'export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.profile
	- echo 'eval "$(pyenv init --path)"' >> ~/.profile
	- . ~/.profile
	- exec $SHELL -l
	- sudo apt-get remove python3(後のpip install mod_wsgiでエラーを発生させないためにpython3を入れ直す)
	- env PYTHON_CONFIGURE_OPTS="--enable-shared" pyenv install 3.7.8

### プロジェクトの配置
	- git clone https://github.com/<project>.git

### 仮想環境作成
	- cd <project>
	- rm -r venv
	- python3 -m venv env
	- . env/bin/activate

	‐ pip install wheel
	- pip install -r requirements.txt
	- pip install mod_wsgi
	- python manage.py makemigrations
	- python manage.py migrate
	- python manage.py collectstatic
	- python manage.py createsuperuser

### Postgreインストール
    - sudo apt install libpq-dev
	- sudo sh -c "echo 'deb http://apt.postgresql.org/pub/repos/apt/ bionic-pgdg main' > /etc/apt/sources.list.d/pgdg.list"
	- wget --quiet -O - http://apt.postgresql.org/pub/repos/apt/ACCC4CF8.asc | sudo apt-key add -
	- sudo apt install postgresql
#### DB作成
	- sudo -u postgres -i
	- psql
	- alter role postgres with password '<パスワード>';
	- createdb DB名 -U ログインユーザ --template=template0 --encoding='UTF8' --lc-collate='C' --lc-ctype='C' -p 5432

### Apache設定
	- mod_wsgi-express module-config
		‐ "LoadModule wsgi_module"という部分をコピーしておく
	- sudo vim /etc/apache2/sites-available/django.conf
		```以下django.confの内容
		LoadModule wsgi_module /home/<ユーザ名>/<プロジェクト名>/env/lib/python3.6/site-packages/mod_wsgi/server/mod_wsgi-py36.cpython-36m-x86_64-linux-gnu.so

		WSGIPythonHome /home/<ユーザ名>/<プロジェクト名>/env
		WSGIScriptAlias / /home/<ユーザ名>/<プロジェクト名>/<プロジェクト.設定フォルダ>/wsgi.py
		WSGIPythonPath /home/<ユーザ名>/<プロジェクト名>:/home/<ユーザ名>/<プロジェクト名>/env/lib/python3.6/site-packages
		
		<Directory /home/<ユーザ名>/<プロジェクト名>/<プロジェクト.設定フォルダ>>
		  <Files wsgi.py>
		    Require all granted
		  </Files>
		</Directory>
		
		Alias /static/ /home/<ユーザ名>/<プロジェクト名>/static/
		<Directory /home/<ユーザ名>/<プロジェクト名>/static>
		  Require all granted
		</Directory>
		```
	‐ sudo a2dissite 000-default
	- sudo a2ensite django
	- sudo systemctl restart apache2
	- sudo systemctl enable apache2

### うまく行かない場合の確認方法
	- sudo cat /var/log/apache2/error.log #エラーログ表示
	‐ systemctl status apache2            #apache2ステータスチェック
	- apachectl configtest                #confの文法チェック

また私が動作確認をした際は、ログファイルを吐き出すフォルダに権限を与えるのを忘れておりエラーが発生しました、、、

一連の操作の中で記載はしていませんが、Linuxのコマンドなどもいろいろ使ったのでいい勉強になりました。
普段Windowsしか業務でも使用しないので苦手意識がありましたが、やはり触っていると楽しいですね。