amustallホーム

vps環境で、pythonをflaskを使用してhello worldするまでを徹底解説

環境構築はとても大変

いままでにconoha VPSを使用して、pythonを言語にしてflaskを使用してwebサイトを3つ程作成しました。 環境構築は大変で、構築の度にgoogle先生をググりまくっていたので、一旦ブログに構築方法をまとめる事にしました。

このブログで使用している環境は、conoha VPSCENTOS 8、プログラミング言語はpython、 webアプリケーション用フレームワークにflask、アプリケーションサーバーにuwsgi、 webサーバーにnginxを使用しています。筆者の経験をもとに書いており、筆者は素人ですので、 間違っている情報もあるかと思いますが、一部みなさんの参考にある点もあるかと思いますので、自分の勉強もかねて書いていきます。 なので基本的には、こうしましょうではなく、自分はこうしましたが、みなんさんどうでしょうか?のスタンスですので、よろしくお願いします。

まずはをnginxを導入しましょう

まずはwebサーバーにnginxを導入します。webサーバーでは、nginxのほかにapacheも有名ですね。 自分も他で使用している共用サーバーではapacheを使用していましたが、python+flaskの環境で 検索すると、nginxが多かったのでそちらでやる事にしました。

sudo yum install -y nginx

上記をターミナルで実行するとnginxがインストールされます。ターミナルをあまり触った事のない人も いるかと思います。自分もsudo(すだ?)って誰だ?ってなっていました。まぁしかしコードの全てを 理解するのはとても大変ですし、ある程度動けばいいやの精神も重要です。自分も全然わかりません。 天下のmetaのザッカーバーグ様も 「Done is better than perfect!」と言っているらしいですしね!

sudoは、linux環境でスーパーユーザー権限で実行しますって時に使用します。super user doの略なのかな? スーパーユーザーというのは、管理者権限ともいいますね。ようするにこのサーバーに対して、なんでも出来る権限 です。普段からいつでも管理者権限でlinuxいじっていると、間違ってルートディレクトリでrm *なんて、 とんでもない悲劇を起こしてしまうので、普段は管理者権限ではない、重大は事は簡単には実行できない環境で 作業するんですね。sudoに似ているのに、su もあります。sudo はその処理のみ管理者権限で行いますが、 suは作業者が管理者になります。ターミナルでは、一般ユーザーである$マークから、管理者である#マークに変わります。

sudo systemctl start nginx

インストールが出来たら、上記コマンドでnginxを起動します。

sudo systemctl status nginx

上記コマンドでnginxのステータスを確認、無事に起動できていれば、ターミナルにactiveと表示されている部分が見つかります。 以下のコマンドでサーバーの再起動時も自動でnginxを起動できるので設定しておいた方が便利と思います。

sudo systemctl enable nginx

pythonを導入

続いてpythonを導入します。ここではpython3.6をインストールしています。 必要に応じてバージョンは変更してください。 pythonのインストールのやり方は色々説明があるので、調べて見てください。自分のメモには以下の二つの やり方が残っていました、今の環境ではどっちを使用したかなぁ。。記憶が。。


yum install -y https://centos7.iuscommunity.org/ius-release.rpm
yum install -y python36u python36u-libs python36u-devel python36u-pip
			

上記の2個を順次実行 やり方その1

sudo yum install python36

上記を実行 やり方その2

正しく実行できていれば、下記コマンドでversionが確認できます。このversion確認は、色んなライブラリ等インストール したときの定番の確認方法ですね。

python3 --version

これで例えば Python 3.6.8 のように表示されればpythonのインストールまで完成です!!

続いて作業用のフォルダを作成して、venv環境を構築

まずはディレクトリ作成、今回はmyappというフォルダーを作成して作業していきます。

sudo mkdir -p /var/www/myapp

sudoは説明した通りですね、mkdirはフォルダーを作成するコマンドですね。windowsがメインの方には分かりにくい かもしれないのが、linuxの階層構造ですね。 今回は/var/www/myappとなっております。最初に/があるのは/はルートという意味です。linuxでは /が階層の一番上になります。なのでどこのファオルダーにいても/から指定すればルートからの 絶対パスで指定できます。 mkdir /var/www/myappはルート階層のなかのvarフォルダの中のwwwファオルダの中にmyappフォルダを作るという意味ですね。

