徒然なるままに

個人の備忘録を中心としたブログです

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
ソースからインストールしたApacheにSSL機能を追加したくなったので、mod_sslモジュールをDSOで追加した。

かなりエラーが出て悩んだので、できればApacheのインストール時にconfigureで
$ ./configure --enable-so --enable-ssl
しておくのが一番です。

参考にしたとういか、助けてもらったのは以下のサイトです。エラーの内容とそのエラーを回避する方法について非常に詳しく書いてあるので詳しく知りたい方はこちらを読んでください。
apxsコマンドの指定の意味がつかめると思います。
http://d.hatena.ne.jp/rx7/20130206/p1

Apacheでmod_sslを有効にするためにはopensslが必要です。
$ openssl --version

version情報が確認できればインストールされています。
(Ubuntu12.04では元々インストール済みでした)
oepnsslのヘッダファイルの場所は環境によって異なりますが
おそらく/usr/include/openssl、/usr/local/include/openssl辺りにあると思います。

mod_sslモジュール本体であるmod_ssl.cは、インストール時に使用したApacheのソース/modules/sslにあります。

では、早速apxsでmod_ssl.cをコンパイルするのですが、mod_ssl.cだけをコンパイルすると後にsyntax検査で必要なファイルがないとかでエラーがでます。
sslディレクトリ内のすべての*.cファイルを指定する必要があることに注意。

また、コンパイルの際にHAVE_OPENSSLというマクロが定義されていないと、ヘッダファイルがインクルードされないので-Dオプションでマクロを定義します。

-lcrypto、-lsslはopensslのライブラリ指定です。必須です。

例によってapxsのオプションは-iがインストール、-aがhttpd.confに自動でLoadModuleの記述を追加、-cがコンパイル -Iでインクルードするヘッダファイルを指定します。

$ cd APACHE_SRC/modules/ssl
sudo /usr/local/apache/bin/apxs -i -a -c -I /usr/include/openssl -D HAVE_OPENSSL=1 -lcrypto -lssl *.c


$ apachectl -M

でSyntax OKを確認したら無事モジュールのインストールが完了しました。
スポンサーサイト
ReverseProxyの意味がつかめておらず、無駄に設定に苦労した。


http://wiki.apache.org/httpd/TomcatModProxyHTMLを参考。

httpd.confにてモジュールがロードされているか確認。
LoadFile      /usr/lib/libxml2.so
LoadModule proxy_html_module modules/mod_proxy_html.so
LoadModule xml2enc_module modules/mod_xml2enc.so


httpd-proxy.confにて
ProxyEnableをOnにして、ProxyHTMLURLMapディレクティブを追加すると以下のようになった。
ProxyRequests off
ProxyPass /tomcat/ ajp://localhost:8009/
<Location /tomcat>
ProxyPassReverse /
ProxyHTMLEnable On
ProxyHTMLURLMap http://localhost:8080/ /tomcat/
ProxyHTMLURLMap / /tomcat/
ProxyPassReverseCookieDomain localhost localhost
ProxyPassReverseCookiePath /servlet /tomcat/servlet
</Location>

ここではバックエンドサーバ内のページの「/」から始まる絶対パスと、
「http://ホスト名/」からなるリンクを変換しています。

ProxyHTMLURLMapでURLを変換しています。
ProxyHTMLURLMap fromURL toURL [R]
正規表現を使う場合、末尾にRをつけてください。


あとはこれをhttpd.confでインクルードします。
httpd.conf
<IfModule proxy_html_module>
Include /usr/local/conf/extra/httpd-proxy.conf
</IfModule>

事前にしっかりLoadModuleされていれば別に<IfModule>で囲む必要はありませんが、
このようにしておけば後から見て何のモジュール用にインクルードされたファイルなのかが分かります。
逆に、httpd-proxy.conf内でLoadModule proxy_html_moduleで読み込むなら、<IfModule>で囲んではいけません。

これでhttp://localhost/tomcat/の管理画面のリンクがhttp://localhost/tomcat/manager/等に入れ替わっていると思います。

事前にmod_proxyでリバースプロキシの設定をしている場合、
既にhttpd.confや別confファイルにProxyPassなどの指定をしていると思います。
その場合は重複になり、後から読み込んだほうが優先されるので、統合して一つにまとめたほうが良いでしょう。
ProxyPassReverseによってリダイレクトのURLを置換することができるようになりましたが、
ページに埋め込まれたリンクまでは置換することが出来ません。

