SEワンタンの独学備忘録

IT関連の独学した内容や資格試験に対する取り組みの備忘録

【Python】CentOS7サーバ上にFlask+Nginx+Nginx UnitでWebアプリを構築する

おきまりのハローさせるところまで。

前提と今回の構築イメージ

f:id:wantanBlog:20200404220034p:plain

VirtualBox上のCentOS7にNginx、Nginx Unit、Flaskなどすべてをインストールして構築する。

今回の手順は特にpython3.6がインストールされていることは必要条件です。別のバージョンとかだと少し手順が変わる部分があると思います。
また現状、普通の設定ではpyenvはうまく使用できないようです。

Flask

Flaskとは

Flask(フラスク)は、プログラミング言語Python用の、軽量なウェブアプリケーションフレームワークである。標準で提供する機能を最小限に保っているため、自身を「マイクロフレームワーク」と呼んでいる。Werkzeug WSGIツールキットとJinja2テンプレートエンジンを基に作られている。BSDライセンスで公開されている。

引用元:Flask - Wikipedia

Pythonのフレームワークです。
Pythonのフレームワークでいうと他に有名どころにはDjangoが存在しますが、そちらと比較すると軽量さがウリになっているようです。

Flaskでもカスタマイズは様々なカスタマイズは可能なようですが、補助機能などの面では劣るようです。

本格的なWebアプリの構築をやるつもりならDjangoを学ぶべきという意見も見ましたが、インストールから画面返却(ハローワールド)を実装するまでのスピード感からWebアプリを作りこむ以外の、例えば今回の私のように環境構築を行うこと自体を目的としてちょこっとWebアプリを構築してみたいような場合には最適と言えるでしょう。


また、Webアプリを作りこんでいく場合には、開発生産性の観点から統合開発環境(IDE)を導入するのは必須でしょう。今回はほんとに軽く作るだけなのでなしでいきます。
目的に応じて、そこは参考にしない方がよいでしょう


Flaskのインストール

インストール

Flaskのインストールはpipにより行います。

pipの更新をしていない場合には以下のコマンドで更新をしておきましょう。

pip install --upgrade pip

以下、私の環境で使用できるpipを使用しますが、適宜自身の環境で使用できるバージョンに読み替えてください。

pip install Flask

既にインストールされていました・・

python(Flask)実行ファイルの記述

Flaskを使用したpythonファイルを記述します。
プログラミング系の記事ではないのでここではあっさりと。

・main.py

from flask import Flask

application = Flask(__name__)

#default
@application.route('/')
def index():
    print('test')
    return "Hello Flask"

注意点としてはappは「application」と記述するところのみ。

Nginx unit

ちょっと調べるまではNginxFlaskで構築できると思っていました。
Nginxはあくまでwebサーバなので、リクエストに対してプログラムを実行するためにはAPサーバにあたる機能が必要となります。

NginxFlaskという組み合わせの場合にはuwsgiを使用するのも一般的みたいですが、今回はwebサーバとしてNginx unitを使用します。

日本語版の公式ドキュメントがありますのでそちらかなり参考になります。
インストレーション — NGINX Unit 日本語訳

Nginx unitのインストール

まずはインストールだけ済ましてしまいます。

・リポジトリ情報の登録

vim /etc/yum.repos.d/unit.repo

↓ファイルの中身

[unit]
name=unit repo
baseurl=https://packages.nginx.org/unit/centos/$releasever/$basearch/
gpgcheck=0
enabled=1

・インストールの実行

yum install unit

そのほかに必要とされるものもインストール。
言語ごとに必要なモジュールかなんかですかね?

yum install unit-devel unit-go unit-jsc8 unit-php unit-perl unit-python unit-python36

最後に自動起動設定だけやっておきます。

systemctl enable unit

Nginx Unitの設定

少し複雑になってきます。

Nginx Unit(以下、Unit)の起動

・Unitの起動
ひとまず何も設定せずに起動します。

systemctl start unit

・Unitの状態確認
「Active: active (running) 」になっていれば起動しています。

systemctl status unit

↓表示結果

