V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
NGINX
NGINX Trac
3rd Party Modules
Security Advisories
CHANGES
OpenResty
ngx_lua
Tengine
在线学习资源
NGINX 开发从入门到精通
NGINX Modules
ngx_echo
yamada
V2EX  ›  NGINX

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

  •  1
     
  •   yamada · 2016-08-12 10:54:33 +08:00 · 5103 次点击
    这是一个创建于 3026 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

    不过,设置 2 小时后过期倒是灵的! 无奈用 proxy_store 得了
    yamada
        4
    yamada  
    OP
       2016-08-12 20:39:31 +08:00
    @lun10439547 超时倒有很多可能性,你那的出入流量怎样?我这 iftop 看 10 来分钟,出流量只有 1G 入流量达到了 5G 真是搞不懂,差太多,可是我都启用了 GZIP 了
    lun10439547
        5
    lun10439547  
       2016-08-12 22:10:57 +08:00
    @yamada 我设置了超长过期时间和超长的不访问删除时间, 理论上 又拍云每日流量不会消耗超过 10M 的(每天更新图片没有那么多的) ,出去可能 10G 左右吧 ,结果是 每日很平均的 好的时候 又拍云流量消耗每日在 三四百兆左右。。。。不知道什么原因时间一长 反而会流量慢慢消耗加剧。。。超过 1G 甚至更多。。
    你忽略了查询参数了没?
    Google 了很多配置都差不多的。。。
    yamada
        6
    yamada  
    OP
       2016-08-13 12:55:55 +08:00
    @lun10439547 我的配置已经贴在上面了
    另外我发现
    cd /tmp/cache
    ls
    是空的……
    yamada
        7
    yamada  
    OP
       2016-08-13 20:10:01 +08:00
    /tmp/cache 为空不是权限问题,我发现缓存被放倒 /tmp/systemd-private-xxxxxxxxxxxx-nginx.service-fWNh6O/tmp/cache 里去了……这是为啥
    fffonion
        8
    fffonion  
       2016-08-23 22:01:45 +08:00
    你反代的是不是大文件然后客户端请求的时候带了 Range 头?可以试试给这些 location 设置 proxy_buffering off;
    有一个情形是客户端带 Range 头的时候,如果开启了 cache , nginx 会从 upstream 取好几遍相同的文件,直到本地留了一份 cache 下来
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3907 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 37ms · UTC 01:02 · PVG 09:02 · LAX 17:02 · JFK 20:02
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.