Phoenix に NGINX 経由でアクセスする

Phoenix に NGINX 経由のアクセスを設定した記録を投稿します。環境は、CentOS 7 の Docker コンテナを利用しています。
ホスト側には 80 番ポートへのアクセスをコンテナの 80 番ポートにフォワーディングする設定をしています。
以下はすべてコンテナ内での作業です。

## NGINX 側の設定

### NGINX のインストール

<pre>
[root@phoenix ~]# vim /etc/yum.repos.d/nginx.repo
[nginx]
name=nginx repo
baseurl=http://nginx.org/packages/mainline/centos/7/$basearch/
gpgcheck=0
enabled=1

[root@phoenix ~]# yum install -y nginx
</pre>

### プロキシ設定

HTTP アクセスを 4001 番ポートにプロキシする設定をします。
Phoenix は production 環境を 4001 番ポートで listen させます。

<pre>
[root@phoenix ~]# cp -p /etc/nginx/conf.d/default.conf /etc/nginx/conf.d/default.conf.org
[root@phoenix ~]# vim /etc/nginx/conf.d/default.conf
[root@phoenix ~]# diff -u /etc/nginx/conf.d/default.conf.org /etc/nginx/conf.d/default.conf     
--- /etc/nginx/conf.d/default.conf.org  2018-08-29 00:43:40.000000000 +0900
+++ /etc/nginx/conf.d/default.conf      2018-08-31 09:32:45.127236562 +0900
@@ -5,9 +5,13 @@
     #charset koi8-r;
     #access_log  /var/log/nginx/host.access.log  main;

+    #location / {
+    #    root   /usr/share/nginx/html;
+    #    index  index.html index.htm;
+    #}
+
     location / {
-        root   /usr/share/nginx/html;
-        index  index.html index.htm;
+        proxy_pass http://localhost:4000;
     }

     #error_page  404              /404.html;
</pre>

### サービス自動起動設定とサービス再起動

<pre>
[root@phoenix ~]# systemctl enable nginx
Created symlink from /etc/systemd/system/multi-user.target.wants/nginx.service to /usr/lib/systemd/system/nginx.service.
[root@phoenix ~]# systemctl start nginx
</pre>

## Phoenix 側の設定

### listen ポートの指定と公開する IP アドレスの設定
以下では、production 環境が NGINX 経由でのみアクセスできるよう、バインドする IP アドレスにループバックアドレスを指定し、listen するポート番号は環境変数 PORT から取得する設定をしています。

<pre>
[root@phoenix ~]# su - homulilly
[homulilly@phoenix ~]$ cd /apl/test
[homulilly@phoenix test]$ cp -p config/prod.exs config/prod.exs.old
[homulilly@phoenix test]$ vim config/prod.exs
[homulilly@phoenix test]$ diff -u config/prod.exs.old config/prod.exs     
--- config/prod.exs.old 2018-08-28 09:13:40.998220302 +0900
+++ config/prod.exs     2018-08-31 09:37:13.137221137 +0900
@@ -12,8 +12,8 @@
 # manifest is generated by the mix phoenix.digest task
 # which you typically run after static files are built.
 config :test, Test.Endpoint,
-  http: [:inet6, port: {:system, "PORT"}],
-  url: [host: "example.com", port: 80],
+  http: [ip: {127,0,0,1}, port: {:system, "PORT"}], 
   cache_static_manifest: "priv/static/cache_manifest.json"
 
 # Do not print debug messages in production
</pre>

### DB の設定

secret ファイルはサンプルからコピーして作成します。secret 情報をファイルに書いておくのが好ましくない場合、上の listen するポート番号と同様、環境変数から取得することも可能なようです。

<pre>
[homulilly@phoenix test]$ vim config/prod.secret.exs 
use Mix.Config

# In this file, we keep production configuration that
# you'll likely want to automate and keep away from
# your version control system.
#
# You should document the content of this
# file or create a script for recreating it, since it's
# kept out of version control and might be hard to recover
# or recreate for your teammates (or yourself later on).
config :test, Test.Endpoint,
  secret_key_base: "***********************************************************"

# Configure your database
config :test, Test.Repo,
  adapter: Ecto.Adapters.Postgres,
  username: "homulilly",
  password: "********",
  database: "test_prod",
  hostname: "localhost",
  pool_size: 15
</pre>

## 動作確認

production 環境で Phoenix サーバを起動します。

<pre>
[homulilly@phoenix test]$ export MIX_ENV=prod
[homulilly@phoenix test]$ mix ecto.migrate
[homulilly@phoenix test]$ PORT=4001 mix phx.server
</pre>

以上で、ホストの 80 番ポートへアクセスすると、Phoenix のページが表示されました。また、コンテナの 4001 番ポートへのフォワーディングルールをホスト側に追加した後、4001 番ポートへ直接アクセスしても、Phoenix のページは表示されませんでした。