LoginSignup
62

More than 5 years have passed since last update.

Ubuntu 14.04 LTSでvenvを利用して速攻でPython3.4 + Nginx + uWSGI + FlaskなWebアプリケーション実行環境を作る

Last updated at Posted at 2014-04-20

Ubuntu 12.04でpyenvを利用して速攻でPython3.4 + Nginx + uWSGI + FlaskなWebアプリケーション実行環境を作る
http://qiita.com/5t111111/items/e170fead91261621b054

この14.04版ではpyenv依存をやめてvenvだけを使うようにしています。

登場人物

  • ぼく
    去年まで女子校だった私立高校に通う普通の高校生。人間が嫌い。これ以降登場しない。
  • Ubuntu
    Linuxらしいが、よく知らない。
  • venv
    Pythonの実行環境を切り替えるやつ。標準でついてくるようになったらしいが、よく知らない。
  • Nginx
    Webサーバーらしいが、よく知らない。
  • uWSGI
    WSGIサーバーらしいが、何のことか分からない。そもそもWSGIを知らない。
  • Flask
    Webアプリケーションを気軽に作れる軽量のフレームワークらしいが、よく知らない。

Nginxのインストール

Nginxのstableリポジトリを追加

$ sudo add-apt-repository ppa:nginx/stable

いつものupdate/upgrade

$ sudo apt-get update
$ sudo apt-get upgrade

Nginxのインストールと起動

$ sudo apt-get install nginx
$ sudo /etc/init.d/nginx start

ブラウザで接続し、Nginxのgreetingsページが表示されることを確認する。

スクリーンショット 2014-04-19 23.55.07.png

flaskサンプルアプリケーションの構築

アプリケーションのディレクトリを作成

アプリケーションのディレクトリを作成。
アプリケーションの関連ファイルは、venv仮想環境を含めすべてこの中に格納する。

$ sudo mkdir -p /var/www/demoapp

ユーザー権限がrootのままだとあれなので、自分の利用しているユーザーに変更しておく

$ sudo chown -R username:username /var/www/demoapp/

サンプルアプリケーション用のvenvの作成

残念ながら現在、Python 3.4でvenvの作成はうまくいかないみたいです。
http://qiita.com/5t111111/items/1643ba04104e75589ad4

なので、--without-pipオプションを付けてvenvを作ってから、手動でpipをインストールする必要があります。

$ pyvenv-3.4 --without-pip /var/www/demoapp/venv
$ source /var/www/demoapp/venv/bin/activate
$ mkdir ~/src
$ cd ~/src
$ curl -O https://pypi.python.org/packages/source/s/setuptools/setuptools-3.4.4.tar.gz
$ tar xvfz setuptools-3.4.4.tar.gz
$ cd setuptools-3.4.4/
$ python setup.py install
$ cd ..
$ curl -O https://pypi.python.org/packages/source/p/pip/pip-1.5.4.tar.gz
$ tar xvfz pip-1.5.4.tar.gz
$ cd pip-1.5.4/
$ python setup.py install

Flaskのインストール

venvの有効化

$ source /var/www/demoapp/venv/bin/activate

Flaskのインストール

$ pip install flask

Flaskアプリケーションの作成

/var/www/demoapp/hello.pyを作成。

from flask import Flask
app = Flask(__name__)

@app.route("/")
def hello():
    return "Hello World!"

if __name__ == "__main__":
    app.run(host='0.0.0.0', port=8080)

flaskアプリケーションの起動テスト

venvを有効にした状態で。

$ python /var/www/demoapp/hello.py

webブラウザでサーバーのポート:8080に接続し確認。
スクリーンショット 2014-04-19 23.55.19.png

Nginxの設定

デフォルトのサイト設定(の、シンボリックリンク)を削除

$ sudo rm /etc/nginx/sites-enabled/default

サンプルアプリケーション用の設定ファイルを作成

/var/www/demoapp/demoapp_nginx.conf を作成

server {
    listen      80;
    server_name localhost;
    charset     utf-8;
    client_max_body_size 75M;

    location / { try_files $uri @yourapplication; }
    location @yourapplication {
        include uwsgi_params;
        uwsgi_pass unix:/var/www/demoapp/demoapp_uwsgi.sock;
    }
}

uWSGIサーバーはUNIXソケット or TCPでWebサーバーであるNginxと通信する。
上記の設定ではUNIXソケットでの通信を指定している。
uwsgi_pass unix:/var/www/demoapp/demoapp_uwsgi.sock;

Nginxの設定ファイルのディレクトリにシンボリックリンクを貼る

$ sudo ln -s /var/www/demoapp/demoapp_nginx.conf /etc/nginx/sites-enabled/

Nginxの再起動

$ sudo /etc/init.d/nginx restart

