nginx 反代为什么入流量远大于出流量?

2016-08-12 10:54:33 +08:00
 yamada

结构: 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的流量比较大,但是出到客户端的流量都比较低。

5071 次点击
所在节点    NGINX
8 条回复
234747005
2016-08-12 14:34:23 +08:00
用 iftop 看一下,是什么 IP 的流量大,而且 nginx1 是马前卒,又要接收 anget 的又要接收 upstream 的,所以流量比较大也正常吧。
yamada
2016-08-12 15:21:26 +08:00
@234747005 在 nginx1 上看是来自 nginx2 的响应流入比较大,但是出到客户端的流量都比较低。难道是 nginx1 会主动去请求 nginx2 刷新过期的缓存?
->而且 nginx1 是马前卒,又要接收 anget 的又要接收 upstream 的,所以流量比较大也正常吧。
不, nginx1 收到的请求都要转发给 nginx2 同时也要把 nginx2 的响应转回给客户端,不管怎么想,流入也不可能比流出大啊而且是大好几倍我还开启了缓存的情况下,至少持平才是正确的
lun10439547
2016-08-12 20:16:12 +08:00
我也有一样的问题。。。感觉反代的过期时间不灵。。。。。反代又拍云静态图片资源。。。设置过期一个月或者一年。。等了几个月。。结果又拍云那边一直在消耗流量。。。(然后买了 amh5.2 的面板里面设置反代也是一样效果)

不过,设置 2 小时后过期倒是灵的! 无奈用 proxy_store 得了
yamada
2016-08-12 20:39:31 +08:00
@lun10439547 超时倒有很多可能性,你那的出入流量怎样?我这 iftop 看 10 来分钟,出流量只有 1G 入流量达到了 5G 真是搞不懂,差太多,可是我都启用了 GZIP 了
lun10439547
2016-08-12 22:10:57 +08:00
@yamada 我设置了超长过期时间和超长的不访问删除时间, 理论上 又拍云每日流量不会消耗超过 10M 的(每天更新图片没有那么多的) ,出去可能 10G 左右吧 ,结果是 每日很平均的 好的时候 又拍云流量消耗每日在 三四百兆左右。。。。不知道什么原因时间一长 反而会流量慢慢消耗加剧。。。超过 1G 甚至更多。。
你忽略了查询参数了没?
Google 了很多配置都差不多的。。。
yamada
2016-08-13 12:55:55 +08:00
@lun10439547 我的配置已经贴在上面了
另外我发现
cd /tmp/cache
ls
是空的……
yamada
2016-08-13 20:10:01 +08:00
/tmp/cache 为空不是权限问题,我发现缓存被放倒 /tmp/systemd-private-xxxxxxxxxxxx-nginx.service-fWNh6O/tmp/cache 里去了……这是为啥
fffonion
2016-08-23 22:01:45 +08:00
你反代的是不是大文件然后客户端请求的时候带了 Range 头?可以试试给这些 location 设置 proxy_buffering off;
有一个情形是客户端带 Range 头的时候,如果开启了 cache , nginx 会从 upstream 取好几遍相同的文件,直到本地留了一份 cache 下来

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/298822

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX