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

16G内存分配给nginx做前端加速后端,有什么建议吗?

  •  
  •   Tianpu · 2013-02-01 21:23:23 +08:00 · 6196 次点击
    这是一个创建于 4309 天前的主题,其中的信息可能已经有所发展或是发生改变。
    多做几个proxy_cache_path来给不同的后端应用平均分配,还是做一起好呢?

    一个proxy_cache_path分配多少内存比较好,有没有人有这方面的经验?

    后端主要是搜索应用、动态生缩略图、php+mysql的应用

    文件数量肯定很多,计划除了首页类的页面,缓存一天

    谢谢
    13 条回复    1970-01-01 08:00:00 +08:00
    Kvm
        1
    Kvm  
       2013-02-02 02:39:31 +08:00
    楼主直接把cache写到/dev/shm么
    Tianpu
        2
    Tianpu  
    OP
       2013-02-02 23:46:01 +08:00
    @Kvm


    现在是分配了五个proxy_cache_path 然后每个分配1.25G内存 允许32G的缓存文件 缓存文件放在一块sansung 830的硬盘上

    运行了15个小时了 缓存文件有300来万 改成缓存2天了 页面变化都不大 有修改的话API会自动刷新 再长时间inode好像不大够 这个得后续看 大体上还算稳定

    worker_cpu_affinity 导致后端出现严重的问题 去掉了 增大进程了

    配置大约是这个样子 压缩什么的都放后端了 前端就是负责输出:

    ###############################################
    user www www;
    worker_processes 32;
    worker_rlimit_nofile 65535;
    events {
    use epoll;
    worker_connections 65535;
    }
    http {
    client_header_buffer_size 4k;
    client_body_buffer_size 128k;
    large_client_header_buffers 4 4k;
    server_names_hash_max_size 1280;
    server_names_hash_bucket_size 128;
    client_max_body_size 4m;
    server_name_in_redirect off;
    sendfile on;
    tcp_nopush on;
    tcp_nodelay on;
    server_tokens off;
    keepalive_timeout 60;
    open_file_cache max=65535 inactive=300s;
    open_file_cache_valid 500s;
    open_file_cache_errors on;
    proxy_cache_path /www/zonea levels=1:2 keys_zone=zonea:1280m inactive=3d max_size=32g;
    proxy_cache_path /www/zoneb levels=1:2 keys_zone=zoneb:1280m inactive=3d max_size=32g;
    proxy_cache_path /www/zonec levels=1:2 keys_zone=zonec:1280m inactive=3d max_size=32g;
    proxy_cache_path /www/zoned levels=1:2 keys_zone=zoned:1280m inactive=3d max_size=32g;
    proxy_cache_path /www/zonee levels=1:2 keys_zone=zonee:1280m inactive=3d max_size=32g;
    server {
    listen 8.8.8.8:80;
    server_name www.v2ex.com v2ex.com;
    location / {
    proxy_pass http://4.4.4.4:80;
    proxy_cache zonea;
    proxy_cache_key $request_method://$host$request_uri;
    proxy_buffer_size 8k;
    proxy_buffers 4 32k;
    proxy_busy_buffers_size 96k;
    proxy_temp_file_write_size 256k;
    proxy_cache_valid 200 301 302 1d;
    proxy_cache_valid any 1m;
    proxy_cache_use_stale error timeout updating invalid_header http_500 http_502 http_504 http_404;
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header REMOTE_ADDR $remote_addr;
    proxy_set_header HTTP_CLIENT_IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    add_header X-Cached $upstream_cache_status;
    }
    location ~ /purge(/.*) {
    proxy_cache_purge zonea $request_method://$host$1;
    }
    access_log off;
    }
    ....
    }

    ###############################################

    现在有一个问题 在同一个局域网的前端和后端的机器互相ping是0.86ms 实际抓取网页测试 有时候会卡到1.2s 应该是后端对并发支持不佳吧 也可能是流氓msnbot造成的 整体上还在观察

    下一步重点测试keepalive相关的参数
    chairo
        3
    chairo  
       2013-02-03 01:06:10 +08:00   ❤️ 1
    楼主说的1.25G内存,据说,貌似,可能,估计只是存储文件的名字,其实不存储文件内容的。楼主要多少文件名字才能占满1.25G内存……
    Tianpu
        4
    Tianpu  
    OP
       2013-02-03 05:21:30 +08:00
    @chairo 天啊 这是必然的 我估计2天的缓存时间可以有1000来万个文件 512M应该足够了

    proxy_pass部分使用upstream使用公网IP做了个backup,然后keepalive了下 速度有所提升

    继续看别的
    chairo
        5
    chairo  
       2013-02-03 22:59:52 +08:00
    @Tianpu 前端加速还是用varnish吧,专业一些……
    Kvm
        6
    Kvm  
       2013-02-04 02:12:20 +08:00   ❤️ 1
    设一个keys_zone吧
    挂载存到shm里面去
    ownway
        7
    ownway  
       2013-02-04 12:54:56 +08:00
    varnish,全放内存
    BOYPT
        8
    BOYPT  
       2013-02-04 14:15:43 +08:00   ❤️ 1
    varnish做这些比nginx擅长多了。
    Tianpu
        9
    Tianpu  
    OP
       2013-02-04 17:19:46 +08:00
    感谢诸位的建议 varnish我担心的就是全放到内存

    >站点类型以搜索结果 还有缓存的缩略图 fastcgi生的网页比较多

    >过去15个小时一共产生了230万个临时文件 使用了35G硬盘

    >按照2天估计 会有1024万个文件 112G硬盘

    >硬盘一共有256G 1300万个inodes

    >如果放到内存一部分 会不会反而反复的交换内存和硬盘?
    Tianpu
        10
    Tianpu  
    OP
       2013-02-04 17:25:00 +08:00
    @Kvm keys_zone 考虑文件数会达到1000万左右 一个key占用128字节 一共需要1250M 那单个进程处理一个大内存块(1250M)会比多个小内存块(5*250)更好吗?

    现在留下大量内存 是想让系统自动管理内存和硬盘间的缓存 具体就是top的cached指标

    不知道是不是想的差的太远?
    Tianpu
        11
    Tianpu  
    OP
       2013-02-04 17:32:25 +08:00
    配置稍微有点更新,我贴出来:

    user www www;
    worker_processes 16;
    worker_rlimit_nofile 65535;
    events {
    use epoll;
    worker_connections 65535;
    }
    http {
    include mime.types;
    default_type application/octet-stream;
    client_header_buffer_size 4k;
    client_body_buffer_size 128k;
    large_client_header_buffers 4 4k;
    server_names_hash_max_size 1280;
    server_names_hash_bucket_size 128;
    client_max_body_size 4m;
    server_name_in_redirect off;
    sendfile on;
    tcp_nopush on;
    tcp_nodelay on;
    server_tokens off;
    keepalive_timeout 60;
    open_file_cache max=65536 inactive=20s;
    open_file_cache_valid 30s;
    open_file_cache_errors on;
    gzip on;
    gzip_min_length 128;
    gzip_buffers 32 4k;
    gzip_http_version 1.0;
    gzip_comp_level 3;
    gzip_types text/plain text/css application/x-javascript application/xml;
    gzip_vary on;
    proxy_cache_path /www/zonea levels=1:2 keys_zone=zonea:256m inactive=3d max_size=32g;
    proxy_cache_path /www/zoneb levels=1:2 keys_zone=zoneb:256m inactive=3d max_size=32g;
    proxy_cache_path /www/zonec levels=1:2 keys_zone=zonec:256m inactive=3d max_size=32g;
    proxy_cache_path /www/zoned levels=1:2 keys_zone=zoned:256m inactive=3d max_size=32g;
    proxy_cache_path /www/zonee levels=1:2 keys_zone=zonee:256m inactive=3d max_size=32g;
    upstream backend {
    server 10.4.1.1:80;
    server 8.8.8.8:80 backup;
    keepalive 32;
    }
    server {
    listen 80;
    server_name www.v2ex.com v2ex.com;
    location / {
    proxy_pass http://backend;
    proxy_cache zonea;
    proxy_cache_key $scheme://$host$request_uri;
    proxy_http_version 1.1;
    proxy_buffer_size 4k;
    proxy_buffers 4 32k;
    proxy_busy_buffers_size 96k;
    proxy_temp_file_write_size 256k;
    proxy_cache_valid 200 301 302 2d;
    proxy_cache_valid any 1m;
    proxy_cache_use_stale error timeout updating invalid_header http_500 http_502 http_504 http_404;
    proxy_set_header Connection '';
    proxy_set_header Host $host;
    proxy_set_header REMOTE_ADDR $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }
    location ~ /purge(/.*) {
    proxy_cache_purge zonea $scheme://$host$1;
    }
    access_log off;
    }
    }

    主要是三点:
    1、观察$request_method对于缓存结果没有影响,合并了HEAD和GET的缓存
    2、后端不再负责gzip,交给前端来做
    3、proxy_pass增加公网IP作为备份,仍旧以内网IP为主,同时设置32个持久连接
    LazyZhu
        12
    LazyZhu  
       2013-02-05 10:38:27 +08:00   ❤️ 1
    1.虽然你设置了zone[a-e],但是实际你只用了zonea;
    2.要实现冷热缓存的话:
    a.简单的,可以设置多个proxy_cache和多个location进行匹配,但必须人工区别那些资源是冷或热
    b.复杂点,可以自己写个访问计数器(ngx_lua),实现类似“1分钟内访问超过10次的资源存为内存缓
    存1天,3分钟内访问超过1次的资源存为磁盘缓存12小时,..."
    Tianpu
        13
    Tianpu  
    OP
       2013-02-05 13:59:20 +08:00
    @LazyZhu
    1、这个是因为后面还有好多个站点的配置 大致是均匀的
    2、冷热资源的确是个问题 这方面还没在考虑

    感谢建议
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1062 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 28ms · UTC 19:40 · PVG 03:40 · LAX 11:40 · JFK 14:40
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.