AWS(EC2)-Ubuntu18.04 + flask + uWSGI + nginxでWebサーバー構築・mecabの走らせ方
1.環境作成
①まずは普通にAWS(EC2)を使って、Ubuntu18.04環境を作る。※新規作成時、キーペア(秘密鍵)の作成有無を聞かれるので作っておく。
②Ubuntu18.04が載ったAWS(EC2)が作れたので、適宜自分のPCのwindowsなら「コマンドプロンプト」や「Tera Term」などからssh接続する。ファイル送受信などがGUIで出来ることも考えれば、自分としては「Tera Term」が楽で吉かと。
「OK」を押し、次の画面で①で作ったキーペア(秘密鍵)を聞かれるので、キーペア(.pem)のファイルのディレクトリを選択して、AWS-Ubuntu18.04環境にログインする。
③ログイン出来たら、とりあえずは初めての更新作業として、
$ sudo apt update $ sudo apt upgrade
※何か聞かれたら「y」でyesする。
④諸々をインストールする。pipと仮想環境作成のためのvenvとdev。
$ sudo apt install python3-pip python3-venv python3-dev
⑤さらに今回の肝のひとつであるnginxをインストールする。
sudo apt install nginx
⑥"myapp"フォルダ内にvenvで仮想環境(env)を作成後、それをアクティブにした後、pipでuwsgiとflaskをインストール。さらに、今回はmecabをインストールする。
$ mkdir ~/myapp; cd ~/myapp $ python3 -m venv env $ source env/bin/activate (env) $ pip install flask (env) $ pip install uwsgi (env) $ sudo apt install aptitude (env) $ sudo aptitude install mecab libmecab-dev mecab-ipadic-utf8 git make curl xz-utils file -y (env) $ pip install mecab-python3==0.7
2.必要となる各種ファイルの作成
①メインの動きを実装したflaskアプリを server.py として、以下のディレクトリに作成する。vimエディタ等々を使って作成すればよい。
~/myapp/server.py
# -*- coding: utf-8 -*- from flask import Flask , render_template import sys sys.path.append("/home/ubuntu/env/lib/python3.6/site-packages") import MeCab app = Flask(__name__) @app.route("/") def hello(): txt = 'すもももももももものうち' m = MeCab.Tagger('-Owakati') result = m.parse(txt) return render_template('index.html', input_from_python = result) if __name__ == "__main__": app.run(host='0.0.0.0')
ここで、mkdirで"templates"というflaskが参照するhtmlファイル用置き場のフォルダを作る。その中に"index.html"を新規作成し配置。
(env) $ cd myapp (env) $ mkdir templates (env) $ cd templates (env) $ nano index.html
~/myapp/templates/index.html
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>This is sample site</title> </head> <body> <h1> This is test-site! </h1> <script type="text/javascript"> data = {{ input_from_python | tojson }}; document.write(data); </script> </body> </html>
同様に、wsgi.pyを作成。
~/myapp/wsgi.py
from server import app if __name__ == "__main__": app.run()
②uwsgiの設定ファイル server.ini を作成する。
~/myapp/server.ini
[uwsgi] module = wsgi:app master = true processes = 1 socket = server.sock chmod-socket = 666 vacuum = true die-on-term = true touch-reload = server.py
③連携させるためのファイル myapp.service を作成する。コマンドは、
$ sudo nano /etc/systemd/system/myapp.service
とし、内容を以下のとおりにする。
/etc/systemd/system/myapp.service
[Unit] Description=uWSGI instance to serve myapp After=network.target [Service] User=ubuntu Group=www-data WorkingDirectory=/home/ubuntu/myapp Environment="PATH=/home/ubuntu/myapp/env/bin" ExecStart=/home/ubuntu/myapp/env/bin/uwsgi --ini server.ini [Install] WantedBy=multi-user.target
3.サービスの起動
$ sudo systemctl start myapp $ sudo systemctl enable myapp # 自動起動 $ sudo systemctl status myapp # 確認 $ sudo systemctl restart myapp #再起動したいときはこれ
4.プロキシ設定
プロキシ設定のためのファイル"myapp"を作成する。コマンドはこれ。
sudo nano /etc/nginx/sites-available/myapp
以下をファイル内に記述する。
server { listen 80; server_name $hostname 0.0.0.0; location / { include uwsgi_params; uwsgi_pass unix:/home/ubuntu/myapp/server.sock; } }
そして、以下を実行する
$ sudo ln -s /etc/nginx/sites-available/myapp /etc/nginx/sites-enabled $ sudo nginx -t # 確認 $ sudo systemctl restart nginx # 再起動
5.動作確認
curl で試しにアクセスしてみる。
$ curl "http://0.0.0.0"
図のような応答が返ってこればOK!!
今回は 0.0.0.0としたが、使用しているAWS(EC2)のパブリック IPv4 アドレス(x.x.x.x)を指定してそのような設定に各種変更してやれば、世界中どこからでもブラウザでアクセスできるのは勿論。以下の図がその時の例。というわけで、取り合えず完了。