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"]
FROM python:3.9
: Python 3.9の公式Dockerイメージをベースにしています。これにより、Pythonの実行環境がDockerコンテナ内に構築されます。WORKDIR /usr/src/app
: 作業ディレクトリを/usr/src/app
に設定します。これは後続のコマンドがこのディレクトリ内で実行されることを意味します。COPY requirements.txt ./
: ローカルのrequirements.txt
ファイルをコンテナ内の作業ディレクトリにコピーします。これにより、Pythonパッケージの依存関係をインストールするために使用されます。RUN pip install --no-cache-dir -r requirements.txt
:requirements.txt
に記載されているPythonパッケージの依存関係を、pip
を使用してインストールします。--no-cache-dir
オプションは、パッケージのキャッシュを無効にし、ビルドをより軽量化します。COPY app/ .
: ローカルのapp/
ディレクトリの内容をコンテナ内の作業ディレクトリにコピーします。これには、Flaskアプリケーションのソースコードやその他の必要なファイルが含まれています。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/;
}
# その他の必要な設定をここに追加することができます
}
proxy_pass
ディレクティブでは、Flaskアプリケーションへのリバースプロキシが設定されています。proxy_redirect off
ディレクティブは、リバースプロキシによるリダイレクトの無効化を行います。proxy_set_header
ディレクティブは、リバースプロキシで使用されるヘッダーを設定します。これにより、正しいクライアントIPアドレスやプロトコルが渡されます。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!'