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で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で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で同じようなことをやったからすんなりいけるかなと思ったけど、やっぱりそんなすんなりはいかなかったです。こういう環境作るのは毎回時間掛かりがちですね。
ちょっと苦戦したけど、とりあえず動かすことができました。