WEBアプリの公開に苦労した話

以前から作成していたwebアプリを実際に使えるようにしたいと思い、サーバーに上げてみました。思い込みと、ネットの情報に振り回され、とほほという感じです。

今回仮公開したアプリは個人用のAPIサーバーであり、今のところ公開予定はありません。以前から興味のあったjavascript(node.js)に触れてみたいと思って作っただけの試作品です。

作業をしてみて、次の項目が大きな課題でした。

  • dockerコンテナ間の連携
  • リバースプロキシの設定
  • サブディレクトリに配置したアプリのパス解決

Dockerコンテナ間の連携

今回の目的の一つは、webアプリをDockerコンテナとしてデプロイすることでした。ホームページ配信用webサーバーからwebアプリにアクセスするためには、リバースプロキシの設定が必要です。ところが、今回はwebサーバーとwebアプリが別のコンテナになっているので、リバースプロキシはwebアプリコンテナの動的なIPアドレスを知ることができません。最初このことを忘れていて、無駄に苦労してしまいました。

解決法としては、nginxの設定の中でresolverにDockerのEmbeddedDNSサーバーである127.0.0.11を指定することで、ホスト名(コンテナ名)からIPアドレスを引けるようにすることでした。

後から気が付いたのですが、Dockerのネットワークはもっと詳細な設定ができるようなので、全てのコンテナに静的なIPアドレスを付与してもよかったかもしれません。

リバースプロキシの設定

これは、webの情報に踊らされた形となりました。有名なQ&Aサイトのstackoverflowの中ですら、答えが何種類もあり、何が正しいのかよく分かりません。ただ、nginxのドキュメントは意外と丁寧です。リバースプロキシする際に、正規表現を使ってrewriteしたりする必要が無いことも書いてありました。

サブディレクトリに配置したアプリのパス解決

リバースプロキシの設定ができ、ようやくwebアプリが表示できる・・・と思った矢先に登場した問題でした。サブディレクトリにwebアプリを配置すると、webアプリがルートディレクトリにあるものとして書かれたパスが無効になります。webアプリが返すレスポンスヘッダはnginxのproxy_redirect等で書き換えられるものの、レンダリングしたHTMLファイルの中の文字列は自力で対処しなければなりません。このことは完全に盲点でした。express.jsでこれを回避することはできるのだろうか?

まだまだ未解決の課題がありますが、今日はこのくらいにしておきます。