LoginSignup
9

More than 5 years have passed since last update.

さくらのクラウド「シンプル監視」でVPCルータ配下のhttp/httpsを無料で監視する

Posted at

さくらのクラウドで提供されている「シンプル監視」は

料金 説明
無料 監視対象がIPv4アドレスかつ、弊社サービス(さくらのVPS、さくらの専用サーバ等)で提供するグローバルIPアドレスの場合
有料 ・監視対象がFQDNの場合
・弊社提供以外のグローバルIPアドレスの場合

ということで、IPv4でさくらインターネットのグローバルIPアドレスであれば無料で監視できます。
有料でも21円/月(2016年4月28日現在)なので、有料でも良い気はするのですが、 さくらインターネットで借りているサーバ なのに 有料 になっちゃうのは悲しかったので、無料で使える方法。

今回の構成は、VPCルータを利用して

  • グローバルIPは1つ
  • 配下にプロダクションサーバ、ステージングサーバの2台
  • プロダクションサーバはVirtualHostで運用していてFQDNでリクエストする必要がある
  • グローバルIPの80ポートおよび443ポートはプロダクションサーバに転送(VPCルータのNAT機能利用)
  • WebサーバはApache HTTP Serverの2.4系

という構成になります。

目的

VPCルータ配下のプロダクションおよびステージングサーバのhttp/httpsの応答監視をしたい

越えなければならないハードル

有料でOKなら、越えるべきハードルは月額21円×監視項目数。

無料にしたいなら

  • FQDNは有料になるのでIPv4でしか監視できない
  • IPv4にするとVirtualHostが反応しない

をどうにか越えなければならない。

そうだ!Proxyを使おう

というわけで、早速解決編。
mod_headersとmod_proxy、mod_sslが使える前提になりますが、以下の方法で監視できました。

<VirtualHost *>
    ServerName dummy.example.net
    DocumentRoot /var/www/html

    SetEnvIf Request_URI "^/_monitor/prod/" REQUEST_MONITOR_PROD=1
    SetEnvIf Request_URI "^/_monitor/stg/" REQUEST_MONITOR_STG=1

    RequestHeader set Host www.example.net env=REQUEST_MONITOR_PROD
    RequestHeader set Host stg.example.net env=REQUEST_MONITOR_STG

    ProxyRequests Off
    ProxyPreserveHost On

    SSLProxyEngine On
    #SSLProxyVerify none
    SSLProxyCheckPeerCN off
    SSLProxyCheckPeerName off
    #SSLProxyCheckPeerExpire off

    <Proxy *>
        Order deny,allow
        Deny from all
        Allow from 27.133.139.32/28
    </Proxy>

    ProxyPass /_monitor/prod/http/  http://192.0.2.32/
    ProxyPass /_monitor/prod/https/ https://192.0.2.32/
    ProxyPass /_monitor/stg/http/   http://192.0.2.33/
</VirtualHost>

この設定で、

名称 監視用URL
プロダクションサーバのHTTP http://(VPCルータのIPv4アドレス)/_monitor/prod/http/
プロダクションサーバのHTTPS http://(VPCルータのIPv4アドレス)/_monitor/prod/https/
ステージングサーバのHTTP http://(VPCルータのIPv4アドレス)/_monitor/stg/http/

を監視できます。

上から順に設定の解説

VirtualHost宣言

<VirtualHost *>
    ServerName dummy.example.net
    DocumentRoot /var/www/html

ここで登場する <VirtualHost *> は httpd.conf から設定ファイルをたどって最初に登場する <VirtualHost> にします。
ApacheはIPアドレスでアクセスされた場合など該当するVirtualHostが無い場合、一番最初に定義されているVirtualHostにアクセスします。

SetEnvIfで条件によって環境変数を宣言

    SetEnvIf Request_URI "^/_monitor/prod/" REQUEST_MONITOR_PROD=1
    SetEnvIf Request_URI "^/_monitor/stg/" REQUEST_MONITOR_STG=1

Request_URI の値を使ってどのサーバを確認したいのかを判断します。