webブラウザでサーバーに接続し確認。
この時点では、uWSGIサーバーが起動していないため、このように"502 Bad Gateway"のエラーが出るはず。
スクリーンショット 2014-04-20 0.26.56.png

uWSGIのインストール

uWSGI用のvenv環境の構築

uWSGIはaptからもインストール可能だが、少々バージョンが古いのでpipで最新のものをインストールする。

uWSGIは今後複数アプリケーションで共用すると思うので、アプリケーション用のvenv内にインストールするのではなく別で用意するが、システムのPython環境は弄りたくないので、ここでは/opt以下にやはりvenvでuWSGI用の環境を作成する。

アプリケーション用の demoapp venvを有効化していたらdeactivateしておく。

$ deactivate

uWSGIのビルドに必要なパッケージのインストール

以下が必要になるのでインストールする。

  • Cコンパイラ
  • Python3ヘッダ
$ sudo apt-get install build-essential python3-dev

uWSGI用のvenv作成

/opt以下に作るのでrootで作業を行うが、気になる場合には別の場所や権限を変更しても構わない。
その場合は以下の設定でuWSGIバイナリのパスなどを修正する必要がある。

アプリケーション用のvenvを作ったときと同様に、通常の方法ではうまくいかないので、手動でpipのインストールを行う。(めんどい・・・)
以下は、アプリケーション用のvenvを作ったときのソースは残っているものとして手順を記載。

$ sudo -s
# pyvenv-3.4 --without-pip /opt/venv/uwsgi
# source /opt/venv/uwsgi/bin/activate
# cd ~/src
# cd setuptools-3.4.4/
# python setup.py install
# cd ..
# cd pip-1.5.4/
# python setup.py install

uWSGIのインストール

$ source /opt/venv/uwsgi/bin/activate
$ pip install uwsgi

uWSGIの設定

アプリケーションのuWSGI設定ファイルを作成する

/var/www/demoapp/demoapp_uwsgi.ini を作成

[uwsgi]
#application's base folder
base = /var/www/demoapp

#python module to import
app = hello
module = %(app)

#virtualenv folder
virtualenv = /var/www/demoapp/venv

pythonpath = %(base)

#socket file's location
socket = /var/www/demoapp/%n.sock

#permissions for the socket file
chmod-socket    = 666

#the variable that holds a flask application inside the module imported at line #6
callable = app

#location of log files
logto = /var/log/uwsgi/%n.log

ログ出力先ディレクトリの作成

$ sudo mkdir -p /var/log/uwsgi
$ sudo chown -R username:username /var/log/uwsgi

uWSGIの起動

$ uwsgi --ini /var/www/demoapp/demoapp_uwsgi.ini

webブラウザでサーバーに接続し確認。
NginxとuWSGIが問題なくソケット通信できていれば、Hello World!が表示される。
スクリーンショット 2014-04-20 11.05.01.png

uWSGI Emperor

uWSGI EmperorはuWSGIの設定ファイルを読み込んでuWSGIプロセスを起動する機能。
複数の設定を読み込みプロセス起動を一括管理することができる。

Upstartファイルの作成

/etc/init/uwsgi.conf を作成

description "uWSGI"
start on runlevel [2345]
stop on runlevel [06]
respawn

env UWSGI=/opt/venv/uwsgi/bin/uwsgi
env LOGTO=/var/log/uwsgi/emperor.log

exec $UWSGI --master --emperor /etc/uwsgi/vassals --die-on-term --uid www-data --gid www-data --logto $LOGTO

上記の最後の行は、/etc/uwsgi/vassalsに存在する設定ファイルを探しuWSGIデーモンを起動することを意味しているので、
サンプルアプリケーションのuWSGI設置ファイルへのシンボリックリンクを/etc/uwsgi/vassalsに作成。

$ sudo mkdir -p /etc/uwsgi/vassals
$ sudo ln -s /var/www/demoapp/demoapp_uwsgi.ini /etc/uwsgi/vassals

権限の設定

uWSGIデーモンをwww-dataユーザーで起動する設定としている。
したがって、アプリケーションとログのディレクトリのオーナーをwww-dataにしておく。

$ sudo chown -R www-data:www-data /var/www/demoapp/
$ sudo chown -R www-data:www-data /var/log/uwsgi/

NginxとuWSGIが同一のwww-dataユーザーで動作するため、ソケットのパーミッションを644に変更しておく。

/var/www/demoapp/demoapp_uwsgi.ini を編集

...
#permissions for the socket file
chmod-socket = 644

uWSGIの起動

$ sudo start uwsgi

webブラウザでサーバーに接続し確認。
ここまですべて問題なければ、Hello World!が表示される。

終わりに

一応これでFlaskアプリケーションを動かせるところまではできました。
注意点というか突っ込みどころは色々あるかと思います。
特にNginxとuWSGIの周りは、それぞれのドキュメントやググって設定を詰めてください。

参考

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
62