REST通信でAPIにリクエストを送る場合、だいたい以下のようなURLになるだろう。
https://domain/app-name/api/api-name?…
途中からプロジェクトに参画すると、特にこのURLを意識することは無いのだが、この間に入っている/api/ってなんだ?と、常々疑問に思っていた。
開発環境になると、この部分が、/api-dev/になったりする。これはどこで設定しているんだ?
コンテキストパスの設定
環境はJava、Spring Boot、Gradle、Red Hat。
API_1からAPI_2にRESTでリクエストを送信する場合を考える。
まず、リクエストを受けるAPI_2では、自身のコンテキストパスを認識し、そのパス宛てのリクエストのみを受け付ける。
コンテキストパスは複数箇所で設定できるため、特定が難しいが、たとえば以下で設定している。
- サーバーにデプロイしているwar名 //my-app.warをデプロイしていれば、my-app
- application.yml のserver.servlet.context-path
コンテキストパスに app-name が指定されているとすれば、API_1からAPI_2にリクエストを送信する際は以下のURLで送信することになる。
https://domain/app-name/…
プロキシで設定している場合も多い
としてもコンテキストパスの設定が見つからなければ、サーバーのプロキシ設定によってパスを書き換えている可能性がある。
サーバー内で、プロキシの設定を確認する。
sudo grep -R "ProxyPass" /etc/httpd/
プロキシの設定もいくつか方法があるが、基本的には /etc/httpd/ 配下のファイルで行われている。
ファイル内では ProxyPass という文字列で設定を行っているので、grepで検索する。
たとえば /etc/httpd/conf/httpd.conf に以下のような設定が見つかったとする。
ProxyPass /my-app-req http://localhost:18080/my-app/api
これは、外部から /my-app-req にアクセスが来たら、localhost:18080/my-app/api に転送してね、という指示。
localhost と聞くとローカルPCをイメージしがちだが、ここではサーバー自身、正確にはAPI_2のTomcatを指す。
18080 など、よくわからないポートが指定されている場合、受け側のポート設定方法はいくつかあるが、たとえば以下で設定している。
/tomcatのパス/conf/server.xml
ファイル内では、以下の箇所で設定している。
<Connector port="18080" …>
これらのプロキシ構成は、以下の目的のためにわりとよく行われる実装である。
- 1つのAPサーバーに複数のTomcatを構築して、複数の開発環境を作る。
- 本番ではWebサーバーとAPIサーバーを分けるが、リソース節約の目的から、開発環境・テスト環境ではどちらも1サーバーで行う(Apache上でプロキシを使用する)。
アプリの資源は同じまま、複数環境でルーティングできるのが、Apacheでプロキシを使用する強み。
ここまでの設定をまとめる
※前提として、アプリの application.env.yml は一元管理し、ポートは書き込まない。また、web資源とAP資源を1サーバに配置する。
/etc/httpd/conf/httpd.conf の設定
※SSLを使う場合は/etc/httpd/conf.d/ssl.confで、ポートは80ではなく443を使用する。
# webサーバとしてポート80番をListen
Listen 80
<VirtualHost *:80
DocumentRoot "/var/www/html" # Apacheとして参照するweb資源
>
# APリクエストはTomcatへルーティング
ProxyPass /my-app-api/ http://localhost:8080/api/
ProxyPassReverse /my-app-api/ http://localhost:8080/api/
/opt/[tomcatのパス]/conf/server.xmlの設定
<Connector port="8080" ... />
リクエストの流れ
ブラウザから画面資源をリクエスト
リクエストURL:http://domain/app-name
- httpではポート80がデフォルトで使用される。httpsではSSL接続となり、443が使用される。
- /etc/httpd/conf/httpd.conf でポート80をListenしているため、VirtualHostが呼ばれる。
- VirtualHostの中で、web資源 /var/www/html が参照される。
- /var/www/html にデプロイされているweb資源から、index.htmlなどが呼ばれる。
- ブラウザにweb資源が表示される。
表示されたブラウザ(またはアプリ)からリクエスト送信
リクエストパス:/app-name-api/api-name
- web資源からリクエストを送る際は相対パスでのリクエストとなる
- /etc/httpd/conf/httpd.confで、今度は、ProxyPassに該当するリクエストであるため、http://localhost:8080/api/にルーティングされる
- /tomcatのバス/conf/server.xmlで、ポート8080を待ち受けているため、Tomcatがリクエストを受け取る

コメント