リクエストURLはどのように決まっているのか?

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

  1. httpではポート80がデフォルトで使用される。httpsではSSL接続となり、443が使用される。
  2. /etc/httpd/conf/httpd.conf でポート80をListenしているため、VirtualHostが呼ばれる。
  3. VirtualHostの中で、web資源 /var/www/html が参照される。
  4. /var/www/html にデプロイされているweb資源から、index.htmlなどが呼ばれる。
  5. ブラウザにweb資源が表示される。

表示されたブラウザ(またはアプリ)からリクエスト送信

リクエストパス:/app-name-api/api-name

  1. web資源からリクエストを送る際は相対パスでのリクエストとなる
  2. /etc/httpd/conf/httpd.confで、今度は、ProxyPassに該当するリクエストであるため、http://localhost:8080/api/にルーティングされる
  3. /tomcatのバス/conf/server.xmlで、ポート8080を待ち受けているため、Tomcatがリクエストを受け取る

 

コメント

タイトルとURLをコピーしました