daemontoolsでTokyoTyrantを監視する

このエントリーをはてなブックマークに追加
はてなブックマーク - daemontoolsでTokyoTyrantを監視する
Share on Facebook

TokyoTyrantは非常に安定したソフトウェアですが、万が一不正終了した場合に備えて、daemontoolsで再起動できるように設定しました。

「daemontoolsって何?」「インストール方法は?」という方は、下の記事をご覧ください。

daemontoolsでプロセスを監視する | 1000g

runスクリプトの作成

/service/ttserver/run を下記のように書きます。 起動オプションは自分の環境に合わせて書き直してください。 (ただし落とし穴があります!詳細は後述。)

#!/bin/sh
exec 2>&1
exec ttserver -host localhost -port 1978 /var/ttserver/casket.tch#bnum=1000000

同様に、/service/ttserver/log/run は下記の通りになります。

#!/bin/sh
exec multilog t ./main

それぞれ実行権限を付与するのを忘れないでください。

# chmod +x /service/ttserver/run
# chmod +x /service/ttserver/log/run

動作テスト

# svc -u /server/ttserver
# svstat /service/ttserver/
/service/ttserver/: up (pid 20041) 86 seconds   # プロセス監視できている
# kill -9 20041                                 # 不正終了させてみる
# svstat /service/ttserver/
/service/ttserver/: up (pid 20058) 2 seconds    # ちゃんと再起動している

注意

TokyoTyrantの起動オプションに注意が必要です。

「-dmn」オプションは付けてはいけない

daemontoolsの原則として、監視対象はフォアグラウンドで実行させねばなりません。バックグラウンドで実行されると、daemontoolsはプロセスを正しく取得できず、延々と再起動を繰り返してしまいます。

「-dmn」オプションは外しましょう。

「-pid {pid}」オプションも付けてはいけない

TTが不正終了してpidファイルが残ってしまうと、再度TT起動コマンドを叩いても、以下のようなエラーが出て起動できなくなります。

the process 18080 may be already running

TTは起動時に、pidの有無をもとにプロセスが既に存在しているかどうかを判断してしまうようです。

「-pid」も外しましょう。

参考

daemontoolsでプロセスを監視する

このエントリーをはてなブックマークに追加
はてなブックマーク - daemontoolsでプロセスを監視する
Share on Facebook

daemontoolsとは

プロセス管理とロギングを行うツールです。プロセスを監視し、もし異常終了しても即座に再起動することが可能になります。システムの可用性を保つのに非常に有効です。

2001年にリリースされたv0.76で完成されたようで、それ以来開発が止まっています。

インストール

以下はCentOSでの例です。yumにはパッケージが無いので、RPMをリビルドしてインストールします。

# wget http://www.qmail.org/rpms/RPMS/daemontools-0.76-112memphis.i386.rpm
# rpm -ivh daemontools-0.76-112memphis.i386.rpm

その他のディストリビューションの場合、ソースからビルドしてください。 ちなみにDebian系の場合はaptパッケージがあるようです。

参考: ブローヴちゃん: Debian に daemontools をインストール

RPMからインストールするとデーモンは自動起動しないため、手動で起動します。

# svscan /service &
[1] 30103

初期設定

inittab組み込み

Linux起動時にdaemontoolsが自動起動されるようにします。

  1. /etc/inittabの最下部に下記の行を追加
#daemontools
SV:123456:respawn:/command/svscanboot
  1. inittab再読み込み
# kill -HUP 1

これでdaemontoolsの監視プロセス(supervise, svscan)が起動します。

# ps aux | grep supervise
root      7738  0.0  0.0   3676   364 ?        S    16:39   0:00 supervise ttserver

# ps aux | grep svscan
root      7736  0.0  0.0   3848   424 ?        S    16:39   0:00 svscan /service

それぞれのプロセスの役割は、下記の記事に大変詳しく書いてあります。

私家版 daemontools FAQ (1/3)

