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

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

Apache2.4(Ubuntu/Debian)で複合言語(メイン:php サブ:python)で組み合わせる典型的なやり方。

Apache2.4(Ubuntu/Debian)で複合言語(メイン:php サブ:python)で組み合わせる典型的なやり方。


サイトを構築する場合、1つのプログラミング言語で作る場合より複数の言語で構成するほうが多いと思う。従来WEBに非常に親和性の高い言語といえばなんといってもphpになるだろう。さらにCMSとなるとWORDPRESSをケースが非常に多いと思います。このようなケースでサイトの一般的なページはWORDPRESSで作るけど、システム的な部分はsymfonyやlaravel、cakephpのようなフレームワークで作るのではないかと思います。今回はこのシステムを組み込む部分に異なる言語pythonを使った場合はどうやって一つのサイトにまとめるか解説していきたいと思います。

PythonをApache2.4に組み込む

Apache2.4へ仮想ホストを登録する

WSGIScriptAlias,WSGIDaemonProcess,WSGIProcessGroup,WSGIApplicationGroupのパラメータ設定が肝である。特に注意しなければならないのは通常apacheのユーザ、グループはwww-dataなのだが、pythonで作るシステム部分が共通でwww-dataで良い場合もあるだろうし、異なったほうが良い場合もある。下記の例では異なるユーザでpythonプログラムを起動して動かす前提で作っています。予めuser&groupをuseraddコマンドで作っておきましょう。pythonプログラムを設置するパスは当然起動ユーザのアクセス権になっている必要があります。そのユーザのログインパスをそこに設置するというのも一つの手法です。あともう一つ注意点があるとすれば、processとthreadsの数です。apache2.4でhttp2対応させるケースが増えてきた現在ではpreforkからevent,workerタイプに移行しapacheを動作させるケースが多くなりました。メイン設定プロセス数とスレッド数に対しpythonのプログラムが独立してマルチプロセス、マルチスレッドで動作するためメインとサブで恐らく設定数の兼ね合い、バランスを取らないとApacheサーバが落ちてしまう原因を作りそうな気はしています。サブがサイト運用の中で処理メインならば、当然サブのほうがプロセス数、スレッド数が多くなければいけないだろうと思います。興味ある方は実験してみてください。Scriptで呼び出していると言ってもバックエンドで動いてる動作に近いのではないかと推測します。

下記の例ではドキュメントルートは/var/www/vhosts/flat_siteへ配置し、pythonのコンテンツは/var/www/vhosts/sideaに配置します。セキュリティ的にpythonコンテンツをドキュメントルート配下に設置しないよう気をつけましょう。

Pythonプログラム

/var/www/vhosts/sideaに下記をindex.pyとして配置します。

開発とデバッグ用に単独起動の処理を”__main__”に導入しています。通常はapache起動ではelseのapplicationに分岐します。尚WSCRIPTSで動作させる場合はpython側はシングルスレッド仕様で作成して大丈夫です。(スレッドセーフにプログラムを作ってさえいれば問題なし)マルチプロセス・マルチスレッドの部分はApache側が担当します。

接続確認を行う。

下記の例で「http://zero.serve.net/sideapp」にアクセスするとpythonのコンテンツが表示され、それ以外のフォルダーはWORDPRESS(php)で動作するようになっています。ドメインは貴方のドメインして実験してみてください。

タグ: , , , , , , ,

ApacheにおけるSSL設定品質の肝。SSLCipherSuite及びSSLProtocol (POODLE対策)


今はGoogleのオールSSL化の推進によりかなりサイトがSSL接続仕様に変わってきた。しかし、実際のところそれで安心してはならない。SSLの設定のさじ加減というか塩梅によってはダメダメなケースもあるのです。その中でも一番肝と思うディレクティブ設定に以下のパラメータ設定がある。

暗号化通信の方式と暗号化アルゴリズムの選択

下記の設定はタイトルを表す通りの設定を行うApacheのディレクティブです。

  • SSLProtocol
  • SSLCipherSuite

脆弱性のある通信方式

SSLの通信方式には2014年10月に判明したSSL3.0およびTLS 1.0 / TLS 1.1の脆弱性があります。これを「POODLE」という名前で呼んでいます。 もともと、Googleの研究チームがSSLの解析を行い、2014年10月14日に、SSL3.0に関する脆弱性について重大なレポートを行ったのがきっかけです。POODLEは「POODLE(Padding Oracle On Downgraded Legacy Encryption)」の略称でSSL 3.0を有効にしているサーバに問題があると報告していましたが、その後TLS 1.0 / TLS 1.1の一部も問題ありと追加で報告されました。故にApacheでSSLを設定する際にデフォルトで設定していると脆弱性のある通信方式を許容するためセキュリティホールができてしまうのです。つまり、この対策は危険なプロトコルスィートを抑え込む設定が必要となります。

Apacheで行うべき設定

