Python3 Bottleフレームワーク入門(その13)- HTTP/2対応hproxで ReverseProxy SSL対応 & Bottle連携
2019/12/06
2020/03/11
タグ: Bottle, haskell, hprox, http2, proxy, Python, SSL
最近は何かと話題のhttp/2対応のWEB接続がかなり増えてきました。オリジナルアプリケーションをフレームワークで作ったものをhttp2対応させる事もフレームワークのライブラリーに既に実装されているのもあり手軽になってきているとはいえ、まだまだ敷居が高いかもしれません。
今回は、非http2対応のウェブアプリをリバースプロキシーで簡単に対応させるサーバを紹介します。haskellベースのプロキシーですが簡単に構築できます。もちろん、Apache,nginx,h2o,Caddyでもできますができるだけ設定が単純なもので行きたいのでこれを使用しました。但しバーストのメモリ消費は多いみたいだ。
ソフトのダウンロード
hproxをgithubから取得します。
1 2 3 4 5 6 |
# curl -sSL https://get.haskellstack.org/ | sh # stack upgrade # git clone https://github.com/bjin/hprox.git # cd hprox # stack setup # stack install |
作成するとデフォルトで~/.local/bin/hproxにバイナリーが設置されます。.bashrcに環境変数PATHで追加登録しておきましょう。
使い方
Proxyサーバは8000番ポートでリッスン状態にします。http/2接続の場合は証明書は当然ですが必須です。h2オプションスイッチはありませんがSSL仕様にすると標準でhttp/2対応になるようになっています。証明書がなければ自動でhttp/1.1接続になります。後は末端にあるリバースプロキシー先のアプリサーバ設定を- -revで指定します。
1 2 |
# hprox -p 8000 -s test.servers.net:/etc/letsencrypt/live/test.servers.net/fullchain.pem:/etc/letsencrypt/live/test.servers.net/privkey.pem --rev 127.0.0.1:8001 & # python test.py & <--- pythonのアプリサーバ |
ソースコード(test.py)
毎度のお決まりのソースコードですが。。。。python bottleのサーバで実験してみます。下記はシングルスレッドですが、実運用ではマルチスレッド対応のWSGIにしてpythonアプリサーバを動作させてください。
1 2 3 4 5 6 7 |
from bottle import route, run, template @route('/hello/<name>') def index(name): return template('<b>Hello {{name}}</b>!', name=name) run(host='localhost', port=8001) |
ブラウザーで確認するか、curlコマンドで確認してみましょう。
1 |
# curl http://test.server.net:8000/hello/James |
hproxの使えるオプション
このサーバはwebsocket接続のproxyにも対応しておりますので、- -wsで後方にあるwebsocketのサーバを指定すれば利用できます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
[root@host ~]# hprox -h Usage: hprox [--version] [-b|--bind bind_ip] [-p|--port port] [-s|--tls hostname:cerfile:keyfile] [-u|--user nobody] [-a|--auth userpass.txt] [--ws remote-host:port] [--rev remote-host:port] a lightweight HTTP proxy server, and more Available options: -h,--help Show this help text --version show version -b,--bind bind_ip ip address to bind on (default: all interfaces) -p,--port port port number (default 3000) -s,--tls hostname:cerfile:keyfile enable TLS and specify a domain and associated TLS certificate (can be specified multiple times for multiple domains) -u,--user nobody setuid after binding port -a,--auth userpass.txt password file for proxy authentication (plain text file with lines each containing a colon separated user/password pair) --ws remote-host:port remote host to handle websocket requests (port 443 indicates HTTPS remote server) --rev remote-host:port remote host for reverse proxy (port 443 indicates HTTPS remote server) |
- Python Bottle Framework入門 全13回
- 1.基礎編サーバ起動
- 2.リクエストメソッド
- 3.ORM Peewee (MySQL)
- 4.ORM Peewee CRUD
- 5.Cookie And Session
- 6.Abort and Redirect
- 7.マルチスレッドWEBサーバ
- 8.デーモン化
- 9.Json
- 10.WSGI on SSL
- 11.Apache連携起動(外部WSGI) SSL接続
- 12.Apache連携起動(ReverseProxy)SSL接続
- 13.hprox連携起動(ReverseProxy)SSL接続&HTTP2対応