甘栗の雨暮らし

Django+gunicron+Nginx+postgresqlで本番環境を構築

カテゴリ:Django

作成日:2022年11月4日18:30

更新日:2022年11月17日10:40

前の記事 | 次の記事

動作環境

Ubuntuの環境設定

日本語パックのインストール

$ sudo apt-get -y install language-pack-ja-base language-pack-ja ibus-mozc

日本語に設定

$ sudo localectl set-locale LANG=ja_JP.UTF-8 LANGUAGE="ja_JP:ja"

確認

$ sudo localectl

次のように表示されることを確認

System Locale: LANG=ja_JP.UTF-8
         LANGUAGE=ja_JP:ja
  VC Keymap: n/a
  X11 Layout: jp,jp
  X11 Model: pc105

ソフトウェアの更新

$ sudo apt update

Python3,pip,postgesql,nginxのインストール

$ sudo apt-get install python3-pip python3-dev libpq-dev postgresql postgresql-contrib nginx

注意:おそらく、以下のように表示される

12  main    5432 down   postgres /var/lib/postgresql/12/main /var/log/postgresql/postgresql-12-main.log

その場合、次のように対応する

sudo etc/init.d/postgresql start

直ったか確認(赤字が緑の色になっていればOK)

$ pg_lsclusters

PostgreSQLの設定

postgresqlデータベースの作成

postgresqlのバージョン確認

$ psql --version

postgresqlと通信

