2

nginx サーバーに送信されたすべてのリクエストをデフォルトでバックエンド アプリケーションにルーティングしたいのですが、GET HTTP 動詞を含む API リクエストを、content_by_luanginx ディレクティブに基づく OpenResty Lua ベースの REST API に選択的に送信したいと考えています。

次の構成を使用して、URL プレフィックスに基づいてすべての API 要求を Lua API に正常にルーティングできます (これは HTTP 動詞を考慮していないことに注意してください)。

http {
  upstream backend {
    server localhost:8080;
  }
  server {
    listen 80;

    location / {
      # Send all requests to the backend application
      proxy_pass http://backend;
      proxy_set_header   X-Forwarded-For  $proxy_add_x_forwarded_for;
      proxy_set_header   Host             $http_host;
      proxy_set_header   X-Real-IP        $remote_addr;
      proxy_set_header   CLIENT_IP $remote_addr;
      proxy_set_header   HTTP_CLIENT_IP $remote_addr;
      proxy_redirect off;
    }

    location /api {
      # Send any URL with the /api prefix to the nginx Lua API application
      content_by_lua '
        require("lapis").serve("app")
      ';
    }
  }
}

しかし、上で述べたように、GET 以外の HTTP 動詞 (POST、PUT、DELETE など) を含むすべてのリクエストが引き続きバックエンドにルーティングされ、GET リクエストのみがルーティングされるように、API リクエストをさらに制限したいと思います。 Lua API の場所に移動します。

他のいくつかの投稿、ブログ、およびドキュメントに基づいて (そしてディレクティブが嫌われていると聞いて) ifディレクティブを使用してみましたが、ディレクティブがブロック用に設計されていないようlimit_exceptに見えるため、起動時に nginx サーバーがクラッシュしました。これが私の試みでした:content_by_lualimit_except

http {
  upstream backend {
    server localhost:8080;
  }
  server {
    listen 80;

    location / {
      proxy_pass http://backend;
      proxy_set_header   X-Forwarded-For  $proxy_add_x_forwarded_for;
      proxy_set_header   Host             $http_host;
      proxy_set_header   X-Real-IP        $remote_addr;
      proxy_set_header   CLIENT_IP $remote_addr;
      proxy_set_header   HTTP_CLIENT_IP $remote_addr;
      proxy_redirect off;
    }

    location /api {
      # Default the non-get API requests back to the backend server
      proxy_pass http://backend;
      proxy_set_header   X-Forwarded-For  $proxy_add_x_forwarded_for;
      proxy_set_header   Host             $http_host;
      proxy_set_header   X-Real-IP        $remote_addr;
      proxy_set_header   CLIENT_IP $remote_addr;
      proxy_set_header   HTTP_CLIENT_IP $remote_addr;
      proxy_redirect off;

      # Select requests that *aren't* a PUT, POST, or DELETE, and pass those to the Lapis REST API
      limit_except PUT POST DELETE {
        content_by_lua '
          require("lapis").serve("app")
        ';
      }
    }
  }
}

すぐにクラッシュしました

nginx: [emerg] "content_by_lua" directive is not allowed here in nginx.conf:46

ディレクティブに委任するときに、URL プレフィックスHTTP 動詞の両方に基づいて nginx で選択的にルーティングする最良の方法は何ですか?content_by_lua

4

1 に答える 1