基本コマンド

mojamojaデーモンを操作するコマンドは以下の通りになります。runスクリプト(後述)は「/service/mojamoja/run」という想定です。

デーモンの操作

  • 開始(up)
# svc -u /service/mojamoja
  • 停止(down)
# svc -d /service/mojamoja
  • 再起動
# svc -t /service/mojamoja
  • サービスの停止後 supervise を終了し、再起動しないようにする
# svc -dx /service/mojamoja /service/mojamoja/log
  • 全てのサービスの停止後 supervise を終了し svscan を終了する
# svc -dx /service/*
# svc -dx /service/*/log
# killall svscan 

その他、HUPやALRMなどのシグナルを送ることもできます。詳しくは daemontools howto をご覧ください。。

状態確認

svok

# svok /service/mojamoja/; echo "$?"
0

0が表示されればデーモンは正常に動いています。

svstat

# svstat /service/mojamoja/
/service/mojamoja/: up (pid 12482) 0 seconds

「up」ならばプロセスが起動しています。 ただし、「* seconds」が増加せずいつまでも0や1の場合、うまく動いていない可能性が大です。 (下記のトラブルシューティング参照)

ps aux

最新のエラーはプロセス一覧に表示されます(わかりづらい)。正常な時は下記のように「…….」と表示されますが、エラーがあると「…」の代わりにエラーメッセージが入ります。

$ ps aux | grep read
root     29781  0.0  0.0   3664   328 ?        S    17:46   0:00 readproctitle service errors: ................................................................................................................................................................................................................................................................................................................................................................................................................

ログの表示

daemontoolsのログには、「TAI64N形式」という、うるう秒を考慮したタイムスタンプが付いています。正確ですが人間に可読ではありません。

そこで、daemontools付属のtai64nlocalを使うことで、ログを読みやすくすることができます。

$ tai64nlocal < /service/ttserver/log/main/current
2012-01-16 18:32:29.571225500 Starting the server of Tokyo Tyrant
2012-01-16 18:32:30.593347500 Existing process: 8790

なお、「/service/mojamoja/log/main」配下には「@*.s」「@.u」から始まるファイルが複数出現します。前者は正常に書き込み完了した古いログ、後者は異常終了した古いログファイルです。

監視スクリプトの作成

daemontools の svscan プロセスは定期的に /service 内を監視します。 また、標準出力のメッセージをロギングするため、「exec 2>&1」を指定しています。

以下、mojamojaプロセスを監視するスクリプトと、その実行結果をロギングするスクリプトを書きます。

監視スクリプト

# mkdir /service/mojamoja/run
# vi /service/mojamoja/run

----
#!/bin/sh
exec 2>&1
exec /usr/local/bin/mojamoja start
----

# chmod u+x /service/mojamoja/run 

ログ出力スクリプト

デーモン化したプログラムの標準出力と標準エラーをログに出力します。

# mkdir -p /service/mojamoja/log/main
# vi /service/mojamoja/log/run

----
#!/bin/sh
exec 2>&1
exec multilog t ./main
----

# chmod u+x /service/mojamoja/log/run

以上で完成です。 superviserはmojamojaプロセスを監視しています。 異常発生時にはロギングを行い、プロセスは自動で再起動できるようになりました。

プロセスの監視を開始するには、「svc -u /service/mojamoja」コマンドを実行します。

# svc -u /service/mojamoja/
# svstat /service/mojamoja/
/service/mojamoja/: up (pid 18080) 3 seconds    # 無事稼働
# kill -9 18080                                 # 異常終了
# svstat /service/mojamoja/
/service/mojamoja/: up (pid 18132) 3 seconds    # ちゃんと再起動しています

トラブルシューティング

superviseがエラーを吐く

svstatコマンドの結果、以下のようなエラーが出る場合。

# svstat /service/mojamoja
supervise: fatal: unable to acquire mojamoja/supervise/lock: temporary failure

