プレフィックスが /api/ の URL への呼び出しをレート制限しようとしています。設定を添付してレート制限を構成しましたが、Axios を使用してテストしてもスロットリングは表示されません。
limit_req_zone $binary_remote_addr zone=mylimit:10m rate=1r/s;
server {
server_name gmmff.test;
root /home/angel/wdev/laravel/gmf/public;
add_header X-Frame-Options "SAMEORIGIN";
add_header X-Content-Type-Options "nosniff";
error_log /var/log/nginx/gmf.log warn;
access_log /var/log/nginx/gmf-access.log;
index index.php;
charset utf-8;
location / {
try_files $uri $uri/ /index.php?$query_string;
}
location /api/ {
limit_req zone=mylimit;
rewrite ^/api/(.*)$ /index.php?$query_string;
}
location = /favicon.ico { access_log off; log_not_found off; }
location = /robots.txt { access_log off; log_not_found off; }
error_page 404 /index.php;
location ~ \.php$ {
fastcgi_pass unix:/var/run/php/php8.0-fpm.sock;
fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;
include fastcgi_params;
}
location ~ /\.(?!well-known).* {
deny all;
}
}
答え1
で始まる URI は/api/
に書き換えられ/index.php
、limit_req
後者の URI が処理されているときにはディレクティブはスコープ内になくなります。
オプション 1)ブロックindex.php
内でファイルを処理できますlocation /api/
。
例えば:
location /api/ {
limit_req zone=mylimit;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $realpath_root/index.php;
fastcgi_pass unix:/var/run/php/php8.0-fpm.sock;
}
SCRIPT_FILENAME
の場所をポイントするだけですindex.php
。
オプション 2)limit_req
ディレクティブを移動して常にスコープ内になるようにしますが、ディレクティブを使用して「key」変数を操作することで、ディレクティブを効果的にオン/オフにしますmap
。
例えば:
map $request_uri $token {
~^/api/ $binary_remote_addr;
default '';
}
limit_req_zone $token zone=mylimit:10m rate=1r/s;
server {
...
limit_req zone=mylimit;
...
}
からドキュメント:
キー値が空のリクエストはカウントされません。