ネット上のアクセスボリュームをUPさせ効率の良い集客をご提案します。

Python3 Bottleフレームワーク入門(その10)- WSGI via uwsgi Server on SSL

 / Python Bottle Framework, トピックス, ノウハウ


今回は、Pythonでお馴染みのWSGIの技術を使ったSSL接続を試してみます。

WSGIとはシンプルすぎて非常にわかりにくいものですが、簡単に言うと通常コマンドラインで標準出力しているものを内部及び外部のhttpサーバで使われているネットワークの土管にバイパスしてブラウザへの表示を拝借してしまおうという発想です。

bottleフレームワークはもとからWEBサーバを走らせる機能がありますから外部WEBサーバ使う理由に何が必要なのか?という疑問を持つ人もいると思います。それはbottleの標準WEBサーバはシングルスレッドなので多くの接続を処理したり、SSL接続をしたい場合はこのようにWSGIの技術を使用して外部、内部の別のWEBサーバと連携しないといけないと言うことです。まず最初にbottleで簡単なWEBサーバを起動してみましょう。

index.pyを実行するとシンプルなWEBサーバが起動します。

ここまでは誰でも普段からやっていると思います。

今度はこれをWSGI仕様に変えてソースを改良します。
特にWSGI関連ライブラリーを呼び出す必要はありません。ポイントはapplicationというクラスです。uWSGIから呼び出すため、mainは生成されずelseへ分岐します。ここへbottleのインスタンスを渡してあげます。このケースではdefault_app()ですが、もしご自分でbottleのインスタンスを他の変数やクラスへ継承させているならそれを代入しましょう。これがWSGI仕様にする要になります。

最下行にたった2行が追加されました。たったこれだけです。大変シンプルですね。

次はuwsgiというシンプルな外部WSGI接続が可能なWEBサーバーをpipでインストールします。

これでブラウザへ接続をすれば「Hello World! Bottle and uWSGI!」と表示されます。

次にwsgiでSSL接続を行ってみましょう。pythonのプログラムは特に修正する必要はありません。uwsgiのネットワークトンネルを拝借していますから、SSLの処理はuwsgiの機能で行います。

よくオレオレ証明書を使う方がいますが、今は安いSSL証明書なら年間ライセンス1000円程度で購入できます。私はテスト用に1000円のSSLライセンスを購入して実験利用しています。テスト環境で実験する場合はWindows側では”c:\Windows\System32\Drivers\etc\hosts”を開いてDNSの照合よりも先にhostsファイルに登録したドメインとIPアドレスを参照するように予めテスト用のドメインを登録しておきます。


こうすることで、SSL証明書のドメインとテスト用のサーバのドメインを一致させブラウザを騙します。そうしないとhttps接続時に赤色でバツや三角がブラウザ上のURLそばのアイコンが表示されます。



証明書が購入できたら次に作業するフォルダーに証明書用のフォルダーを作成します。今はとりあえずauthという名前のフォルダーを作成します。そこに購入した証明書ファイルを配置します。以下のような最低でも3種類のファイルが必要となります。

  • サーバー証明書(server.crt)
  • サーバ秘密鍵(server.key)
  • 中間証明書(ca-bundle.ca)

これらのファイルで中間証明書はuwsgiコマンドのパラメータで指定する事ができないため、中間証明書とサーバ証明書は1つのファイルにマージします。

マージされた証明書は必ず一度エディターで中を開けてチェックして下さい。順番は関係あります。サーバ証明書が一番上に来るようにして下さい。また中間証明書はサーバ証明書のend区切りコメントに連続にならないように改行を必ず入れてください。そうしないとエラーになります。

下記は証明書を結合した場合の証明書同士のボーダーを示しています。予め結合する前にサーバ証明書に改行を入れておくと安全です。必ず結合後はチェックしましょう。

次のようにuwsgiを起動する際に鍵ファイルや証明書を指定します。

実際の実行時のターミナル画面は次のようになります。

実際に本番稼働させる場合は実行用のユーザとグループを用意してchrootさせて実行すると以下の警告はなくなります。

その他uwsgiの実行オプションはここ

パラメータでスレッド数、プロセス数やパフォーマンス・チューニング、ログの場所など細かくチューニングが可能です

スレッド数やプロセス数を増やせば必ずしもマルチスレッドに対応したコンテンツになるとは限りません。例えばコンテンツがREAD主体の静的コンテンツはスレッド数やプロセス数を増やせばマルチスレッドになると思いますが、動的に変化するコンテンツは内部側でもマルチスレッド対応にしないと駄目なケースが多いと思います。

ブラウザから以下のようにアクセスができたら成功です。中間証明書がきちんと登録ができていないと今のブラウザは厳しいので「このサイトは安全でない」と表示されるので要注意です。必ず中間証明書とサーバー証明書をマージして区切り線が前後に改行されていることを確認しましょう。


Python Bottle Framework入門 全10回
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

TOPへ戻る