结构: nginx1<->nginx2<->backend server
nginx1 、 nginx2 、 backend server 都不在内网,在公网上,并且全部启用 gzip 。
nginx1 和 nginx2 的配置一样,区别只是 nginx1 的 upstream 是 nginx2 , nginx2 的 upstream 是 backend server ,这是配置:
worker_processes 1;
error_log /var/log/nginx/error.log warn; pid /var/run/nginx.pid;
worker_rlimit_nofile 1024;
events {
worker_connections 1024;
}
http {
include /etc/nginx/mime.types; default_type application/octet-stream;
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log /var/log/nginx/access.log main;
sendfile on;
tcp_nopush on;
keepalive_timeout 120;
gzip on;
gzip_types application/json text/plain application/x-javascript application/javascript text/javascript text/css application/xml text/xml;
gzip_min_length 1k;
server_tokens off;
upstream backend{
server xxx.xxx.xxx.xxx;
keepalive 120;
}
proxy_temp_path /tmp/cache_tmp;
proxy_cache_path /tmp/cache levels=1:2 keys_zone=cache1:100m inactive=20m max_size=5g;
server{
listen 80;
location / {
proxy_pass http://backend;
proxy_http_version 1.1;
proxy_set_header Range $http_range;
proxy_set_header If-Range $http_if_range;
proxy_set_header Connection "";
proxy_set_header X-Forwarded-For $remote_addr;
proxy_set_header Accept-Encoding "gzip";
proxy_cache cache1;
proxy_cache_key $uri$is_args$args;
proxy_cache_revalidate on;
}
}
}
现在的问题是, nginx1 的入流量远大于出流量, 3 倍左右,正常来说,在没设置 proxy_cache 的情况下,出入流量应该一致,在设置了 proxy_cache 后应该出流量大于入流量,已开始怀疑是不是 nginx2 的响应没有 gzip ,但在 nginx1 上抓包,来自 nginx2 的响应确实是 gzip 的,所以为什么流量不平衡?
在 nginx2 上,则是出大于入,但只多出了一点点,很少。
服务器上除了nginx没有其他任何服务,在nginx1上通过iftop查看可以看到接收nginx2的流量比较大,但是出到客户端的流量都比较低。
1
234747005 2016-08-12 14:34:23 +08:00
用 iftop 看一下,是什么 IP 的流量大,而且 nginx1 是马前卒,又要接收 anget 的又要接收 upstream 的,所以流量比较大也正常吧。
|
2
yamada OP @234747005 在 nginx1 上看是来自 nginx2 的响应流入比较大,但是出到客户端的流量都比较低。难道是 nginx1 会主动去请求 nginx2 刷新过期的缓存?
->而且 nginx1 是马前卒,又要接收 anget 的又要接收 upstream 的,所以流量比较大也正常吧。 不, nginx1 收到的请求都要转发给 nginx2 同时也要把 nginx2 的响应转回给客户端,不管怎么想,流入也不可能比流出大啊而且是大好几倍我还开启了缓存的情况下,至少持平才是正确的 |
3
lun10439547 2016-08-12 20:16:12 +08:00
我也有一样的问题。。。感觉反代的过期时间不灵。。。。。反代又拍云静态图片资源。。。设置过期一个月或者一年。。等了几个月。。结果又拍云那边一直在消耗流量。。。(然后买了 amh5.2 的面板里面设置反代也是一样效果)
不过,设置 2 小时后过期倒是灵的! 无奈用 proxy_store 得了 |
4
yamada OP @lun10439547 超时倒有很多可能性,你那的出入流量怎样?我这 iftop 看 10 来分钟,出流量只有 1G 入流量达到了 5G 真是搞不懂,差太多,可是我都启用了 GZIP 了
|
5
lun10439547 2016-08-12 22:10:57 +08:00
@yamada 我设置了超长过期时间和超长的不访问删除时间, 理论上 又拍云每日流量不会消耗超过 10M 的(每天更新图片没有那么多的) ,出去可能 10G 左右吧 ,结果是 每日很平均的 好的时候 又拍云流量消耗每日在 三四百兆左右。。。。不知道什么原因时间一长 反而会流量慢慢消耗加剧。。。超过 1G 甚至更多。。
你忽略了查询参数了没? Google 了很多配置都差不多的。。。 |
6
yamada OP |
7
yamada OP /tmp/cache 为空不是权限问题,我发现缓存被放倒 /tmp/systemd-private-xxxxxxxxxxxx-nginx.service-fWNh6O/tmp/cache 里去了……这是为啥
|
8
fffonion 2016-08-23 22:01:45 +08:00
你反代的是不是大文件然后客户端请求的时候带了 Range 头?可以试试给这些 location 设置 proxy_buffering off;
有一个情形是客户端带 Range 头的时候,如果开启了 cache , nginx 会从 upstream 取好几遍相同的文件,直到本地留了一份 cache 下来 |