nginx サーバーに送信されたすべてのリクエストをデフォルトでバックエンド アプリケーションにルーティングしたいのですが、GET HTTP 動詞を含む API リクエストを、content_by_lua
nginx ディレクティブに基づく 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_lua
limit_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