このままでは管理者権限でないと使用出来ないので権限を変更します。一般userをlocaluserの場合とします。 みなさんの開発環境で一般user名が例えば、tomとかならlocaluserの場所をtomに変更して使用してくださいね。


sudo chown -R localuser:localuser /var/www/myapp/
			

今後はこのmyappフォルダーの中で色々な処理をするので、一般userでも使用できる権限に変更しないと、 毎回sudoしないといけないのでchown(change ownerの略だったかな?)しておきます。

続いてvenv環境にします。これは何かというと、myappフォルダーの中にその中だけで色々と設定できる バーチャル環境を作るという事です。pythonでアプリを作るときに必要なライブラリをpipでインストール していきますが、アプリによって必要なライブラリは異なります。またpythonではバージョンの関係が とてもややこしい問題になりやすいので、作業フォルダー毎にそれぞれ独立した環境を使用する方が 作業がしやすいんですね。

python3.6 -m venv venv

初めにpython3.6とありますが、先にも書きましたが、pythonはバージョン違いのトラブルが本当にややこしくなる ので、自分のインストールしているpythonのバージョンはしっかり把握して置きましょう。 その後は -m venv venv とありますが、これはフォルダーの名前でもあるので変更してもいいのですが、 後にvenvをactivateするときに違う環境でも同じコマンドでactivateできるようにするために、このままのコマンド で使用するのがいいと思います。

source ./venv/bin/activate

上記のコマンドでvenvが使用できる状態になります。activateされればターミナルに(venv)と先頭に表示されます。

flask導入

上記の状態でvenvがactivateされているので、この状態でflaskをinstallします。

pip install flask

上記コマンドでflaskがインストールされますので、きちんとインストールされているか確認します。

pip freeze

上記コマンドでvenv環境にインストールされているライブラリ一覧がみれるので、そこにFlaskがあればOKです。 pythonのwebアプリケーションフレームワークには、flaskの他にdjangoもありますね。こちらの方が有名なのかな? 自分は使用した事ないですが、見ている感じだとruby on railsに似ている感じですかね? 大きなプロジェクトにより向いている印象でしょうか?自分はhtmlもcssもよくわからない。phpも未使用で getとpostの違いも知らない状態でrailsアプリをherokuにup loadした事があって、その時にあまりにも 苦労したので、djangoより軽量なイメージのflaskを使用することにしました。

ここまで来たらrun.pyを作成しておきましょう。 このファイルは /var/www/myappの中においておきます。つまり絶対パスは/var/www/myapp/run.pyですね。


from flask import Flask

app = Flask(__name__)

@app.route("/")
def index():
  return "Hello, World! hello myapp!!"

if __name__ == "__main__":
  app.run(host="0.0.0.0" ,port=5000)
			

nginxの設定

nginxのconfファイルを作成しましょう。場所は/var/www/myapp/myapp_nginx.confとします。 以下のコマンドでファイルを作成しましょう。

touch /var/www/myapp/myapp_nginx.conf

上記のtouchファイルを作るコマンドですね。以前に使用したmkdirフォルダを作成するlinuxコマンドです。 ファイルが出来たら、ファイルの中身を以下にようにしましょう。


server {
  listen      80;
  server_name myapp.demo.com;
  charset     utf-8;
  client_max_body_size 75M;

  location / { try_files $uri @yourapplication; }
  location @yourapplication {
    include uwsgi_params;
    uwsgi_pass unix:/var/www/myapp/myapp_uwsgi.sock;
  }
}
			

server_nameの後は各自の環境に合わせて変更してください この例では、ドメインをdemo.comで取得している人が、サブドメインmyappに設定する場合です。 この例ではhttp通信ですが、今はhttps通信にしないと有用ではないので、後でSSL化についても解説します。

