2017年6月
        1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30  
無料ブログはココログ

« 株:現物売り約定(長谷工コーポレーション) | トップページ | 株:現物買い約定(三菱商事、トヨタ自動車、キャノン電子) »

2015年12月 2日 (水)

オイラ、dockerしてるぜ dockerでリバースプロキシを使う

★2017/2/19:「gitlabが起動エラーになる」「Apacheが起動エラーになる」問題を修正。古いDockerImageが残っていて、gitlabでパラメタの設定がないときエラーになるように修正されていた、Apacheのパスとlibxml2.soの展開先が変わっていた。

DockerでCI(継続的インテグレーション)のAPとして、Redmine、Jenkins、gitlab(+redis)と、それらの外部IFとしてApacheHTTPServerをリバースプロキシを立ち上げる環境を構築しようとして紆余曲折していたが、やっとまともにログインまで出来るようになった。
READMEはまだ書いていないけれど、githubにUPしておきました。
Docker ToolBoxをインストールして、Docker Quickstart TerminalでVMイメージを作ったら、そこからinit.shを実行するのです。
シェルを呼び出したディレクトリの直下に、ciディレクトリを作りそこの下に永続化が必要なファイルを出力しますのです。
※:安定して起動できない感じ。シェルの実行が終わっても、環境が起動し終わるまで5分くらい待った方がイイみたい?

init.shを実行した次回からはstart.shを実行することで、Dockerコンテナの起動ができます。
Dockerコンテナの終了はstop.shを実行。

Oracle VM VirtualBoxは、休止状態には対応していない模様で、外部とのアクセスができなくなってしまうので注意。そこら辺の解決方法は、こちらに書いたので参照のこと。

「オイラ、dockerしてるぜ 覚書:DockerのホストOSとSSHで接続できないときの対処」

あと、Oracle VM VirtualBoxからネットワークの設定をしないと、そのPCからしかアクセスできないので注意。アダプタ1(割り当てNAT)のポートフォワーディングにホストIPにそのPCのIPアドレス、ホストポートとゲストポートに80または443を設定(ゲストIPは空欄で可)にすれば、そのPC外からDockerのApacheHTTPServerにアクセスできるようになる。(もちろん、Dockerを動かしているPCで他にポート80を使うAPを動かしていないこと)

ここからはどうでもいい苦労話。

想定としては、http://192.168.99.100/<各AP名>/ というURLにして、パスでAPの割り振りをしようとしていた。これはLocationディレクティブにProxyPassとProxyPassReverseを使って設定できる。

でもこれだけでは、以下の2つの問題が発生してなかなか解決できなかったのだ。

  • CSSやイメージファイル(PNG)が読み込めない。リンクの先が想定外なところに飛ぶ。
    →HTMLのリンク先が正しくないため。
     DockerのそれぞれのWeb・APサーバがHTMLで示すCSSやイメージ、リンク先をAPのパスとは関係なく、設定されるため。
     相対パスだからURL+相対パスとなると思っていたが、そうはならなかった。
  • ログインができない。
    →Cookieのドメイン、パスが正しくないため。
     ProxyPassReverseCookieDomainとProxyPassReverseCookiePathで設定できると思っていたが、Locationディレクティブの外で指定していたので、複数APに対応するProxyPassReverseCookieDomainの内、一番上の方に書かれた設定だけが有効になった模様。
     Webブラウザの開発環境でCookieを見ると、パスが付いていないことから分かった。

というわけで、前者は、mod_proxy_htmlを使って、ProxyHTMLEnable ONとして、ProxyHTMLURLMap で / を /<AP名>/に置き換えることで解決する。(相対パスと言っても"/"で始まるものはルートからになるということを初めて知りましたよ)
後者は、ProxyPassReverseCookieDomainとProxyPassReverseCookiePathをLocationディレクティブの内に書くことで、リバースプロキシに渡されたURLの(APごとの)パスで、区別されたCookieのDomain・パスに変換できるようになる。
#ところでパスの綴りはPass?なのPathなの?

最終的にhttpd.confは以下の定義となる。(元の定義から追加した箇所を抜粋)

LoadFile    /opt/bitnami/common/lib/libxml2.so
LoadModule  proxy_html_module    modules/mod_proxy_html.so
LoadModule  xml2enc_module       modules/mod_xml2enc.so

ProxyRequests Off
<Proxy *>
Order deny,allow
Allow from all
</Proxy>

<Location /jenkins/>
ProxyPass http://ci_jenkins:8080/jenkins/
ProxyPassReverse http://ci_jenkins:8080/jenkins/

ProxyHTMLEnable On
ProxyHTMLURLMap /jenkins/ /jenkins/

ProxyPassReverseCookieDomain ci_jenkins:8080 192.168.99.100
ProxyPassReverseCookiePath /jenkins/ /jenkins/

RequestHeader unset  Accept-Encoding
</Location>

<Location /redmine/>
ProxyPass http://ci_redmine/
ProxyPassReverse  http://ci_redmine/

ProxyHTMLEnable On
ProxyHTMLURLMap / /redmine/

ProxyPassReverseCookieDomain ci_redmine 192.168.99.100
ProxyPassReverseCookiePath / /redmine/

RequestHeader unset  Accept-Encoding
</Location>

<Location /gitlab/>
ProxyPass http://ci_gitlab/
ProxyPassReverse  /

ProxyHTMLEnable On
ProxyHTMLURLMap / /gitlab/

ProxyPassReverseCookieDomain ci_gitlab 192.168.99.100
ProxyPassReverseCookiePath / /gitlab/

RequestHeader unset  Accept-Encoding
</Location>

ApacheHTTPServerは、bitnami/apacheを使用したがこれにはmod_proxy_htmlが入っていないので、以下のコマンドでインストールして、新たなDockerイメージを作った。


docker run -d --rm=false -v ${apache_dir}/app:/app -v ${apache_dir}/conf:/bitnami/apache/conf -v ${apache_dir}/logs:/bitnami/apache/logs -p 80:80 -p 443:443 ${images6} 

a=`docker ps | grep ${images6} | awk '{print $1}'`
docker exec -it ${a} apt-get -y update
docker exec -it ${a} sudo apt-get -y install libapache2-mod-proxy-html
docker exec -it ${a} apt-get -y install libxml2-dev
docker exec ${a} ln -s /usr/lib/apache2/modules/mod_proxy_html.so /opt/bitnami/apache2/modules/
docker exec ${a} ln -s /usr/lib/apache2/modules/mod_xml2enc.so /opt/bitnami/apache2/modules/
docker commit ${a} apache_rp
docker stop ${a}
docker rm ${a}

ここら辺は、githubに入れたinit.shを見てください。

« 株:現物売り約定(長谷工コーポレーション) | トップページ | 株:現物買い約定(三菱商事、トヨタ自動車、キャノン電子) »

コメント

コメントを書く

(ウェブ上には掲載しません)

トラックバック

この記事のトラックバックURL:
http://app.f.cocolog-nifty.com/t/trackback/117572/62770615

この記事へのトラックバック一覧です: オイラ、dockerしてるぜ dockerでリバースプロキシを使う:

« 株:現物売り約定(長谷工コーポレーション) | トップページ | 株:現物買い約定(三菱商事、トヨタ自動車、キャノン電子) »