当社はIT技術のオンライン教育を得意としたセミナー専門会社です。 | 一戸英男

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

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

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


今回は、Pythonでお馴染みのWSGI(外部サーバ)の技術を使ったSSL接続を試してみます。

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

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

index.pyを実行するとシンプルなWEBサーバ(正確に言うとシングルスレッド内部WSGIサーバです。)が起動します。

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

今度はこれを外部接続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サーバの設置を行う場合のやり方

よくオレオレ証明書を使う方がいますが、今は安いSSL証明書なら年間ライセンス1000円程度で購入できます。私はテスト用に1000円のSSLライセンスを購入して実験利用しています。
テスト環境で実験する場合はWindows側では”c:\Windows\System32\Drivers\etc\hosts”を管理者権限モードでテキストエディタで開いてDNSの照合よりも先にhostsファイルに登録したドメインとIPアドレスを参照するように予めテスト用のドメインを登録しておきます。ドメイン認証だけのSSLならこれでうまくいきます。それ以外の認証が入っている高価なSSLだと「安全ではない」がでるかもしれません。


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


証明書の準備と取得証明書のマージ処理からサーバ起動まで

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

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

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

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

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

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

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

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

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

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

スレッド数やプロセス数を増やせば必ずしもマルチスレッドに対応したコンテンツになるとは限りません。例えばコンテンツがREAD主体の静的コンテンツはスレッド数やプロセス数を増やせばマルチスレッドになると思いますが、動的に変化するコンテンツは内部側でもマルチスレッド対応(thread_safeは必須)にしないと駄目なケースが多いと思います。というか、多くのケースはPythonコンテンツ側もマルチスレッド動作に対応する必然性があるかもしれません。マルチスレッド対応とは2種類の意味があります。DBなどファイル書き込みが複数のスレッドで競合が起きないようにするという意味と複数のコネクションを1プロセスで捌くという意味です。今回の場合はスクリプト起動なので必要最低限で前者が必須のケースです。マルチスレッド通信はProxyタイプ通信で連携する場合では必須なので他の章を参考にしてください。

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



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操作関連

タグ: , , , , ,

Python3 Bottleフレームワーク入門(その9)- Json


Bottleに限ったjsonの返却の仕方という訳ではないが、特定URLを叩いた時のjson返却方法を試してみる。REST APIのようなものを作る時の基礎として掲載する。

※http://xxx.xxx.xxx.xxx/api/v1.0/tasks で実験。

※http://xxx.xxx.xxx.xxx/json/1/2/3/pathfindで実験。

合わせて読みたいJson記事

FORM入力をJSONでサーバへ送出する仕組みの基本的な例(Vue.jsを使った場合)



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操作関連

タグ: , , ,

Python3 Bottleフレームワーク入門(その8)- デーモン化


Bottleはコマンドラインで起動すると終了でCTRL+Cを入れるまでコマンドプロンプトが戻ってきません。これでは不便と考えるなら自前でデーモン化してみましょう。最近ではBottleDaemonというモジュールもありますがオリジナルで色々開発しているとそのままではBottleDaemonが使えないケースが多いです。そんなときは自前でデーモン化処理を作ってしまいましょう。それほど難しいものではありません。

◯ デーモンの起動と停止

◯ 起動プログラム

◯ 停止プログラム



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操作関連

タグ: , , ,

Python3 Bottleフレームワーク入門(その7)- マルチスレッドWEBサーバ(Paste,Rocket)


今回の記事ではBottleのWEBサーバについて解説していきたいと思います。Bottleの標準で用意されているWEBサーバはシングルスレッドのWSGIサーバ(wsgirefサーバ)です。Bottleに限らずほとんどの様々な言語のフレームワークはテスト用にシングルスレッドのWEBサーバが用意されています。あくまでも開発中に作ったものを確認するために用意されたものです。しかし、マルチスレッドでもう少し挙動を確認したい場合もあるはずです。やはりシングルとマルチではプログラムの作り方が根本的に違います。また、pythonで作ったWEBサーバに関してセキュリティ攻撃や機能的に心もとないと思うならリバースプロキシーWEBサーバでApache連携すれば良いですが、その場合はPythonコンテンツ側はマルチスレッドである必要があります。故にマルチスレッドでの動作ができる内部連携するWSGI WEBサーバをご紹介したいと思います。

マルチスレッドpasteモジュール

Bottleをマルチスレッドで動作させるモジュールは色々ありますが古くからあり使いやすいのがpasteモジュールです。今回はpasteモジュールのインプリメントを見ていきましょう。
※2023/03/8 にPasteWebサーバの設定方法を刷新しました。ログ出力も対応しています。画面とファィルに出力されます。後半のRocketServerは既に古くてpython3.6以前でないと動作しないと思います。

pasteモジュールの導入

まず最初にpasteモジュールを導入します。

簡単なマルチスレッド起動のコーディングを書く

makoテンプレートエンジンを使っていますので、テンプレートはPython3 Bottleフレームワーク入門(その1)で紹介しているものをそのまま使ってください。

負荷テスト

nperfを使って負荷テストをしてみましょう。-cが並行スレッド数で-nがテストの回数です。

◯ nperfのインストール



Rocketを使ったマルチスレッド対応

最近使った感じではこちらのRocketの方がpasteより良い感じ。pasteはPython2.7からPython3.xの対応が中途半端でエラーを吐くことがあるのでメンテがいまいち。Rocketも最新バージョンがバグがありエラーとなるのでpipから導入したものは起動エラーが生じ動作に至りませんでした。まともに動くForkしたバージョン(1.2.4)で利用すると良いです。

Rocketサーバのインストールとロギング機能の設置

Rocketを使ったマルチスレッドサーバ(server.py)のソースコード

ログ出力の機能を加えました。Apacheのログ形式で実行ディレクトリ上のrocket.logに吐き出されます。
ちなみにport番号の後にサーバ証明書、プライベート鍵を記述するとHTTPS対応になりますので是非トライしてみてください。
Apacheサーバでリバースプロキシー連携するならSSLはApache側に持たせたほうが絶対に良いです。理由は細かいSSLオプション関連の制御ができるからです。

サーバの実行



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操作関連

タグ: , , ,

Python3 Bottleフレームワーク入門(その6)- Abort and Redirect


本記事ではアボート処理とリダイレクトについて説明する。abortの出番はWEB上のコンテンツを作る上では重要である。よくあるのはアクセス禁止、ファイルが存在しないケースだろう。特に後者はCMSの世界ではソフトウェア404を使うケースが多い。でもグーグルがソフトウェア404だと正しく認識してくれないため検索インデックスに該当ファイルが無いという認識が持てず古いインデックスを更新しません。結果的に悪い評価になってしまうことがあります。このような場合はabort関数を使用してハードウェア404を返してあげるとベターです。

アボート処理

アボート処理はWEB上で異常を示すエラーコードと共に使用するものです。

リダイレクト処理

リダイレクト処理は何らかの理由があって、最初のURLから別のURLへ転送します。

※この2つの関数redirect(),abort()は必ず実行するとException Errorを起こしますが気にする必要はありません。使うと発生するそのようなものと解釈してください。元々そのような仕様で作られています。つまり何らかの異常を示す際に使う関数であるからと理解するとわかり易いかもしれません。エラーを抑制したい場合はBottleのconfigでcatchallをFalseに設定することで止めることができます。



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操作関連

タグ: , , , ,

1 2 3