SEO対策とセキュリティで企業をバックアップします。

ITエンジニアの技術力UPをお約束します。

Python3 Bottleフレームワーク入門(その13)- HTTP/2対応hproxで ReverseProxy SSL対応 & Bottle連携

Python3 Bottleフレームワーク入門(その13)- HTTP/2対応hproxで ReverseProxy SSL対応 & Bottle連携


最近は何かと話題のhttp/2対応のWEB接続がかなり増えてきました。オリジナルアプリケーションをフレームワークで作ったものをhttp2対応させる事もフレームワークのライブラリーに既に実装されているのもあり手軽になってきているとはいえ、まだまだ敷居が高いかもしれません。

今回は、非http2対応のウェブアプリをリバースプロキシーで簡単に対応させるサーバを紹介します。haskellベースのプロキシーですが簡単に構築できます。もちろん、Apache,nginx,h2o,Caddyでもできますができるだけ設定が単純なもので行きたいのでこれを使用しました。但しバーストのメモリ消費は多いみたいだ。

ソフトのダウンロード

hproxをgithubから取得します。

# 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で指定します。

# 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アプリサーバを動作させてください。

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コマンドで確認してみましょう。

# curl  http://test.server.net:8000/hello/James

hproxの使えるオプション

このサーバはwebsocket接続のproxyにも対応しておりますので、- -wsで後方にあるwebsocketのサーバを指定すれば利用できます。

[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対応

合わせて読みたいPython MySQL操作関連

タグ: , , , , , ,