リバースプロキシPound
おまけ: 俺が適当に書いたinitスクリプト(ただしLinux用)
#!/bin/bash
# init file for pound
#
# chkconfig: - 50 50
# description: HTTP Reverse Proxy Daemon
#
# processname: /usr/local/sbin/pound
# config: /usr/local/etc/pound.conf
# pidfile: /var/run/pound.pid
#
# source function library
. /etc/init.d/functions
prog="pound"
RETVAL=1
start() {
echo -n $"Starting $prog: "
daemon /usr/local/sbin/pound
RETVAL=$?
echo
touch /var/lock/subsys/pound
return $RETVAL
}
続き
stop() {
echo -n $"Stopping $prog: "
killproc /usr/local/sbin/pound
RETVAL=$?
echo
rm -f /var/lock/subsys/pound
return $RETVAL
}
reload(){
stop
start
}
restart(){
stop
start
}
condrestart(){
[ -e /var/lock/subsys/pound ] && restart
return 0
}
おわり
case "$1" in
start)
start
;;
stop)
stop
;;
restart)
restart
;;
reload)
reload
;;
condrestart)
condrestart
;;
status)
status pound
RETVAL=$?
;;
*)
echo $"Usage: $0 {start|stop|status|restart|condrestart|reload}"
RETVAL=1
esac
exit $RETVAL
適当に書いたことにしたいのだろうけど、本当はどこからパクった?
あーすんません。
「適当」ってのは、パクって適当に改変したって意味です。
元になったのは、確かucd-snmpとかいうやつです。
Poundをロードバランスするにはどうすんの?
なにか箱を前に入れるの? 大規模なWebサイトでない限り、いまのところ
Pound自体をロードバランスする必要はないと思いますが、
どうですかね。
自分は、最大同時コネクション数が2 300のWebアプリでPoundを使ってますが、
Pentium2 450MHz x 2というヘボスペックでも、
Poundの負荷が問題になったことはないです。
ただ、poundは全てのログをsyslogに吐くので、
syslogが遅いと、それに引きずられるかもしれないですが。
冗長性を持たせるのが目的なら、LVSとかですかね。
書き込みねーな。誰も使ってないのか?
俺はスゲー便利だと思うけどな。
Poundだけじゃなく、Squid、
Apacheモジュールタイプ、WASやOASについてくるやつ、
はたまた、ServerIronのようなハードウェアタイプなどなど。
わかりやすく比較している記事とかないかなぁ。
軽く探してみたけど、こんなのしか見つかんかった。
ttp://kevinminnick.blogspot.com/2006/03/my-evaluation-of-reverse-proxy.html
Debian GNU/Linux etch (Linux kernel 2.6.19) 上で pound 2.0 を動かしています。
pound: MONITOR: worker exited on signal 11, restarting...
というエラーを吐いてどうもうまく動作しません。ググってみたところ NPLT やら
LD_ASSUME_KERNEL というキーワードが見つかったので
env LD_ASSUME_KERNEL=2.4.19 /usr/sbin/pound
としてみたのですが、手元の環境では変化ありませんでした。
適当に試行錯誤してみた結果 pound.cfg の Service ブロック内に Session ブロック
を書いて Type として IP 以外を指定すると問題なく reverse proxy として動作する
ようになったのですが、みなさんのお手元ではこういう問題は発生していないですかね?
自己レスですが、pound 2.2 だと問題ないですね。
昨日はどういうわけか http://www.apsis.ch/pound/ にアクセスできなかったので
確認を怠ってしまったのですが deb 化されている 2.0 って最新版じゃなかったのね orz
>>14
多分関係ないと思うが、
昔、poundでOpenSSH関連の意味不明なエラーが出て困ったことがあった。
詳細な理由は不明だが、どうやら「rootじゃないアカウントでpoundをビルドしたこと」が
原因だったようだ。それ以来rootでmakeするようにしている。
rootでビルドしないと使えないソフトってなんだか怪しいなあ 2chを読むことは出来るけど
書くことが出来ないようにできる? >>19
ここは君の来るところではない。
Windows板の初心者スレあたりで質問してきなさい。
2.2 にあった NO_SYSLOG のマクロ定義が 2.3 でなくなってしまったのは何故なんでしょうか。
CHANGELOG 眺めてもわからない… configure --disable-log が有効にならないみたいなんですけど。 うぉ.
Pound最高.
Cookieのぞいてセッション見てくれる. >>25
完成度が高過ぎて話すネタがないのかも知れませんね、って1ヶ月後に書くのもなんですが。
バックエンドを変更したときなど,
あるいはバックエンドの一部を落としたい時など,
設定ファイルを読み直させるにはどうすればいいんでしょうか?
kill -HUP <pid> ? バックエンドを落とすだけなら
poundctl
でなんとかなりそうじゃない? >>28
ごめん、不十分な説明だった。
バックエンドを落として、別のに切り替えたいときがあって。
まぁ新しいバックエンドを同じIPアドレスにすればいいのかも試練が。
それにしても堅牢だわ、pound。SSLオフロードもできるし。
商用のSSLオフロードバランサが商売になるのってどれくらいの
サイト規模なんだろうねぇ。 >>29
大人になって誰かに責任をなすりつけられることの意味を知ったら小規模サイトでも使うよ
というのは冗談として,運用担当グループがスキル的にpoundの設定変更を任せられる
レベルじゃない場合は箱物を選択するんじゃない?
いつもBIG-IPとServerIronとArrayとPoundを並列に提案して客に選ばせるんだけど,
日本ではBIG-IP以外の選択を受けたことないよ.アメリカだとたまにArrayやPoundを
選択してもらえる時がある. BIG-IPだと400万円とか一桁違うだろ。みんな金持ってるなあ。
まあ人件費よりは安いか…
てかエロサイト? WASとかOracleなんかを使ってれば、付属のキャッシュサーバが使えたりするし、
BIG-IPやらServerIronあたりのメジャーなやつと連携が取れるようになっていたりもする。
Pound使ってるとApacheにPoundのIPアドレスが渡ってしまうから
アクセス制限かけられねーよ…と思っていたら
mod_extract_forwarded2
なるものがあるのね
debian用パッケージはないのね アクセス制限とは違うんだけど、バックエンド側の
ログをみても分けわかめになるのはどうすればいいの? バックエンドがapacheなら、環境変数でもログってみるとかさ。
>>33 のモジュールだってX-Forwardから取得してるんだし。 いや、話がややこしくなるから書かなかったんだけど
Poundを通してMediaWiki(Wikipediaのシステム)を使うと
MediaWikiに記録されるIPアドレスが全部PoundのIPアドレスになってしまうということだったのよ
ApacheのログにアクセスしたIPアドレスを記録させるには
LogFormat "%{X-Forwarded-For}i %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
こんな風にするらしいよ バックエンドに lighttpd 使ってるから mod_rpaf とか聞いても
ショボーンだったけど,mod_extforward があるのを知った.
シャキーン X-Forwarded-Forヘッダ解釈で値を変更するってややリスキーだな。
apacheのソース見るとログは単純に文字列で、アクセス制限はソケットの構造体を見てる。
気になるのは3点。
・ログの%aや%hは上書きされるのか?
・IPアドレスベース、ホスト名ベースのアクセス制限は機能するのか?
・リバースプロキシにアクセスする際にX-Forwarded-Forを付けるとどうなるか?
mod_extract_forwarded2とかmod_rpafのソース読めばいいんだけどね。 バックエンドにSSLを使っているサービスがあり、PoundでSSLからSSLへブリッジしたいのですが、
バックエンドのSSLはオレオレ証明書なのです。
Poundのパブリッシャ側というか、クライアント側というか、送信側は、オレオレ証明書のサービスに
対してリクエストを転送できないようですが、解決法はあるのでしょうか?
だれも、こんな使い方している人はいない?
Pound側のOpenSSLのRootCAにオレオレのCA証明書を追加して
オレオレCA秘密鍵でバックエンド側のオレオレ証明書にサインすればいんじゃね? はぁ、どうもありがとうございます。
OpenSSLの仕組みに詳しくないため、かなり試行錯誤をしないと実現できない感じですが、
その方向性で試してみます。
バックエンドはIISなのです。
どうも有り難うございました。
すまん,オレオレ言い過ぎた.まとめると
1) PoundサーバでCAの設定をする
2) PoundサーバでCAの証明書をRootCA(FreeBSDだと/etc/ssl以下にある.他は知らぬ)に追加
3) IISサーバでreqを作る
4) 3)のreqにPoundサーバで設定したCAの秘密鍵で署名する
5) IISで4)で署名された証明書を使うように設定する
って感じ!
>>44
どうも有り難うございます。師匠と呼ばせて下さい。
CentOSなのですけれど、2)はFreeBSDだと可能なのでしょうか?
Linuxだと、2のやり方が分からなかったのですが。
PoundのMLを読んでいたら、stunnel使えば出来るって一言書かれていただけでした。
ということで、仕方なくstunnelを試してみました。
IISサーバにstunnelも入れてしまいましたが、上手く動きました。
経由アプリがさらに増えて、ちょっと性能的に気になりますが、
とりあえずこれでしのぐことにします。
どうも有り難うございました。
>>45
> CentOSなのですけれど、2)はFreeBSDだと可能なのでしょうか?
FreeBSDってか,OpenSSLなら可能です.OS関係ナシ
CentOS上のOpenSSLがどこにRootCA置いてるかは知らぬ.
つーか,rpm -ql openssl すれば一瞬で分かるんじゃないの?
IISサーバにstunnelって時点で何したいのか意味不明になったので
師匠の話は固辞させていただきますね 申し訳ありません、最初からまとめてみます。通常なら下記ですよね。
IIS <-(HTTP)- Pound <-(HTTPS)- 外部
でも、IIS上のアプリがSLLを使用しないと動作しないのです。
オレオレ証明書で十分なのですが、とにかくSSL必須のアプリなのです。
そのため、PoundでSSLブリッジという表現になりました。
IIS <-(HTTPS)- Pound <-(HTTPS)- 外部
最終的には、今、下記の構成で暫定対処しています。
IIS <-(HTTPS)- stunnel <-(HTTP)- Pound <-(HTTPS)- 外部
Poundだけで構成した下記の場合には、IISが呼び出せない問題が生じました。
IIS <-(HTTPS)- Pound
上記の場合、Poundはクライアントと見なせますよね。
ということは、Windowsでいうところの信頼されたルート証明書機関に
証明書を追加すればよいと思ったのですが、
OpenSSLのprivateディレクトリに証明書を置いても接続できないのです。
調べたところ、そもそもLinuxではSSLのクライアント動作に
各アプリケーション共通のルート証明書参照という仕組みがない。
それは各アプリ毎に実装される部分である。
ということでした。そこでstunnelということになったのです。
分かりにくい説明ですみません。
証明書ストアという概念は、確かにJavaだとJava用ディレクトリ決まってますよね。
OpenSSLでは、本当にライブラリ使用アプリ側で違うものなのでしょうか‥‥ 例えばVerisignの署名があればPoundでブリッジできるじゃないですか.
既にポインタは示したつもりだけど,技術的にVerisignの署名ならOKでオレオレCAの署名は
ダメなんてことあるわけないと思わない?
これ以上具体的に例示しろってことなら金くれ.
2万/hで売ってますんでよろしく. > 例えばVerisignの署名があればPoundでブリッジできるじゃないですか.
出来ない え?うちのイントラのVeriサイン入りサーバを外から叩くのに運用中だけど。 Poundの場合、backendにhttpsで繋ぐ機能はないと思うが。 SSLラッパとして使ってるが、ページによってエラー302で接続できなくなる。
302ってセッショントラッキングの問題ですか? これってバックエンドに投げたリクエストのタイムアウトが設定できるんだけど、
正常なレスポンスが返ってこなかったときに別のサーバにリトライするように
設定できますか?