[python]mod_pythonのpublisherとpspを使う

Written by uechoco 8月 09

前回はPythonHandlerをファイル指定で使っていましたが、mod_pythonには汎用的なPythonHandlerの指定方法もあるようです。mod_python.publisherというものらしい。publisherを使うと、URLを解析して以下のようにエントリポイントが変わった(私の環境の場合)。

  • http://test.localpy/ ... 403 Forbidden
  • http://test.localpy/index ... 404 Not Found
  • http://test.localpy/index/ ... 404 Not Found
  • http://test.localpy/index.py ... /document-root/index.py内のdef index(req):関数が実行された
  • http://test.localpy/index.py/ ... /document-root/index.py内のdef index(req):関数が実行された
  • http://test.localpy/index.py/index ... /document-root/index.py内のdef index(req):関数が実行された
  • http://test.localpy/index.py/hello ... /document-root/index.py内のdef hello(req):関数が実行された
  • http://test.localpy/index/hello ... 404 Not Found
  • http://test.localpy/other.py ... /document-root/other.py内のdef index(req):関数が実行された
  • http://test.localpy/other.py/index ... /document-root/other.py内のdef index(req):関数が実行された
  • http://test.localpy/other.py/world ... /document-root/other.py内のdef world(req):関数が実行された
  • http://test.localpy/dir/another.py ... /document-root/dir/another.py内のdef index(req):関数が実行された
  • http://test.localpy/dir/another.py/index ... /document-root/dir/another.py内のdef index(req):関数が実行された
  • http://test.localpy/dir/another.py/asdf ... /document-root/dir/another.py内のdef asdf(req):関数が実行された

参考になるリンクを示しておきます。

お次はPSP。Play Station Portable という意味ではありません(Python for PSPというものが確かにあるらしいですが)。PSPはPython Server Pagesの略です。JSPとかASPの真似っ子ですね。ようはphpみたいにHTML内にPythonが書ける仕組みをmod_pythonが提供しています。このPSPという仕組みは、私がグーグルでいろいろ調べている感じだとあんまり流行ってなさそうな雰囲気です。じゃぁみんなPythonのWebは動やっているんだろう。。。PSPは、mod_wsgiとかではたぶん提供していないと思います。

PSPのサンプルコードとして、Python Server Pages! 略してPSP - Fioの素敵な日々という記事を参考にしました。コードをそのまま拝借して(charsetくらいはUTF-8にして)test.pspを作り、そのまま、http://test.localpy/test.psp?name=uechocoにアクセスすると、以下のようなHTML表示がされます。

これならphpっぽくWebが作れそうですね。といってもmod_pythonに依存しすぎていますが。

ちなみに、今回使ったhttpd.confのVirtualHostは以下のものです。

TEXT:
  1. <VirtualHost *:80>
  2.     ServerName test.localpy
  3.     DocumentRoot "/Users/dev/py_works/test.localpy"
  4.     <Directory "/Users/dev/py_works/test.localpy">
  5.         Allow from all
  6.         AddHandler mod_python .py .psp
  7.         PythonHandler mod_python.publisher | .py
  8.         PythonHandler mod_python.psp | .psp
  9.         PythonDebug On
  10.     </Directory>
  11.     ErrorLog "logs/test.localpy-error_log"
  12.     CustomLog "logs/test.localpy-access_log" common
  13. </VirtualHost>

[python]MacPortsで入れたpython25をApacheで動かすには?

Written by uechoco 8月 09

最近Pythonを始めたのは皆さんご存知かと思いますが、PythonはWebに特化していないのが厄介ですね。phpはWebに特化していてCLIも出来るというイメージですが、Pythonは軽量でなんでもできる言語なのでWebも出来るというのが現時点での私のイメージです。

Webサーバのデーモンと言ったらやっぱりApacheが多いかと思いますが、PythonをApacheで動かすにはどうしたらいいんでしょうか。『入門Trac』に書いてあったのとかを参考に思いつくものを並べてみました。

  • mod_python ... 古くからあり、おそらく資料も豊富なはず。ただし、開発プロジェクトは公式に終了宣言されているらしい
  • mod_fastcgi/mod_fcgi ... FastCGI系。FastCGI自体の理解はあまりないのだが、CGIで動かしている+αと考えれば、CGIに分類されるはず。
  • mod_wsgi ... WSGIというインタフェースに対応したモジュール。mod_pythonの代わりとして徐々に定着しつつある?mod_pythonやmod_fastcgiなどよりは多少速いとか。