指定したデーモンが正しく終了しなかった時に出るようです。再起動することで修復します。

# svc -dx /service/mojamoja /service/mojamoja/log

デーモンが1秒以上動かない

svstatを見ると起動時間が0秒 or 1秒で、何度も再起動が発生している場合、プロセスがバックグラウンドで実行されている可能性があります。 バックグラウンドで実行してしまうと、superviserはプロセスが起動していることを認識できず、何度も再起動して、そのたびプロセスから「起動済み」エラーが出て強制終了させられます。

runファイルに書き込むプロセスはフォアグラウンドで実行させなければいけません

exec mojamoja.sh &    # NG
exec mojamoja.sh      # OK

「デーモンとして起動」といった起動オプションを付けている場合も要注意です。 私はTokyoTyrantで「-dmn」オプションを付けていることに気付かず4時間ほど浪費しました。

参考

最新のパッケージをyumでインストールする

このエントリーをはてなブックマークに追加
はてなブックマーク - 最新のパッケージをyumでインストールする
Share on Facebook

yum公式リポジトリ内の古いApacheやphpではなく、最新版をrpmで入れる方法です。

下記に記す非公式リポジトリを参照することで、最新のパッケージをyumでインストールできます。

もちろん公式のリポジトリより信頼性は劣るようなので、注意が必要です。

手順

Remiリポジトリ追加

RemiリポジトリはEPELリポジトリに依存しているため、両方追加する必要があります。

最新のダウンロード先は下記から確認してください。

# wget http://rpms.famillecollet.com/enterprise/remi-release-5.rpm
# wget http://download.fedora.redhat.com/pub/epel/5/i386/epel-release-5-4.noarch.rpm
# rpm -ivh epel-release-5-4.noarch.rpm remi-release-5.rpm

※前のバージョンのrpmが入っている場合、「rpm -Uvh {パッケージ名}」を指定します。

これでyumのリポジトリにRemiとEPELを参照できるようになりました。

$ ls /etc/yum.repos.d/
CentOS-Base.repo       CentOS-Media.repo  epel-testing.repo  remi.repo
CentOS-Debuginfo.repo  CentOS-Vault.repo  epel.repo

Utterリポジトリ追加

/etc/yum.repos.d/utter.repo を開き、下記のように編集します。

[utter]
name=Jason's Utter Ramblings Repo
baseurl=http://www.jasonlitka.com/media/EL$releasever/$basearch/
enabled=0
gpgcheck=1
gpgkey=http://www.jasonlitka.com/media/RPM-GPG-KEY-jlitka

以上で、phpやhttpdの最新版がyumでインストールできるようになりました。

最新パッケージのインストール

yumコマンドに「–enablerepo={リポジトリ名}」オプションを付けることで、それぞれのリポジトリを参照できます。

PHPの場合

# yum --enablerepo=remi install php
...
===================================================================================================================
 Package                  Arch                 Version                                 Repository             Size
===================================================================================================================
Installing:
 php                      x86_64               5.3.9-1.el5.remi                        remi                  2.8 M
Installing for dependencies:
 httpd                    x86_64               2.2.3-53.el5.centos.3                   updates               1.2 M
 libedit                  x86_64               2.11-2.20080712cvs.el5                  epel                   80 k
 php-cli                  x86_64               5.3.9-1.el5.remi                        remi                  2.6 M
 php-common               x86_64               5.3.9-1.el5.remi                        remi                  997 k

Transaction Summary
===================================================================================================================
Install       5 Package(s)
Upgrade       0 Package(s)

Total download size: 7.7 M
Is this ok [y/N]: 

Apache2(httpd)の場合

# yum --enablerepo=utter install httpd
...
===================================================================================================================
 Package                       Arch                   Version                          Repository             Size
===================================================================================================================
Installing:
 httpd                         x86_64                 2.2.21-jason.1                   utter                 3.2 M
Installing for dependencies:
 apr-util-ldap                 x86_64                 1.3.12-1.jason.1                 utter                  20 k
