はじめに
本記事は
Raspberry pi + Nginx + uWSGIでWebサーバーを立ち上げDjangoアプリをデプロイしてみる その1
Raspberry pi + Nginx + uWSGIでWebサーバーを立ち上げDjangoアプリをデプロイしてみる その2
の続きとなっています。まだご覧になってない方はそちらを先に読むことをおすすめしております。
今回が最終回です。前回はNginxをインストールからメディアファイルの表示までを行いました。今回はNginxとuWSGIを使ってDjangoプロジェクトを表示させるところまで行います。完了時の構成は以下の通りです
ブラウザ <-> Webサーバ(Nginx) <-> Unixソケット/http(通信プロトコル) <-> アプリケーションサーバ(uWSGI) <-> Webアプリケーション(Django)
NginxとuWSGIでHello World
その1 で作成した"Hello World"を表示する test.py
を実行します。まずは仮想環境を実行した後プロジェクトがあるディレクトリに移動し、Nginxを起動させましょう(その2 から直接来た方は特に何もしなくて大丈夫です。
$ cd /home/pi/Test # Testへ移動
$ pipenv shell # 仮想環境の実行
$ cd mysite # mysiteへ移動
$ sudo /etc/init.d/nginx start # Nginxの起動
準備が整ったら以下のコマンドを打ってください
$ uwsgi --socket :8001 --wsgi-file test.py
http://127.0.0.1:8000/ にアクセスして"Hello World"が表示されれば成功です。このコマンドの意味するところとして、Nginxは8000番ポートでブラウザに対しHTTPプロトコルで通信を行い、8001番ポートでuWSGIとuwsgiプロトコルで通信を行います。そしてtest.pyを実行するようブラウザからNginxにリクエストが送られ、静的コンテンツのリクエストではないためNginxはuWSGIにそれを流す。といった流れです
確認が終わったらCtrl + C
で一旦終了してください。
NginxとuWSGIでHello World その2
先程まではTCPポートソケットを使って通信を行ってきましたが、今度はUnixソケットを使用して通信を行います。uWSGI公式ドキュメント 曰くTCPポートソケットは通信が簡単な反面、Unixソケットと比較しオーバーヘットが多いらしいです。
オーバーヘッドについては こちら をご参照ください。簡単に言えば処理で発生する負荷です。
Unixソケットで通信を行う準備をしましょう。mysite_nginx.conf
を編集します。多分今はmysiteディレクトリにいると思うので下記のコマンドで編集が可能です
$ vi mysite_nginx.conf
mysite_nginx.conf
のupstream django
に2行コードが書いてあり、片方がコメントアウトされていると思います。片方のコメントアウトを外して、今まで生きていた方をコメントアウトしましょう
つまり
upstream django {
# server unix:///home/pi/Test/mysite/mysite.sock; # for a file socket
server 127.0.0.1:8001; # for a web port socket (we'll use this first)
}
これを
upstream django {
server unix:///home/pi/Test/mysite/mysite.sock; # for a file socket
# server 127.0.0.1:8001; # for a web port socket (we'll use this first)
}
こうします。編集が完了したらNginxを再起動しtest.pyを呼び出してみましょう。
$ sudo /etc/init.d/nginx restart # Nginxの再起動
$ uwsgi --socket mysite.sock --wsgi-file test.py --chmod-socket=666
TCPポートソケットを使った際のコマンドと比較すると一目瞭然で、ポート番号の指定からmysite.sock
とUnixソケットの指定に変わっています。
また、先程には付いていなかった--chmod-socket=666
という謎のコマンドですが、これはNginxがUnixソケットを使用できるように権限を管理するコマンドです。
この権限の事を知らず、--chmod-socket=666
を付けなかったために何度アクセスしても502 Bad Gateway
が表示されてしまい、心が折れかけました(3敗)
説明はここまでにして http://127.0.0.1:8000/ にアクセスしましょう"Hello World"が表示されているはずです。
ここまでくれば後はDjangoアプリケーションを表示させるだけです。次へ進みましょう
NginxとuWSGIでDjangoアプリケーションのデプロイ
いよいよ本丸です。その1 でDjangoアプリをを呼び出した人ならどんなコマンドになるのかなんとなく予想ができるかもしれません、以下のコマンドを実行してください
$ uwsgi --socket mysite.sock --module mysite.wsgi --chmod-socket=666
http://127.0.0.1:8000/ にアクセスしてみましょう。下の画像のようなサイトが表示できればOKです。
これでNginxとuWSGIを使ってDjangoアプリケーションのデプロイが完了しました。この環境を使ってDjangoチュートリアル を進めてみるのも良いと思います。
ある程度Djangoアプリが形になったらドメインを取得して実際に公開するのも面白いと思います。自宅サーバとして使えるラズパイならではの使い方ですね。
おまけ
iniファイルでuWSGIを実行させる
Djangoアプリの表示はできましたが、uWSGIの実行時に--chmod-socket=666
などオプションを付けたりするのでどうしてもコマンドが冗長になりがちです。
ですのでオプション含めた設定をすべてiniファイルにまとめ、実行時に読み込む様にします。こうすることで設定の管理が容易になります。
/home/pi/Test/mysite
ディレクトリにmysite_uwsgi.ini
を作成します。作成したら以下の内容を保存してください。ディレクトリは適切なものに変えることを忘れないでください。
[uwsgi]
# Django-related settings
# the base directory (full path)
chdir = /home/pi/Test/mysite
# Django's wsgi file
module = mysite.wsgi
# the virtualenv (full path)
# home = /home/pi/Test
# process-related settings
# master
master = true
# maximum number of worker processes
processes = 10
# the socket (use the full path to be safe
socket = /home/pi/Test/mysite/mysite.sock
# ... with appropriate permissions - may be needed
chmod-socket = 666
# clear environment on exit
vacuum = true
iniファイルの編集が完了したら早速起動してみましょう。以下のコマンドを/home/pi/Test/mysite
で実行してください。
$ uwsgi --ini mysite_uwsgi.ini
前と同じDjangoの画面が表示されれば成功です。コマンドがだいぶスッキリしました。iniファイルは今後Djangoアプリを実際に作成した後などで適宜編集する必要があります。
それらを含む項目に関してはちゃんと運用するときのuWSGI設定メモ を参照すると良いと思います。
おわりに
以上でRaspberry pi + Nginx + uWSGIでWebサーバーを立ち上げDjangoアプリをデプロイしてみるは終了です。最後までお付き合い頂きまして大変ありがとうございました。
恐らく誤字脱字や内容の不備などが多々あると思いますので、コメントや編集リクエストで教えて頂ければ幸いです。