LinuxのUbuntuサーバー環境でNginx+uWSGI+Flaskの環境構築をする手順

2020年11月22日

皆様おはこんばんにちは、せなです

本日はLinux環境での開発環境構築方法を解説致します

初めに

構築には以下を使用します

  • Nginx
  • uWSGI
  • Flask

初めて環境構築する方に向けて、簡単にそれぞれの役割を解説いたします。

Nginxはクライアントとのやり取りを行うWebサーバーの一つです
類似したWebサーバーにApacheがありますが、そちらと比較して多人数からの同時アクセス処理に優れているなどの特徴があります

uWSGIはPythonのWebアプリケーションをWebサーバーとやり取りさせるためのアプリケーションサーバーの一つです

PythonにはWSGIと呼ばれる規約が存在しており、規約に則った方法でWebサーバーとアプリケーションサーバー間でのやり取りを行います
詳しく知りたい方は下記のリンクを参照してください
リンク: PEP3333

FlaskはPythonの小規模開発でよく使用される、フレームワークの一つです
詳しくは以下の記事にまとめていますのでご確認ください。
リンク:Python初心者向けの小規模なフレームワーク「Flask」のインストールと簡単な使い方

構築準備

まずpipコマンドがインストールされていることを確認しましょう

pip3 -V

恐らく「pipコマンドが入っていないよ」とエラーが出るはずですので、以下のコマンドを使用してpipをインストールしましょう

sudo apt install python3-pip

念のためにpip3としておりますが、Python2系が入っていないならpipでも問題ないです

次にNginxのインストールを行います

sudo apt install nginx

これで正しくインストールされていれば以下のコマンドで「Active: active (running) 」と表示されます

# バージョン確認
nginx -V
sudo systemctl status nginx

次はuWSGIをインストールします
インストール時にCコンパイラが必要ですので「clang」もインストールします

sudo apt install clang
CC=`which clang` pip3 install uwsgi
sudo apt install uwsgi-plugin-python3 libpcre3 libpcre3-dev

最後にFlaskをインストールします

sudo pip3 install flask

これで準備は完了です
次は設定ファイルを変更していきましょう

Nginxの設定

Nginxの設定ファイルは「/etc/nginx/」配下に全て格納します
デフォルトでは「/etc/nginx/nginx.conf」に設定が記載されていますので、そのファイルを修正しましょう
以下のコマンドでファイルを開きます

sudo vi /etc/nginx/nginx.conf

その中から以下の記載を探してください

include /etc/nginx/conf.d/*.conf;
include /etc/nginx/sites-enabled/*;

「include /etc/nginx/sites-enabled/*;」については使用しないため、コメントアウトにします

include /etc/nginx/conf.d/*.conf;
# include /etc/nginx/sites-enabled/*;

次にファイルを作成しましょう
(ファイル名については任意の名前で大丈夫です)

sudo vi /etc/nginx/conf.d/default.conf
server {
    listen       80;

    location / {
        include uwsgi_params;
        uwsgi_pass unix:///usr/local/app/tmp/uwsgi.sock;
    }
}

簡単に行っていることを説明しておくと、listenで外部からのリクエストを受け付けるポートを指定
location内ではuWSGIのSoketと繋げています
(今は細かいことは気にせずにおまじない程度に考えておいてください)

uWSGIの設定

次にuWSGIの設定ファイルですが、ファイルを作成して以下を記載してください

sudo vi /etc/nginx/conf.d/uwsgi.conf
server {
  listen 5050;
  error_log  /var/log/nginx/error.log warn;

  location / {
    include uwsgi_params;
    uwsgi_pass unix:///usr/local/app/tmp/uwsgi.sock;
    uwsgi_ignore_client_abort on;
  }
}

Flaskの設定

最後にFlaskの設定を行いますが、初めにFlask用にディレクトリを作りましょう

sudo mkdir /usr/local/app

次にuwsgi起動のためにファイルを作成します

sudo vi /usr/local/app/uwsgi.ini
[uwsgi]
plugins-dir = /usr/lib/uwsgi/plugins
plugin = python38
chdir = /usr/local/app

# アプリケーションのベースフォルダ
base = /usr/local/app

# pythonモジュールのインポート
app = main
module = %(app)

# ソケットの場所
socket = /usr/local/app/tmp/uwsgi.sock
# ソケットの許可
chmod-socket = 666

# appの保持
callable = app

# ログの場所
logto = /var/log/uwsgi/%n.log


# 諸々の設定
master = true
processes = 10
vacuum = true
die-on-term = true
max-requests = 100
harakiri = 60

reload-mercy = 5
worker-reload-mercy = 5

ignore-sigpipe=true
ignore-write-errors=true
disable-write-exception=true

「plugin =」には環境内のpythonバージョンを指定しましょう
「Python3 -V」で確認できます
上記は、python3.8なので「python38」としています

次に以下のファイルに記載して、uwsgiをサービスに登録していきましょう

sudo vi /etc/systemd/system/uwsgi.service
[Unit]
Description=uWSGI instance to serve uwsgi
After=network.target

[Service]
User=root
Group=root
WorkingDirectory=/usr/local/app
Environment="LD_LIBRARY_PATH=/usr/lib"
ExecStart=/usr/bin/uwsgi  --ini uwsgi.ini

[Install]
WantedBy=multi-user.target

念のためパーミッションの変更を行います

sudo chmod 664 /etc/systemd/system/uwsgi.service

最後に自動起動で設定しておきます

sudo systemctl enable uwsgi
sudo systemctl restart uwsgi.service
sudo systemctl status uwsgi.service

ここでは「Active: active (running) 」と表示されなくても問題ありません

最後にFlaskのアプリケーションを作成しましょう

アプリケーションファイルの設置

インストールと設定は終わりましたので、最後にアプリケーションを配置しましょう

まずは、ディレクトリの作成と所有者などを変更しましょう

sudo mkdir -p /usr/local/app/tmp
sudo chmod 777 /usr/local/app
sudo chown root:root /usr/local/app
sudo mkdir /var/log/uwsgi
sudo chown root:root /var/log/uwsgi

後は、「main.py」と「index.html」を指定のディレクトリに作成します

sudo vi /usr/local/app/main.py
from flask import Flask,render_template

app = Flask(__name__)

@app.route('/')
def index():
    return render_template('index.html')

if __name__ == "__main__":
    app.run()
sudo vi /usr/local/app/templates/index.html
<html>
  <head>
    <title>sample</title>
    <body>
      <h1>Hello world!</h1>
    </body>
  </head>
</html>

以上で完了です
使用中のサーバー環境のIPアドレスにアクセスすれば「Hello World!」が表示されると思います

最後に

ここまでお読みいただきありがとうございます
最近Linuxサーバーを借りて開発環境を構築した際の備忘録となります

今回の記事がお役に立てたなら幸いです
ではでは~

雑記

Posted by sena