Updating for dependencies:
 apr-util                      x86_64                 1.3.12-1.jason.1                 utter                 201 k

Transaction Summary
===================================================================================================================
Install       2 Package(s)
Upgrade       1 Package(s)

Total download size: 3.4 M
Is this ok [y/N]: 

参考

pacoでソースからインストールしたアプリを管理する

このエントリーをはてなブックマークに追加
はてなブックマーク - pacoでソースからインストールしたアプリを管理する
Share on Facebook

pacoは、自分でソースからインストールしたアプリでもrpmのようにパッケージ管理できるようになるツールです。

インストール手順

最新のソースは paco – a source code pacKAGE oRGANIZER for Unix/Linux で確認してください。

# wget http://sourceforge.net/projects/paco/files/paco/2.0.9/paco-2.0.9.tar.bz2/download
# tar xvf paco-2.0.9.tar.bz2 
# cd paco-2.0.9
# ./configure --disable-gpaco
# make
# make install
# make logme

今回はGUIを使わないので、configureオプションに「–disable-gpaco」を付けています。 これを付けないと「No package ‘gtkmm-2.4′ found」というエラーが出ます。

最後の「make logme」でpaco自身のインストール内容を記録しています。

使い方

インストールを記録する

今後、何らかのアプリをmake installする際には、「paco -D」を付けることでpacoに記録できます。

# cd {インストールしたいパッケージ}
# paco -D make install

インストール済みパッケージを確認する

「-a」オプションを使います。

# paco -a
paco-2.0.9

パッケージでインストールされたファイルを確認する

「-f」オプションを使います。

$ paco -f paco-2.0.9
paco-2.0.9:
/usr/local/share/paco/README
/usr/local/lib/libpaco-log.a
/usr/local/lib/libpaco-log.la
/usr/local/lib/libpaco-log.so
/usr/local/lib/libpaco-log.so.0
/usr/local/lib/libpaco-log.so.0.0.0
/usr/local/bin/paco
/usr/local/etc/pacorc
/usr/local/lib/pkgconfig/paco.pc
/usr/local/share/man/man5/pacorc.5
/usr/local/share/man/man8/paco.8
/usr/local/share/man/man8/pacoball.8
/usr/local/share/man/man8/rpm2paco.8
/usr/local/share/man/man8/superpaco.8
/usr/local/share/paco/faq.txt
/usr/local/share/paco/pacorc
/usr/local/bin/ocap
/usr/local/bin/pacoball
/usr/local/bin/rpm2paco
/usr/local/bin/superpaco

パッケージをアンインストールする

「-r」オプションです。

# paco -r {アンインストールしたいパッケージ名}

参考

CentOSでbzip2が解凍できないエラー

このエントリーをはてなブックマークに追加
はてなブックマーク - CentOSでbzip2が解凍できないエラー
Share on Facebook

bzip2ファイルを解凍しようと思ったら、見慣れないエラーが出ました。

# tar xvf paco-2.0.9.tar.bz2 
tar: bzip2: exec 不能: そのようなファイルやディレクトリはありません
tar: エラーを回復できません: 直ちに終了します
tar: Child returned status 2
tar: 処理中にエラーが起きましたが、最後まで処理してからエラー終了させました

ただ単にbzip2がインストールされていなかったのが原因でした。yumで入れて即解決です。

# yum -y install bzip2
...
Installed:
  bzip2.x86_64 0:1.0.3-6.el5_5                                                                                     

Complete!

CloudCore VPSでこのエラーに遭遇しました。 CentOSの最小構成でインストールされているようで、ごく普通のコマンドが使えないことが多いです。 パッケージが不足していないか注意が必要ですね。

参考

CloudCore VPS初期設定

このエントリーをはてなブックマークに追加
はてなブックマーク - CloudCore VPS初期設定
Share on Facebook

