手順としては
- awsで仮想環境(ubuntu)を立てる(今回は.sshで手動ログイン)
- awsの仮想環境にdjango,apache2,posgresqlを入れる
- djangoのデプロイに必要なプラグインを入れる(mod_wsgi)を含むリモート環境で動かすために必要なプラグイン
- 入れたプラグインの設定を組み込みサーバーの環境に合わせるために設定をいじる。
- エラーがなければデプロイ完了のはずです。
今回はこのように進めていきます。
#1. awsで仮想環境(ubuntu)を立てる(今回は.sshで手動ログイン)
まずaws ec2 でインスタンスを取得します。
クラウドならアマゾン ウェブ サービス 【AWS 公式】を参考にして
今回使っていくosとしてubuntu18.04
を使用していきます
そしてapacheを今回は使うのですが、ポートの80番を開放しないとapacheに接続できないので
セキュリティ→インバウンドから80番ポート(httpプロトコル)、443番ポート(httpsプロトコル)を開放しておいて下さい。
ssh [インスタンスのキーペアのパス] ubuntu:[インスタンスのパブリックdns]
またこれを書くのが面倒な場合は
Host aws
HostName [パブリックdns]
User ubuntu
IdentityFile [キーペアのパス]
Port 22
TCPKeepAlive yes
IdentitiesOnly yes
と記載してやれば
$ ssh aws
で動くと思います
2. awsの仮想環境にdjango(python),apache2,posgresqlを入れる
無事クラウドで作った仮想環境に入ることができたら
linuxの
ユーザー名@ホスト名の箇所に ubuntu@ip-パブリックipアドレスと表示されると思います。
確認が取れたら
$ sudo apt-get update
$ sudo apt-get upgrade
$ sudo apt update
$ sudo apt upgrade
をまず最初に打って apt,apt-getをアップデートしてください。その後
$ sudo apt install python3-pip
$ pip3 install --upgrade pip
$ pip3 install django
$ apt install python-django-common
$ django-admin --version
またこのコマンド群が動かない場合は
$ sudo su
でrootユーザーでコマンドを打つと正常にダウンロードしてくれました。
これでdjangoとpythonのインストールは終わりました。
次はapache2を入れていきます。
$ sudo apt-get update
$ sudo apt-get install apache2
$ apt-get install apache2-dev
$ service apache2 start
これで、apache2の導入と起動が完了しました。
$ sudo apt-get install postgresql
これで postgresqlのインストールも完了すると思います。
3. djangoのデプロイに必要なプラグインを入れる(mod_wsgi)を含むリモート環境で動かすために必要なプラグイン
まず、
$ pip3 install mod_wsgi
$ sudo apt-get install python-psycopg2
$ sudo apt-get install libapache2-mod-wsgi-py3
と打ってmod_wsgiとpsycopg2を入れます。
次に自分のデプロイしたいdjangoアプリケーションをこのクラウド仮想サーバーに持っていきます。
$ git clone <githubに保存してあるurl>.git
その後、デプロイしたいアプリケーションのホームディレクトリに戻って、
$ python3 manage.py runserver
と打ちます。
ここでエラーが出たら、それを対処していきます。
ここでエラーが出ているとデプロイできないので、エラーが出なくなるまでチューニングして下さい。
4. 入れたプラグインの設定を組み込みサーバーの環境に合わせるために設定をいじる。
先にpostgresqlの設定を 決めていきますが、その前に
$ sudo su
# useradd -m <ユーザー名>
# passwd ubuntu
# passwd <ユーザー名>
# passwd postgres
で自分の作ったユーザーとubuntuユーザーとpostgresユーザーにpasswdを決めておくと楽に運用できます。
またこれからはデプロイしたいdjangoのアプリケーションのadminファイルと設定もしていかないので
このようなディレクトリの構成で考えていきます。
home/ubuntu/django -- djangoadmin ------ __pycache__
| |___ settings.py
| |___ urls.py
| |___ wsgi.py
| |___ ___init__.py
|
|_ djangpapp___ templates
|___ static
<以下略>
ではここまで確認ができたとこで、psqlの設定を触っていきます
$ sudo -u postgres psql
# create user <ユーザー名> PASSWORD '<PASSWORD>';
# ALTER ROLE <ユーザー名> with SUPERUSER;
# create database django;
これで、仮想サーバに作ったユーザーと同名のユーザーをpostgresqlのユーザーの部分に作ることができました。
$ sudo vim django/djangoadmin/settings.py
settings.py
~~~~~~~~以下略~~~~~~~~~~
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
}
}
~~~~~~~~以下略~~~~~~~~~~
これを
~~~~~~~~以下略~~~~~~~~~~
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.postgresql_psycopg2',
'NAME': 'django',
'USER': '<ユーザー名>',
'PASSWORD': '<PASSWORD>',
'HOST': 'localhost',
'PORT': '5432',
}
}
~~~~~~~~以下略~~~~~~~~~~
このように書き換えます。
これで動くようになります。
また
FATAL: Peer authentication
とエラーが出ている場合は
$ sudo find / -name pg_hba.conf
コマンドを使ってpg_hba.conf のパスを見つけて、
pg_hba.conf
local all all peer
を
local all all md5
に書き換えると動きます。
apache2の設定方法。
$ sudo vim /etc/apache2/sites-available/django.conf
LoadModule wsgi_module <wsgiモジュールまでのパス>
<VirtualHost *:80>
ServerName dnsかipアドレス(ドメイン名)
DocumentRoot /home/ubuntu/django/
WSGIDaemonProcess [パブリックdns] user=ubuntu threads=5 python-path=/home/ubuntu/.local/lib/python3.6/site-packages:home/ubuntu/django
WSGIProcessGroup [パブリックdns]
WSGIScriptAlias /<djangoapp> /home/ubuntu/django/djangoadmin/wsgi.py
Alias /static/ /home/ubuntu/django/djangoapp/static/
<DIrectory /var/www/Django/Django-slackmyapp/static>
Require all granted
</Directory>
<Directory /home/ubuntu/django/djangoadmin/>
<Files wsgi.py>
Require all granted
</Files>
</Directory>
</VirtualHost>
python-pathは絶対パスからsite-packagesまでのpathを書いていきます。
site-pakeagesまでのパスがわからなかったら
$ sudo find / -name site-pakeages
で確認できます。
最後に
$ sudo vim /etc/apache2/apache2.conf
<Directory /var/www/>
Require all granted
</Directory>
$ sudo a2dissite 000-default
$ sudo a2ensite django
$ sudo systemctl restart apache2
$ sudo systemctl enable apache2
で正常に動くと思います。
リロードコマンド
$ sudo service apache2 restart
エラー確認コマンド
$ cat /var/log/apache2/error.log