
结构: 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 下来 |