高スペック&安価&国産で話題のCloudCore VPSをレンタルしてみました。 このスペックで月980円はたしかにお得です。

# cat /etc/redhat-release 
CentOS release 5.6 (Final)

# df -h
Filesystem          サイズ  使用  残り 使用% マウント位置
/dev/vda1              97G  5.0G   87G   6% /
tmpfs                1003M     0 1003M   0% /dev/shm

# cat /proc/cpuinfo
processor       : 0
vendor_id       : AuthenticAMD
cpu family      : 16
model           : 2
model name      : AMD Phenom(tm) 9550 Quad-Core Processor
stepping        : 3
cpu MHz         : 2199.998
cache size      : 512 KB
fpu             : yes
fpu_exception   : yes
cpuid level     : 5
wp              : yes
flags           : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 syscall nx mmxext fxsr_opt pdpe1gb lm up pni cx16 popcnt lahf_lm cmp_legacy svm cr8_legacy altmovcr8 abm sse4a misalignsse
bogomips        : 4399.99
TLB size        : 1024 4K pages
clflush size    : 64
cache_alignment : 64
address sizes   : 40 bits physical, 48 bits virtual
power management:

# cat /proc/meminfo 
MemTotal:      2053764 kB
MemFree:       1859380 kB

まずは初期設定メモを残しておきます。

よく使うパッケージのインストール

CentOS最小構成でインストールされているらしく、よく使うパッケージが全然入っていません。入れておきましょう。

# yum -y install sudo vim-enhanced iptables vsftpd bzip2 gcc gcc-c++ make automake mlocate

導入しているパッケージの説明は下記の通り。

パッケージ名 説明
sudo sudoコマンド
vim-enhanced 標準で入っているviの高機能版
iptables ファイアーウォール
vsftpd FTPデーモン
bzip2 bzip2圧縮・解凍
gcc, gcc-c++ コンパイル時に必要
make, automake ソースからインストールする時必要
mlocate locate & updatedbコマンド
vixie-cron crontabコマンド & cronデーモン

crondは起動し、自動起動をオンにしておきます。

# /etc/rc.d/init.d/crond start
# chkconfig crond on

また、インストール済みのパッケージを更新しましょう。 私の場合100パッケージ(129MB)ありました。

# yum update

作業用ユーザー追加

rootでの作業はリスク上よろしくないので、作業用ユーザーを追加します。 wheelグループに追加することで、su権限が得られます。

# useradd mojamoja
# usermod -G wheel mojamoja

wheelグループのユーザーがsudoを実行できるよう設定します。

# visudo

----
## Allows people in group wheel to run all commands
%wheel  ALL=(ALL)       ALL
↑この行のコメントアウトを外す。

sshポートの変更

sshポートデフォルトの22番ではポートスキャンの標的になりやすいので、変更します。

#vim /etc/ssh/sshd_config

以下の行を変更。

#port 22
port 10022

sshデーモンを再起動して変更を反映します。 これで22番ポートではsshログインできなくなっています。

# /etc/init.d/sshd restart

不要なデーモンの停止

初期状態では4つのデーモンしか自動起動設定になっておらず、特に停止するようなデーモンはありません。

参考: スペック|CloudCore VPS|KDDIウェブコミュニケーションズ

ファイアーウォールの構築

ssh(10022), FTP, HTTPで接続できるようポートを開放してやります。 下記シェルファイルを作成し、実行してください。

※コンソールから1行ずつ打つと、「/sbin/iptables -P INPUT DROP」設定直後にコンソールが操作不能になります。 その場合、コントロールパネルから再起動することで再度ログイン可能になります。

#!/bin/sh
 
/sbin/iptables -F
/sbin/iptables -X
 
/sbin/iptables -P INPUT DROP
/sbin/iptables -P OUTPUT ACCEPT
/sbin/iptables -P FORWARD DROP
 
/sbin/iptables -A INPUT -i lo -j ACCEPT
/sbin/iptables -A OUTPUT -o lo -j ACCEPT
 