● unit.service - NGINX Unit
Loaded: loaded (/usr/lib/systemd/system/unit.service; enabled; vendor preset: disabled)
Active: active (running) since 土 2020-04-04 00:43:32 JST; 6s ago
Main PID: 6455 (unitd)
Tasks: 3
CGroup: /system.slice/unit.service
tq6455 unit: main v1.16.0 [/usr/sbin/unitd --log /var/log/unit/uni...
tq6465 unit: controller
mq6466 unit: router

4月 04 00:43:32 localhost.localdomain systemd[1]: Started NGINX Unit.
4月 04 00:43:32 localhost.localdomain unitd[6455]: 2020/04/04 00:43:32 [inf...
Hint: Some lines were ellipsized, use -l to show in full.

ディレクトリ構成の構築

ディレクトリ構成は決まっているわけではないみたいなので、以下はあくまで例です。

・ディレクトリ構成の表示

tree /usr/share/nginx/

f:id:wantanBlog:20200404032125p:plain

/usr/share/nginx/」まではインストールした時点で構成されているはずです。

app以下に実行するアプリを配置します。
※配置場所は後から指定するのでどこでもかまいません。
今回の場合は前述のmain.pyを配置します。

conf.jsonについては後述します。

実行アプリケーションの設定

Nginx Unitでは実行するアプリケーションをコントロール ソケットと言われる control.unit.sock に設定します。

設定についてはlistenersapplicationsがあります。
以下のようなイメージです。公式などから概要図などが取得できなかったのであくまで私のイメージになるので実態とは異なる可能性もあります。

f:id:wantanBlog:20200404173854p:plain

まずは設定を行うためのファイルを用意します。適当な場所に配置します。

・conf.json

{
  "listeners": {
    "*:8081": {
      "application": "flask_sample"
    }
  },

  "applications": {
    "flask_sample": {
      "type": "python",
      "path": "/usr/share/nginx/app/sample/",
      "module": "main"
    }
  }
}

listenersには任意のポート番号を指定します。ここでポート番号とapplicationを紐づけます。
次にapplicationsについて、まずは任意の名前を設定し以下のように設定します。
typeには使用する言語
pathにはアプリを配置する場所
moduleには実行するファイル名を指定

他にもいくつかの設定項目が存在します。
pathにはフルパスで表記する以外の方法もあるみたいですが、いまいちわかりませんでした。

・設定のPUT

ファイルに記述した設定の内容をソケットへPUTします。

sudo curl -X PUT --data-binary @/usr/share/nginx/conf.json --unix-socket /var/run/unit/control.sock http://localhost/config

ここのPUTはエラーがでて結構躓きやすいです。
うまくいかない場合は設定ファイルのJSON形式をよく確認したり他の原因なども調べてみましょう。

PUTが成功したら起動中のNginx Unitに反映されているはずなので確認します。

systemctl status unit

unitに設定したアプリケーションが追加されていれば成功です。

1269 unit: "flask_sample" application

Nginxの設定

nginx.confの設定

・設定ファイルのバックアップ
どうにもならなくなった場合に備えて、コピーしてバックアップしておきます。

cp /etc/nginx/nginx.conf /etc/nginx/nginx.conf.old

・設定の追記
APサーバとしてNginx Unitを使用する場合の追記を行っておきます。

vim /etc/nginx/nginx.conf

http{}の中に以下の内容を追記します。

    upstream unit_backend {
        server 127.0.0.1:8300;
    }
nginx.confの設定

/etc/nginx/conf.d/」には先ほど記述した「nginx.conf」から読み込むファイルを配置します。
新たに「.conf」ファイルを作成してもよいですが今回はデフォルトのファイルに追記を行います。

・設定ファイルのバックアップ
こちらも一応コピーしておきます。

cp /etc/nginx/conf.d/default.conf /etc/nginx/conf.d/default.conf.old

・設定の追記

vim /etc/nginx/conf.d/default.conf

server{}内に以下のような記述を追記します。

    location /sample/ {
        proxy_pass http://127.0.0.1:8081/;
    }

location 」には接続する際のURLのホスト以下を記述します。
proxy_pass」にはさきほどNginx UnitでたてたAPサーバに接続するようにします。
今回はポートを指定する。

ここまで設定ができたら「Nginx」の再読み込みを行います。
サービス自体を再起動しなくても以下のコマンドで再読み込みできます。

nginx -s reload
ブラウザから疎通確認

設定が完了したのでブラウザから疎通確認を行います。

私の場合は以下のURLです。

http://localhost:8080/sample/

f:id:wantanBlog:20200404213836p:plain

できたぁ!!!



ーーーーーーー

疲れたのでここまで。
結構苦労したのでつまったところで別途記事作成予定。