VPSをレンタルしてウェブサイトを公開するために必要なこと
自分のパソコンでPythonやDjangoをインストールしてコードを書いた方は、これからウェブサイトを全世界に公開するための場(VPS)を借りる必要が出てきます。VPSのレンタルを進めていこうと思います。当然お金はかかります。1CPU / 1GBメモリ / 25GB SSD / 1TB転送量: 月額5ドル程度です。すでにVPSを持っている方は、それで構いません。
今回使用するサービスは、Vultr(バルチャー)という会社が提供しているものを使っていきます。
バルチャーでのアカウント作成
バルチャーのサイトに入り、”CREATE ACCOUNT”というボタンでアカウントを作成します。
メールアドレスとパスワードを入力しますが、パスワードは10文字以上、大文字・小文字・数字などを含む厳重なものを求められます。
その辺を考慮してパスワードを設定してください。
メールアドレスとパスワードを入れて”CREATE ACCOUNT”をクリックすると、アカウントが作成され、登録したメールアドレスにメールが届きます。
メールに記載されたリンクからメールアドレスの認証を完了させましょう。
メールアドレスの認証が完了したら、ログインをしてVPSのレンタルを進めていきます。
バルチャーのサイトで”LOGIN”をクリックし、メールアドレスとパスワードでログインしましょう。
ログイン後、クレジットカード情報の入力が求められます。
これを登録しないとサーバーを借りることができませんので、クレジットカード情報を入力してください。
登録しただけではすぐにお金が発生するわけではありませんのでご安心ください。
一点ポイントとして、”Amount”(デポジット)の項目がありますが、ここでデポジットを指定すると、その金額が即時にカードから引き落とされてしまいます。
これで”CREATE ACCOUNT”およびクレジットカード情報の登録が完了し、サーバーを借りる準備が整いました。
ここから実際にサーバーをレンタルしていきます。
ログイン後のダッシュボードの画面から”Servers”をクリックします。
右側にある”+Deploy New Server”をクリックします。
ここからサーバーを借りるための設定を行います。
- サーバーの場所(Location):東京を選択します。
- サーバーのタイプ(Server Type):Ubuntuを選択します。
Linuxのディストリビューションは様々ありますが、コマンドなどが微妙に異なるため、ここではUbuntuを選ぶと、以後の設定がスムーズです。 - サーバーのプラン:5ドルプランで問題ありません(テスト公開であれば最安で大丈夫です)。
他のオプションは特にいじらなくても構いません。 - 最後に”Deploy”ボタンをクリックしてサーバーを作成します。
“Server added successfully”という表示が出れば、サーバーが無事に作成され、現在インストール中の状態です。
サーバーのインストールが完了するとステータスが”Running”になります。
“Running”と表示されていれば、そのVPSが起動していることを示しています。
VPSにアクセスする
ではこのVPSに手元のパソコンからアクセスしていきましょう。
アクセスするには、VPSの情報を確認する必要があります。
作成したVPSの名前部分をクリックすると、IPアドレスやログインに必要なパスワードが表示されます。
ここでは以下の情報が必要です:
- IPアドレス
- ROOTユーザーのパスワード
- ユーザー名(ROOT)
この3つの情報でVPSにアクセスしていきます。
ターミナルを開きます。
特にフォルダ位置はどこでも構いません。
手元のパソコンからVPSに接続するために”ssh”コマンドを使います。
形式は、ssh ユーザー名@IPアドレス
です。
例:ssh root@<VPSのIPアドレス>
初回接続時は”Are you sure you want to continue connecting?”と聞かれますが、”yes”と入力します。
続いてパスワードを求められるので、表示されているパスワードをコピー&ペーストしてEnter。
すると、プロンプトがroot@vultr
のような表示に変わります。
これで、手元のパソコンからVPSへのアクセスが完了しました。
セキュリティ対策:ROOTユーザーの禁止と新規ユーザーの作成
ここから、VPS上で作業を進めていきますが、まず最低限のセキュリティ対策として、別ユーザーを作成し、ROOTユーザーでのログインを禁止する設定を行います。
ROOTユーザーは何でもできるため、万が一ROOTユーザーでログインされると、サーバーを自由に改ざんされてしまいます。
そこで、新規ユーザーを作って、そのユーザーにsudo(管理者権限)を与え、以後そのユーザーで作業を進めます。
また、ROOTでのログインを禁止し、万が一パスワードが漏れても被害を最小限にします。
任意ですが、まずROOTパスワードを変更することもできます。passwd
コマンドでパスワード変更が可能です。
次にユーザーを追加します。adduser 新規ユーザー名
パスワードを設定し、必要な情報を入力しますが、特に空Enterで飛ばしても構いません。
新しいユーザーにsudo権限を付与します。usermod -aG sudo ユーザー名
これで、そのユーザーがsudo権限を使えるようになります。
次に、ROOTログイン禁止の設定を行います。
SSH設定ファイルを編集します。vim /etc/ssh/sshd_config
この中でPermitRootLogin yes
となっている箇所をPermitRootLogin no
に変更します。
編集後、systemctl reload sshd
で設定を反映します。
これでROOTユーザーでのログインは禁止となりました。
一度exit
でログアウトし、新しく作ったユーザーでログインします。ssh ユーザー名@IPアドレス
パスワードを入力すると、そのユーザーでログインできるはずです。
次に、ファイアウォール(UFW)の設定をします。
外部からのアクセスを制御するため、SSH(22番ポート)以外のアクセスは一旦遮断されます。sudo ufw allow ssh
これでSSHは許可されました。
次にsudo ufw enable
でファイアウォールを有効化します。sudo ufw status
で確認すると、SSHのみ許可されている状態です。
これでVPSを借りたうえでの初期設定は完了です。
GITとGITHUBを使ったファイルの移行
ここからGITについてのお話をします。
本番公開時には、ローカル(手元のPC)で作ったDjangoプロジェクトをVPSにアップロードする必要があります。
その手段の一つがGITHUBを使った方法です。
GITHUBは、GITというバージョン管理システムをウェブ上で使えるサービスです。
複数人で開発する際のバージョン管理が主な用途ですが、単純にファイルのアップロード・ダウンロード手段としても使えます。
最低限のGITコマンドは以下です。
git init
:リポジトリ初期化git add .
:全ファイルをステージングgit commit -m "メッセージ"
:変更をコミット(履歴に確定)git remote add origin <URL>
:リモートリポジトリを登録git push
:ローカルの変更をリモート(GITHUB)へアップロードgit clone <URL>
:リモートのリポジトリをローカルへダウンロード
ローカル→リモート→VPSの流れでファイルを移動できます。
実際にGITとGITHUBを使って、ローカルで作ったDjangoプロジェクトをVPSへ移行していきます。
まずGITHUBのアカウントを作成します。github.com
で”Sign up”からユーザー登録、メール認証、パスワード設定を行います。
フリーアカウントでプライベートリポジトリも作れるので、フリーで問題ありません。
GITHUBで”New Repository”を作成します。
任意のリポジトリ名を付けて、”Private”にして”Create Repository”を押せば空のリポジトリができます。
ローカルのDjangoプロジェクトがあるディレクトリで、git init
git add .
git commit -m "first commit"
を実行し、git remote add origin <GITHUBリポジトリのURL>
git push -u origin master
とすることで、ローカルのファイルをGITHUBへアップロードできます。
ユーザー名とパスワードまたはPersonal Access Tokenを求められるので入力します。
これでGITHUB上にファイルが反映されます。
次にVPS側でgit clone <GITHUBリポジトリのURL>
を実行すると、GITHUBからVPSへファイルをダウンロードできます。
これでローカルからVPSへコードが移動可能です。
ここからDjangoアプリを本番公開するための設定を進めていきます。
Djangoアプリを本番公開する準備
では実際に、VPS上でDjangoを本番公開する手順を進めていきます。
- VPSにログイン(
ssh ユーザー名@IPアドレス
)。 - パッケージマネージャーの更新:
sudo apt update
- 必要なパッケージインストール:
sudo apt install nginx postgresql postgresql-contrib python3-pip
これでウェブサーバーとしてNginx、データベースとしてPostgreSQL、Pythonパッケージマネージャーpipをインストール。 - PostgreSQL設定:
sudo -u postgres psql
でPostgreSQLに入る。CREATE DATABASE todo_project;
でデータベース作成。CREATE USER todo_project_user WITH PASSWORD 'password';
ユーザー作成(パスワードは例)。ALTER ROLE todo_project_user SET client_encoding TO 'utf8';
ALTER ROLE todo_project_user SET default_transaction_isolation TO 'read committed';
ALTER ROLE todo_project_user SET timezone TO 'UTC';
GRANT ALL PRIVILEGES ON DATABASE todo_project TO todo_project_user;
\q
で抜けます。 - ローカルで開発していたDjangoプロジェクトをGITHUBにプッシュ後、VPSで
git clone
して取得してある状態を想定します。cd todo_project
でプロジェクトディレクトリへ移動。 - 仮想環境を作成:
sudo -H pip3 install --upgrade pip
sudo -H pip3 install virtualenv
virtualenv venv
(venvという名称の仮想環境を作成)source venv/bin/activate
で仮想環境有効化。 - DjangoとGunicornをインストール:
pip install django gunicorn psycopg2-binary
- Django設定ファイル
settings.py
の編集:cd todo_project
(Djangoのsettings.pyがあるフォルダへ)vim todo_project/settings.py
ALLOWED_HOSTSにVPSのIPアドレスを追記(例:ALLOWED_HOSTS = ['<VPS_IP>', 'localhost']
)。
DEBUGをFalseに変更しても良いです(Falseの場合、ALLOWED_HOSTSにIPを入れておかないとエラーになります)。データベース設定をPostgreSQLに書き換えます:
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.postgresql',
'NAME': 'todo_project',
'USER': 'todo_project_user',
'PASSWORD': 'password',
'HOST': 'localhost',
'PORT': '',
}
}
スタティックファイルの収集先を設定:
import os
STATIC_ROOT = os.path.join(BASE_DIR, 'static/')
設定が完了したら保存して終了。
マイグレーションとスタティックファイル収集:python3 manage.py migrate
python3 manage.py collectstatic
(問われたらyes)
スーパーユーザー作成:python3 manage.py createsuperuser
Gunicornでテスト起動:gunicorn --bind 0.0.0.0:8000 todo_project.wsgi:application
ブラウザでhttp://<VPS_IP>:8000
にアクセスして動作確認。
もしアクセスできなければ、sudo ufw allow 8000
で8000番ポートを許可して再度アクセス。
確認できたらCTRL+CでGunicornを停止。
本番運用設定:
GunicornとNginxを連携させ、常時バックグラウンドで稼働させるためにシステムサービス設定を行います。
- Gunicornソケットファイル作成:
sudo vim /etc/systemd/system/gunicorn.socket
[Unit]
Description=gunicorn socket
[Socket]
ListenStream=/run/gunicorn.sock
[Install]
WantedBy=sockets.target
Gunicornサービスファイル作成:sudo vim /etc/systemd/system/gunicorn.service
[Unit]
Description=gunicorn daemon
Requires=gunicorn.socket
After=network.target
[Service]
User=あなたのユーザー名
Group=www-data
WorkingDirectory=/home/あなたのユーザー名/todo_project
ExecStart=/home/あなたのユーザー名/todo_project/venv/bin/gunicorn \
--access-logfile - \
--workers 3 \
--bind unix:/run/gunicorn.sock \
todo_project.wsgi:application
[Install]
WantedBy=multi-user.target
上記のパスやユーザー名は自分の環境に合わせて修正してください。
Nginx設定ファイル作成:sudo vim /etc/nginx/sites-available/todo_project
server {
listen 80;
server_name <VPS_IP>;
location = /favicon.ico { access_log off; log_not_found off; }
location /static/ {
root /home/あなたのユーザー名/todo_project;
}
location / {
include proxy_params;
proxy_pass http://unix:/run/gunicorn.sock;
}
}
- シンボリックリンクで有効化:
sudo ln -s /etc/nginx/sites-available/todo_project /etc/nginx/sites-enabled
- Nginxを再起動:
sudo systemctl restart nginx
- ファイアウォールで80番ポート(HTTP)を許可:
sudo ufw allow 'Nginx Full'
sudo systemctl start gunicorn.socket
sudo systemctl enable gunicorn.socket
- シンボリックリンクで有効化:
http://<VPS_IP>
にアクセスすると、Djangoのアプリが表示されます。
管理画面にもアクセスでき、データベースに保存したTODOリストなどが閲覧・追加可能です。
これで、Djangoアプリケーションの本番環境へのデプロイは完了です。
最初は難しく感じるかもしれませんが、慣れるとスムーズになります。
お疲れさまでした。