ConoHa VPS

ConoHa VPSでFlaskアプリを公開する【CentOS9/Nginx/MySQL/uWSGI】

ConoHa VPSでFlaskアプリケーション公開したいんだけどできる?

やってみましょう!

この記事ではConoHa VPSでFlaskアプリケーションを公開するっていうことをやっていきます。

この記事でやること

  • ConoHa VPSでサーバーを立てる
  • Nginxのインストールと設定
  • MySQLのインストールと設定
  • ローカルのFlaskアプリケーションのアップロード
  • uWSGIの設定
  • ブラウザから確認

ConoHa VPSでFlaskアプリケーションを公開してみたい方は参考にしてみてください。OSはCentOSを使ってやります。

Dockerを使う場合

ConoHa VPSのDockerテンプレートを使って、DockerでFlaskアプリケーションを動かすっていうことは以下の記事でやったのでDocker使って公開したい方はよかったら以下をどうぞ。

ConoHa VPS

ConoHa VPSでDockerを使ってFlaskアプリを公開してみる

2022/12/12  

この記事ではConoHa VPSでDockerを使ってFlaskアプリケーションを公開するっていうことをやっていきます。 ConoHa VPSでDockerを使ってFlaskアプリケーションを公開した ...

今回はDockerは使わずにサーバーにコマンドでいろいろインストールしてやっていきます。

ConoHa VPSでFlaskアプリケーション公開してみましょう。

ConoHa VPSでサーバーを立てる

まだサーバーを立てていない場合は、サーバーを立てます。自分は既にあるのでそれを使ってやっていくことにしますが、参考までに新規で作成する場合の画面を載せておきます。(ConoHa VPSから申し込むと700円のクーポンがもらえるみたいです。)

  • サービス・・・VPS
  • 利用するきっぷ・・・新規購入(利用しなくてもいいが、3ヶ月以上利用するなら利用する方が安い)
  • 有効期間・・・どれぐらい利用するか
  • メモリ・・・1GB以上がおすすめ
  • イメージタイプ・・・今回はCentOS Stream9を使います。
  • rootパスワード・・・rootのパスワード
  • ネームタグ・・・管理画面に表示される立てたサーバー名

オプションで設定できる項目もいくつかあるけど、SSH Keyぐらいは設定しておくと後で接続する際に楽です。

サーバーを立てたらSSH接続して環境を整えていきますよ。

SSH接続する

コンソールも使えますが、それだとやりづらいのでSSH接続して作業するのがおすすめです。サーバー作成時にオプションで一緒にSSHキーを作成した場合は、その鍵のパーミッションを設定して接続しましょう。

$ mv 秘密鍵 /Users/〇〇/.ssh/
$ cd /Users/〇〇/.ssh/
$ chmod 600 秘密鍵
$ ssh -i 秘密鍵 root@ipアドレス

SSH接続については以下の記事で書いているので、迷ったらみてみてください。

ConoHa VPS

ConoHa VPSでSSH接続する方法とおすすめ設定を紹介します。

2022/8/2  

今回はそんなConoHa VPSでSSH接続する方法を書いていきたいと思います。 SSH接続する方法を見ていくんですが、後半ではセキュリティ面を意識してrootユーザーではSSH接続できないようにして ...

ユーザーを作成する

rootとは別にユーザーを作ります。

$ useradd kobayashi
# パスワードの設定
$ passwd kobayashi

これで/home配下に作成したユーザーディレクトリが作成されているはずです。

[root@xxx-xx-xx-xxx home]# ls
kobayashi

CentOSにはwheelグループが最初から存在しているので、そこに作成したユーザーを追加します。今回はkobayashiを作成したのでkobayashiを追加。

# wheelグループに追加
$ usermod -aG wheel kobayashi

# wheelを有効にする
$ vi /etc/pam.d/su

# 以下のコメントアウトを外す
auth sufficient pam_wheel.so trust use_uid
auth required pam_wheel.so use_uid
作成したユーザーがwheelグループに入ったかどうかを確認します。

$ cat /etc/group | grep wheel
# 作成したユーザーが表示されていればOK

鍵を設置するディレクトリを作ってSSH接続できるように置いておきます。

$ su kobayashi
$ cd /home/kobayashi
$ mkdir .ssh
$ sudo cp /root/.ssh/authorized_keys /home/kobayashi/.ssh/.
$ chmod 700 .ssh
$ sudo chmod 600 .ssh/authorized_keys

