2011年4月15日金曜日

CentOS5にcairoインストールでハマる

どうも、俺@ハマってばっかりです。

CentOS5にrrdtoolをソースからインストールする場合、色んなパッケージも一緒にインストールする必要があります。
yumで一発インストールすればすべて解決なので、そんな便利な物使えない時ってありますよね。。。いや、なくてもソースからconfigureオプション指定してキチっとインストールしたい場合ありますよね。

rrdtoolをインストールする際にはざっと
・zlib
・libpng
・freetype-2
・fontconfig
・libpango
・libcairo
・libpixman
が必要になります。他にもgdとかも必要かな。

今日はその中のcairoをインストールする際にハマったのでメモメモ。
./configureコマンドで
configure: error: pixman >= 0.10.0 is required
と出てしまい、「こりゃpixmanってやつインストしなあかんねんな」と思いpixmanをググって探します。
pixman-0.20.2あったので
# wget http://cairographics.org/releases/pixman-0.20.2.tar.gz
 # tar zxvf pixman-0.20.2.tar.gz
 # cd pixman-0.20.2
 # ./configure
 # make
 # make install
でインストしました。
# ls /usr/local/lib
libpixman-1.a
libpixman-1.la
libpixman-1.so
libpixman-1.so.0
libpixman-1.so.0.20.2
ちゃんとインストされてます。
# cd /path/to/cairo
 # ./configure
configure: error: pixman >= 0.10.0 is required
あれれ!?また同じエラーが、、

pixmanライブラリを認識していないでは?と思い
# vim /etc/ld.so.conf
------------------------------
/usr/local/lib

# ldconfig
としてもダメ。
# ./configure --libdir=/usr/local/lib
としてもダメ。



そんな時は
# export PKG_CONFIG_PATH=/usr/local/lib/pkgconfig:/usr/local/share/pkgconfig:/usr/lib/pkgconfig:/usr/share/lib/pkgconfig
としてみてください。
きっと解決するはず。
詳しくはman pkg-configに。


以上でぇぇえぇす。

2011年4月13日水曜日

CentOS4.3にnode.jsをインストールする

どうも、俺@お仕事中です。
忘れないうちにメモメモします。

CentOS4.3にnode.js(0.4.2)をインストールした時少しハマりました。
まずは本体をDL。
# wget 'http://nodejs.org/dist/node-v0.4.2.tar.gz'
次に解凍しいつものやつ。
# tar zxvf node-v0.4.2.tar.gz
# cd node-v0.4.2
# ./configure
まずここでズッコけました。

