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

2013-02-01 21:23:23 +08:00
 Tianpu
多做几个proxy_cache_path来给不同的后端应用平均分配,还是做一起好呢?

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

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

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

谢谢
6068 次点击
所在节点    NGINX
13 条回复
Kvm
2013-02-02 02:39:31 +08:00
楼主直接把cache写到/dev/shm么
Tianpu
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
2013-02-03 01:06:10 +08:00
楼主说的1.25G内存,据说,貌似,可能,估计只是存储文件的名字,其实不存储文件内容的。楼主要多少文件名字才能占满1.25G内存……
Tianpu
2013-02-03 05:21:30 +08:00
@chairo 天啊 这是必然的 我估计2天的缓存时间可以有1000来万个文件 512M应该足够了

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

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

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

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

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

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

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

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

不知道是不是想的差的太远?
Tianpu
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
2013-02-05 10:38:27 +08:00
1.虽然你设置了zone[a-e],但是实际你只用了zonea;
2.要实现冷热缓存的话:
a.简单的,可以设置多个proxy_cache和多个location进行匹配,但必须人工区别那些资源是冷或热
b.复杂点,可以自己写个访问计数器(ngx_lua),实现类似“1分钟内访问超过10次的资源存为内存缓
存1天,3分钟内访问超过1次的资源存为磁盘缓存12小时,..."
Tianpu
2013-02-05 13:59:20 +08:00
@LazyZhu
1、这个是因为后面还有好多个站点的配置 大致是均匀的
2、冷热资源的确是个问题 这方面还没在考虑

感谢建议

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

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

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

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

© 2021 V2EX