我近期对服务器进行了少量改进,虽然之前使用了nginx反向代理之后性能有所提高,但仍然不够,需要使用缓存来大幅度提高静态资源的访问速度.
服务器上的静态资源主要有这些:png, jpg, svg, js, css等.下面,我通过新的nginx配置来实现缓存.对红色的字我会额外进行说明.
worker_processes 1; events { worker_connections 1024; multi_accept on; use epoll; } http { include mime.types; default_type application/octet-stream; sendfile on; tcp_nopush on; keepalive_timeout 65; proxy_cache_path /svcwork/nginxcache levels=1:2 keys_zone=staticcache:10m inactive=1h max_size=2g; server { listen 80; server_name localhost; location / { proxy_set_header Host $host; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; proxy_pass http://localhost:8080/; } location ^~ /resource { alias /resource; expires 1h; } location ^~ /hpaasvc { rewrite ^(.*)$ https://$host$1 permanent; } location ~* \.(js|css|ico|gif|jpg|png|svg)$ { log_not_found off; access_log off; expires 7d; proxy_pass http://localhost:8080; proxy_cache staticcache; proxy_cache_valid any 10m; } } server { listen 443 ssl; server_name localhost; ssl_certificate cert/cert.pem; ssl_certificate_key cert/cert.key; ssl_session_cache shared:SSL:10m; ssl_session_timeout 10m; ssl_ciphers HIGH:!aNULL:!MD5; ssl_prefer_server_ciphers on; location / { proxy_set_header Host $host; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; proxy_pass http://localhost:8080/; } location ^~ /resource { alias /resource; expires 1h; } location ~* \.(js|css|ico|gif|jpg|png|svg)$ { log_not_found off; access_log off; expires 7d; proxy_pass http://localhost:8080; proxy_cache staticcache; proxy_cache_valid any 10m; } } }
1, "multi_accept on"和"use epoll"可以提高服务器吞吐量
2, "proxy_cache_path /svcwork/nginxcache levels=1:2 keys_zone=staticcache:10m inactive=1h max_size=2g;"配置了一个服务器缓存,被缓存的服务器响应(不一定是文件,也有可能是302,304之类的响应)存放在/svcwork/nginxcache目录下;而且将根据被缓存响应的md5摘要信息创建两级目录(一般来说一个目录下存放过多的文件会导致文件系统访问性能的下降);缓存的名字叫staticcache,后面会用到这个名字;缓存使用10M内存(我看别人的范例上是100M,所以一开始我也配置了100M,但发现内存不足,nginx报错,所以就改小了许多);如果没有新的动作,被缓存的响应的将会在1个小时候被删除;缓存区最多可使用2G的磁盘空间.
3, location后面加上"^~"表示一旦匹配的话将不会匹配正则表达式. 如果用户要访问的URI是"/resource/test/abc.png",那么将使用"location ^~ /resource"规则,忽略掉后面的正则表达式匹配.
4, access_log off; 其实我觉得access_log意义不大.
5, expires 7d;这玩意儿其实是客户端缓存,通过http头告诉浏览器这个访问的资源的有效期是7天,7天内可以别再向服务器要,但这个取决于浏览器的具体实现,如IE按<F5>,就会强制向服务器刷新所有资源而不管是否有缓存.
6, proxy_cache staticcache;指定要使用的缓存.嗯,就是前面定义的那个staticcache.
7, proxy_cache_valid any 10m;10分钟后访问的数据将会"变不新鲜"...怎么说呢?举个栗子: /website/image/abc.png被首次访问的话讲会被缓存,接下去10分钟里对这个资源的访问都直接从缓存返回而不会将请求pass到后台.10分钟后再重新尝试从后台拿. 注意一下跟"proxy_cache_path"的"inactive"的差别,inactive是说缓存的响应的"生命时间",每次访问这个资源都将刷新缓存的"生命时间",让它继续活在缓存中,而这里则表示隔了这么长时间就重新刷新下这个被缓存的响应.
本文写得有点仓促潦草,有问题再说了...