Câu trả lời trước đó của tôi hoạt động nhưng nó phù hợp hơn với trường hợp tất cả các yêu cầu cần được làm chậm lại. Tôi đã phải đưa ra một giải pháp cho phép tôi chỉ bật giới hạn tốc độ trên cơ sở từng trường hợp và đã đưa ra cấu hình sau. Hãy chắc chắn đọc toàn bộ câu trả lời trước khi bạn sử dụng câu trả lời này, bởi vì có những sắc thái quan trọng cần biết.
location/{
if (-f somewhere/sensible/LIMIT) {
echo_sleep 1;
# Yes, we need this here too.
echo_exec /proxy$request_uri;
}
echo_exec /proxy$request_uri;
}
location /proxy/ {
internal;
# Ultimately, all this goes to a Django server.
proxy_pass http://django/;
proxy_set_header Host $http_host;
proxy_set_header X-Forwarded-For $remote_addr;
}
Lưu ý quan trọng: sự hiện diện hoặc vắng mặt của dấu gạch chéo ở phía trước tạo sự khác biệt. Ví dụ: proxy_pass http://django
, không có dấu gạch chéo, không làm điều tương tự như dòng trong mã ở trên.
Nguyên tắc hoạt động đơn giản. Nếu tệp somewhere/sensible/LIMIT
tồn tại thì các yêu cầu khớp với location /
sẽ bị tạm dừng trong một giây trước khi tiếp tục. Vì vậy, trong bộ thử nghiệm của tôi, khi tôi muốn một mạng chậm lại, tôi tạo ra các tập tin, và khi tôi muốn loại bỏ sự chậm lại, tôi loại bỏ nó. (Và tôi có mã dọn dẹp để loại bỏ nó giữa mỗi bài kiểm tra.) Về lý thuyết tôi muốn sử dụng các biến cho tệp này nhiều hơn một tệp, nhưng vấn đề là các biến được khởi tạo lại với mỗi yêu cầu.Vì vậy, chúng tôi không thể có một khối location
sẽ đặt biến để chuyển giới hạn và một biến khác để tắt giới hạn đó. (Đó là điều đầu tiên tôi thử, và nó thất bại do tuổi thọ của các biến). Nó có lẽ sẽ có thể sử dụng các mô-đun Perl hoặc Lua để biến tồn tại hoặc fiddle với cookie, nhưng tôi đã quyết định không đi xuống các tuyến đường này.
Ghi chú quan trọng:
Nó không phải là một ý tưởng tốt để trộn chỉ thị từ các module echo
(như echo_sleep
và echo_exec
) với các chỉ cổ phiếu của nginx đó dẫn đến việc sản xuất của một phản ứng. Ban đầu, tôi có echo_sleep
cùng với proxy_pass
và có kết quả kém. Đó là lý do tại sao chúng tôi có khối location /proxy/
tách riêng các chỉ thị cổ phiếu khỏi các công cụ echo
. (Xem này issue cho một cuộc xung đột tương tự mà đã được giải quyết bằng cách tách một khối.)
Hai echo_exec
chỉ thị, trong và ngoài if
, là cần thiết do cách if
công trình.
Chỉ thị internal
ngăn khách hàng yêu cầu trực tiếp /proxy/...
URL.
Thật không may, 'tc' chỉ dành cho Linux, nhưng không xuất hiện trên OS X. – jiyinyiyong