このサイトはアドセンスやアフィリエイト広告を利用しています

Conoha python 開発

Conoha VPSでDockerとPythonのFlask+MySQL+Nginx+uWSGIでアプリを公開する方法

Conoha VPSでPythonアプリを公開したい!簡単なwebサイトを実装したい!っていう人はPython+Flaskを利用すると思います。そこで、今回はFlaskの公開でプラスアルファMySQLもセットで実装しちゃおうと思います

現在記事を作成中 ある程度知識のある人ならここまででも行けると思う

Nginxを設定する方法だけを知りたい人は

NginxとはWebサーバ・ソフトウェアだけどuWSGIってなに?

uWSGI 英語圏だとユーウィズィーって発音してました。さて、これを何に使うかというと、PythonのフレームワークであるFlaskやDjangoとwebサーバー間の通信処理をしてくれるツールです。なくてもPythonアプリは動くのですが、かかったり、処理が多くなるとuWSGIがないと処理しきれなくなってしまいます。簡単に言えば、PythonのFlaskやDjangoが高負荷でも問題なく処理してくれるツールだと思えばいい感じですね

あとから、負荷対策するよりも、初心者のうちに負荷対策の知識をやっといたほうが、らくだと思いますのでこの設定も行っていきます。

Flaskってなに?動的なサイトを簡単に作れるPythonのフレームワーク

詳しい説明は省きますが、FlaskはJinja2というテンプレートエンジンを使って、動的なウェブページを作成することができます。

例えば、LinkedInやReddit、Pinterestなどのサイトが一部をFlaskを利用しています。同じようなデザインのページを1つのデザインで使いまわして表示させたりできます。

たとえば、ニュースサイトでTOPページと記事の詳細ページのテンプレートを作成し、詳細ページはデータベースからタイトルとニュース内容を記事に表示させるといった感じです。

この構成だとTOPページと記事詳細ページだけの2つのデザインを作ればあとは自動更新で何百といったニュースの記事でも表示が可能です。

私はこの本1冊で勉強できました

データベースはMySQL オープンソースで入門テキストでよく採用される

Flaskは動的サイトに便利なので、動的な内容丹必要な情報をどこに保存するか?ってなりますよね。だからデータベース保存します。私は最初はテキストファイルに保存して、それを読み込んだりしてました。でもせっかくConoha VPSを借りたので、DBを使っていきましょう

データベースを管理するツールRDBMのMySQLはほとんどの人が名前を聞いたことあると思います。超メジャーでOracle者のサービス。データベースの入門の本とか、だいたいMySQLが使われているから、メジャーなやつから覚えていく。SQLの書き方などで使った本はこれ。めっちゃわかりやすい

独自ドメインの設定とSSLの設定も行います

せっかくなので、作ったアプリを公開するため、独自ドメインの設定も行っていきます。SSL証明書の設定にもトライしていきます。

docker-composeでMySQLとFlaskとNginxの基本設定をする

Docker composeを使って、MySQLとNginxとFlaskの基本設定を行うためのDocker-composeのymlファイル構成

services:
  mysql:
    image: mysql:latest
    restart: always
    environment:
      MYSQL_ROOT_PASSWORD: ルートパスワード
      MYSQL_DATABASE: DB名
      MYSQL_USER: ユーザー名
      MYSQL_PASSWORD: ユーザーパスワード
    ports:
      - "3306:3306"
    volumes:
      - ./mysql_data:/var/lib/mysql

  flask:
    build: 
      context: ./app
    restart: always
    environment:
      MYSQL_HOST: mysql
      MYSQL_PORT: 3306
      MYSQL_USER: ユーザー名
      MYSQL_PASSWORD: ユーザーパスワード
      MYSQL_DB: DB名

  uwsgi:
    build:
      context: ./app
    restart: always
    environment:
      MYSQL_HOST: mysql
      MYSQL_PORT: 3306
      MYSQL_USER: ユーザー名
      MYSQL_PASSWORD: ユーザーパスワード
      MYSQL_DB: DB名

  nginx:
    image: nginx:latest
    ports:
      - "80:80"
    volumes:
      - ./nginx/conf:/etc/nginx/conf.d
      - /srv/test/my_flask_app:/var/www/html
    depends_on:
      - uwsgi

MySQLのDB名、ユーザー名、ユーザーパスワードを入力するところがそれぞれ丹箇所ありますが、同じものを入力してください

DockerFileでPythonの設定とパッケージの管理

DockerFileは自分専用のコンテナイメージを作成するファイルです。このファイルをDocker compose内で指定すると、docker composeが実行されたときにコンテナが作成され、docker pomposeをdownして終了させるとコンテナが破棄されます。

