LIFE LOG(ここにはあなたのブログ名)

作業日誌 う靴

気ままにコンピュータ関連の備忘録などを書きます...。

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)を指定してそのような設定に各種変更してやれば、世界中どこからでもブラウザでアクセスできるのは勿論。以下の図がその時の例。というわけで、取り合えず完了。