conf 内容
SetEnvIf Request_URI "^/_monitor/prod/" REQUEST_MONITOR_PROD=1 /_monitor/prod/ で始まるリクエストURIの場合、REQUEST_MONITOR_PROD環境変数を作成して1を代入
SetEnvIf Request_URI "^/_monitor/stg/" REQUEST_MONITOR_STG=1 /_monitor/stg/ で始まるリクエストURIの場合REQUEST_MONITOR_STG環境変数を作成して1を代入

RequestHeaderでHostを指定

    RequestHeader set Host www.example.net env=REQUEST_MONITOR_PROD
    RequestHeader set Host stg.example.net env=REQUEST_MONITOR_STG

proxyでアクセスする際にVPCルータ配下のIPアドレスを直接指定してアクセスするため、環境変数が宣言されているかによってリクエストヘッダーの Host 値を設定します。

Proxyの挙動を設定

    ProxyRequests Off
    ProxyPreserveHost On

ProxyRequest Off は、フォワードプロキシではなくリバースプロキシにするためOFFにします。
ProxyPreserveHost On は、RequestHeaderで設定したHostを引き継ぐためにONにします。

Proxyをする際のSSL通信について設定

    SSLProxyEngine On
    #SSLProxyVerify none
    SSLProxyCheckPeerCN off
    SSLProxyCheckPeerName off
    #SSLProxyCheckPeerExpire off

ここ案外肝です。

SSLProxyEngine On が無いと

AH01961: SSL Proxy requested for dummy.domain.tld:80 but not enabled [Hint: SSLProxyEngine]
AH00961: HTTPS: failed to enable ssl support for 192.0.2.32:443 (192.0.2.32)

と言う感じでエラーになります。

次に SSLProxyCheckPeerCN 、 SSLProxyCheckPeerName が無いと…

(502)Unknown error 502: [client 203.0.113.1:63153] AH01084: pass request body failed to 192.0.2.32:443 (192.0.2.32)
[client 203.0.113.1:63153] AH00898: Error during SSL Handshake with remote server returned by /_monitor/https/
[client 203.0.113.1:63153] AH01097: pass request body failed to 192.0.2.32:443 (192.0.2.32) from 203.0.113.1 ()

というエラーになります。
理由はproxyでアクセスしているのはIPアドレスになるため証明書の検証でCommon Name(CN)が一致しないやSubject Alternative Name(SANs)でも一致しないというのをチェックしないようにします。

コメントアウトしている SSLProxyVerify と SSLProxyCheckPeerExpire は自己署名証明書(オレオレ証明書)の場合に付けると証明書自体の検証と有効期限切れのチェックを行わなくなります。
(今回は証明書の期限切れとか証明書そのものがおかしいというのも監視できるようになるのでコメントアウト)

Proxyへの外部からのアクセスについて設定

    <Proxy *>
        Order deny,allow
        Deny from all
        Allow from 27.133.139.32/28
    </Proxy>

proxyすることができる接続元IPをシンプル監視のIPに限定します。

Proxy接続先

    ProxyPass /_monitor/prod/http/  http://192.0.2.32/
    ProxyPass /_monitor/prod/https/ https://192.0.2.32/
    ProxyPass /_monitor/stg/http/   http://192.0.2.33/

各リクエストURLでのプロキシ先を定義します。

VirtualHost設定終了

</VirtualHost>

設定終了です。

最後に・・・

これを使うと、Proxyを経由してさくらインターネット以外のIPも監視できちゃう気がしますが、やめておきましょう。

  • サービス提供元のさくらインターネットに対して、なんか失礼である(今回はVPCルータ配下と言うことで見逃して…NGなら記事下げます m(_ _)m )
  • 監視先の実際のサーバは何事も無くてもVPCルータまたはProxyを設定したサーバが落ちた場合、障害が検知される(→夜中不用意に起こされる危険が増える)

ということで、さくらインターネットのサービスに対して快く無料提供があるので、さくらのクラウドのリソースなどさくらインターネットのサービスだけで使いましょう。

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
9