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

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
が表示されれば成功

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

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です