$ sudo -u postgres psql

  • ¥p・・・通信終了
  • ¥l・・・データベースのリストを表示
  • これらは実際入力するときは「¥」は「\」で表示される。

    データベースの作成

    (your_databaseに自分で決めるデータベースの名前が入る)

    # CREATE DATABASE your_database;

    データベースのユーザーとパスワードの作成

    (your_user_nameに自分の名前、yourpasswordに自分のパスワードが入る)

    # CREATE USER your_user_name WITH PASSWORD 'yourpassword';

    データベースへの日本語設定

    # ALTER ROLE your_user_name SET client_encoding TO 'utf8';

    タイムゾーン設定

    # ALTER ROLE your_user_name SET timezone TO 'Asia/Tokyo';

    ユーザーに権限を付与

    # GRANT ALL PRIVILEGES ON DATABASE your_database TO your_user_name;

    通信終了

    # ¥q

    postgresqlコンフィグファイルの設定

    PostgreSQLのリモート接続設定

    $ cd /etc/postgresql/12/main

    pg_hba.confの編集

    $ sudo vim pg_hba.conf

    97行目当たり、# IPv4 local connections:に以下を追記

    # IPv4 local connections:
    host    all             all             127.0.0.1/32/32               md5
    host    all             all             自分のIPアドレス           md5 # 追記

    postgresql.conf の編集

    $ sudo vim postgresql.conf

    # listen_addresses = 'localhost'

    59行目あたり、上記を次のように変更する

    listen_addresses = '接続させたいIPアドレス'

    PostgreSQL再起動

    $ sudo /etc/init.d/postgresql restart

    Virtualenvの仮想環境の構築

    仮想環境ファイルの作成

    Pip3 のインストールとアップグレード

    $ sudo -H pip3 install --upgrade pip

    virtualenvのインストール

    $ sudo -H pip3 install virtualenv

    virtualenvのインストール

    $ sudo -H pip3 install virtualenv

    次のような表示が出るので留意しとく

    WARNING: Running pip as the 'root' user can result in broken permissions and conflicting behaviour with the system package manager. It is recommended to use a virtual environment instead: https://pip.pypa.io/warnings/venv

    警告: 「root」ユーザーとして pip を実行すると、パーミッションが壊れたり、システム パッケージ マネージャーと競合する動作が発生する可能性があります。 代わりに仮想環境を使用することをお勧めします: https://pip.pypa.io/warnings/venv

    ホームディレクトリへ移動

    $ cd

    virtualenvのファイル作成(仮想環境ファイル名はvenvにしている)

    $ virtualenv venv

    仮想環境の有効化

    仮想環境の実行

    $ source venv/bin/activate

    仮想環境の中にdjango,gunicorn,psycopg2をインストール

    (venv) $ pip3 install django gunicorn psycopg2

    次のようになる場合がある

    ERROR: Failed building wheel for psycopg2

    この場合、以下のように対処

    pip install psycopg2-binary

    Djangoプロジェクトのデプロイ

    前提として、既にプロジェクトをデプロイしているとして、進めて行きます。GitHubとかお好きなように

    GitHubの場合

    gitをインストール

    $ sudo apt-get install git

    プロジェクトを設置したいディレクトリに移動して、クローン

    $ git clone git@github.com:xxxxxxxxx/xxxxxxxxx.git

    環境変数で管理させるためにdjango-environをインストール

    (venv) $ pip3 install django-environ

    Djangoの動作確認

    settings.pyを編集する

    自分のリモートサーバーのIPアドレスを入力

    ALLOWED_HOSTS = ['xxx.xxx.xxx.xxx']

    8000番ポートを解放

    $ sudo ufw allow 8000

    manage.pyがあるディレクトリで以下を実行(xxx.xxx.xxx.xxxに自分のIPアドレスを入力)

    $ python3 manage.py runserver xxx.xxx.xxx.xxx:8000

    エラーが出た場合は対処

    ModuleNotFoundError: No module named 'livereload'

    livereloadを仮想環境でインストール

    $ pip install livereload

    ModuleNotFoundError: No module named 'django_cleanup'

    django_cleanupを仮想環境でインストール

    $ pip install django_cleanup

    migrateしてない場合は赤字で注意されるので対応

    python3 manage.py migrate

    ブラウザで確認

    xxx.xxx.xxx.xxx:8000

    サイトを確認できたらOK

    Gunicornの設定

    manage.pyがあるディレクトリで以下を実行(xxx.xxx.xxx.xxxに自分のIPアドレスを入力,projectに自分のプロジェクト名を入力)

    (venv) $ gunicorn --bind xxx.xxx.xxx.xxx:8000 project.wsgi

    エラーが出ず、サイトを確認できたらOK

    GunicornをOSの起動時に動作するように設定

    unicornのシステムファイルが含まれるディレクトリに移動

    $ cd /etc/systemd/system

    gunicornのサービスファイル作成

    $ sudo vim /etc/systemd/system/gunicorn.service

    作成したファイルを自分の環境に合わせて編集(yournameやprojectの部分)

    [Unit]
    Description=gunicorn daemon
    After=network.target

    [Service]
    User=yourname
    Group=yourname
    WorkingDirectory=/home/yourname/project
    ExecStart=/home/yourname/venv/bin/gunicorn --pythonpath /home/yourname --access-logfile - --workers 3 --bind unix:/home/yourname/project/project.sock project.wsgi:application

    [Install]
    WantedBy=multi-user.target

    編集後にファイルの動作を確認

    $ sudo systemctl start gunicorn

    エラーが出た場合は対処

    次に、OS起動時にgunicornを起動するように設定

    $ sudo systemctl enable gunicorn

    以下のように表示され、/etc/systemd/system/gunicorn.service にシンボリックリンクが作成される

    Created symlink /etc/systemd/system/multi-user.target.wants/gunicorn.service → /etc/systemd/system/gunicorn.service.

    gunicornのログの表示

    エラーが出た場合は対処(私がやった時は、かなりの鬼門だった)

    sudo journalctl -u gunicorn

    Nginxの設定

    Nginxのコンフィグファイルの編集

    Webサーバーのエントリーファイルがあるディレクトリへ移動

    $ cd /etc/nginx/sites-available

    confの編集

    $ sudo vim /etc/nginx/nginx.conf

    62行目を編集

    include /etc/nginx/sites-enabled/project;

    Djangoプロジェクトで使用するオリジナルのエントリーファイルを作成

    $ cd /etc/nginx/sites-available

    $ sudo vim project

    下記のように編集(yournameやprojectなど、自身の環境に合わせて適宜書き換えてください)

    server {
    listen 80 ;
    listen [::]:80 ;
    server_name xxx.xxx.xxx.xxx;
    server_name hogehoge.com;

    location =/fabicon.ico {access_log off; log_not_found off;}
    location /{
    include proxy_params;
    proxy_pass http://unix:/home/yourname/project/project.sock;
    }
    location /static{
    alias /var/www/html/static;
    }
    location /media{
    alias /var/www/html/media;
    }
    }

    }

    シンボリックリンクに貼る

    sudo ln -s /etc/nginx/sites-available/project /etc/nginx/sites-enabled/

    エントリーファイルの検証

    $ sudo nginx -t

    エラーが出たら対処。以下のようになればOK

    nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
    nginx: configuration file /etc/nginx/nginx.conf test is successful
    Nginxの起動とサイト表示確認

    8000番ポートの無効化

    $ sudo ufw delete allow 8000

    80番ポートの解放

    $ sudo ufw allow 80

    Nginxのリスタート

    $ sudo systemctl restart gunicorn

    gunicornの再起動

    $ sudo systemctl restart nginx

    ポート番号指定なしでブラウザで確認できたらOK

    SSL化とリダイレクト設定は、こちらの記事を参考

    static、mediaファイル表示の設定

    static,mediaファイルの読み込み場所を指定するために、settings.pyに以下を追記

    STATIC_URL = '/static/'
    STATICFILES_DIRS = (
    os.path.join(BASE_DIR, "static"),
    )
    STATIC_ROOT = '/var/www/html/static'
    MEDIA_URL = '/media/'
    MEDIAFILE_DIRS = {
    os.path.join(BASE_DIR, 'media')
    }
    MEDIA_ROOT = '/var/www/html/media'

    ファイルを置く場所を作成

    sudo mkdir /var/www/html/static
    sudo mkdir /var/www/html/media
    sudo chown yourname /var/www/html/static
    sudo chown yourname /var/www/html/media

    画像表示に対応するための、必要なライブラリをインストール

    (venv) $ pip3 install pillow

    仮想環境に入り、静的ファイルを移動させる

    (venv) $ python3 manage.py collectstatic

    Djangoなど、何か変更を加えた際は、必ずgunicornとnginxを再起動させる

    gunicornの再起動

    $ sudo systemctl restart gunicorn

    nginxの再起動

    $ sudo systemctl restart nginx

    サイトで確認できたらOK

    ホームアイコン 前の記事 | 次の記事
    ブログ管理人のプロフィール画像
    甘栗

    某国立大の理系大学生。このサイトは気が向いたら備忘録として更新する感じだよ!
    プロフィールアイコンは藤ぼろん先生