前提条件
- 一般ユーザーアカウント名:unknwon
- 購入したvpsのサーバー名:srv12345
- 購入したvpsのサーバーIP:255.255.255.255
- 既にsshでputtyに一般ユーザーで入れる
- 既にDjangoはインストール済
今回やる事
見事にDjangoを海外VPSにインストールしたは良いが、'manage.py runserver'で起動に成功できたものの、表示されたアドレスを入力されても'ERROR'になってしまう。
(venv)[unknown@srv12345 myproject]$ python manage.py runserver
Watching for file changes with StatReloader
Performing system checks...
System check identities no issues (0 silenced).
June 27, 2024 -12:00:00
Django version 3.2.25, using settings 'myproject.settings'
Starting development server at http://127.0.0.1:8000/
Quit the server with CONTROL-C.
はい、これだと自分のPCからブラウザで起動ページを確認する事はできません。
※ここがDjango関連の書籍を見てぶち当たった壁です。自分のPCにDjangoを入れて動かせばこれで起動ページが見られるようになるのですが、VPSに入れる場合は、勝手が違います。
しかし、このVPSに入れてページが見られるようになるまでの方法を載せている書籍は少なくとも日本語書籍では見たことがない。
実現フロー
1:ファイヤーウォール設定の確認と設定
1-1 と、その前にfirewalldをインストールしないといけない。
詳しいことはまだ不勉強だが、とりあえずこのパッケージでVPSの自分のファイルにアクセスできるように扉をあけるのは間違いない。
firewalld以外にも[iptables]、[ip6tables]等で設定できるようだ。というか、そもそも後者達の方が古株で、前者(firewalld)の方が新しい技術のようだ。
'firewalld'は'firewall'ではなく後ろにdが着いている。このdは'dynamic'の略で、解説によればダイナミックにポートなどを割り振る事ができるらしい。
ということでインストール開始
(venv)[unknown@srv12345 myproject]$sudo dnf install firewalld
※ディレクトリがmyprojectになっているが場所に意味はない
1-2 'firewalld'の有効化と起動
インストール後、'firewalld'を有効にして起動する。
(venv)[unknown@srv12345 myproject]$sudo systemctl enable firewalld
(venv)[unknown@srv12345 myproject]$sudo systemctl start firewalld
1-3 ポートの開放
(venv)[unknown@srv12345 myproject]$sudo firewall-cmd --permanent --add-port=8000/tcp
(venv)[unknown@srv12345 myproject]$sudo firewall-cmd --reload
1-4 ポートの開放に成功したかどうかの確認
(venv)[unknown@srv12345 myproject]$sudo firewall-cmd --list-ports
2:ALLOWD_HOSTSの設定
次にDjnago側の'settings.py
(venv)[unknown@srv12345 myproject] vi settings.py //settings.pyを開く
viでsettings.pyを開いた後、'ALLOWED_HOSTS=[]'を探して、自分のVPSのIPアドレスを入力する。
#settings.py
ALLOWED_HOSTS=['255,255,255,255']
3:サーバーの起動
上述の設定が終わるといよいよDjangoを起動します。
(venv)[unknown@srv12345 myproject] python manage.py runserver 0.0.0.0:8000
ここでポイントなのが、 '0.0.0.0:8000'を後ろに付けないといけません。
後ろに付けないとアクセスが出来ません。
なぜ'0.0.0.0:8000'?
Djangoの初期設定ではローカルホスト'127.0.0.1'のみしか受け付けていない。
'0.0.0.0'を指定することで、すべてのアクセスからのリクエストを受け付けられるようになるようです。
当然、セキュリティ上心配な気がしますが、だからこそ'settings.py'の'ALLOWED_HOST'にて、指定されたホスト名やIPアドレスからのリクエストのみを受け入れるようにしているらしい。
後ろの':8000'は何?
後ろの':8000'は、Djangoが使用するポート番号を指定している。別のポート番号でも良いが、初心者が変える必要はないですね。
'0.0.0.0:8000'とすることで、全てのIPアドレスからリクエストを受け付けられるようになる。
この”全てのIPアドレスから”というのに若干混乱したが、多分実際には以下のイメージな筈で、オープンにしているが、実際にはVPSのIPアドレスからのリクエストしか受け付けないと解釈している。
結局、'settings.py'の'ALLOWED_HOSTでは255.255.255.255からのアクセスしか許可していないので、”Djangoは全てのリクエストをを受け付ける”が、実際には255.255.255.255からしかアクセスしてくる奴がいないので、実質255.255.255.255が唯一のアクセス先になる。
で良いのかな?
4:ブラウザからのアクセス
そして最後に、自分のPCのブラウザに"255.255.255.255:8000/"と入力すれば以下の様にページが表示され無事、成功!となる。