/sbin/iptables -A INPUT -s 10.0.0.0/8 -j DROP
/sbin/iptables -A INPUT -s 172.16.0.0/12 -j DROP
/sbin/iptables -A INPUT -s 192.168.0.0/16 -j DROP
 
/sbin/iptables -A INPUT -p icmp --icmp-type echo-request -j ACCEPT
 
/sbin/iptables -A INPUT -p tcp --dport 10022 -j ACCEPT
/sbin/iptables -A INPUT -p tcp --dport 80 -j ACCEPT
 
/sbin/iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
 
/etc/rc.d/init.d/iptables save
 
/sbin/service iptables restart

設定が終わったら実行します。

# chmod +x set_iptables.sh 
# ./set_iptables.sh 
ファイアウォールのルールを /etc/sysconfig/iptables に保存中[  OK  ]
ファイアウォールルールを適用中:                            [  OK  ]
チェインポリシーを ACCEPT に設定中filter                   [  OK  ]
iptables モジュールを取り外し中                            [  OK  ]
iptables ファイアウォールルールを適用中:                   [  OK  ]

無事設定できたら、サーバー起動時にサービスが開始するよう設定します。設定が間違ったままこれをonにすると、コントロールパネルから再起動してもログイン不能になるので注意してください。

# chkconfig iptables on

FTPを接続可能にする

/etc/vsftpd/vsftpd.conf を以下のように設定します。

以下の既存の行を修正する。

# 匿名ユーザーのログインを禁止
anonymous_enable=NO

# asciiモードでファイルを転送可能にする
ascii_upload_enable=YES
ascii_download_enable=YES

以下の行を追加。

# ファイル所有者を数字ではなくユーザー名で表示する
text_userdb_names=YES

# ファイルの上書き時間が日本時間になる
use_localtime=YES

設定が終わったら起動し、自動起動もオンにしましょう。

# /etc/rc.d/init.d/vsftpd start
vsftpd 用の vsftpd を起動中:                               [  OK  ]
# chkconfig vsftpd on

FTPクライアントで10022番ポートにSFTP接続可能になっていることを確認してください。

参考

Windows7にAndroid開発環境構築

このエントリーをはてなブックマークに追加
はてなブックマーク - Windows7にAndroid開発環境構築
Share on Facebook

「Androidは簡単に開発が可能」と言われてる割に導入が面倒だったので、メモしておきます。

手順

1. 必要ファイルのダウンロード

Windows 7 64bitの場合、下記アプリをダウンロードしました。

2. Java 6 JDKの設定

インストールしたファイルを実行して、画面に従うだけ。

3. Android SDKの設定

  1. ダウンロードしたファイルを解凍orインストーラー実行
  2. Android SDKのインストールが完了後、Managerが起動するので、使いたいAPIにチェックして[Install * Packages]
    • 2.1を選べば97%のAndroidユーザーをカバーできるらしいので、チェック
    • 必要に応じて別のバージョンもインストールする

4. Eclipseの設定

Android Developer Tools (ADT)のインストール

  1. ダウンロードしたファイルを解凍し、eclipse.exeを実行
  2. Eclipseを起動し、[Help] – [Install software]
  3. [Work with:]の隣にある[Add]をクリック。完了したら[OK]
    • Name: Android Plugin
    • Location: http://dl-ssl.google.com/android/eclipse/
    • 「https」を指定すると途中でエラーが出て止まる
  4. [Work with:]に今入力した項目を選択。数十秒「Pending…」が表示された後、[Developer Tools]が出てきたらチェックを付けて[Next]
  5. インストールされるパッケージ一覧が出るので、[Finish]
  6. 途中「Security Warning」が出るが、[OK]
  7. 長時間インストール完了を待ち、完了したら[Restart Now]
  8. Eclipse再起動後、「Welcome to Android Development」が表示されるので、[Use existing SDKs]にチェック
  9. SDKのインストール先を指定して[Next]
    • デフォルトなら “C:\Program Files (x86)\Android\android-sdk”
  10. 統計データをGoogleに送るかどうか選択して[Finish]

