11
11

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Raspberry pi + Nginx + uWSGIでWebサーバーを立ち上げDjangoアプリをデプロイしてみる その3(最終回)

Posted at

はじめに

本記事は
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 から直接来た方は特に何もしなくて大丈夫です。

terminal
$ cd /home/pi/Test    # Testへ移動
$ pipenv shell    # 仮想環境の実行
$ cd mysite    # mysiteへ移動
$ sudo /etc/init.d/nginx start    # Nginxの起動

準備が整ったら以下のコマンドを打ってください

terminal
$ 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ディレクトリにいると思うので下記のコマンドで編集が可能です

terminal
$ vi mysite_nginx.conf

mysite_nginx.confupstream djangoに2行コードが書いてあり、片方がコメントアウトされていると思います。片方のコメントアウトを外して、今まで生きていた方をコメントアウトしましょう
つまり

mysite_nginx.conf
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)
}

これを

mysite_nginx.conf
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を呼び出してみましょう。

terminal
$ 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アプリをを呼び出した人ならどんなコマンドになるのかなんとなく予想ができるかもしれません、以下のコマンドを実行してください

terminal
$ uwsgi --socket mysite.sock --module mysite.wsgi --chmod-socket=666

http://127.0.0.1:8000/ にアクセスしてみましょう。下の画像のようなサイトが表示できればOKです。
djangoSite_SS.png
これでNginxとuWSGIを使ってDjangoアプリケーションのデプロイが完了しました。この環境を使ってDjangoチュートリアル を進めてみるのも良いと思います。

ある程度Djangoアプリが形になったらドメインを取得して実際に公開するのも面白いと思います。自宅サーバとして使えるラズパイならではの使い方ですね。

おまけ

iniファイルでuWSGIを実行させる

Djangoアプリの表示はできましたが、uWSGIの実行時に--chmod-socket=666などオプションを付けたりするのでどうしてもコマンドが冗長になりがちです。
ですのでオプション含めた設定をすべてiniファイルにまとめ、実行時に読み込む様にします。こうすることで設定の管理が容易になります。
/home/pi/Test/mysiteディレクトリにmysite_uwsgi.iniを作成します。作成したら以下の内容を保存してください。ディレクトリは適切なものに変えることを忘れないでください。

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で実行してください。

terminal
$ uwsgi --ini mysite_uwsgi.ini

前と同じDjangoの画面が表示されれば成功です。コマンドがだいぶスッキリしました。iniファイルは今後Djangoアプリを実際に作成した後などで適宜編集する必要があります。
それらを含む項目に関してはちゃんと運用するときのuWSGI設定メモ を参照すると良いと思います。

おわりに

以上でRaspberry pi + Nginx + uWSGIでWebサーバーを立ち上げDjangoアプリをデプロイしてみるは終了です。最後までお付き合い頂きまして大変ありがとうございました。
恐らく誤字脱字や内容の不備などが多々あると思いますので、コメントや編集リクエストで教えて頂ければ幸いです。

11
11
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
11
11

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?