元のコード
例えば、以下のようなソースコードがあったとして、
from bottle import route, run
@route("/")
def root():
return "Server running"
if __name__ == '__main__':
run(host="0.0.0.0", port=80)
必要なモジュールをインストール
pip install gevent
鍵を準備
Let's Encryptでやるときはここを見ると良さそう
https://certbot.eff.org/lets-encrypt/ubuntufocal-nginx
オレオレ証明書を使うときはここ
https://qiita.com/ll_kuma_ll/items/13c962a6a74874af39c6
localhostで作りたいときはここ
https://qiita.com/rkunihiro/items/530b5dc685bd3bff2082
コードをちょっと変える
こうする
from bottle import route, run, ServerAdapter
from gevent.pywsgi import WSGIServer
CERT = "<公開鍵>"
KEY = "<秘密鍵>"
class SSLWebServer(ServerAdapter):
def run(self, handler):
srv = WSGIServer((self.host, self.port), handler,
certfile=CERT,
keyfile=KEY)
srv.serve_forever()
@route("/")
def root():
return "Server running"
if __name__ == '__main__':
run(host="0.0.0.0", port=443, server=SSLWebServer)
Let's Encryptで鍵を用意した場合、
公開鍵は/etc/letsencrypt/live/<ドメイン>/cert.pem
秘密鍵は/etc/letsencrypt/live/<ドメイン>/privkey.pem
にある
注意点
UNIX系OSで1024未満のポートをバインドできるのはrootユーザーのみなので、実行するときは
sudo python3 https_server.py
とする必要がある
しかし、一般ユーザー権限でpip install
した場合、モジュールは$HOME/.local/lib/python3.8/site-packages
に格納される。そして、root権限でPythonを実行した場合、上記のパスをモジュールパスに含めないため、ModuleNotFoundError
を起こしてしまう。
対策として、
- root権限で
pip install
し直す必要がある - 以下のようにモジュールパスに上記パスを追加する
from sys import path, version
path.append("/home/ubuntu/.local/lib/python{ver}/site-packages".format(ver=".".join(version.split(".")[:2])))