少し脱線しますが、ファイルの中身の変更等に関してターミナルで行ってもいいのですが、自分はやりにくいので、ローカル環境で ファイルを作成して、それをuploadしています。それには色々なソフトがあるとおもいますが、自分はwinSCPとういうソフトを使用しています(ローカル環境はwindowsです)。 これは簡単に言えば、ローカル環境のファイルやフォルダーをリモート環境にあるサーバーに安全にuploadできるソフトです。 サーバーを立ち上げたあとで、webサービス等を作るにも色々なやり方がありますが、自分は個人開発なのでローカル環境である程度 作って、一気に多数のファイルをサーバーにuploadするので、このようなソフトがとても便利ですね。

以下コマンドでシンボリックで配置しておきます。今後別のサブドメイン等で使用するに便利です。 シンボリックはリンクを貼るってイメージでしょうか。


sudo ln -s /var/www/myapp/myapp_nginx.conf /etc/nginx/conf.d/
			

上記で作ったファイルの中身が意図したもの(リンク元)と同じになっているのか以下コマンドで確認しておきます。

cat /etc/nginx/conf.d/myapp_nginx.conf

これで中身が同じであればOKです。上記コマンドのcatはファイルの中身を見る時に使用します。編集は できません。編集する時はviかvimがあればvimですね。 linuxのコマンドは覚えておくのが大変なので、自分の場合はよく使うコマンドはメモしています(笑)

ここまでやればnginxの設定は完成ですので、下記コマンドでnginxを再起動して、ブラウザで確認しましょう。 今までの例ではブラウザにhttp://myapp.demo.comと入力して確認しましょう。 (上記のhttp://myapp.demo.comは当ブログで紹介している内容に仮で使用しているアドレスです。実際にここに アクセスしてもサイトは表示されません。各自の取得しているドメインに修正してアクセスしてください)

sudo systemctl restart nginx

上記コマンドを入力して以下のような画面がでればここまでは成功です。続いてuwsgiの設定をしていきます。

bad gateway画像

uwsgiの設定

続いてuwsgiの設定になります。uwsgiって一体なんなんだ?さっぱりわからん?? って感じでしたが、後にflask-socketioを使用したアプリを作成したときに、非常に 優秀なアプリケーションサーバーである事がわかりました。 いずれflask-socketioに関してのブログも書きたいと思います。 uwsgiに関しては以下のサイトがとても参考になるのでそちらを参考にしていただくといいと思います。 自分もこのサイトでuwsgiの設定をしました。とても参考になる素晴らしいい記事ですね!

ConoHa VPS(CentOS 7.6)でFlask + Nginx + uWSGIのWebアプリ(複数)実行環境構築
上記サイトで十分ですが、一応このブログでも解説していきますね。

まずは以下のコマンドを入力

cd /opt

上記のコマンドでまずはcdですね。これはlinuxでめちゃくちゃよく使うコマンドで、ディレクトリを移動する時に使用する コマンドです。上記では/(ルート)階層のoptフォルダの中に入るという意味ですね。 cdが出てきたので、もう一つのよく使用するコマンドを紹介します。pwdです。これはいま自分のいる絶対パスを取得する コマンドです。こちらも滅茶苦茶よく使用するので覚えておきましょう。 そちてさらにもう一つ!ls。これは今の階層のフォルダやファイル一覧を取得します。まぁcdで移動して、lsでその階層のファイルやフォルダを 確認してとlinuxを使用していくので、これも絶対に覚えておきましょう!! linuxのフォルダにはある程度のルールが あります。このoptは「拡張アプリケーションやソフトウェアパッケージのインストール」等に使うようです。 今回はここにuwsgiをインストールしていきます。以下のコマンドでvenvを環境を作ります。

sudo python3.6 -m venv venv

venvが出来たら次のコマンドでactivate

source ./venv/bin/activate

activateできましたか?このブログ内でも2回目なので慣れてきたかと思います。続いてpipでuwsgiをインストールします。

pip install uwsgi

つづいてmyappファルダーに myapp_uwsgi.iniを作成、内容を以下


[uwsgi]
#application's base folder
base = /var/www/myapp

#python module to import
app = run
module = %(app)

#virtualenv folder
virtualenv = /var/www/myapp/venv

pythonpath = %(base)

#socket file's location
socket = /var/www/myapp/%n.sock

#permissions for the socket file
chmod-socket    = 666

#the variable that holds a flask application inside the module imported at line #6
callable = app

#location of log files
logto = /var/log/uwsgi/%n.log
			

