🌽
nginx × dockerのリバースプロキシ設定で詰まったところ
- nginx × docker でフロントエンドとバックエンドの振り分けをしました!リバースプロキシ!!の時に、nginx.confの書き方など詰まる部分があったので、まとめておこうと思います
環境
- フロントエンド: nuxt
- バックエンド: rails
- Docker Desktop for Mac
各ディレクティブがよくわからない件
- そもそもどれが何を意味しているのか
- nginx.confの構成をなんとなく理解します、、
- Configuration File’s Structureによると、、、
- ディレクティブ2種
-
- sinpleディレクティブ
- シンプルに指示、命令。
# ディレクティブ名 パラメーター; listen 80; server_name localhost;
-
- blockディレクティブ
- simpleディレクティブでできている
- contextを作る
- 特定のcontext内でしか呼べないディレクティブがあります
# ディレクティブ名 { simpleディレクティブたち } # TOPはmain context server { # ここはserver context listen 80; server_name localhost; }
-
- 要するに各種ディレクティブ(命令)を各種コンテキスト内ですればよいです
- 各ディレクティブの意味については先人の知恵を借りました
- nginx.confの中身を理解したいので一つずつ調べました
- ↓↓なんとなく理解したこと
- server: サーバーについて指定するディレクティブ
- location: リクエストのパスを元に処理をするディレクティブ
- proxy_path: リクエストをプロキシ先に飛ばすディレクティブ
- upstream: プロキシ先(backend/frontend)について指定するディレクティブ
エラー! nginx: [emerg] no "events" section in configuration
-
events
ディレクトリがないよというエラー -
特に設定するものもない気がしたので、入れてなかったのですが、必須でした。
-
とりあえずディレクティブがあればOKのようです
nginx.confevents {} http { ...以下略...
-
eventsディレクティブ
は、リクエストがきた時の接続処理に関する設定をできます- worker_connections
- 同時接続数
- アクセス数の多いサイトなどは設定するといいかもしれません〜
- use
- 接続処理の方法(select, poll, kqueue, epoll..など)
- それぞれ何が違うのかはわかりません、、
- などなど、、
- worker_connections
エラー! nginx: [emerg] host not found in upstream "nuxt:3000" in /etc/nginx/nginx.conf:14
- frontendコンテナが見つからないエラー
- frontendとnginxを別のcomposeにしていたことが原因です。
- 逆にbackendはnginxと同じcomposeにいるので、コンテナ名を利用して通信が可能でした
- 同じネットワークに属すようにすれば、解決しますcompose.yaml
networks: default: name: my_network
エラー!(rails) Blocked hosts: backend
-
rails側でホスト名
backend
が受け入れられないみたいです -
config.hostsで設定されたホスト名しか受け入れないようになっています
-
localhost
はデフォルトで設定されています - nginx経由したため、
localhost
でアクセスしていますが、ホスト名がnginxからrailsを呼び出す時のbackend
になってしまいました
-
-
nginx側の設定で、アクセスしたホスト名を設定することができます
- proxy_set_headerでプロキシ先のサーバーにアクセスする際のヘッダーを設定できます
-
$http_host
でnginxにアクセスした時のリクエストのhost名を取得できます- その他nginx内で取得できる変数がたくさんありました!
nginx.confhttp { # upstream: プロキシ先の指定 # backendコンテナへ upstream backend { server rails:3000; } ...略... # server: サーバー設定 server { ...略... location /api/ { # ここでホスト名を設定しました↓ proxy_set_header Host $http_host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-Host $host; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-CSRF-Token $http_x_csrf_token; proxy_pass http://backend; } ...略...
Discussion