herokuからConoha VPSにPythonアプリを移行

herokuからConoHa VPS

herokuの無料枠が廃止になる!という報道を受けて、自分のサーバーにアプリを移動してみました。結果、思ったより簡単にできました。

しかし移行後に稼働したところ新たな問題にもぶつかったのでそこも簡単に書いています!

では早速移管しましょう〜!

目次

移行元・先・ローカルのPythonバージョンを確認

Pythonバージョン確認コマンド

 % python3 --version

移管元

Python 3.8.8

移管先

私の環境では、移管先(Conoha)にデフォルトで入っているPythonはバージョンが古いことがわかりました。

バージョン3.6と3.8の違いを確認するとセキュリティ要件のようです。ソースに問題は出ないようですね(もちろんセキュリティ強い方がいいですが)

とりあえず移管してしまおうと思います。

# python3 --version
Python 3.6.8

デプロイしてみる

とりあえずpythonソースをデプロイしています。

任意のフォルダに.pyファイルを置いて

実行

$ python3 tmp.py
ModuleNotFoundError: No module named 'bottle'

モジュールが見つかりませんでした。入れてないですもんね。入れましょう

herokuを使っていた時、requirements.txtの中に必要なモジュールをそのバージョンとともに記載していました。

今後もこれを使いたいと思います。

$ pip3 install -r requirements.txt
このコマンドで必要なモジュールを一括インストールできます。

python実行してみる

$ python3 tmp.py
Bottle v0.12.19 server starting up (using WSGIRefServer())...
Listening on http://0.0.0.0:3000/
Hit Ctrl-C to quit.
無事に立ち上がりました!しかしこのままだとコンソールが捕まってしまうのでバックグランド実行したいです。
$ nohup python3 tmp.py &
このコマンドでバックグランド実行ができました!
ちゃんとアクセスができるか、テストしてみます。
もう一つコンソールを開いて、そちらから用意してあるテストパスにアクセスしてみます
$ curl http://0.0.0.0:3000/hello
hello!

ローカルサーバー内で、アクセスでき正しく挙動していることが確認できました!

私は今回3000ポートを外部からアクセスできないようにしているのでサーバー外からはリクエストを送ることができません。

稼働開始してみたら、文字コードがおかしい

無事、移行が完了したかと思っていましたが、数日経って今回移行したPythonアプリから吐き出される文字が化けていることに気がつきました。

ãçºå£²ã¾ã§25æ¥ã%0AãDVDãçºå£² ã¹ãã¼ã³ãº%0Açºå£²æ¥ï¼2022å¹´09æ
28æ¥%0A

派手な文字化けです…なんでしょうこれ。どうしてこうなっているんでしょう。ソースは変えてないので、明らかにサーバー依存の問題です。文字化け解析ツールなどで調べても、これが何の文字コードなのかわかりません。

ググっても判明しない文字化け「ãがいっぱい」

そんな中、以下のブログに辿り着きました。救われました…「ãがいっぱいある」文字化けがどうして起こるのかを説明してくださっています。

西尾泰和のはてなダイアリー
ãだらけの文字化けはなぜ起こるか - 西尾泰和のはてなダイアリー この記事がはてなダイアリー上で化けないかどうか不安だが。 >>> u"こんにちは世界" u'\u3053\u3093\u306b\u3061\u306f\u4e16\u754c' >>> u"こんにちは世界".encode("utf-8...

Pythonアプリがインプットの文字列の文字コードを誤判し、別の文字コードへ変換してしまっているんですね。

原因はわかりました。では正しい文字コードをPythonに教えてあげるだけです!

ここからが長かった…

Python「ãがいっぱい」文字化け解消

結論:HTTPリクエストからPythonが受け取っていた情報の抜き取り方を変えた
PythonはBottleというフレームワークを使ってHttpリクエストからパラメータやBodyを抜き取って使用していたのですが、その時に使用するメソッドを変えることで文字化けが解消しました。
はっきり言って、力不足で文字化けの根源原因は特定できなかったが、回避方法を見つけた、になります…
これまで使用していたメソッドだと、URLからリクエストを受け取った時点で文字化けが発生していました。しかしリクエストの文字コードはあっているし、前と変えていないし。でもPythonが受け取った時点でもう文字化けている。フレームワークの問題でしょうか。どうしようもなかったです…
しかし、取り方を変えただけで、文字化けが解消しました。バージョンの違いでしょうか?URLパラメータの取得方法ってそんなに頻繁に変わります…?
# "koretoritai"というクエリをURLから取得したい
# 前
msg = request.query.get('koretoritai')
# 後
msg = request.query.koretoritai

ちょっと疑問が残りますが、私の環境ではこのソース変更で文字化けが解消しました!

解決に到達するまで、たくさん回り道しました…

 

こちらのブログさんもお世話になりました。

 

ねこゆきのメモ
文字コード - ねこゆきのメモ 文字コード Character Codesで少し遊んだ。 UTF-8のコード表。 UTF-8コード表(1) このコード表を元にデコードdecodeしてみる。 In [36]: b'\xe3\x81\x82'.decode() Out[36]...

 

ソース修正前のクエリ取得方法でパラメータを取得したときは以下のような文字列になっていました。

想定通りUTF-8で文字列を受け取れているのに、その後うまく扱えず。

b'\xc3\xa6\xc2\x97\xc2\xa5\xc3\xa6\xc2\x9c\xc2\xac\xc3\xa3\xc2\x81\xc2\x94\\n\xc3\xa3\xc2\x81\xc2\x93\xc3\xa3\xc2\x81\xc2\x86\xc3\xa3\xc2\x81\xc2\xaa\xc3\xa3\xc2\x82\xc2\x8b\xc3\xa3\xc2\x81\xc2\xa8\xc3\xa3\xc2\x81\xc2\xa9\xc3\xa3\xc2\x81\xc2\x86'

で、結局のところ、それ以前のパラメータ取得部分のコードを変えたらうまく取得できるようになった!という結論です。

文字コード問題は、どの部分でおかしくなっているか?を見つけ、場所を特定したらどうしたら解消できるか?を冷静に考えることが大切ですね…!

これ以降、やっと問題なくシステムが動くようになりました!
herokuからConoHa VPS

この記事が気に入ったら
フォローしてね!

よかったらシェアしてね!
  • URLをコピーしました!

この記事を書いた人

ピープル大学(UoPeople)でコンピューターサイエンスを学んでいます。趣味はプログラミング。

コメント

コメントする

目次