nginx+php-fpm(PHP5.3)環境にPHPMotionを導入してみた。

以前は、画像と動画はGallery3、オーディオファイルはPodHawkを使っていたが、複数こういったプログラムがあると管理が面倒である。というわけで、動画や画像、音楽などを管理できるツールがないかと探していた。そんななか見つけたのがPHPMotionである。正確には、YouTubeクローンと紹介されているが、メディアファイル専門のCMSといったほうが正しいだろう。公式サイトを見る限りHTMLソースは汚いが、テーマが充実している。日本でもVPSの流行と共に、少しずつだが知られているようだ。

以前は、PHP5.3に対応していなかったので見送っていたが、ちょうと3日前に対応版をリリースしたらしい。早速インストールしてみた。やり方は、まず、必要なライブラリをapt-getでインストールする。ちなみに、今まで使っていたUbuntu x64 10.10が相次ぐトラブルの挙句、壊れたのに頭に来たので、OSをDebianに変更した。

下準備

まず、/etc/apt/sources.listに以下の行を追加

deb http://www.debian-multimedia.org squeeze main non-free
deb-src http://www.debian-multimedia.org sid main

で、次に、キーを読み込ませる。

aptitude install debian-multimedia-keyring

そしたら、

apt-get update
apt-get install ffmpeg php5-ffmpeg mplayer mencoder flvtool2 unzip

次に、Installing PHPShield Loaders - PHP5.3.x Serverを参考にプロテクトをインストールする。OSSと異なり、コア部分は、プロプライエタリらしい。これを使って復号化して実行しているようだ。まず、

php -i|grep extension_dir

で、phpのextension_dirを取得する。自分の場合、extension_dir => /usr/lib/php5/20090626だった。

cd /usr/lib/php5/20090626
wget http://downloads.phpmotion.com/phpshield-loaders/linux/i386/ixed.5.3

で、PHPShieldをインストールする。で、php.iniに読み込ませるわけだが、最近のPHPは、/etc/php5/conf.d内にファイルをおけば、わざわざphp.iniを書き換えなくても済む。したがって、/etc/php5/conf.d/内にphpshield.iniを設置して、中身を

extension=ixed.5.3

と入れるだけで、問題は無い。あとは、php5-fpmをリロードするだけだ。

service php5-fpm reload

これで、準備完了。

インストール

公式サイトのダウンロードのページに自分のメールアドレスを入れてファイルをダウンロードし、インストールしたい場所で展開する。

unzip phpmotion.zip

で、ブラウザからそこにアクセス。サブドメインのルートにおいているものとする。

http://[Your server]/setup/

あとは、ガイド通りに進めていくだけ。nginxでは、php.iniをオーバーライド(.htaccessにおけるphp_valueみたいなの)するときに、fastcgi_param PHPVALUE ""の括弧内に記入する。したがって、nginxのphpのlocation設定は以下のようになる。ちなみに、自分はphp5-fpmへの接続をポート開放などが面倒なので、ソケット接続にしているので注意。

location ~ \.php$ {
	fastcgi_pass	unix:/var/run/php-fpm.socket;
	fastcgi_index	index.php;
	fastcgi_param	PHP_VALUE	"
upload_max_filesize = 100M
post_max_size = 100M
max_execution_time = 1500
session.gc_maxlifetime = 14000
safe_mode = off
Thread saftery = disabled
enable_dl = On
";
	include			fastcgi_params;
}

括弧内に改行があるって?気にしないでくれ。

次にパーミッションの設定、データーベースの設定など、これらは説明する必要はないだろう。画面の指示通りに進めればいい。

RewriteRuleをNginx用に書き換える

どうも、PHPMotionは、デフォルトで静的なURLにアクセスするようハードコーディングされているらしい。Apacheを使っている場合は問題ないが、Nginxを使っているので独自に設定が必要である。とりあえず、.htaccessの設定をnginxの設定ファイルにコピーして、RewriteBaseが、/になっているので、RewriteRuleをrewriteに書き換えて^を^/にして、書き換え先のスクリプトのファイル名の前に/を追加し、[L]をlast;に書き換えてはい終わり。

