🌽

nginx × dockerのリバースプロキシ設定で詰まったところ

2024/10/26に公開

環境

  • フロントエンド: nuxt
  • バックエンド: rails
  • Docker Desktop for Mac

各ディレクティブがよくわからない件

  • そもそもどれが何を意味しているのか
  • nginx.confの構成をなんとなく理解します、、
    • Configuration File’s Structureによると、、、
    • ディレクティブ2種
        1. sinpleディレクティブ
        • シンプルに指示、命令。
        # ディレクティブ名 パラメーター;
        listen 80;
        server_name localhost;
        
        1. 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.conf
    events {}
    http {
    ...以下略...
    
  • eventsディレクティブは、リクエストがきた時の接続処理に関する設定をできます

    • worker_connections
      • 同時接続数
      • アクセス数の多いサイトなどは設定するといいかもしれません〜
    • use
      • 接続処理の方法(select, poll, kqueue, epoll..など)
      • それぞれ何が違うのかはわかりません、、
    • などなど、、

エラー! 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側の設定で、アクセスしたホスト名を設定することができます

    nginx.conf
    http {
      # 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