我已经在 StackOverflow 上问过这个问题,但不幸的是没有人回答。
我目前正在使用 NGINX 作为我创建的 API(apache)的反向代理(因为我正在使用一些 docker 容器)。我已经删除了大多数超时,因为我的一些请求将花费不到 60 秒的时间,这不是问题。
但是,我的一个请求绝对不应该超过 3 秒,如果超过 3 秒,我想取消它并发送一个空的响应。
我之所以需要这样做,是因为有时我的 apache 会过载(客户端排队)并且 TTL 会变得非常大。如果是这种情况,我真的需要终止对 api.webservice.me/public/js 的请求(它不应该被阻塞并加载太久)。而且在 apache 端执行此操作毫无用处,因为请求 api.webservice.me/public/js 的人会在队列中等待。
正确的做法是什么?
所以我需要的是:
60 seconds timeout for api.webservice.me/public/anything
60 seconds timeout for api.webservice.me/public/second-request
3 seconds timeout for api.webservice.me/public/js
如果可能的话,用空的 200 状态进行响应
这是处理我的 API 的部分
# api.website.me
upstream api.website.me {
ip_hash;
## Can be connected with "nginx-proxy" network
# serverapi_webservice_9
server 172.18.0.13:80;
}
server {
server_name api.website.me;
listen 443 ssl http2 ;
access_log /var/log/nginx/access.log vhost;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers 'XXXXX'
ssl_prefer_server_ciphers on;
ssl_session_timeout 5m;
ssl_session_cache shared:SSL:50m;
ssl_session_tickets off;
ssl_certificate /etc/nginx/certs/api.website.me.crt;
ssl_certificate_key /etc/nginx/certs/api.website.me.key;
location / {
proxy_pass http://api.website.me;
}
}
server {
server_name api.website.me;
listen 80 ;
access_log /var/log/nginx/access.log vhost;
location / {
proxy_pass http://api.website.me;
}
}
答案1
proxy_read_timeout 3s;
定义从代理服务器读取响应的超时时间。超时时间仅在两次连续的读取操作之间设置,而不是针对整个响应的传输。如果代理服务器在此时间内未传输任何内容,则连接将关闭。