#PHP Motion
server{
	listen		80;
	server_name	[ドメイン名];
	root		[PHPMotion設置ディレクトリ];
	index		index.php;

	add_header	X-UA-Compatible 	edge;
	add_header	X-Content-Type-Options	nosniff;
	add_header	X-Frame-Options		SameDomain;
	
	# Main Menu Links #
	rewrite ^/videos/load/(.+)$					/seemore.php?load=$1				last;
	rewrite ^/videos/load/(.+)/(.+)$			/seemore.php?load=$1&page=$2		last;

	rewrite ^/audios/load/(.+)$					/audio.php?load=$1					last;
	rewrite ^/audios/load/(.+)/(.+)$			/audio.php?load=$1&page=$2			last;

	rewrite ^/audio/album/(.+)/(.+)$			/audio.php?album=$1					last;
	rewrite ^/audio/album/(.+)/(.+)/(.+)$		/audio.php?album=$1&page=$3			last;

	rewrite ^/blogs/load/(.+)$ 					/blogs.php?load=$1					last;
	rewrite ^/blogs/load/(.+)/(.+)$				/blogs.php?load=$1&page=$2			last;

	rewrite ^/albums/load/(.+)$					/albums.php?load=$1					last;
	rewrite ^/albums/(.+)/(.+)$					/albums.php?load=$1&page=$2			last;

	rewrite ^/people_ajax						/people_ajax.php last;
	rewrite ^/people/(.+)/(.+)$					/people.php?load=$1&page=$2			last;
	rewrite ^/people							/people.php							last;
	rewrite ^/upload-media						/upload.php							last;

	rewrite ^/groups$							/groups.php							last;
	rewrite ^/search							/search.php							last;


	# Action Links #
	rewrite ^/videos/(.+)/(.+)$					/play.php?vid=$1					last;
#	rewrite ^/audio/(.+)/(.+)$					/play_audio.php?audio=$1

	rewrite ^/category/(.+)$					/category_home.php?cid=$1			last;
	rewrite ^/category/(.+)/(.+)$				/category_home.php?cid=$1&page=$2	last;

	rewrite ^/subcategory/(.+)/(.+)$			/category_home.php?sub=$1 last;
	rewrite ^/subcategory/(.+)/(.+)/(.+)$		/category_home.php?sub=$1&page=$3	last;

	rewrite ^/genre/(.+)$						/genre_home.php?cid=$1 last;
	rewrite ^/genre/(.+)/(.+)$					/genre_home.php?cid=$1&page=$2		last;

#	rewrite ^/view-album/(.+)/(.+)$				/album_view.php?album=$1
#	rewrite ^/view-image/(.+)/(.+)$				/album_view.php?image=$1
	rewrite ^/read_blog/(.+)/(.+)$				/read_blog.php?id=$1				last;

	rewrite ^/blogs/category/(.+)/(.+)$			/blogs.php?cat_id=$1				last;
	rewrite ^/blogs/category/(.+)/(.+)/(.+)$	/blogs.php?cat_id=$1&page=$3		last;

	rewrite ^/members/(.+)$						/memberprofile.php?user=$1			last;

	#-------------------------------------------------------------#
	# redirect directory browsing attempts
	rewrite ^/videos(.?)$ 						/seemore.php	last;
	rewrite ^/audios(.?)$ 						/audio.php		last;
	rewrite ^/blogs(.?)$ 						/blogs.php		last;
#	rewrite ^/members(.?)$						/people			[R=301]
	rewrite ^/albums(.?)$ 						/albums.php		last;

	location ~ \.php$ {
		fastcgi_pass	unix:/var/run/php-fpm.socket;
		fastcgi_index	index.php;
		fastcgi_param	PHP_VALUE	"
upload_max_filesize = 100M
post_max_size = 100M
max_execution_time = 1500
session.gc_maxlifetime = 14000
safe_mode = off
Thread saftery = disabled
enable_dl = On
";
		include			fastcgi_params;
	}

	location ~* ^.+.(gif|jp?eg|png|css|js|ico|zip|7z|rar|lzh|exe|html|avi|mp4|mp3|m4a|swf|flv)$ {
	#	FileETag on;
	#	etag_format \"%X%X\";
		expires max;
		add_header Cache-Control max-age;
	}
}

これでよしと。