続いてuwsgiのログのファイルを作ります。このlogファイルは超重要です!! 自分がまさに今説明している環境でwebサービスを開発している時に悩んだのが、エラーログがどこに出力されるか問題です。 恥ずかしながら、このエラーログがどこに出力されるのか分からなくて、とてつもなく困りました。 ローカル環境では、自分はvisual studio codeを使用しているので、エラーはターミナルにしっかり出ます。 しかし、リモート環境でのエラーがどこに出るか知らなかったので、一体なにが問題なにかもわからず途方にくれました。 以下のコマンドでuwsgi用のlogファイルを作ります。

sudo mkdir -p /var/log/uwsgi

logの場所は/var/log/uwsgiの中にあります。この環境ではファイル名はmyapp_uwsgi.logとなります。 ここはとても重要なので、logの場所を必ず覚えておいてください!!webで開発していると、ここを 何回も訪れることになります。大事なのであえて確認のしかたも書いておきます。

cat /var/www/log/uwsgi/myapp_uwsgi.log

上記コマンドは死ぬほど打つことになるので、是非覚えておいてくださいね!!忘れちゃうと筆者の様に 途方にくれる事になります。。そしてlogファイルが出来たら、いつもの権限の変更をしましょう。


sudo chown -R localuser:localuser /var/log/uwsgi
			

ここまで出来たらuwsgiをコマンドから実行してみましょう


/opt/venv/bin/uwsgi --ini /var/www/myapp/myapp_uwsgi.ini
			

上記をターミナルで実行します。自分はtera tremというソフトを使用してリモートサーバーにターミナルで アクセルしているので、上記を実行してtera tremを閉じないで、ブラウザからhttp://myapp.demo.comにアクセルすると run.pyの内容が表示されて、Hello, World! hello myapp!!とブラウザに表示されれば成功です!

このブログでわざわざ初めからサブドメインでの内容になっているのは、初めからサブドメインを複数使用していく 想定のためです。以下コマンドを実行して複数のアプリケーションで利用できる様にしておきましょう。


sudo mkdir -p /etc/uwsgi/vassals
			

sudo ln -s /var/www/myapp/myapp_uwsgi.ini /etc/uwsgi/vassals
			

uwsgiのデーモン化

上記でuwsgiは起動できましたが、tera termを閉じると、ブラウザ側も表示されなくなります。 これでは有用性に乏しいのでuwsgiがずっと起動しておいてもらう必要があります。 そこでこのデーモン化。/etc/systemd/system/uwsgi.serviceとゆうファイルを作ります。 内容は以下


[Unit]
Description=uWSGI
After=syslog.target

[Service]
ExecStart=/opt/venv/bin/uwsgi --master --emperor /etc/uwsgi/vassals --die-on-term --uid localuser --gid localuser --logto /var/log/uwsgi/emperor.log
Restart=always
KillSignal=SIGQUIT
Type=notify
StandardError=syslog
NotifyAccess=all

[Install]
WantedBy=multi-user.target
			

上記ファイルが出来たら以下コマンドを入力してください。


sudo systemctl daemon-reload 
sudo systemctl start uwsgi 
			

以下コマンドはサーバー再起動時に自動的にuwsgiを起動するかの設定です。しておいた方が便利です。

sudo systemctl enable uwsgi

これでuwsgiは常時起動状態になるります。お疲れさまでしたここまで今回は終了です。 この続きで、サイトのhttps化を行います。https化は必須です。http通信ではブラウザ表示する時に 安全でないサイトとして表示されません。(実際には表示できますが、 この状態ではサイトを見てくれる可能性が非常に低くなってしまいます) ですので、大変ですが自分で作ったサイトを他の人に見てもらうためには、必ずhttps化をしておきましょう。 let'S encryptを使用すれば無料でサイトのhttps化ができるので、ブログで案内する予定です。 ここまで読んで頂いて本当にありがとうございました!!

現在筆者のwebサービスとして公開している物を紹介します deep learningして進化していくchat bot のフミ

フミのページへ移動する
匿名で話せる、しかも会話の内容も5分ですべて消えるリアルタイムチャット anon space
anon spaceのページへ移動する
是非覗いてみてください!!

ブログ一覧へ戻る