やる気がストロングZERO

やる気のストロングスタイル

vagrant + ubuntu(xenial) + nginxでpythonのwebアプリの実行環境をつくる

apache + phpみたいな感じでいけるのかと思っていたら、 思っていたよりもいろいろあったのでメモ

apache + phpとの違い

apacheにはphpの実行モジュールが存在し、それがphpを実行してくれている。 ほぼデフォルト設定でこれらが動作するようになっていたので、 apacheをインストールしてブラウザからphpスクリプトへアクセスすれば、 apachephpを実行して結果をブラウザへ返してくれていた。

nginx + pythonの場合このようなモジュールがない。 (あるのかもしれないが、一般的ではないぽい)

このため、pythonスクリプトを実行して結果を得られる何かが必要になる。 これにfastCGIという仕組みを使っている。

ざっくり言うと、 phthonを実行するプロセスを常駐させ、nginxからこれに問い合わせることでpythonの実行結果を得、webブラウザに結果を返却している、、という感じ。

このpythonを実行する常駐プロセスを作成するのに必要なのがuwsgi、という感じらしい。

hostブラウザからvagrant内部のpython実行までの全体像

ブラウザ(http://localhost:8080) => vagrant(設定により8080を80へポートフォワード) => ubuntu(ポート番号を見てnginxへ) => nginx(設定によりuwsgi(3031)へ) => uwsgi(pythonスクリプトを実行)

環境構築手順

vagrantubuntu(xenial)のboxでinit

vagrant box add ubuntu/xenial64 mkdir somedir cd somedir vagrant init ubuntu/xenial64

vim Vagrantfile (下記行のコメントアウトを削除して有効化) config.vm.network "forwarded_port", guest: 80, host: 8080

vagrant up vagrant ssh sudo apt update sudo apt upgrade

pythonインストールで必要なものをインストール sudo apt install gcc make libssl-dev libbz2-dev libreadline-dev libsqlite3-dev

nginxをインストール

参考)https://nginx.org/en/linux_packages.html#stable

cd ~ wget https://nginx.org/keys/nginx_signing.key sudo apt-key add nginx_signing.key sudo vim /etc/apt/sources.list 下記を追記 deb http://nginx.org/packages/ubuntu/ xenial nginx deb-src http://nginx.org/packages/ubuntu/ xenial nginx sudo apt update sudo apt install nginx

sudo vim /etc/nginx/conf.d/default.conf (location / の項目を以下のように記述) location / { include uwsgi_params; uwsgi_pass 127.0.0.1:3031; }

sudo nginx

pythonのインストール(pyenv)

参考)https://github.com/pyenv/pyenv-installer

cd ~/ curl -L https://raw.githubusercontent.com/pyenv/pyenv-installer/master/bin/pyenv-installer | bash

vim ~/.bashrc (最下部に下記を追記) export PATH="~/.pyenv/bin:$PATH" eval "$(pyenv init -)" eval "$(pyenv virtualenv-init -)"

source ~/.bashrc pyenv install 3.6.4 pyenv local 3.6.4

venvでpython環境の作成

cd ~/ mkdir appdir cd appdir mkdir pyenv python -m venv pyenv source pyenv/bin/activate

uwsigをインストールして設定

参考)http://uwsgi-docs.readthedocs.io/en/latest/WSGIquickstart.html

cd ~/appdir/ python -m pip install uwsgi vim hello.py (下記スクリプトを記入) def application(env, start_response): start_response('200 OK', [('Content-Type','text/html')]) return [b"Hello World"]

vim uwsgi.ini (下記を記入) [uwsgi] socket = 127.0.0.1:3031 chdir = /home/ubuntu/appdir/pyenv/ wsgi-file = hello.py processes = 4 threads = 2 stats = 127.0.0.1:9191

uwsgi uwsgi.ini(ターミナルに処理が戻ってこなくなる)

実行してみる

ローカルブラウザから http://localhost:8080/にアクセスして Hello World が表示されれば成功

>> 続き|vagrant + ubuntu(16.04 LTS)内のuwsgiをsystemdで自動起動する