わかりやすく言うと、今回使うpythonのインストールと実行と必要な設定を行うためのコンテナイメージです

パッケージの管理はrequirements.txtというファイルで一括インストールする設定を書きます

# ベースイメージを指定
FROM python:3.9

# ワーキングディレクトリを設定
WORKDIR /app

# 依存関係をインストール
COPY requirements.txt requirements.txt
RUN pip install --no-cache-dir -r requirements.txt

# Flaskアプリケーションのソースコードをコピー
COPY . .

# uWSGIをインストール
RUN pip install uwsgi

# uWSGIの設定ファイルをコピー
COPY uwsgi.ini /etc/uwsgi.ini

# FlaskアプリケーションをuWSGIサーバーで実行
CMD ["uwsgi", "--ini", "/etc/uwsgi.ini"]
  1. FROM python:3.9: Python 3.9の公式Dockerイメージをベースにしています。これにより、Pythonの実行環境がDockerコンテナ内に構築されます。
  2. WORKDIR /usr/src/app: 作業ディレクトリを/usr/src/appに設定します。これは後続のコマンドがこのディレクトリ内で実行されることを意味します。
  3. COPY requirements.txt ./: ローカルのrequirements.txtファイルをコンテナ内の作業ディレクトリにコピーします。これにより、Pythonパッケージの依存関係をインストールするために使用されます。
  4. RUN pip install --no-cache-dir -r requirements.txt: requirements.txtに記載されているPythonパッケージの依存関係を、pipを使用してインストールします。--no-cache-dirオプションは、パッケージのキャッシュを無効にし、ビルドをより軽量化します。
  5. COPY app/ .: ローカルのapp/ディレクトリの内容をコンテナ内の作業ディレクトリにコピーします。これには、Flaskアプリケーションのソースコードやその他の必要なファイルが含まれています。
  6. CMD ["python", "./app.py"]: コンテナが起動されたときに実行されるデフォルトのコマンドを指定します。この場合、pythonコマンドを使用してapp.pyスクリプトを実行します。

requirements.txtファイルを作成して書くパッケージを設定

pip コマンドでインストールしたいやつを設定、今回はFlaskをつかって、MySQLのデータベースにアクセスしたいので以下3つを設定

requirements.txtファイル

Flask==2.0.2
mysql-connector-python==8.0.28
uwsgi==2.0.19.1

Nginxの設定ファイル

server {
    listen 80;
    server_name sample.com 111.222.333.4;

    location / {
        # Flaskアプリケーションへのリバースプロキシ設定
        proxy_pass http://flask:5000;
        proxy_redirect off;
        proxy_set_header Host $http_host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }

    location /static {
        # Flaskアプリケーションの静的ファイルへのパス設定
        alias /usr/src/app/static/;
    }

    # その他の必要な設定をここに追加することができます
}
  1. proxy_pass ディレクティブでは、Flaskアプリケーションへのリバースプロキシが設定されています。
  2. proxy_redirect off ディレクティブは、リバースプロキシによるリダイレクトの無効化を行います。
  3. proxy_set_header ディレクティブは、リバースプロキシで使用されるヘッダーを設定します。これにより、正しいクライアントIPアドレスやプロトコルが渡されます。
  4. location /static ブロックでは、Flaskアプリケーションの静的ファイルへのパスが設定されています。必要に応じて、静的ファイルのサーブ設定を追加してください。

uWSGIの設定ファイル

uwsgi.ini

# uWSGI用の設定ファイル

[uwsgi]
module = app:app
socket = :5000
master = true
processes = 4
threads = 2

MySQLサーバにアクセスする方法

docker-composeのymlファイルがあるフォルダで以下を実行すれば、MySQLサーバにアクセスできます

docker-compose exec mysql mysql -u ユーザー名 -p -h localhost -P 3306

設定ファイルやシェルスクリプトを使用して、MySQLサーバーにアクセスするショートカットを作成

まず、シェルスクリプトファイル(例:mysql_access.sh)を作成します。

#!/bin/bash

docker-compose exec mysql mysql -u ユーザー名 -p -h localhost -P 3306

次に、このファイルに実行権限を与えます。

chmod +x mysql_access.sh
./mysql_access.sh

FlaskアプリのHello Worldの簡単なファイル

__init__.pyとapp.pyの両方のファイル作成します。

app.py

from app import app

if __name__ == '__main__':
    # アプリケーションを実行
    app.run()

__init__.py

from flask import Flask

# Flaskアプリケーションのインスタンスを作成
app = Flask(__name__)

# アプリケーションのルートURLに関連するルート
@app.route('/')
def hello():
    return 'Hello, World!'

-Conoha, python, 開発
-