ページに埋め込まれたリンクのURLを変更、置換するには「mod_proxy_html」というサードパーティーのApacheモジュールが必要となります。

例えばappserver.example.comが内部のサーバ、www.example.comがフロントサーバであり、内部サーバはhttp://www.example.com/appserverでアクセスされるとします。

http://appserver.example.com/foo/bar.htmlで自分へのリンクを<a href="http://appserver.example.com/foo/bar.html">foobar</a>
で貼っていたとすると、これはappserver.example.comへのプロキシサーバを介さない直接のアクセスになってしまいます。


しかし、mod_proxy_htmlモジュールが有効になっていれば上のリンクは
<a href="http://www.example.com/appserver/foo/bar.html">foobar</a>
のように変更されるというわけです。


では、mod_proxy_htmlのインストール方法について。
1.libxml2が必要になるので、インストールされていないならこちらを先にインストール。
インストール方法はページの最下部に書きます。
/usr/include/libxml2にインストールしたとします。

2.http://apache.webthing.com/mod_proxy_html/からページ下部、Availabilityの項目から
単体のソースではなくbundled Versionを落としてきます。mod_proxy_htmlは、mod_xml2encも必要とするからです。

3.目的のファイルを解凍したら、
sudo /usr/local/apache/bin/apxs -c -I/usr/include/libxml2 -I. -i -a mod_proxy_html.c
sudo /usr/local/apache/bin/apxs -c -I/usr/include/libxml2 -I. -i -a mod_xml2enc.c


-Iは-c(コンパイル)オプションのライブラリ指定です。-I.は同じフォルダ内の.hファイルを参照しています。
-iはインストール、-aはhttpd.confへの自動追加。

4./usr/local/apache/conf/httpd.confの設定
LoadModule proxy_html_module modules/mod_proxy_html.so
LoadModule xml2enc_module modules/mod_xml2enc.so
この二行が自動で追加されていると思うので。この二行の上に
LoadFile  /usr/lib/libxml2.so

を付け加えてください。

5.apachectl -MでSyntax OKがでれば設定完了。

-------------------------------------------------------------------------------------
1.Libxml2のインストール
ftp://xmlsoft.org/libxml2/からlibxml2-2.9.0.tar.gzを落としてくる。

落としたファイルを
tar xzvf libxml2-2.9.0.tar.gz

で解凍し、
./configure --prefix=/usr

--prefixはインストール先の指定です。この場合/usr/include/libxml2にインストールされます。

make
sudo make install

でインストール完了。
(2013/03/24 記事の再編集)

フロントサーバとしてApacheを動かし、内部サーバーとしてtomcatを動かしています。

localhost/tomcat以下へのアクセスをtomcatのルートディレクトリに渡すとすると
httpd.confなどの設定は
ProxyPass /tomcat ajp://localhost:8009

となります。

これで以下のようなアクセスが可能になります。

1、外部からのアクセス→localhost/index.html→Apache(Apacheで処理する)
                        ↓
 外部へのレスポンス←localhost/index.html←ーーー

2、外部からのアクセス→localhost/tomcat/index.html→Apache→URLの変換→ajp://localhost:8009/index.html→tomcat
                                                      ↓
 外部へのレスポンス←Apache←localhost/tomcat/index.html←URLの逆変換←tomcat←ーーーーーーーーーーーーー←

ここで、ファイル$CATALINA_HOME/webapps/ROOT/redirect.htmlが http://localhost:8080/dest.htmlにリダイレクトするようになっていたとしましょう。
このページが http://localhost/tomcat/redirect.html でアクセスされると、リダイレクト機能によって、
リバースプロキシ(apache)を介さずに内部サーバ(tomcat) http://localhost:8080/dest.html へ直接リダイレクトされてしまいます。
これは本来意図しないサーバ、及びファイルへの直接アクセスになります。
このような処理になってしまう原因は、内部サーバ内でリダイレクトをしているからです。



本当ならばリダイレクト先の指定URLが一度 http://localhost/tomcat/dest.htmlに変換された後に
内部変換でhttp://localhost:8080/dest.htmlを呼び出すようにするべきです。

この変換を実現するために、以下のコードでProxyPassReverseを指定します。
ProxyPassReverse /tomcat ajp://localhost:8009


今まで localhost/tomcat/ → localhost:8009/ の一方通行だけだったのが
逆の  localhost/tomcat/ ← localhost:8009/ の関連付けもされるというわけです。



