Django を自動的に起動するには?

記事
IT・テクノロジー

Django を自動的に起動するには?

前回はは、Gunicorn を利用して、Django のアプリを起動してホスティングするところまでを紹介しました。しかし、このやり方では、アプリを毎回手動で起動する必要があります。この記事では、自動的にサービスを起動する手順を紹介します。

「サービス」を利用する

今回は、Ubuntu のサーバーを利用しているので、こうした特定の機能を自動的に起動するには、「サービス(service)」という仕組みを利用します。「systemd」と呼ばれるサービスの設定します。設定は大きく分けて3つのファイルで行います。

* サービス(service)
* ソケット(socket)
* ターゲット(target)
Gunicorn の設定では、このうちサービスとソケットの設定を行います。 2 つのファイルを作成して、「/etc/systemd/system」に保存します。

「guicorn.service」

[Unit]
Description=Daemon for Gunicorn
Requires=gunicorn.socket
After=network.target
[Service]
EnvironmentFile=/home/admin/utility/production.conf
Type=notify
User=admin
Group=www-data
RuntimeDirectory=gunicorn-admin
WorkingDirectory=/home/admin/utility
ExecStart=/home/admin/venv/bin/gunicorn utility.wsgi:application
ExecReload=/bin/kill -s HUP $MAINPID
KillMode=mixed
TimeoutStopSec=5
PrivateTmp=true
[Install]
WantedBy=multi-user.target
「gunicorn.socket」

Description=SRD7 Gunicorn Socket
[Socket]
ListenStream=/run/gunicorn.sock
User=www-data
Mode=600
[Install]
WantedBy=sockets.target


NGINX の設定

NGINX はモジュールをインストールするとサービスの基本設定も自動的に行われます。pip でインストールした後に、基本ページのアクセスを確認しているのでサービスは有効になっています。

NGINX の設定ファイルを作成します。名前は任意ですが、今回は「utility」で作成します。

upstream django {
    server unix:/run/gunicorn.sock fail_timeout=0;
}
server {
    listen 80 default_server;
    return 444;
}
server {
    listen 80 deferred;
    server_name localhost;
    root /var/www/utility;
    client_max_body_size 4G;
    keepalive_timeout 5;
    location / {
        try_files $uri @proxy_to_django;
    }
    location @proxy_to_django {
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_
for;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_set_header Host $http_host;
        proxy_redirect off;
        proxy_pass h t t p://utility;
    }
}
ファイルを、「/etc/nginx/site-available」に保存します。

さらに、インストール時に確認したデフォルトのページの設定のリンクを削除します。

$ sudo rm /etc/nginx/sites-enabled/default

作成したファイルのシンボリックリンクを作成します。

$ sudo ln -s /etc/nginx/sites-available/utility /etc/nginx/sites-enabled/utility
準備が整ったら、設定を有効にします

$ sudo systemctl enable --now gunicorn.socket
$ sudo systemctl reload nginx
以上で Django のホスティングが完了です。サーバーの IP アドレスを URL で指定すると Django のアプリにアクセスできます。

ファイルの置き場所

公開する、Django アプリのファイルをどこにおくかについて触れておきます。 上記の設定ファイルをご覧になるとお分かりかもしれませんが、この設定では、「/home/admin/utility」に置いています。

前回の例では、SSH でサーバーにアクセスして Git で Django のファイルを複製しているので、ユーザーのホームフォルダの一部にファイルを置いていました。 今回は、「/home/admin」の下に置いています。これは、公開用のファイルを「admin」というユーザーを作成してその下にファイルを置いています。

これはセキュリティ上の理由です。この「admin」ユーザーの OS 上の権限を最小限にすることで、必要以上の権限を与えないようにしています。

ユーザーの作成は以下のように行います。

$ sudo adduser --disabled-password --sehll /bin/false --gecos Admin admin
このようにユーザーを設定すると外部からこのユーザーでサーバーにログインすることができなくなります。また、シェルも無効にしています。

ファイルは、管理者権限でコピーした後に、所有者を「admin」に変更します。

その他のパッケージのインストールや設定は、「admin」で行います。 admin ではログインできないので、一般ユーザーでログインして「admin」にスイッチします。

sudo -H -u admin /bin/bash
で、admin で操作ができます。

Django のデプロイメントは面倒か?
実際に、サーバーの準備から始めると Django のデプロイメントは面倒です。 しかし、実際に Web ホスティングを提供しているプロバイダーを利用して公開する場合は先日も紹介した通り、簡単に公開することが可能です。

今回サーバーからの公開の手順を紹介したのは、Web のホスティングの仕組みを知っていると開発にも役立つからです。フロントエンドの開発だけだと、余り意識する事はありませんが、Web サービスの仕組みはちょっと複雑です。Web ブラウザと Web サーバーで別々のプログラムが動いていて、ネットワークを通して一つのサービスとして成り立っています。

いわゆるフルスタックのエンジニアとして活躍するには、プログラミングの知識だけではなく、OS やネットワークの知識も必要です。これらの知識が身につくとセキュリティの仕組みも理解しやすくなります。より、信頼性の高いシステムを開発するには、こうした知識も重要になってきます。

まとめ
今回は、本格的な Web ホスティングのためのサーバー側の設定を少し詳しく説明してみました。 Windows や Mac で開発している場合には知らなくても良い設定が必要になってきます。Web サーバーではよく活用される Linux の仕組みやユーザーやアクセスの権限など、バックエンドを含めた Web 開発では幅広い知識が要求されます。

Django での開発は良い機会なので、サーバー側の設定も一度はやってみると、将来の開発に役立ちます!
サービス数40万件のスキルマーケット、あなたにぴったりのサービスを探す