*本ページはプロモーションが含まれています
Ubuntu 環境(さくらのVPS )で Django アプリケーションを作るまでに実際に辿ったステップ。こちらの記事の続編です。
今回は実際に Django のプロジェクト・アプリケーションを作って公開するところまで。Web サーバーとして Nginx、アプリケーションサーバーとして Gunicorn の設定も行います。
また、今後同じサーバーで複数の Django プロジェクトを作っても大丈夫な様に設定していきます。

全体はとりあえずこんな感じのイメージです。
- サイトをホストするディレクトリの作成
- ルートディレクトリ作成
- 管理者の変更
- Django を動かす
- Python 仮想環境作成
- Django インストール
- Django プロジェクトと Django アプリケーションを作成
- settings.py の設定
- Django の動作確認
- Web サーバーの設定(Nginx)
- Web サーバー: Nginx
- 設定ファイル(nginx.conf)
- アプリケーションサーバーの設定(Gunicorn)
- アプリケーションサーバー: Gunicorn
- 仮想環境内で pip install gunicorn
- systemd .socket ファイル
- systemd .service ファイル
- Nginx の設定ファイルでソケットを使用する様設定する
- 静的ファイルの設定
1. サイトをホストするディレクトリの作成
サーバー上にサイトホスト用ディレクトリを作成しますが、今後を見越し、複数のドメインを同じサーバー上でホスト出来る様に配慮して作業を進めていきます。
ルートディレクトリ作成
サイトをホストするルートディレクトリを作成します。
Nginx はデフォルトで「/var/www/html」というディレクトリを作っていますが、今回は /var/www/ の配下にドメイン名のディレクトリ、そしてその配下に html というディレクトリを作ります。(イメージ:/var/www/example.com/html)
vpsadmin@xx1-234-56789:/var/www$ sudo mkdir -p example.com [sudo] password for vpsadmin: vpsadmin@xx1-234-56789:/var/www$ ls html meatthezoo.org vpsadmin@xx1-234-56789:/var/www$ cd example.com vpsadmin@xx1-234-56789:/var/www/example.com$ sudo mkdir -p html
管理者の変更
ディレクトリの管理者を変更します。
vpsadmin@xx1-234-56789:/var/www$ sudo chown -R $USER:$USER /var/www/example.com/html
2. Django を動かす
Python 仮想環境作成
ルートディレクトリ(/var/www/example.com/html)直下で「python3 -m venv 仮想環境名」を実行しPython の仮想環境を作成します。
$ python3 -m venv djangovenv
Django インストール
仮想環境を起動し、「pip install django」で Django をインストールします。
% cd djangovenv % source bin/activate (djangovenv) % pip install django
Django プロジェクトと Django アプリケーションの作成
Django プロジェクトと Django アプリケーションを作成していきます。
(djangovenv) % django-admin startproject djangoprod (djangovenv) % cd djangoprod (djangovenv) % python manage.py startapp djangoapp
settings.py の設定
settings.py の ALLOWED_HOSTS にサイトのドメイン名を登録し、INSTALLED_APS にアプリケーションを追加します。
ALLOWED_HOSTS = ['example.com', 'www.example.com'] INSTALLED_APPS = [ 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', 'djangoapp.apps.DjangoAppConfig' # 追記分 ]
Django の動作確認
コマンド「python manage.py runserver 0.0.0.0:8000」を実行し、ブラウザの URL バーに「ドメイン名:8000」と打ち込んでみます。


Django デフォルトのロケットの画面が出たら大丈夫です。ちなみにこの画面は settings.py の DEBUG = True の時だけ表示されます。
Djangoのデフォルトエラーページが DEBUG=Falseだと見れないのはなんでか調べた
今現在、Django の runserver を起動した場合に限り、ポート 8000 でなら Django が動くという状態です。
というわけで Web サーバー(Nginx)をアプリケーションサーバー(Gunicorn)を使って下記を解決していきます。
問題 | 解決方法 |
URL バーでポート 8000 を指定しないとアクセスできない | Nginx の設定ファイルで、該当するドメイン名にアクセスされたら Django に繋ぐ様変更する |
runserver を起動していないとアクセスできない | Gunicorn を使う |
3. Web サーバーの設定(Nginx)
設定ファイル(nginx.conf)
デフォルトの設定ファイルは「/etc/nginx/nginx.conf」
初めから下記の二行が書いてあればこのファイルはノータッチで良さそうです。
- include /etc/nginx/conf.d/*.conf;
- include /etc/nginx/sites-enabled/*;
複数ドメイン対応
一つのサーバーで複数のウェブサイトを運営しようとした場合、一つの IP アドレスに複数のドメイン名が紐づく事になります。
そのため、リクエストされた URL に応じて適切なサイトの情報を返せる様設定していきます。
- sites-available ディレクトリにドメイン毎の設定ファイルを置く
- 各ドメインの設定ファイルでドメインとルートディレクトリを紐付け
- それらファイルのシンボリックリンクを sites-enabled ディレクトリに作成
- sites-enabled を nginx.conf 本体に include
設定ファイルの複製と編集
「sites-available」ディレクトリの「default」ファイルを個別サイト用にコピーします。
sudo cp /etc/nginx/sites-available/default /etc/nginx/sites-available/example.com
コピーした方のファイルを確認します。下の方に Virtual Host のための設定というところがあるのでそちらを使います。上半分は Default Server のための設定なので全てコメントアウトします。
server_name と location / の部分を編集しました。
example.com ファイルの Virtual Host 設定部分 # Virtual Host configuration for example.com # # You can move that to a different file under sites-available/ and symlink that # to sites-enabled/ to enable it. # server { listen 80; listen [::]:80; server_name www.example.com; return 301 http://example.com$request_uri; } server { listen 80; listen [::]:80; server_name example.com; root /var/www/example.com/html; index index.html; location / { try_files $uri $uri/ =404; include proxy_params; proxy_pass http://127.0.0.1:8000; } }
ファイル内の概念 | 解説 |
---|---|
listen | リクエストを受け入れる IP アドレスやポートの指定。 UNIX ドメインソケットのパスでも可。 |
server_name | リクエストを受け入れるサーバー名(ドメイン名)の指定。 複数のサーバー名をスペース区切りで設定可。 |
try_files | ファイルの存在を指定された順に確認。 |
$uri | リクエストの URI。リダイレクト時など、処理の中で元々のリクエストから書き変わることもある。 |
include proxy_params | /etc/nginx/proxy_params」にプロキシの設定が記載してあるので include。 |
proxy_pass | プロキシサーバーの指定。 |
初めの部分は「www.example.com」へのアクセスを自動的に「example.com」へリダイレクトする設定です。
シンボリックリンクを作成します。
sudo ln -s /etc/nginx/sites-available/example.com /etc/nginx/sites-enabled/
Nginx を再起動します。
sudo systemctl restart nginx
そして runserver を実行して、反映を確かめます。
python manage.py runserver 0.0.0.0:8000
これで一つ解決です。ポート 8000 を URL に含めなくても Django に飛ぶ様になりました。
次は runserver を起動していないとアクセスできないという部分を、Gunicorn を使って解決します。
問題 | 解決方法 |
runserver を起動していないとアクセスできない | Gunicorn を使う |
4. アプリケーションサーバーの設定(Gunicorn)
Nginx から飛んできたリクエストを、待ち受けているソケットから Django アプリケーションに伝える様に設定します。
言い方を変えると Nginx からのリクエストを .socket ファイルが受け、.service ファイルを起動し Gunicorn の処理を実行します。
Gunicorn のインストール
仮想環境内で pip install gunicorn を実行します。
pip install gunicorn
.socket と .service の作成
「/etc/systemd/system/」ディレクトリに .socket と .service を作成します。今回はファイル名をそれぞれ「sample_django.socket」、「sample_django.service」としています。
systemd .socket ファイル
Nginx の設定ファイルで指定したポートでリクエストを待ち受け、 リクエストがあったら指定されているサービスに接続を渡します。
# sample_django.socket [Unit] Description=gunicorn socket [Socket] ListenStream=/run/sample_django.sock [Install] WantedBy=sockets.target
項目 | メモ |
Description | ログ出力の際などに使われる |
ListenStream | ポートの指定。Nginx 設定ファイルの pass_proxy で指定 |
WantedBy | sockets.target |
systemd .service ファイル
サービスの依存関係や実際の実行内容を定義します。
# sample_django.service [Unit] Description=gunicorn daemon Requires=sample_django.socket After=network.target [Service] User=root Group=root WorkingDirectory=/var/www/example.com/html/djangovenv/djangoprod ExecStart=/var/www/example.com/html/djangovenv/bin/gunicorn --workers 3 --bind unix:/run/sample_django.sock djangoprod.wsgi:application [Install] WantedBy=multi-user.target
項目 | メモ |
Description | ログ出力の際などに使われる |
Requires | 対応する .socket ファイル |
After | |
User | |
Group | |
WorkingDirectory | manage.py があるディレクトリのフルパス? |
ExecStart | systemctl start した時に実行するコマンド。 .sock と wsgi を bind。 venv 内の gunicorn のフルパス(?)を指定 |
WantedBy | 大抵 multi-user.target で大丈夫 |
サービスを起動します。
systemctl start sample_django.socket systemctl start sample_django.service
下記を実行すると Gunicorn のステータスを確認できます。
sudo systemctl status sample_django
Nginx 設定ファイルの変更
Nginx 設定ファイルの proxy_pass の部分を下記の様に変更しました。.socket ファイルの ListenStream で設定したポートを指定しています。
location / { try_files $uri $uri/ =404; include proxy_params; # proxy_pass http://127.0.0.1:8000; proxy_pass http://unix:/run/sample_django.sock; }
Nginx の設定を検証し再起動します。
$ sudo nginx -t nginx: the configuration file /etc/nginx/nginx.conf syntax is ok nginx: configuration file /etc/nginx/nginx.conf test is successful $ sudo systemctl restart nginx
これで runserver を実行しなくても URL を叩けば Django アプリケーションへアクセスできる様になったはずです。
大雑把ですがなんとなく全体像は下記の様なイメージです。



*作業時は何かにつけて「pkill gunicorn」で gunicorn を終わらせた方が良いです。エラーが起きていくらコードを修正しても治らないまま数時間経って、「pkill gunicorn」一発で治ったこともありました。
静的ファイルの設定
実はこの時点では CSS や JavaScript のいわゆる静的ファイルはうまく反映されません。ドメイン名/admin にブラウザでアクセスすると CSS が抜けている状態だと思います。
本番環境でちゃんと表示される様、settings.py と Nginx の設定ファイルを編集します。
settings.py の編集
settings.py 内では STATICFILES_DIRS と STATIC_ROOT を設定します。
STATICFILES_DIRS = [ os.path.join(BASE_DIR, 'static'), ] STATIC_ROOT = '/var/www/example.com/html/static'
項目 | メモ |
STATICFILES_DIRS | collectstatic が静的ファイルを追加検索する対象のディレクトリ(特定のアプリケーションに属さないものが対象) |
STATIC_ROOT | collectstatic 実行時に静的ファイルの集約先となるディレクトリ |
collectstatic を実行します。
python manage.py collectstatic
Nginx の設定ファイルの編集
server ディレクティブの中に STATIC_ROOT 指定したパスを追記しました。
location /static { alias /var/www/example.com/html/static; }
これでドメイン名/admin を再度確認すると CSS が反映されていると思います。
他の行程へ
- ▶︎ 1/3 Ubuntu OS の設定、Python のインストール、Web サーバーのインストール
- ▶︎ 2/3 Django のプロジェクト・アプリケーションの作成
- ▶︎ 3/3 Django アプリケーションの HTTPS 化、使用データベースを MySQL に変更
▶︎まずは2週間無料でお試し♪さくらのVPS