nginxでpythonを動かす

最終的にやりたいこと

店の予約メールが入ったときにすぐわかるように家でパトランプ的なものを光らせたい。

  1. メールサーバに予約っぽいメールが来たら特定フォルダに振り分けておいて
  2. 未読メールがあるかどうか返すAPIをメールサーバに建てておいて
  3. 家のパトランプてきな端末から定期的にサーバをチェックしにいく

家の端末にサーバ側から投げるのは家のファイヤウォールあけるか端末側からつなげっぱにして切れたら再接続とか面倒なことになりそうなので端末側から定期的に見に行く。セキュリティ的にも件数返すだけAPIならあんま頑張んないでもよさげなので。

今回やる範囲

2のAPIを立てるとこ。nginxは未インストールの状態から。pythonはhttp.serverあたりを使ってnginxからproxyで飛ばす予定。あとは実作業しながら書いていく。

開始前の状況

postfix+dovecotでMaildir形式でメールサーバを構築済み。なお、”Ubuntu 22.04.3 LTS”

また、LetsEncriptでtls通信をさせているため証明書も入手済み。ただ、80番ポートが空いている前提のstandaloneモードで証明書の更新をしているためwebroot方式?だかに直さないといけないはず。

メールサーバに予約っぽいメールが来たときはsieveで規定フォルダに振り分けている。設定ファイルはしたので、題名に”予約確定通知”か”予約が確定”とあったら”INBOX.ジム.予約”フォルダに振り分けるというもの。(サンダーバードだと”「受信トレイ」の下の「ジム」の下の「予約」”)

作業開始

nginxインストール&設定

して、とりあえず443ポートをあける。(letsencript使うのに80番も開ける必要があるはずなので空いてなければそちらも)

既に作成済みの証明書を見る形でhttpsを有効にする。ついでにhttpからhttpsへのリダイレクトもかけておく。あと、nginxのバージョンも一応隠す。

で新規ファイルを作り下を追加

でnginx再起動

これでとりあえずブラウザからサーバにサクセスするとhttpsに転送されてnginxにもとから入っているwelcome画面が表示されるはず。

pythonを使えるようにする

nginx側のproxy設定

ssl.conf(と深く考えずに名前を付けたので)に直接かくものじゃないのでインクルードして/etc/nginx/conf.d/mail_api.txt に設定を書く。mail_api.confと拡張子をconfにすると/etc/nginx/nginx.confからのinclude設定と重なり多分うまく動かない。

でserver(443の方)の末尾にインクルード設定を追加

そしてmail_api.txtを作成

にて

これでsudo systemctl restart nginx したら8000番ポートで起動している奴があればそちらにリクエストをすべて飛ばすはず(location / で ルートディレクトリ以下全部)。8000番起動していなくてもとりあえずnginxを先に起動できると思う。

python側のリクエスト受信

http.serverにてnginxのproxyで指定した8000番ポートで待ち受け機能を作る。

(本来ローカルで完結するのでファイヤウォールの8000番は開かなくてよいけどVSCodeでやるとちょいちょいつなげに行こうという処理が走って面倒だった)

取り急ぎmailサーバの任意の場所に以下のmail_api.pyを作ってpython3 mail_api.pyで起動

ローカルのPCからhttps://mail.hoge.co.jp/api/reserve_countにアクセスするとstatus200 で Hello, this is the root path.という文字がかえる。

他だとstatus404 で 404 not foundという文字がかえる。

/api/reserve_count が呼ばれたときに実際に件数を返す処理を作る

response_content = b’Hello, this is the root path.’のところを件数返す関数に変更

してvi reserve_count.py し関数作る。例外処理ちゃんと入れていないので各自実装必要。

あんまり落ちなそうな気はするので実際には例外処理なしで突き進む。あと、ログイン代わりにquery_paramsみてパラメータがあっていたら件数確認処理呼び出すような緩いセキュリティ分岐を入れるつもり。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です