ProxyPassを指定したら、特別な理由がない限りProxyPassReverseも同じように指定しておきなさいということですね。
(ajpを使った場合のProxyPassReverseの指定はProxyPassの指定とは異なるものにするよう?
tomcat側はajpでアクセスされていることを知らずに、内部URL http://localhost/ だと思い込んでいるようなので)

ここでチェックされているのはあくまでリクエストヘッダ、リダイレクト時のレスポンスヘッダだけなのでwebページ内のリンクそのものは変更されません。
ページに埋め込まれたリンクのURLを変更、置換するには別途「mod_proxy_html」というサードパーティーのApacheモジュールが必要となります。

例えばappserver.example.comが内部のサーバ、www.example.comがフロントサーバであり、内部サーバはhttp://www.example.com/appserverでアクセスされるとします。
http://appserver.example.com/foo/bar.htmlで自分へのリンクを<a href="http://appserver.example.com/foo/bar.html">foobar</a>
で貼っていたとすると、これはappserver.example.comへのプロキシサーバを介さない直接のアクセスになってしまいます。

しかし、mod_proxy_htmlモジュールが有効になっていれば上のリンクは
<a href="http://www.example.com/appserver/foo/bar.html">foobar</a>
のように変更されるというわけです。

mod_proxy_htmlの有効化については別の記事で書きます。


なお、URLの変換以外にもCookieの変換という作業も必要になってくることがあります。
tomcat側の/DIR1/use_cookieというサーブレットで、そのままCookieの書き込みをすると
host:localhost
pass:/DIR1
となり、実際のアクセスhttp://localhost/tomcat/DIR1/use_cookieとの関連付けに失敗します。
本来ならば、下のように書き込まなければなりません。
host:localhost
pass:/tomcat


そこで指定するのがProxyPassReverseCookieDomain、ProxyPassReverseCookiePathです。

今回は両方localhostですが、異なるホスト(front,backend)でそれぞれサーバを動かしているとすると
ProxyPassReverseCookieDomain backend front
ProxyPassReverseCookiePath /DIR1 /tomcat/DIR1

になります。

backend /DIR1がtomcat側、
front /tomcat/DIR1がapache側です。
普通に考えてCookieの文字列置換ですね。

これにより、
host:backend
pass:/DIR1
と書き込まれていたのが
host:front
pass:/tomcat/DIR1
こう書かれているはずです。


ごちゃごちゃ書きましたが、localhostでApacheとtomcatを動かしている場合
ProxyPass /tomcat ajp://localhost:8009/DIR1
#ProxyPassReverse /tomcat ajp://localhost:8009/DIR1 #正しい指定か不明
ProxyPassReverseCookieDomain localhost localhost
ProxyPassReverseCookiePath /DIR1 /tomcat/DIR1

が最終的なコードです。

<Location /><Location>の中に記述する方法もあります。
update-rc.dを使って、apacheの起動スクリプトapachectlをrc*.dに登録します(*は0~6のランレベル)

まず、下のコマンドを入力して/etc/init.dにapachectl をapacheとして置きます。
install -o root -g root -m 755 /usr/local/httpd/bin/apachectl /etc/init.d/apache

installコマンドはcpにインストール機能を特化したものと考えれば良い。
ここでは-o(own)所有者 -g(group)グループ -m権限などを設定しています。

あとは、update-rc.dにこのスクリプトを渡して自動で/etc/rc*.d/に登録してもらいます。
ランレベルの設定はデフォルトで、スタートとストップ用の番号をそれぞれ指定しています。
update-rc.d apache defaults 85 15



/etc/rc0.d/K15apache -> ../init.d/apache
/etc/rc1.d/K15apache -> ../init.d/apache
/etc/rc6.d/K15apache -> ../init.d/apache
/etc/rc2.d/S85apache -> ../init.d/apache
/etc/rc3.d/S85apache -> ../init.d/apache
/etc/rc4.d/S85apache -> ../init.d/apache
/etc/rc5.d/S85apache -> ../init.d/apache
シンボリックリンクが作成されるはずです。

自動起動を停止したいときは、まずスクリプト本体を削除してupdate-rc.d removeを使います。
sudo rm /etc/init.d/apache
sudo update-rc.d apache remove

この順番じゃないとupdate-rc.dは強制オプション(-f)でない限り受け付けません。
シンボリックリンクだけを削除して、使われないスクリプト本体が残る状況を防いでいます。

kamiyasu

Author:kamiyasu

QR

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。