リバースプロキシ経由でUserminにアクセスする方法
外部からUserminやWebminにアクセスしたい。自分がやりたいことの場合、公式サイトに書いてある方法だけだと中途半端に失敗する。
目的はこんな感じ。
- http://usermin.example.com:20000 のようなURLは格好悪いので http://usermin.example.com/usermin としたい。
- フロントサーバ(mod_proxy[80]) -> Userminサーバ(mod_proxy[80]) -> Userminサーバ(miniserv.conf[20000]) とリダイレクトしたい。
構成
- フロントサーバは proxy.example.com
- Userminサーバは usermin.example.com
Userminサーバ (Userminの設定)
Centos6.2で試しているので RPMのUserminパッケージをダウンロードします。
$ yum install perl-Net-SSLeay.x86_64 $ yum --enablerepo=rpmforge install perl-Authen-PAM.x86_64 $ rpm -ivh usermin-1.500-1.noarch.rpm
/etc/usermin/config に追加。*1
ssl=0 webprefix=/usermin webprefixnoredir=1
/etc/usermin/miniserv.conf にオレオレ設定を追加。*2
front_url=http://proxy.example.com/usermin/
userminを再起動。ついでに自動起動。
$ sudo /etc/init.d/usermin restart $ sudo /sbin/chkconfig --level 345 usermin on
Userminサーバ (UserminのWebサーバのminiserv.confを修正)
一応バックアップ
$ cd /usr/libexec/usermin/ $ sudo cp -p miniserv.pl miniserv.pl.backup
合っているかどうか自信ないけど、まあいいよね。*3
# diff -c miniserv.pl miniserv.pl.backup *** miniserv.pl Tue Jan 24 16:30:10 2012 --- miniserv.pl.backup Sun Jan 22 10:46:59 2012 *************** *** 3919,3929 **** else { &write_data("Set-Cookie: $sidname=$sid; path=/$sec\r\n"); } ! if ($header{'referer'} =~ /$config{'front_url'}/) { ! &write_data("Location: $config{'front_url'}\r\n"); ! } else { ! &write_data("Location: $prot://$host$portstr$in{'page'}\r\n"); ! } &write_keep_alive(0); &write_data("\r\n"); &log_request($acpthost, $authuser, $reqline, 302, 0); --- 3919,3925 ---- else { &write_data("Set-Cookie: $sidname=$sid; path=/$sec\r\n"); } ! &write_data("Location: $prot://$host$portstr$in{'page'}\r\n"); &write_keep_alive(0); &write_data("\r\n"); &log_request($acpthost, $authuser, $reqline, 302, 0);
Userminサーバ (Apache Reverse Proxyの設定)
http://localhost:20000/にするとログアウトアイコンがでなくなってしまうので、http://usermin.example.com:20000/ にする。
<IfModule mod_proxy.c> ProxyRequests Off ProxyVia Off </IfModule> NameVirtualHost *:80 <VirtualHost *:80> ProxyPreserveHost On ProxyPass /usermin/ http://usermin.example.com:20000/ ProxyPassReverse /usermin/ http://usermin.example.com:20000/ ServerName usermin.example.com <Proxy *> allow from all </Proxy> </VirtualHost>
フロントサーバ (Apache Reverse Proxyの設定)
<IfModule mod_proxy.c> ProxyRequests Off ProxyVia Off </IfModule> NameVirtualHost *:80 <VirtualHost *:80> ProxyPreserveHost On ProxyPass /usermin/ http://usermin.example.com/usermin/ ProxyPassReverse /usermin/ http://usermin.example.com/usermin/ ServerName proxy.example.com <Proxy *> allow from all </Proxy> </VirtualHost>
あとは細かい設定を見なおして、公開する範囲を絞って、SSLに対応するだけかな。
参考
ありがとう。
*1:httpsはReverseProxy側でラップするつもりなのでssl=0にする
*2:ReverseProxy側でhttpsする場合はオレオレ設定のfront_url=http://usermin.example.com/usermin/にする
*3:ReverseProxy経由で認証成功した後に Location: http://proxy.example.com:20000/ されるので書き換えます