下記は、デフォルトではコメントアウトか、設定がないかもしれません。SSLのコンフィグ設定で追記して登録してください。危険ということで完全な抑え込みの設定をしてしまうと古いブラウザが対応できない場合がありますが、基本はTLSv1.2対応だけにするのがベストです。

Ubuntu/Debianの場合は「sudo a2enmod headers」を事前にやっていないとheaderの箇所でエラーとなる可能性があります。RedHad系のLinuxは不要です。

設定後にテストを行う

設定ができたら評価をおこなってください。評価でA+取れるようにがんばってください。今はSNS等も評価がBレベルだとデベロッパーサイトでAPI登録を受け付けてくれないようになってきています。またGoogleもある一定期間の後にSSLの設定レベルの判別を明確にしてゆく話もありますので暗号化スィートの設定は非常に大事です。SEO的に大きな影響をもたらすので今後はApache要の設定となるでしょう。

SSLの設定レベルの品質評価

タグ: , , ,

Python3 Bottleフレームワーク入門(その11)- WSGI方式 Bottle連携SSL Apache起動


WEBサーバーでApacheと連携したいと思う人は多いと思います。いままで紹介していなかったので改めて見本を掲載したいと思います。ApacheとBottleの連携方法は2種類あります。1つはこれから紹介する外部WSGI連携とリバースプロキシーで対応する方法です。プログラミングでセキュリティに不安な人は後者が良い場合が多いかもしれません。同時アクセス数とパフォーマンスを重視するなら前者だと思います。


シンプルな起動メインコード

それでは最初にメインのソースコードを書いていきたいと思います。元々WSGI対応しているBottleですから記述はシンプルです。下記コードは直接Pythonコマンドで指定起動もOK。Apacheの場合はelse分岐の方で起動します。このファイルは取り敢えずindex.pyという名前にしておきましょう。

Apacheの仮想サーバ設定

/etc/httpd/conf.d/python.confとして配置した場合の記述です。これは仮想サーバの設定です。予めmod_wsgiはインストールしておいてください。

肝はWSGIDaemonProcessの部分です。スレッド関連のパラメータを記述していますがきちんと設定しましょうね。これを正しく設置しないとスレッドセーフにならない場合があるため要注意です。DoS攻撃されたらイチコロです。実勢のアクセス量にあわせてチューニングしてください。maximum-requestsはこの値を超えるとカレントプロセスが破棄され新プロセスが再作成されます。ごみメモリもクリアされます。WSGIDaemonProcessのpython-pathの値は自分の環境に合わせ設定してください。python-homeは仮想環境のときに使います。また仮想環境ではないが複数のpythonバージョンが存在するならpython-pathを明示的に使用します。python仮想環境を使って利用する場合はglobalで設定し起動すれば明示的な指定は不要かもしれません。

呼び出すpythonコードの中身を考慮しないで考えた場合はプロセス数とスレッドに関してはもし貴方がプログラムのコードをマルチに動作させることに自信がないのならまずはスレッドセーフにできるだけ安全確実なのはprocess数は任意としてthreadsは’1’にすることです。(もちろん複数のリクエストに対して競合が起きないようにしていないと論外ですよ。)proxy側と呼び出すpython側のプログラムがマルチプロセス・マルチスレッドでスレッドならApacheとpythonプログラムが適正なセッション数で処理できるようprocess&thredsを調整することもできます。つまり後方の呼び出されるプログラムがシングルスレッドなのか、マルチスレッドなのか、マルチプロセスマルチスレッドなのかで状況が違ってきます。それが分かりにくいならthreadsを’1’にしておくことが無難なのです。余裕があるならapacheとpythonアプリケーションのスレッドコネクションの生成の仕方を相互に見極めて調整してゆくと良いでしょう。スレッドの生成が相互に噛み合わないとプログラムが落ちてしまうので注意が必要です。テストに負荷テストのプログラムを使ってthredsやprocessの値を相互(apache側、python側の双方)に調整してゆくことでもっと本格的な設定が可能になります。

Apache起動

サイトにアクセスする例

/hello/の後に任意の文字列を入れてください。ページボディに表示されます。

尚、予めテストサーバにIPアドレスを割り当て名前をWindowsのHostsに登録しておけば下記のように名前ベースのホスト名で実験ができます。



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

タグ: , , , , ,

Apacheの未定義ドメインリクエストURLの落とし穴を埋める


Apacheサーバを運営してありがちな失敗ネタをひとつ。専用サーバを借りてサーバ運営しているとVirtual Hostsに意識が行き過ぎて自分で Virtual 側で定義したドメインしかリクエストが来ないと思ってしまう。

でも実際はそうではありません。IPアドレスでURLを入力したり、定義していないVirtualドメインでURLを入力されたら全く想定していないコンテンツが表示されることがよく有ります。このケースでは設定を見直したりするのは中々骨が折れる作業なので、最も簡単な回避策は下記のvirtual hostsを新規で作り起動しておくと良いです。未定義のドメインやIPできたアクセスは直ぐに他のホストへ転送してくれます。

タグ: , , ,