投稿

11月, 2010の投稿を表示しています

Blogger で新しいはてなブックマークボタンを設置

はてなブックマークボタンが使いやすくなったらしいので、Blogger の各記事の下に加えるようにしてみた。

Blogger では記事の側にボタンを設置しようと思うと HTML 編集モードに入らないといけないっぽいのだが、どうも記事ひとつひとつに対して調節しようと思うと「ウィジェットのテンプレートを展開」を使って展開されたソースに対して書き換えを行う必要があるらしい。
ただこれを一度展開してしまうとテンプレが巨大になって見通しが悪くなるし「ここから先は自力で頑張って下さい」ムードが漂っていてせっかくのインターフェイスが使えなくなりそうで怖いので(※実際にどうなるのかは未確認)、JavaScript 経由で挿入する方法でお茶を濁すことにした。

このブログには既にシンタックスハイライト用の JavaScript を仕込んでいて、その時に jQuery も読み込んでいたので jQuery を使った。実際に必要なコードはこんな感じ。
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.4.4/jquery.min.js"></script> <script type="text/javascript"> //<![CDATA[ $(function(){ $('h3.post-title.entry-title').each(function(){ var $this = $(this), title = $this.text(), url = $this.find('a:first').attr('href') || $('head:first link[rel=canonical]:first').attr('href'), encoded_url = encodeURIComponent(url); $this.closest('div.post.hentry').find('div.post-footer-line.post-footer-line-1') .prepend(…

Debian に Go 言語をインストール

好き放題入れられるんだから興味がある golang も使えるようにしたい。
ただ VPS 上でコンパイルなどができる必要はないので、ローカルの Debian サーバにだけコンパイル環境を用意して、出来上がったバイナリを ServersMan@VPS で動かすような使い方をしようと思う。
以前はビルド前の環境変数の設定が必須だったが、いつの間にか簡単にできるようになっていた。
su apt-get install bison ed gawk gcc libc6-dev make python-setuptools python-dev build-essential easy_install mercurial exit hg clone -r release https://go.googlecode.com/hg/ go cd go/src ./all.bash ビルドが上手くいったので、.bash_profile に環境変数を設定しておく。 今回はまだ .bash_profile 自体が存在していなかったので新たに作成した。
vim ~/.bash_profileif [ -f ~/.bashrc ]; then . ~/.bashrc fi GOROOT=~/go PATH=$PATH:$GOROOT/bin export GOROOT PATHsource .bash_profile プログラムのビルドをテストするのはオフィシャルの Writing programs を参照すればいいと思うので省略。
これで自前のバイナリを走らせることもできるようになった。

golang の netchan でデータが欠落することがある?

Go言語を最近触っていてちょっとした経緯で netchan を使おうと思ったのだが、どうすればいいのかよくわからなくなってきたので取り敢えずメモっておく。このコードは上手くいく。1秒ごとに画面にログが現れる。
package main import ( "log" "time" "netchan" "os/signal" ) func exporter() { exp, _ := netchan.NewExporter("tcp","127.0.0.1:65432") expSendChan := make(chan int) exp.Export("chan", expSendChan, netchan.Send) go func(){ for i:=1;;i++ { time.Sleep(1e9) expSendChan <- i } }() } func importer() { imp, _ := netchan.NewImporter("tcp","127.0.0.1:65432") impRecvChan := make(chan int) imp.Import("chan", impRecvChan, netchan.Recv) go func(){ for { log.Printf("%d", <-impRecvChan) } }() } func main() { exporter() importer() <-signal.Incoming } ただ、これが Importer と Exporter を別のプロセスを分けた時などに起こるような複数回 Importer が接続に行くような状況で上手くデータが転送されないみたいだ。
このソースの main() にある exporter() と importer() の呼び出しのうち片方をコメントアウトし、一方だけを呼ぶバイナリを…

Debian に HAProxy をインストール

HAProxy はロードバランサで、複数の Web サーバに処理を振り分けるために使われたりするもの。
このマシンで Web サーバとして使い始めた nginx も同じ用途で使えるので、通常あれば HAProxy を入れなくても大体同じことができる。

