備忘録

なんとなく暇なときにでも....

Vagrant+Flaskでローカル開発環境を構築する。続き

おつかれさまです。
先日の記事でローカルの環境(Vagrant)でFlaskを動作させるところまでいきました。 hchckeeer.hatenadiary.jp なんとかHello Worldを表示させることができるようになりましたが、なんか違和感が。やっぱりapachepythonを動作させたい。

そこでいろいろ調べて、いろいろやってみた結果なんとかできるようになったので、本日はそれについての備忘録です。

主に参考にしたのはこちらです。↓
http://terokarvinen.com/2016/deploy-flask-python3-on-apache2-ubuntu
前回はcentosを使ってましたが、復習も兼ねて最初からubuntu14.04で環境構築をしました。

環境構築
まずは環境構築。

// boxを追加 ~ vagrant ssh
$ vagrant box add ubuntu14.04 https://cloud-images.ubuntu.com/vagrant/trusty/current/trusty-server-cloudimg-amd64-vagrant-disk1.box
$ vagrant init
$ vagrant up
$ vagrant ssh

vagrant upする前に、前回設定したようにVagrantfileでポートフォワーディングの設定を行っておきます。

config.vm.network "forwarded_port", guest: 5000, host: 8080


仮想環境に接続したら、python3など必要なツールやライブラリをインストールします。

$ sudo apt-get update
$ sudo apt-get -y install python3 ipython3 python3-flask curl

次に、プロジェクトを作成します。

$ pwd
/home/vagrant/
$ mkdir flask && cd flask

ここで、test_flask.pyを作成・編集します。

from flask import Flask
app = Flask(__name__)

@app.route('/')
def hello_world():
 return 'Hello Word!\n\n'

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

ここは前回までと同様ですので、python3 test_flask.pyでサーバーをスタートさせ、ブラウザで127.0.0.1:8080で入力したら、Hello Worldが表示されると思います。

本題はここからです。apacheでflaskを動作させます。 Apacheのインストール

$ sudo apt-get -y install apache2

そして、pythonapache上で動作させるために必要なmod_wsgiをインストールします。

mod_wsgiとは、WSGI (Web Server Gateway Interface) インターフェースに準拠した PythonのプログラムをApache HTTP Serverで動作させるためのモジュールである。*1

$ sudo apt-get -y install libapache2-mod-wsgi-py3

新しくバーチャルホストを作成

$ sudo vi /etc/apache2/sites-available/flask-main.conf
## /etc/apache2/sites-available/flask-main.conf

LoadModule wsgi_module modules/mod_wsgi.so
WSGISocketPrefix /var/run/wsgi

<VirtualHost *>
 ServerName flaskdev.jp

 WSGIDaemonProcess flaskdev.jp user=vagrant group=vagrant threads=5
 WSGIScriptAlias / /home/vagrant/flask/test_flask.wsgi
 WSGIScriptReloading On

<Directory /home/vagrant/flask/>
 WSGIProcessGroup flaskdev.jp
 WSGIApplicationGroup %{GLOBAL}
 Require all granted
</Directory>

</VirtualHost>

以下のサイトによりますと、
Apache+mod_wsgi+Flaskインストール | Zafiel

WSGIDaemonProcess example.com user=apache group=apache threads=5
のuserとgroupはきちんと指定しましょう。
指定し忘れると怒られます。
WSGIDaemonProcess example.com

WSGIProcessGroup example.com
の太字部分は合わせましょう。でないと
No WSGI daemon process called ‘ほにゃらら’

となるらしいので注意します。
また不必要なバーチャルの設定をOFF、今作成したバーチャルホストの設定を有効化、apacheを再起動します。

$ sudo a2dissite 000-default.conf
$ sudo a2ensite test-flask.conf
$ sudo service apache2 restart

このままだとおそらく以下のようなWarningが出るかもしれません。

Could not reliably determine the server's fully qualified domain name, using 127.0.0.1 Set the 'ServerName' directive globally to suppress this message

hostsに指定されたIPを登録しておきます。

$ sudo vi /etc/hosts 
{指定されたIP} flaskdev.jp #←これを追加

再度apacheを再起動したら、解決されるかと。
先ほどのconfファイルのWSGIScriptAliasで指定した場所(/home/vagrant/flask/)にファイル(test_flask.wsgi)を作成します。

//   /home/vagrant/flask/test_flask.wsgi

import sys

if sys.version_info[0]<3:       # require python3
 raise Exception("Python3 required! Current (wrong) version: '%s'" % sys.version_info)

sys.path.insert(0, '/home/vagrant/flask/')
from moi import app as application

apacheを再度再起動します。これで仮想環境での設定は完了です。
この段階で(python3 test_flask.pyをしてなくても )仮想環境でcurlを叩けば、レスポンスが返ってきております。

$ curl localhost
Hello World
$ curl -sI localhost|grep Server
Server: Apache/2.4.7 (Ubuntu)

ローカルの設定
必要なことは仮想環境のパプリックIPを設定し、そのIPをブラウザをみればHello Worldが表示されるはずです。
Vagrantfileを編集してIPを固定します。

# config.vm.network "private_network", ip: "192.168.33.10"
↓
config.vm.network "private_network", ip: "192.168.33.10"

vagrant restartして、ブラウザで192.168.33.10を入力すれば、Hello Worldが表示されるかと。
f:id:tomAn:20160806192758p:plain
ちなみに192.168.33.10などのように入力するのはカッコ悪いみたいな方は、Vagrantfileを編集して、ホストネームを設定します。

  config.vm.hostname = "flaskdev.jp"

ローカルのマシンにて

$ sudo vi /etc/hosts

192.168.33.10 flaskdev.jpを追加すればflaskdev.jpを入力すればいけると思います。
f:id:tomAn:20160806192833p:plain
本日はここまで。

参考

zafiel.wingall.com
Deploy Flask & Python3 on Apache2 & Ubuntu | Tero Karvinen

http://www.tomiryu.com/web/apache-client-denied-by-server-configuration/
http://www.tomiryu.com/web/apache-client-denied-by-server-configuration/

Vagrantのネットワーク周りのあれこれ - Septeni Engineer's Blog
http://qiita.com/K-N/items/a597b684562e5b1da6a5
vagrant使うときのipアドレスを自分の好きなようにカスタマイズ! – webネイティブな僕達

*1:Wikipediaより