他にも、Apacheで動かさないという選択肢もあるようです。フレームワーク自体にサーバ機能が含まれているWeb2pyとかがそうなのかな。Nginxとかはわからないので、別の機会に。

さてさて私のPythonはGAE開発環境を意識して、SnowLeopardにMacPortsで入れたpython25です。ApacheもMacPortsで入れたapache2です。python_selectでSnowLeopard標準のpython26-appleからpython25に切り替えています。

できればMacPortsでモジュールを入れたいです。個人的にはFastCGIは馴染みがないのでmod_wsgiか、mod_pythonに的を絞ります。MacPortsでmod_wsgiをsearchすると、どうやらpython26(標準のともpython25とも違うMacPortsオリジナルのPython 2.6)に依存してしまっているので、python25では使えなさそうです(ソースコード インストールとかはわかりません)。mod_pythonをsearchすると、mod_python25やmod_python26などがあり、mod_python25であれば私がインストールしたpython25に依存しているようです。

早速「sudo port install mod_python25」でインストールし、

TEXT:
  1. ########################################################
  2. # to enable mod_python add
  3. #  LoadModule python_module modules/mod_python.so
  4. # to your apache2 config file:
  5. #  /opt/local/apache2/conf/httpd.conf
  6. ########################################################

というメッセージが表示されるので、LoadModule宣言を指定のhttpd.confに書き込み、Apacheをgracefulします。

続いて、3.3 mod_python は一体何をやっているのかを参考に、VirtualHostの設定やリクエストハンドラを設定しておきます。私の場合は以下のような感じにしています。もちろんtest.localpyというのは架空のドメインですので、/etc/hostsにも登録してあります。

TEXT:
  1. <VirtualHost *:80>
  2.     ServerName test.localpy
  3.     DocumentRoot "/Users/dev/py_works/test.localpy"
  4.     <Directory "/Users/dev/py_works/test.localpy">
  5.         Allow from all
  6.         AddHandler mod_python .py
  7.         PythonHandler mptest
  8.         PythonDebug On
  9.         DirectoryIndex mptest.py
  10.     </Directory>
  11.     ErrorLog "logs/test.localpy-error_log"
  12.     CustomLog "logs/test.localpy-access_log" common
  13. </VirtualHost>

あとは、上記DocumentRootにmptest.pyというファイルを作成し、以下のプログラムを記載します。

PYTHON:
  1. from mod_python import apache
  2.  
  3. def handler(req):
  4.     req.content_type = "text/plain"
  5.     req.write("Hello Apache mod_python!")
  6.     return apache.OK