Pythonのバージョンが2.4以上でないとconfigureできないようです。
# python -V
Python 2.3.4
ズッコケた場合は、各々の環境に合わせてインストールされているPythonのバージョンを上げてください。
僕の環境では古いバイナリをアンインストールし、新しいバージョンのものをソースから再インストールしました。
# python -V
Python 2.7
次にmake。
# ./configure 
# make
ここでまたズッコけました。
/mnt/src/node-v0.4.2/deps/v8/src/platform-linux.cc:587: error: `PR_SET_NAME' was not declared in this scope
/mnt/src/node-v0.4.2/deps/v8/src/platform-linux.cc:587: warning: unused variable 'PR_SET_NAME'
scons: *** [obj/release/platform-linux.o] Error 1
scons: building terminated because of errors.
Waf: Leaving directory `/mnt/src/node-v0.4.2/build'
Build failed:  -> task failed (err #2): 
        {task: libv8.a SConstruct -> libv8.a}
make: *** [program] エラー 1
この 'PR_SET_NAME' というのが問題らしいのですが、この記述があるものをコメントアウトしちゃいます。
# grep -r 'PR_SET_NAME' *
deps/v8/src/platform-linux.cc://  prctl(PR_SET_NAME, thread->name(), 0, 0, 0);
src/platform_linux.cc://  prctl(PR_SET_NAME, process_title);
2ファイル出てきたので両方とも該当行をコメントアウトします。
これでインストールはスムーズにいくはずです。
# make
# make install
おわり!


以上でぇぇぇぇえぇぇぇぇえぇす。

2011年4月1日金曜日

iptablesでipマスカレード設定

どうも、俺@週末です。

iptablesを使ってipマスカレードの設定めもめも。
ローカル回線しかないLinuxサーバでもきちんとデフォルトゲートウェイの設定をしてあげれば、ローカルサーバからグローバルのデータを取得することは出来ます。

・グローバルサーバ(192.168.0.10:ゲートウェイとなる)ローカル回線とグローバル回線
・ローカルサーバ(192.168.0.11) ローカル回線のみ
とします。

まずグローバル側の設定から始めましょう。
// グローバルサーバ
# iptables -L -t nat
Chain PREROUTING (policy ACCEPT)
target     prot opt source               destination         

Chain POSTROUTING (policy ACCEPT)
target     prot opt source               destination         

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination
普通はこんな感じ。
// グローバルサーバ
# iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE -s 192.168.0.0/24
# iptables -L -t nat
Chain INPUT (policy ACCEPT)
target     prot opt source               destination

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination
[root@ss79 cadox]# iptables -L -t nat
Chain PREROUTING (policy ACCEPT)
target     prot opt source               destination

Chain POSTROUTING (policy ACCEPT)
target     prot opt source               destination
MASQUERADE  all  --  192.168.1.0/24       anywhere

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination
ふむふむ、ちゃんと設定されている。
次に転送設定。
// グローバルサーバ
# iptables -P FORWARD ACCEPT
# service iptables save
かなりザックリですが。。
// グローバルサーバ やり方は色々ありますが、、
# vim /etc/sysctl.conf
----------------------------------
net.ipv4.ip_forward = 1

# sysctl -p
または
// グローバルサーバ
echo 1 > /proc/sys/net/ipv4/ip_forward
など。。

次にローカルサーバ側でデフォルトゲートウェイの設定を行います。
// ローカルサーバ
# route add default gw 192.168.0.10
# route
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
192.168.0.0     *               255.255.255.0   U     0      0        0 eth1
xxx.xxx.xx.xx   *               255.255.0.0     U     0      0        0 eth1
default         192.168.0.10    0.0.0.0         UG    0      0        0 eth1 // ←できてる
再起動しても設定がリセットされないように
// ローカルサーバ
# vim /etc/sysconfig/network
----------------------------
GATEWAY=192.168.0.10 # ←追加
これでOK!

以上でぇぇぇえっぇぇす。

2011年3月18日金曜日

postgresqlでSELECTした結果でUPDATEをかける

どうも、俺@仕事中です。

postgresqlでSELECTした結果を利用してUPDATE(更新)をかける方法についてメモメモ。

dbname=# select * from table_a;
 id | name | ref_id 
----+------+--------
  1 | xxx  |     10
  2 | xxx  |     11
  3 | xxx  |     12
(3 rows)

dbname=#
dbname=# select * from table_b;
 id | name 
----+------
 10 | aaa
 11 | bbb
 12 | ccc
(3 rows)
テーブルはこういう状態だとします。
期待する結果は
dbname=# select * from table_a;
 id | name | ref_id 
----+------+--------
  1 | aaa  |     10
  2 | bbb  |     11
  3 | ccc  |     12
(3 rows)
table_bのnameでtable_aのnameを更新したい場合。

dbname=# UPDATE table_a
 SET name = foo.name
 FROM (SELECT * FROM table_b) AS foo
WHERE a.ref_id = foo.id;
これで出来ます!


以上でぇぇぇぇぇぇぇえぇす。

2011年3月9日水曜日

apacheのリバースプロキシでSSL接続しちゃう

どうも、俺@仕事中です。

またまたハマりました。
タイトル通り、apache(2系)のリバースプロキシ機能を使ってローカル内のapacheにSSL接続しようと思ってハマりました。
ググったらたくさん参考資料出てくるんですけどね、、

イメージは
クライアントブラウザ →(SSL)→ Proxyサーバ[192.168.10.10] →(SSL)→ ローカルapacheサーバ[192.168.10.11]
です。

まずapacheをインストールする際に mod_proxyとmod_ssl、mod_proxy_connectが有効になっていないといけません。(多分、、)
# /usr/local/apache2/bin/httpd -l
で上記のモジュールが出てくれば問題ありませんが、なければapacheをインストールし直しましょう。
# ./configure --enable-module=so --with-included-apr --enable-proxy --enable-ssl --enable-proxy-connect
オプションは環境に合わせて変えてください。
# make && make install

では、まずhttpd.confでリバースプロキシの設定しましょう。
# vim /usr/local/apache2/conf/httpd.conf
----------------------------------------------
# 以下を追加
ProxyRequests off
ProxyPass / http://192.168.10.11/
ProxyPassReverse /http://192.168.10.11/
ProxyPassReverseCookieDomain mydomain local-domain
ProxyPassReverseCookiePath / /
<Proxy *>
 order deny,allow
 deny from all
 allow from xxx.xxx.xxx.0/24 ....# あとは適当に
</Proxy>
リバースプロキシだけの設定では以上です。

これからSSLの設定を行いましょう。
※証明書の作り方は以前(opensslを使って秘密鍵と証明書の作成)も書いたのでそちらも参照ください。

オレオレ証明書作ります。
まず、CA秘密鍵作成
# openssl genrsa -rand /var/log/messages -out ca.key 1024
-randオプションはランダムなデータを作成する元となるファイルを適当に選択。
次にCA証明書の署名要求作成
# openss req -new -key ca.key -out ca.csr
ここは色々質問されますが、内容は割愛します。
では次に証明書発行
# openssl x509 -req -in ca.csr -signkey ca.key -out ca.crt
これでCA証明書まで完成です。

次はサーバ用証明書を作成しましょう。
まずサーバ用秘密鍵を作ります
# openssl genrsa -rand /var/log/maillog -out server.key 1024
↑と一緒ですね。
次にサーバ証明書の署名要求を作ります
# openssl req -new -key server.key -out server.csr
これも↑と一緒。
次にシリアルを記述した適当なファイルを作成
# echo 01 > ca.serial
では証明書を発行しちゃいましょう
# openssl x509 -req -days 3650 -CA ca.crt -CAkey ca.key -in server.csr -out server.crt
出来ました!

これを適当な場所へコピー(移動)します。
# cp server.crt /usr/local/apache2/conf/ssl/server.crt # ←サーバ証明書
 # cp server.key /usr/local/apache2/conf/ssl/server.key # ←サーバ秘密鍵
ふぅ。


最後にapacheの設定です。
# vim /usr/local/apache2/conf/httpd.conf
-----------------------------------------------
<IfModule mod_ssl.c>
 Include conf/ssl.conf
</IfModule>

 # vim /usr/local/apache2/conf/ssl.conf (必要な部分のみ抜粋)
----------------------------------------
Listen 443
<VirtualHost _default_:443>
SSLCertificateFile /usr/local/apache2/conf/ssl/server.crt
SSLCertificateKeyFile /usr/local/apache2/conf/ssl/server.key
<VirtualHost>

#SSLCACertificatePath /usr/local/apache2/conf/ssl.crt いらない!?
#SSLCACertificateFile /usr/local/apache2/conf/ssl-bundle.crt いらない!?

#SSLVerifyClient require いらない。クライアントの認証が必要であれば付ける
#SSLVerifyDepth 1 いらない

SSLProxyEngine on
ProxyPass / https://192.168.10.11/ # ローカルのapacheが例えば4444ポートでSSLを動かしてる場合は ProxyPass / https://192.168.10.11:4444/ね
ProxyPassReverse / https://192.168.10.11/ # こっちも ProxyPassReverse / https://192.168.10.11:4444/ね
出来ましたー!!

起動!!
# /usr/local/apache2/bin/httpd -k start -DSSL
たぶんパスフレーズ聞かれるので応えてあげてね。
ちなみにパスフレーズを聞かれるのが面倒な人は
# vim /usr/local/apache2/conf/ssl.conf
----------------------------------------------
SSLPassPhraseDialog exec:/usr/local/apache2/bin/pp-exec
# パスフレーズを入力するためのダイアログタイプ。builtin(デフォルト)またはexec。
で、
# vim /usr/local/apache2/bin/pp-exec
------------------------------------------
#!/bin/sh
echo "パスフレーズ"
だぜ!



以上でぇぇぇぇぇぇぇぇぇぇぇす。