apache + phpみたいな感じでいけるのかと思っていたら、 思っていたよりもいろいろあったのでメモ
apache + phpとの違い
apacheにはphpの実行モジュールが存在し、それがphpを実行してくれている。 ほぼデフォルト設定でこれらが動作するようになっていたので、 apacheをインストールしてブラウザからphpスクリプトへアクセスすれば、 apacheがphpを実行して結果をブラウザへ返してくれていた。
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スクリプトを実行)
環境構築手順
vagrantでubuntu(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 が表示されれば成功