AVDの作成

  1. [Window] – [AVD Manager]
  2. [New]
  3. 下記項目を入力して[Create AVD]
    • [Name]: 機器名。好きな名前でOK
    • [Target]: Androidのバージョン
    • [SD Card]: エミュレータが使用するSDカード容量。32MBもあれば十分
    • [Skin]: 画面解像度
    • [Hardware]: エミュレータのハード。GPSなど、開発しようとするアプリに合わせて選択
  4. [Start]をクリックして、エミュレータが起動したらOK
    • 日本語化したい場合
    • 起動後にホーム画面でメニューボタンクリック
    • [Settings] > [Language & keyboard]
    • [Select locale]から日本語を選択

設定は以上で完了です。

5. サンプルアプリのビルド

ここまででビルド可能になっているので、試してみましょう。

  1. [File] – [New] – [Other...]
  2. Android Project を選択して[Next]
  3. 以下のように設定して[Next]
    • Project Name: SampleApp
    • “Create projects from existing source”にチェック
    • Location: “C:\Program Files (x86)\Android\android-sdk\samples\android-7\SkeletonApp”
  4. Build Targetは”Android 2.1″にチェックして[Next]
  5. Minumum SDKを”7″にして[Finish]
  6. [Run] – [Run Configurations...]
  7. [New launch configuration]アイコンをクリック
  8. [Project:]に”SampleApp”を指定して[Run]
  9. エミュレーター上に”Hello there, you Activity!”と表示されれば成功

なお、ビルドされたアプリはbinディレクトリの下に「SampleApp.apk」という名前で入っています。これをAndroidに転送すれば実機で実行できます。 (ただし「提供元不明のアプリ」を使用可能にしておくこと)

参考

CentOS 5.5にyumでgitをインストールする

このエントリーをはてなブックマークに追加
はてなブックマーク - CentOS 5.5にyumでgitをインストールする
Share on Facebook

さくらVPS(CentOS 5.5が標準OS)を試用中です。早速gitを使おうと思いましたが、デフォルトでは未インストール。yumで入れようと思いましたが、標準のリポジトリではインストールできません。

というわけで、リポジトリを追加します。

インストール手順

1. 参照リポジトリを追加する

/etc/yum.repos.d/rpmforge.repo を作成し、下記のように追記します。

[rpmforge]
name = Red Hat Enterprise $releasever - RPMforge.net - dag
mirrorlist = http://apt.sw.be/redhat/el5/en/mirrors-rpmforge
enabled = 0
gpgcheck = 0

2. yumでインストールする

# yum install git --enablerepo=rpmforge
Loaded plugins: fastestmirror
Loading mirror speeds from cached hostfile
 * base: ftp.nara.wide.ad.jp
 * extras: ftp.nara.wide.ad.jp
 * rpmforge: ftp-stud.fht-esslingen.de
 * updates: ftp.nara.wide.ad.jp

...

 ====================================================================================================================
 Package                  Arch                   Version                             Repository                Size
====================================================================================================================
Installing:
 git                      x86_64                 1.7.6.4-1.el5.rf                    rpmforge                 6.6 M
Installing for dependencies:
 perl-DBI                 x86_64                 1.52-2.el5                          base                     600 k
 perl-Git                 x86_64                 1.7.6.4-1.el5.rf                    rpmforge                  24 k

Transaction Summary
====================================================================================================================
Install       3 Package(s)
Upgrade       0 Package(s)

Total download size: 7.2 M
Is this ok [y/N]: y
...
Complete!
  1. 確認
# git --version
git version 1.7.6.4

完了です。

参考

HTTP_Request2でhttps接続できない場合の対策

このエントリーをはてなブックマークに追加
はてなブックマーク - HTTP_Request2でhttps接続できない場合の対策
Share on Facebook