# もし所有者とグループが違ったら作成したユーザーに直す
$ sudo chown username:group .ssh
$ sudo chown username:group .ssh/authorized_keys

作成したユーザーでSSH接続できればOK。

$ ssh -i 秘密鍵 kobayashi@IPアドレス
# パスワードが求められるので、設定したパスワードを入力

今回はこの作成したユーザーの配下にRailsアプリをアップロードしたいと思います。作業はこの作成したユーザーで行っていきます。

Nginxをインストールする

$ sudo dnf update
$ sudo dnf upgrade
$ sudo dnf -y install nginx

Nginxをインストールしたら起動します。

# nginxを起動してactiveならOK
$ systemctl start nginx
$ systemctl status nginx
● nginx.service - The nginx HTTP and reverse proxy server
     Loaded: loaded (/usr/lib/systemd/system/nginx.service; disabled; vendor pr>
     Active: active (running) since Wed 2022-12-14 09:52:03 JST; 1s ago

firewallを設定する

デフォルトだとfirewallが効いていてIPアドレスにブラウザからアクセスできないんじゃないかなと思います。


# firewalldのstatusを確認
$ systemctl status firewalld.service
     Loaded: loaded (/usr/lib/systemd/system/firewalld.service; enabled; vendor preset: enabled)
     Active: active (running) since Wed 2022-12-14 09:29:11 JST; 25min ago

httpが許可されていないので追加します。

$ sudo firewall-cmd --zone=public --add-service=http --permanent
$ sudo firewall-cmd --reload

servicesを確認してみるとhttpが許可されましたね。

$ sudo firewall-cmd --list-all
public (active)
  target: default
  icmp-block-inversion: no
  interfaces: eth0
  sources:
  services: cockpit dhcpv6-client http ssh
  ports:

ブラウザからアクセス

Nginxの起動が確認できたらブラウザからIPアドレスにアクセスしてみると画面が表示されましたね。

MySQLのインストール

データベースにはMySQLを使います。

$ sudo dnf -y install mysql
$ sudo dnf -y install mysql-server
$ mysqld --version
/usr/libexec/mysqld  Ver 8.0.30 for Linux on x86_64 (Source distribution)

起動しておきましょう。

$ sudo systemctl start mysqld
$ sudo systemctl status mysqld
     Loaded: loaded (/usr/lib/systemd/system/mysqld.service; disabled; vendor preset: disabled)
     Active: active (running) since Wed 2022-12-14 09:58:24 JST; 3s ago

少しだけ設定しておきます。

rootユーザーのパスワードを設定する

rootのパスワードは最初は設定されていないので設定します。

$ mysql -u root

mysql> ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '<パスワード>';
mysql> FLUSH PRIVILEGES;

データベースユーザーの作成

作業用のユーザーも作成しておきましょう。

mysql> CREATE USER 'ユーザー名'@'localhost' IDENTIFIED BY 'パスワード';

権限も付与しておきます。

mysql> GRANT ALL PRIVILEGES ON * . * TO 'ユーザー名'@'localhost';
mysql> FLUSH PRIVILEGES;

全部の権限与えたけど、必要に応じてユーザー権限を調整しましょう。

データベースの作成

Flaskアプリケーションから使用するデータベースも作成しておきます。

mysql> create database flask_todo;

テーブルの作成

テーブルも作成する必要があるなら作成しておきます。

mysql > create table todos(・・・)・・・

Python環境を構築する

Python Japanの内容を参考に進めていきます。

どうやってPythonの環境を作成しようかなと思うけど、Python Japanの内容を参考に進めていこうと思います。

$ sudo yum groupinstall "development tools"

# gdmb-develは抜きました。
$ sudo yum install bzip2-devel libffi-devel \
  libuuid-devel ncurses-devel openssl-devel readline-devel \
  sqlite-devel xz-devel zlib-devel tk-devel python3-devel

pyenvを入れる

Pythonのソースコードを入れてインストールしてもいいけど、面倒なのでpyenv使ってやります。

# gitプロトコルでtimeoutする場合はhttpsに変更。
$ git config --global url."https://".insteadOf git://
$ git clone https://github.com/pyenv/pyenv.git ~/.pyenv

# パスを通す
$ echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.bash_profile
$ echo 'command -v pyenv >/dev/null || export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.bash_profile
$ echo 'eval "$(pyenv init -)"' >> ~/.bash_profile
$ source ~/.bash_profile

以下コマンドでインストール可能なpythonのバージョンを確認しましょう。

$ pyenv install --list

今回は3.10.2をインストールします。

$ pyenv install  3.10.2

# pythonバージョンを切り替え
$ pyenv global 3.10.2

$ python --version
Python 3.10.2

これで普通にpythonを使って実行することができるようになりましたね。仮想環境を作ってやりたい方はvenvなんかで仮想環境を作ってやるといいでしょう。

ローカルのFlaskアプリケーションをサーバーにアップロードする

FTPソフトを使ってローカルで作成したFlaskアプリケーションをConoHa VPSで立てたサーバーにアップロードします。以下はCyberduckでアップロードした画面です。

ポイント

今回はユーザーのディレクトリ配下にアップロードしているけど、これは好きなところに作成してアップロードしてやるといいでしょう。

アプリケーションのデータベース接続情報を変更する

アプリケーションから作成したデータベースに繋がるようにさっき作成したデータベース情報に変更します。

  return pymysql.connect(
    host="localhost",
    db="flask_todo",
    user="kobayashi",
    password="パスワード",
    charset='utf8',
    cursorclass=pymysql.cursors.DictCursor
  )

Pythonの仮想環境を作る

.myvenvという名称で作ったので、コマンドを打って仮想環境に切り替えます。

# 仮想環境を作成
$ cd /home/kobayashi/app
$ python3 -m venv myvenv

# 仮想環境を有効化
$ source myvenv/bin/activate

# 以下コマンドで解除できます。
$ deactivate

何かPython関連のものをインストールするときにはこの仮想環境を有効化した状態でインストールするといいでしょう。

pipでモジュールをインストール

仮想環境を有効化したらモジュールをインストールしていきます。

(/home/kobayashi/app)
$ vim requirements.txt

ここで使いたいモジュールを記述しておきます。今回はこの3つだけしか使わないですが、自分のアプリケーションに応じてインストールしておきましょう。

# バージョン指定した方が良いです。
flask
pymysql
uwsgi
# エラー起きたのでcryptography入れておきます。
cryptography
$ pip install -r requirements.txt

WSGIファイルを作成する

アプリケーションのディレクトリににwsgi.pyを作成します。(今回は/home/kobayashi/app)

$ vim wsgi.py

アプリケーションのファイル名がapp.pyだったりindex.pyだったりすると思うけど、それは合わせておきます。(下でやるapp.iniのmoduleとも合わせておく)

from index import app

if __name__ == '__main__':
    app.run()

app.iniを作成する

wsgiの設定ファイルも作っておきましょう。

(/home/kobayashi/app)
$ vim app.ini
[uwsgi]
# アプリケーションのファイルがindex.pyなのでindexと指定
module = index
callable = app
master = true
processes = 1
# centosだと/tmpだとダメらしいので/runにする
socket = /run/uwsgi/uwsgi.sock
chmod-socket = 666
vacuum = true
die-on-term = true
# アプリケーションのディレクトリにload前に移動
chdir = /home/kobayashi/app
logto = /home/kobayashi/appuwsgi.log

/run配下にsocketで指定したディレクトリを作っておきます。

$ mkdir /run/uwsgi
$ sudo chown kobayashi:kobayashi /run/uwsgi

uwsgiには色々オプションがあるみたいだけど、かなりの数があります。ドキュメントに掲載されているので気になったらみてみるといいです。

Nginxの設定ファイル作成する

最低限uwsgiにつなげて表示できるように設定ファイルを記述しておきます。

$ sudo vim /etc/nginx/conf.d/app_nginx.conf
server {
        listen 80;
        server_name IPアドレス;
        location / {
          include uwsgi_params;
          uwsgi_pass unix:/run/uwsgi/uwsgi.sock;
        }
}

起動して確かめる

# Nginx再起動
$ sudo systemctl restart nginx

# uwsgi起動
uwsgi --ini app.ini

これでIPアドレスにアクセスしてみるとちゃんと表示されましたね。

まとめ

ConoHa VPSでFlaskアプリケーションを動かすっていうことをやってみました。

やったこと

  • ConoHa VPSでサーバーを立てる
  • Nginxのインストールと設定
  • MySQLのインストールと設定
  • ローカルのFlaskアプリケーションのアップロード
  • uWSGIの設定
  • ブラウザから確認

以前Ubuntuで同じようなことをやったからすんなりいけるかなと思ったけど、やっぱりそんなすんなりはいかなかったです。こういう環境作るのは毎回時間掛かりがちですね。

ちょっと苦戦したけど、とりあえず動かすことができました。

  • この記事を書いた人

管理人

各VPSの使い方を紹介します。

-ConoHa VPS