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 "パスフレーズ"
だぜ!



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

2011年3月8日火曜日

phpインストール時にlibxml2を除外する

どうも、俺@おもいっきり残業中です。

php(ver.5.3.5)をインストールしてて、libxml2関連のエラーが出る場合。
※makeしたときにエラーが出ました。

configure: error: libxml2 version 2.6.10 or greater required.
僕の場合はこんな感じでしたが、いかんせんサーバが古いため試行錯誤した結果、libxml2を再インストール(またはアップデート)することを諦めた人へ。。。

簡単な話が、configureオプションでlibxml2を外してやればいいのです。

# vim /usr/local/src/php-5.3.5/conf.sh
----------------------------------------------
#!/bin/sh
./configure --with-apxs2=/usr/local/apache2/bin/apxs --enable-mbstring --enable-zend-multibyte --with-pgsql=/usr/local/pgsql --with-pdo-pgsql=/usr/local/pgsql --enable-sockets --disable-libxml --disable-dom --disable-simplexml --disable-xml --disable-xmlreader --disable-xmlwriter --without-pear
普段のオプションに加えて
--disable-libxml --disable-dom --disable-simplexml --disable-xml --disable-xmlreader --disable-xmlwriter --without-pear
これらを追加してやればmakeできます!!

ただし、phpのlibxml(xml)関連、DOM関連、PEARがインストールされませんのであしからず!


以上でぇぇぇえぇす。