HTTP_Request2::send()でhttpsサイトに接続しようとしたら、下記のようなエラーが返ってきました。

Malformed response:
Unable to connect to ssl://www.google.com:443.
stream_socket_client(): unable to connect to ssl://www.google.com:443 (Unknown error)

Unknown errorというのが一番タチが悪い。エラーが追えません。

検証のためcurlコマンドで同じURLに接続を試みると、ちゃんとレスポンスが返ってきます。何か設定をし忘れているに違いない。

原因

どうやらHTTP_Request::setConfig()で正しい接続設定を行えていない場合、”Malformed response”というエラーが出るようです。 私の場合、オレオレ証明書の許可と社内プロキシの設定を行っていなかったためにはまってしまったようです。

対応

オレオレ証明書を持ったサイトを許可するために、setConfig()でssl_verify_peerssl_verify_hostをfalseに設定してやります。 また、プロキシの設定も行います。

<?php
require_once('HTTP/Request2.php');
$req = new HTTP_Request2();

$req->setConfig(array(
    'ssl_verify_host' => false,
    'ssl_verify_peer' => false,
    'proxy_host' => 'uso.proxy.jp',
    'proxy_port' => '8080',
));

$response = $req->setUrl("https://www.google.com/")->send();
print_r($response);     // HTTPレスポンスが出力される

ほかにも設定項目はあるので、マニュアルを参考に設定を疑ってみてはどうでしょうか。

参考

pear installできないのがpear clear-cacheで解決

このエントリーをはてなブックマークに追加
はてなブックマーク - pear installできないのがpear clear-cacheで解決
Share on Facebook

pear installでパッケージをインストールしようと思いましたが、身に覚えのないエラーが出て困りました。

$ pear install HTTP_Request2
PHP_PEAR_PHP_BIN is not set correctly.
Please fix it using your environment variable or modify
the default value in pear.bat
The current value is:
.\php.exe

$ pear install Net_URL2-2.0.0
SECURITY ERROR: Will not write to C:\DOCUME~1\keijiro\LOCALS~1\Temp\pear\cache\ee3f372dc6f69cdae3c6b0c2a0d1098erest.cacheid as it is symlinked to C:\DOCUME~1\keijiro\LOCALS~1\Temp\pear\cache\ee3f372dc6f69cdae3c6b0c2a0d1098erest.cacheid - Possible symlink attack
install failed

「PHP_PEAR_PHP_BINが間違ってる」「一時ファイルが書き込めない」など言われていますが、どちらも正常に設定できています。

はてどうしたことか。 と思いましたが、pear clear-cacheを実行したらコマンドが通るようになりました。

$ pear clear-cache
reading directory C:\DOCUME~1\keijiro\LOCALS~1\Temp\pear\cache
1024 cache entries cleared

$ pear install Net_URL2-2.0.0

Notice: fwrite(): send of 189 bytes failed with errno=10054 既存の接続はリモート ホストに強制的に切断されました。
 in PEAR\Downloader.php on line 1664
downloading Net_URL2-2.0.0.tgz ...
Starting to download Net_URL2-2.0.0.tgz (11,325 bytes)
.....done: 11,325 bytes
install ok: channel://pear.php.net/Net_URL2-2.0.0

$ pear install HTTP_Request2-2.0.0

Notice: fwrite(): send of 189 bytes failed with errno=10054 既存の接続はリモート ホストに強制的に切断されました。
 in PEAR\Downloader.php on line 1664
pear/HTTP_Request2 can optionally use PHP extension "curl"
pear/HTTP_Request2 can optionally use PHP extension "fileinfo"
downloading HTTP_Request2-2.0.0.tgz ...
Starting to download HTTP_Request2-2.0.0.tgz (97,476 bytes)
......................done: 97,476 bytes
install ok: channel://pear.php.net/HTTP_Request2-2.0.0

Noticeが出ていますが、問題無く使えました。

参考