が、密かに企んでいる将来の目的にはどうも nginx が使えないらしい。目的の詳細についてはまた別な記事で語ることにして、今回は取りあえず HAProxy を経由して nginx に接続させるところまでやってみる。
apt-get install haproxy インストールができたら、/etc/default/haproxy の ENABLED を 1 に変更する。
vim /etc/default/haproxy#ENABLED=0 ENABLED=1 更に haproxy の設定ファイルを書き換える。
最初の時点でなんかわりと色々と書いてあるのだが、今回は真面目にロードバランサとして使うわけではないので取りあえずファイルをバックアップしつつ全面的に書きなおす方向で進める。
cd /etc/haproxy cp haproxy.cfg haproxy.cfg.default vim haproxy.cfgglobal user haproxy group haproxy daemon defaults mode http retries 3 option redispatch option forwardfor except 127.0.0.1/8 option SERVERID rewrite backend web timeout client 30s timeout server 30s timeout connect 1s balance roundrobin server web1 127.0.0.1:60080 rspirep ^(Location:\ [a-z]+://[-.a-z0-9]+)(:[0-9]+)(.*)$ \1\3 frontend all 0.0.0.0:80 default_backend web ※2010-12-01 追記 - Locationヘッダの書き換えを追加

HAProxy がポート…

Debian に Zend Framework をインストール

現在動いているメールフォームは PHP 標準機能とか mb_string ぐらいしか使っていなくて、わりと持ち運びしやすいスクリプトではあるのだが、ServersMan@VPS ではメールサーバを立てるつもりがないので mail 関数がそもそも使えなくなる。
外部の SMTP サーバを使ってメールを送信するには PEAR::Mail を使う手もあるが、今回は Zend Framework に存在する Zend_Mail を使ってその辺を作ってみようと思う。
なので Zend Framework 自体をインストールする。
cd ~ wget http://framework.zend.com/releases/ZendFramework-1.11.0/ZendFramework-1.11.0-minimal.tar.gz tar -zxf ZendFramework-1.11.0-minimal.tar.gz cd ZendFramework-1.11.0-minimal bin と library ディレクトリをインストール先に配置したい。まずは library を取りあえず他のPHPのファイルもある /usr/share/php を真似て /usr/local/share/php に一緒に突っ込んでしまうか。
mv library /usr/local/share/php あとは bin だけどこれも慣例的には /usr/local/bin でいいのかな? これは中身を入れる。
zf.bat は Windows 用のファイルで必要ないので消してしまおう。
あとマニュアル上では zf ってコマンドで呼ぼうとしてるので合わせるようにしてみる。
cd bin rm zf.bat mv zf.sh zf chmod 755 zf mv * /usr/local/bin php.ini に /usr/local/share/php を見に行くようにさせる。php5-fpm と cli の両方を設定しないとダメそう。
あとスクリプトを書き始めてから php.ini で date.timezone と mbstring.language と mbstring.internal_encoding が未設定なことに気づいた。この設定もこの辺でしておくとよさげ。
vim /etc…

自宅サーバを Ubuntu から Debian に変更

ServersMan@VPS で Debian を使い始めたので、自宅にあるサーバ用 Atom マシンを Ubuntu から Debian に切り替えた。
この PC は gPXE が使えるので、ネットワーク経由で小さいイメージを http ダウンロードして直接インストールできる。

基本的には ServersMan@VPS と同じような構成だけど、相変わらず自宅は固定 IP ではないので IP が変化するたびに DynamicDNS を更新する必要がある。
この更新は Ubuntu の時にも使っていた Python スクリプトがあるのでこれをそのまま持ち込んだ。
ただ、もちろん初期の状態では Python も入っていないので apt-get でインストールする。
apt-get install python これでインストールされる Python は 2.5 で若干古いものの、世の中にある Python 用のライブラリなどを調べているとどうも 2.5 が一番無難そうな気配があるのでこのままにしておく。
Python も準備できたところでスクリプトを配置する。
mkdir /usr/local/share/diceoov/ vim /usr/local/share/diceoov/diceoov.py#!/usr/bin/python # -*- coding: utf-8 -*- import urllib2, re, os IPCHECKER = r"http://global-ip.appspot.com/" DDNS_UPDATER = r"[DDNS更新用のリクエスト先URL]" def main(OLD_IP): #現在のIPアドレスを取得する now_ip = urllib2.urlopen(IPCHECKER).read().strip() #正しいIPアドレス表現で、前回からIPアドレスは変わっているか? if re.match(r"\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}", now_ip) and now_ip != OLD_IP: #IPアドレスの更新リクエスト a = urllib2.urlopen(DDNS_UPD…

Debian に Kyoto Tycoon、Net_KyotoTycoon をインストール

前回の記事でカウンタを SQLite3 に移行することに成功したのだが、なんか妙にパフォーマンスが安定しない。何度か F5 で読み込み直すと 100msec ちょっとぐらいで返ってきたり(それでも遅いけど)、500msec 以上掛かったり。
もしかして SQLite2 だと問題ないのかなと思い結局 php-sqlite を入れたりして実験してみると、確かに SQLite2 のコードの方が安定して 100msec を切っていた(それでも同時アクセスが集中すると簡単に遅くなっていく)。

アクセスが少ないんだからそれでいいじゃんという話もあるが、せっかく好き放題できるサーバなのだから好き放題やってみようと思い、Kyoto Tycoon のサーバを立てて PHP からアクセスさせてみることにした。こんなアクセスの少ないサイトに対してこんな豪華なものが使えるなんて幸せだ。

mikio さんのチュートリアルを参考にインストールする。とは言っても王道の流れで入れられるので特に壁になるようなことはない。
apt-get install g++ wget http://fallabs.com/kyotocabinet/pkg/kyotocabinet-1.2.24.tar.gz tar -zxf kyotocabinet-1.2.24.tar.gz pushd kyotocabinet-1.2.24 ./configure make make install popd wget http://fallabs.com/kyototycoon/pkg/kyototycoon-0.9.7.tar.gz tar -zxf kyototycoon-0.9.7.tar.gz pushd kyototycoon-0.9.7 ./configure make make install チュートリアルのように ktserver を起動して、ktremovemgr から set をしようとすると接続に失敗した。これは恐らく iptables によるものだと思うので、ループバックインターフェイスを正しく経由するように明示的に -h localhost を加えることで上手く動いた。
問題なく動いているようなので、PHP からアクセスできるように Net_KyotoTycoon をインストールする。これは p…

ServersMan@VPS の Entry を契約した

イメージ
無事にカードの再発行も済んだので、予定通り ServersMan@VPS の Entry プランに申し込んだ。
取りあえず使う予定のない ServersMan 提供ツール群は必要ないので Apache2 を消した。
その他 smadmin、serversman も必要ないので削除。

ServersMan@VPS の Debian はどうも locale が指定されていない状態になっているのか PuTTY で UTF-8 に設定した状態で日本語を打とうとしたら打てないことに気づいた。その辺の設定はここの記述を参考にして en_US.UTF-8 に設定した。
dpkg-reconfigure locales update-locale LANG=en_US.UTF-8 そして今まで書いてきたのとほぼ同じ手順でサーバを準備して、早速サイトの移植を開始。
元々のサーバである XREA.COMCORESERVER.JP の時に入っていたモジュールが一部入っていなかったりするので、その辺は随時インストールしながら作業していくことにする。

アクセスカウンタ
ほとんど見えないぐらい小さいサイズでさり気なく存在しているアクセスカウンタは、簡単な自作スクリプト。
データは SQLite2 のデータベースで扱っていて、文字の出力は GD 経由で xbm 形式の画像を読み込んで、png 画像として出力している。
ここで使っている SQLite2 と GD はどちらも入っていない。とはいえ SQLite2 をわざわざ入れるよりは SQLite3 を使ったコードに直すべきだと思うので、そこはコード側を修正する方針で進める(直す対象のコードも少ない)。インストールついでに APC も入れておく。高速化バンザイ。
SQLite2 と SQLite3 のデータベースファイルは互換性がないのでコンバート作業が必要。
apt-get install php5-gd php5-apc sqlite sqlite3 invoke-rc.d php5-fpm reload sqlite [カウンタのデータベースファイル名] .dump | sqlite3 [新しいデータベースファイル名] とても単純な構造だったので特に問題なく変換できた(もちろん本当は生成されるSQLデータをよく確認すべき。更にこのままだと…

Debian に daemontools をインストール

実は以前 Windows でも nginx + PHP の環境を作って PHP スクリプトを書いていたこともあったのだが、その時「いつの間にかプロセスが居なくなっている」というミステリーに遭遇した。
Windows 版がそんなに安定動作するとは思えないのでそれ自体は不思議ではないのだが、やはりサーバとして使うのであれば勝手に nginx とか PHP が居なくなってサイトが見れなくなっているのは寂しい(とはいえアクセスが少ないので実質的な問題はほとんどないが……)。

ServerMan@VPS の Entry プランはメモリも少なめで swap 領域も現状はないので、OOM Killer 様がやってきて殺戮していく可能性もあるし、でも自分が書いたスクリプトのバグなどで大量にメモリ食い潰したりした時は落として欲しいので OOM Killer 様も必要。
というわけで落ちた後に何食わぬ顔で立ち上がってくるようにしておきたいので、今回は daemontools をインストールしてみようと思う。

daemontools は apt-get でインストール。
apt-get install daemontools daemontools-run 基本的にはこれだけで daemontools は起動する。
daemontools でプロセスを監視させる場合、daemontools 側からサービス起動をしなければいけないようなので、nginx と php5-fpm を自動実行の対象から外しておく。sshd は OOM Killer の対象外だし失敗すると作業続行が出来なくなる可能性があるので取りあえず今回は除外。 まずは nginx から。
invoke-rc.d nginx stop update-rc.d -f nginx remove pushd /etc/service mkdir nginx pushd nginx vim run#!/bin/sh exec 2>&1 exec /usr/local/sbin/nginx -c /usr/local/nginx/nginx.conf -g 'daemon off;'chmod 700 run svc -u /etc/service/nginx これで daemontools 経由で起動す…

Debian にインストールした nginx を再調整

前回の記事の最後に書いた通り、nginx を ./configure する際のオプションを見なおして記事を修正した。とは言っても --user=www-data --group=www-data を追加して、指定しなくても問題なさげな md5 と sha1 の指定を外しただけ。

まだこれといって nginx.conf もそんなに弄っていなかったので、今回は思い切って /usr/local/nginx まるごと削除して make install し直した。ps aux でプロセス一覧を確認した限りでは問題なくなっているので無事成功したようだ。

DBはなくとも、取りあえずは Web サーバとして使える状態になったので現サイトを少しずつ移植していきたい。本当はデザインとかサイト構成とかも変えたいものの、その辺は弄りだすと永遠に終わらなくなるので気にしない方向で。

Debian に PHP5.3 をインストール

iptables の設定も終わったので、次は予定通り PHP のインストールをしようと思う。
PHP も頻繁にアップデートがあるのでソースから入れようかと思っていたのだが、丁度似たような時期に似たようなことをしている人がいて、明らかに自分より詳しそうな人なのでホイホイ参考にさせてもらいながら php5-fpm を入れてみようと思う。

php5-fpm 自体は Dotdeb のリポジトリにあるらしいので、一つ前の記事も参考にさせてもらいながら /etc/apt/sources.list にリポジトリを追加などを行う(Dotdebのインストラクションはこちら)。

ただし、hkp鍵サーバとの通信のために tcp の 11371番ポートで外部へアクセスできないといけないので、iptables の設定を弄る必要があった(※前回の記事を既に編集済み)。
su echo "deb http://php53.dotdeb.org stable all" >> /etc/apt/sources.list echo "deb-src http://php53.dotdeb.org stable all" >> /etc/apt/sources.list gpg --keyserver keys.gnupg.net --recv-key 89DF5277 gpg -a --export 89DF5277 | apt-key add - apt-get update apt-get install php5-fpm invoke-rc.d php5-fpm start あっさりと立ち上がるところまできてしまった。
あとは書いてあるように nginx.conf を編集すれば使えそうだ。
vim /usr/local/nginx/nginx.conf location ~ \.php$ { root html; fastcgi_pass 127.0.0.1:9000; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME /usr/loca…

Debian に iptables を設定

前回から少し間があいてしまったが、sshd と httpd が立っている Debian に対して、必要最低限のアクセスのみを許可するような設定を施したい。ただ iptables で出来る設定はネットワークに関する知識が乏しい自分にはなかなか難しく、手探り状態ながら作業してみる。
方針としてはその辺のサイトの解説でもよくあるようなホワイトリスト方式。ただし作業元の環境は固定IPアドレスは持っていないので、IPによる接続元制限はできない。

念のため netstat で使用中のポート一覧も確認して知らぬ間にサーバが立っていないか確認しておく。
以降のコマンドは全て su で root になった状態で叩いている。
netstat -anp 問題なさそうだったので、/etc/firewall.sh というファイルを新規作成して、vim で内容を作る。
touch /etc/firewall.sh chmod 700 /etc/firewall.sh vim /etc/firewall.sh#! /bin/sh LOCALNET=192.168.11.0/255.255.255.0 MY_SSHD_CONFIG=/etc/ssh/sshd_config iptables -F iptables -X iptables -P INPUT DROP iptables -P OUTPUT DROP iptables -P FORWARD DROP # Loopback iptables -A INPUT -i lo -j ACCEPT iptables -A OUTPUT -o lo -j ACCEPT # SYN Cookiesを有効にする # ※TCP SYN Flood攻撃対策 sysctl -w net.ipv4.tcp_syncookies=1 > /dev/null sed -i '/net.ipv4.tcp_syncookies/d' /etc/sysctl.conf echo "net.ipv4.tcp_syncookies=1" >> /etc/sysctl.conf # ブロードキャストアドレス宛pingには応答しない # ※Smurf攻撃対策 sysctl -w net.ipv4.icmp_echo_…

Debian に nginx をインストール

前回 SSH で秘密鍵を使ったログインができるようになった Debian に、今度は nginx を入れようと思う。
枯れているし .htaccess が使える Apache はとても便利だけど、非力なマシンでは軽さを優先したい。
そんな理由で今回は nginx を入れようと思う。

nginx は今もバリバリバージョンアップされているので、apt-get を使って入れた場合のバージョンを先に調べてみる。
apt-cache show nginx どうやら apt-get で入れようとすると現状では 0.6.32 がインストールされるらしい。
ちょっと古過ぎる気もするのでソースからインストールすることにしようと思う。

本当に何もない状態からのインストールなので、gcc や make なども必要。
とりあえず今回は libpcre3-dev と lib-ssl-dev があれば configure に成功するようだ。
一気に make と make install までやる。
su apt-get install gcc make libpcre3-dev libssl-dev cd ~ wget http://nginx.org/download/nginx-0.8.53.tar.gz tar -zxf nginx-0.8.53.tar.gz cd nginx-0.8.53 ./configure --user=www-data --group=www-data --sbin-path=/usr/local/sbin/nginx --conf-path=/usr/local/nginx/nginx.conf --pid-path=/usr/local/nginx/logs/nginx.pid --with-http_ssl_module make make install インストールに成功したら、起動用のスクリプトをここからもらってくる。
configure の際のパラメータは予めこの起動用スクリプトに合わせたファイル構成にしてあるから改変なしで上手くいく。
wget -O /etc/init.d/nginx http://www.debianadmin.com/images/nginx chmod 755 /etc/init.d/nginx 試しに起動して接続テスト…

Windows Virtual PC に Debian をインストールし、SSH の設定をする

イメージ
ServersMan@VPS の Entry プランを試しに申し込んでみようかと思っているものの、先日起きた個人情報流出に巻き込まれてしまって普段使っているカードが一時的に使えなくなっているので、取りあえず予行練習ということで Windows Virtual PCDebian をインストールしてみようと思う。

元々 Windows 以外の OS に関してはそんなに詳しくはないものの、Ubuntu は多少使ったことがあるので CentOS よりは Debian の方が慣れやすいだろう、というところで Debian を選んだ。

取りあえずメモリは ServersMan@VPS の Entry プランの基本になる 256MB に。HDD は検索したところによると容量可変のHDDを使うと VirtualPC 2007 で問題が起こっていたらしいので、取りあえず「詳細オプションを使用して仮想ハードディスクを作成する」を選んで、「固定サイズ」、10240MB の HDD を作成。

Debian は 150MB 程の小さい ISO イメージをダウンロードした。
仮想マシンを起動したら ISO イメージを選択。インストーラの起動画面まで到達できた。


2007 だとここからもまだ Kernel Panic が起こったりして noreplace-paravirt というオプションが必要になったりするらしい話も見かけたものの、手元の環境では何も指定しなくても問題なさそうだ。

まず言語選択。ここは迷わず English を選択する。大抵の場合 English の方が都合がいいから。

次に「Choose a country, territory or area」と言われるが、ここでは「other」を選ぶ。
すると「Choose a continent or region」と言われるので、選択肢の中から「Asia」を選ぶ。
こうすると次の「Choose a country, territory or area」ではさっき存在しなかった「Japan」が選べるので選ぶ。

続いてキーボードレイアウトを選ぶ。日本語キーボードを使っているので「Japanese」を選ぶ。

少しの間色々と進行して、ネットワークの設定が始まる。Hostname を決めろと言われるが、その辺は好みで。今回はめんどいので…