あとは指定のURL(私の場合はhttp://test.localpy/)にアクセスすればOKです。DirectoryIndexが効かない場合は、http://test.localpy/aaa.pyみたいに適当なファイル名をつけてみてください。適当なファイル名でもいい理由は3.3 mod_python は一体何をやっているのかに書いてあります。

とりあえず、Webで動いたー!でもちょっとやりづらいのはphpでMVCフレームワークとかに慣れ過ぎなせいですかね。

[Linux]ApacheがPermission deniedを吐いてくる

Written by uechoco 1月 01

 VirtualBoxでFedora 7をせこせこがんばっている最中です。sshやsftpなんかも問題なく繋がって、あとはApacheの設定を終わらせればLinuxのWeb開発環境が完成するというところまで来ていますが、VirtualHostを設定すると、wgetできなくなるという現象が発生しました。

 エラーログはこんな感じです。

[Mon Dec 31 14:30:13 2007] [error] [client 127.0.0.1] (13)Permission denied: access to /index.html denied [Mon Dec 31 14:31:10 2007] [error] [client 127.0.0.1] (13)Permission denied: access to /index.html denied [Mon Dec 31 14:35:01 2007] [error] [client 127.0.0.1] (13)Permission denied: access to /index.html denied [Mon Dec 31 14:36:01 2007] [error] [client 127.0.0.1] (13)Permission denied: access to /index.html denied [Mon Dec 31 14:38:02 2007] [error] [client 127.0.0.1] (13)Permission denied: access to /index.html denied [Mon Dec 31 14:52:10 2007] [error] [client 127.0.0.1] (13)Permission denied: access to / denied [Mon Dec 31 14:54:00 2007] [error] [client 127.0.0.1] (13)Permission denied: access to / denied [Mon Dec 31 14:54:55 2007] [error] [client 127.0.0.1] (13)Permission denied: access to /index.html denied [Mon Dec 31 14:59:57 2007] [error] [client 127.0.0.1] (13)Permission denied: access to / denied [Mon Dec 31 15:00:18 2007] [error] [client 127.0.0.1] (13)Permission denied: access to / denied

 /var/www/htmlが初期設定ののDocumentRootです。症状としては

  • /var/www/htmlをDocumentRootに設定したVirtualHostはOK
  • /var/www以下に作ったディレクトリをDocumentRootに設定したVirtualHostはOK
  • /var/www2/htmlとか/home/hoge/htmlとかいろんなところに新しく作ったディレクトリをDocumentRootに設定したVirtualHostはNG

な感じです。AA-Camp #6に参加しているakkyさん、studio15さん、shinさんにアドバイスをもらいながらもなかなか原因がわからなかったのですが、もしかしてSELinuxじゃない?っていうアドバイスももらったので

echo 0 > /selinux/enforce

というコマンドでSELinuxをとりあえず切ってみたら、さっきまでNGだった場所をDocumentRootに設定したVirtualHostもしっかりと受け付けてくれました。仮想環境のLinuxだから、セキュリティはそんなに意識しなくてもいいでしょということで、/etc/selinux/config で

# /etc/selinux/config SELINUX=disabled

としてSELinuxが起動しないように設定しました。

 Apacheが動かないからずっとhttpd.confとにらめっこしたりディレクトリのパーミッションを全部777にしてみたりrootオーナーに変えてみたりを繰り返していましたが、こんなところに魔物が潜んでいたんですね。勉強になりました。

[xampp]ローカルにサブドメイン切ったらaccess forbidden食らった

Written by uechoco 12月 06

 XREAのWebスペース上で開発することが多々あるのですが、たまにSAFE_MODEの弊害があってローカルのXAMPP / Windows 上での開発に移行したりします。

 で、たまたまlocalhostのサブドメインをまだ切っていないマシンだったので、サブドメインを追加しようと思って、

C:\xampp\apache\conf\extra\httpd-vhosts.conf

NameVirtualHostを有効にして、該当の<VirtualHost>ディレクティブを追加して、

C:\WINDOWS\system32\drivers\etc\hosts

127.0.0.1 localhost
127.0.0.1 subdomain1.localhost

を追加して見たのですが、早速 http://subdomain1.localhost/ にアクセスしても

Access forbidden!

といわれました。なぜだーとおもって昔のhttpd.confを覘いたら、<Directory>ディレクトリを書き忘れていたようです。

 こういう細かいところのノウハウ(?)ってすぐに忘れちゃうんですよね。ってことで備忘録的に設定載せておきます。

httpd-vhosts.conf

NameVirtualHost *:80

<VirtualHost *:80>
DirectoryIndex index.php index.html
DocumentRoot "C:/path/to/subdomain1"
ServerName subdomain1.localhost
</VirtualHost>

<Directory "C:/path/to/subdomain1">
order deny,allow
allow from ALL
</Directory>

<VirtualHost *:80>
DocumentRoot "C:/xampp/htdocs"
ServerName localhost
</VirtualHost>

[php][CakePHP]コピペでCakeをxamppに突っ込んだらスタイルシートが適用されなかった

Written by uechoco 10月 05

つまらない備忘録。

電車の中でCakePHPの日本語pdfマニュアルをみてました。順番にみていき、インストールのところまで来たのでCakeのVer1.1.17を解凍して、xamppのhtdocsに突っ込んだところ、スタイルシートの適用されない素のHTMLみたいな画面でDBがないって言われました。

マニュアルに載っていたとおり、原因を探ると、xamppをインストールしたばかりで、httpd.confの中で、

#LoadModule rewrite_module libexec/httpd/mod_rewrite.so

となっていただけでした。#をとって、非コメント化したら、無事にスタイルシートの適用されたHTMLでDBがないって言われるようになりました。

そういえば、1.2のデザインはとってもキツい感じだったけど、1.1系のデザインに戻すことって簡単なのかな?まぁ日本語のマニュアルが整備されているのかどうかわからないので、今は1.1系で勉強します。