django✖️ubutnu✖️aws✖️apahce2でdjangoアプリケーションのデプロイ環境を整える


手順としては
1. awsで仮想環境(ubuntu)を立てる(今回は.sshで手動ログイン)
2. awsの仮想環境にdjango,apache2,posgresqlを入れる
3. djangoのデプロイに必要なプラグインを入れる(mod_wsgi)を含むリモート環境で動かすために必要なプラグイン
4. 入れたプラグインの設定を組み込みサーバーの環境に合わせるために設定をいじる。
5. エラーがなければデプロイ完了のはずです。

今回はこのように進めていきます。


#1. awsで仮想環境(ubuntu)を立てる(今回は.sshで手動ログイン)

まずaws ec2 でインスタンスを取得します。
[クラウドならアマゾン ウェブ サービス 【AWS 公式】](https://aws.amazon.com/jp/)を参考にして

今回使っていくosとしてubuntu18.04
を使用していきます

そしてapacheを今回は使うのですが、ポートの80番を開放しないとapacheに接続できないので

セキュリティ→インバウンドから80番ポート(httpプロトコル)、443番ポート(httpsプロトコル)を開放しておいて下さい。

ssh [インスタンスのキーペアのパス] ubuntu:[インスタンスのパブリックdns]
  

  またこれを書くのが面倒な場合は

```/.ssh/config

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のインストールは終わりました。

次はapache２を入れていきます。

    $ 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ファイルと設定もしていかないので
このようなディレクトリの構成で考えていきます。



```s
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

```/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

```/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