uwsgiを用いてflaskアプリを動かし、その前にnginxを設置して,
動かすもの。
大まかな流れとしては,
- vagrantにてUbuntuの仮想マシンを立ち上げる
- 内部でnginxを立ち上げる。
- 内部でflaskとflaskをunixソケット通信で動かすuWSGIを動かす。
- ここはdockerによりコンテナ化する.
- socketファイルだけvagrantと共有する
- nginxにてそのsocketを指定する
- nginx - socket(uwsgi) - flask 実現!
おもしろ教育ポイントとしては、
socket通信を用いてnginxとflaskが通信していることを確認するために、
flask - uwsgiをdockerで包んで、
socketファイルだけをhost側に受け渡してあげているところ。
host側とdocker側ではsocketファイルが存在するtmp
ファイルしか共有していないのに
nginxがsocket通信によりflaskにアクセスすることができている。
dockerのportバインド機能は用いていない。
基本的にはFlask + uWSGI + Nginx でハローワールドするまで @ さくらのVPS (CentOS 6.6) - Qiitaから拾ってきたやつ。
vagrantを起動する
$ vagrant up
vagrantにsshする
vagrant ssh
vagrantというuser名でsshできる。ちなみにパスワードはvagrant
現在このプロジェクトのルートディレクトリとvagrant内の/app
がバインドしてある。
vagrantに関してわかんなかったらinternetにいっぱい落ちてるので漁って
--- 以下vagrant内 ---
まずvagrantにてバーチャルマシンが作られるときに./setup.sh
によって
nginxとdockerがインストールされている。
いちおうnginx. dockerの確認
docker run hello-world
sudo nginx -t # nginxのテストできるやつ。nginxの設定イジったら基本これ
nginxに関してはPermissionなんもやってないからsudoが必要。仕事が雑なので...
バインドされているディレクトリに移動
cd /app
Dockerfile読んでビルド
cat Dockerfile # さり気なくディレクトリ移動をしっかり行ったかの保険をかけれる男。マジでイケメン
dokcer build -t uwsgi_flask .
挙動の確認
vagrantの5000番とcontainerの5000を共有し、flaskを実行している。
docker run --rm -p 5000:5000 -d -v `pwd`:/app uwsgi_flask python app.py
# port転送指定したので、cuurlしてみる
curl localhost:5000
flaskのログも確認する
docker logs <containerID>
適当にcontainerを落とすのを忘れずに。
docker runするときにコマンドを何も指定しなければDockerfileのCMD
が実行される。
docker run --rm -d -v /tmp:/tmp uwsgi_flask
ちゃんとsocketが生成されているか、vagrantと共有されているか確認
file /tmp/uwsgi.sock
nginxの設定ファイルを書いていく。
/etc/nginx/nginx.conf
に
include /etc/nginx/conf.d/*.conf;
conf.d/の.confを全部インクルードする設定がデフォで書いてある。
これを使ってconf.dの中にユーザー設定を記述していく。
/etc/nginx/conf.d/default.conf
server {
# 80番で受け付けたとき
listen 80;
# / にアクセスが来たとき
location / {
# uwsgiのパラメータをインクルードする。実態は/etc/nginx/uwsgi_params.
# uwsgiはすごいのでnginxにデフォでパラメーターファイルがよういしてあるノダ!
include uwsgi_params;
# ここでuwsgiのsocket(dockerと共有したもの)を指定しているノダ!
# ポイントはhttp:/ではなく、unix:/ なのだ。socketを指定する場合はこうなのだ。
uwsgi_pass unix:/tmp/uwsgi.sock;
}
}
unixドメインソケットなのでunix:/をつけるのだ。unixドメインソケットとかそのあたりはググるのだ。
nginxつまりポイントとしてsocketファイルの権限とか、怪しいのだ
error.logが何処に吐くかは/etc/nginx/nginx.confに書いてあるはずなので確認して、
即ったらerror.logをきっちり確認するのだ。適当にググる前にエラーログを読めバカタレが。
# nginx test
sudo nginx -t
nginxの再起動
sudo service nginx restart
(PWはググるのだ。)
エラー履いてなかったらたいていできてるけど一応確認するのだ。
vagrant内でlocalhost:80にcurlしたり、
あとはvirtualマシンにも192.168.33.10
というアドレスを振ってあるので(./Vagrantfile
の16行目なのだ。)
ホストでそのIPにcurlしても確認できるのだ。
socket通信自体がいまいちわかってなかったので
理解した。ここがわかりやすいのでオススメ。
unixソケットとは!調べてみました。ソケット通信の実態
研究から逃げながら雑に作ったやつだからなんかガバがあるかも。
あとこのreadme書いてる途中に気づいたけどvagrantなんも知らんだとだるそうなのでやはり対面かVCで教えるのが最適解な気がする。
気まぐれで書いたけど加藤のために書いたからstarつけて♡