Nginx问题求教

zhaodong1475 2014-12-19 10:27:44
第一:Nginx可以实现图片缓存,那么他是一个什么工作原理呢?
正常访问站点的时候 是直接拿图片 那么假如通过Nginx拿图片的时候 就是去拿二进制一类的代码了吗?
第二:前天配置了Nginx 缓存目录也有缓存 但是网站访问的速度还是上不去,而且用fireBUG查看 读取图片 CSS JS一类的文件还是原来的速度 所以说 有没有什么方法可以检测是否图片 CSS JS 这一类的文件是从缓存中读取的呢
第三:服务器的缓存配置 图片一类的用Nginx 数据库动态一类用memcached 还有没有其他的比较好用类似的服务器缓存的组件呢 希望大神可以说一下 感激不尽!
...全文
1959 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
苍蝇①号 2016-09-13
  • 打赏
  • 举报
回复
可以用浏览器缓存,cdn
灰灰666 2016-09-10
  • 打赏
  • 举报
回复
引用 4 楼 jam00 的回复:

location ~ .*\.(gif|jpeg|png|bmp|js|css)$
{
	expires      12h;
}
我只知道这样配置,图片,js,css,就能在浏览器端缓存12小时(天就改成d),可以用chrome 的调试工具查看network查看,会有 from cache的提示 效果更好的话,可用cdn,图片的话,用七牛云也是不错的选择 内存充足的话,就用memcached或是redis这样的内存缓存
亲所谓的缓存 (指 nginx 配置 exipres 指令缓存 ) 应该是 304 . 来自浏览器本生 . 这个 expires 来源于 nginx http filter module . 源代码在 nginx 源代码为根目录下的 src/http/modules/ngx_http_headers_filter_module.c. 它做的事情其实非常简单 , 执行到有 http / server / location 块中有 expires 指令时 , 首先在 nginx 启动时通过 ngx_http_headers_expires 函数为结构体 ngx_http_headers_conf_t 填充内容 , 也就是在 (ngx_cycle_t *)cycle->conf_ctx 中的 conf 公用指针 (定义为 void ****conf_ctx) 中保存自己的结构 , 以便上下文调用 . 设置完成后 , 在 ngx_http_headers_filter_init 设置 header filter 指针为函数 ngx_http_headers_filter ( src/http/modules/ngx_http_headers_filter_module.c:150 ) 通过 ngx_http_headers_filter 分析可知 , 它根据启动时初始化的结构体和其填充的值 , 在 http 的 response header( *(ngx_http_request_t *)r->headers_out) 中根据用户的配置去设置相关值 (具体的设置操作 , 由其调用函数 ngx_http_set_expires (源代码 213行开始) 完成) , Expires 指令设置过后会返回的 response header 有如下两个: Expires (一个格林威治个是的时间) Cache-Control (no-cache 或 max-age = 一个数字 参考源代码 295-305 行) , 注明一下 , cc->key 的值为 Cache-Control
295     if (expires == NGX_HTTP_EXPIRES_EPOCH) {
296         e->value.data = (u_char *) "Thu, 01 Jan 1970 00:00:01 GMT";
297         ngx_str_set(&cc->value, "no-cache");
298         return NGX_OK;
299     }
300 
301     if (expires == NGX_HTTP_EXPIRES_MAX) {
302         e->value.data = (u_char *) "Thu, 31 Dec 2037 23:55:55 GMT";
303         /* 10 years */
304         ngx_str_set(&cc->value, "max-age=315360000");
305         return NGX_OK;
306     }
这几个值在 head 加入之后的具体作用可参考 http 协议 . 至于具体情况可参见所列出的源代码 . 至于其它的 , 例如 Last-Modified , Etag , 等 , 可以参见源代码的 77-90 行 , 顺着去找答案 . -------------------------------------------------------------------------------------------------------------- 另外 , expires 的配置在源代码中的段列出一下 ngx_command_t 配置结构体为 :
static ngx_command_t  ngx_http_headers_filter_commands[] = {

    { ngx_string("expires"),
      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_HTTP_LIF_CONF
                        |NGX_CONF_TAKE12,
      ngx_http_headers_expires,
      NGX_HTTP_LOC_CONF_OFFSET,
      0,
      NULL},

    { ngx_string("add_header"),
      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_HTTP_LIF_CONF
                        |NGX_CONF_TAKE23,
      ngx_http_headers_add,
      NGX_HTTP_LOC_CONF_OFFSET,
      0,
      NULL},

      ngx_null_command
};
可见这个 expires 可以接受 1 个或两个参数 . 看看它的配置处理函数 : ngx_http_headers_expires 在两个参数的情况下 , 第一个参数必须为 modified , 至于两个参数在什么情况下用 , 我没用过 . 源代码中有对于参数的如下判断 ( 带行数复制) :
static char *
603 ngx_http_headers_expires(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)
604 {
..............................................................................
619 
620     if (cf->args->nelts == 2) {
621 
622         hcf->expires = NGX_HTTP_EXPIRES_ACCESS;
623 
624         n = 1;
625 
626     } else { /* cf->args->nelts == 3 */
627 
628         if (ngx_strcmp(value[1].data, "modified") != 0) {
629             return "invalid value";
630         }
631 
632         hcf->expires = NGX_HTTP_EXPIRES_MODIFIED;
633 
634         n = 2;
635     }
..............................................................................
666     return NGX_CONF_OK;
667 }
...................................................................................................................................... 以上是我的简略分析 , nginx 的 expires 完全是依靠浏览器的 , 也就是说这个指令在服务端没有任何缓存的用意 , 但是浏览器本生有 304 ( 参考 http 协议 ) , 所以它对 304 给予了支持 . 我觉得这也是最有效的缓存 . 效果好 , 而且不要钱 . 而反向代理缓存么 , (ngx_cache_purge, squid , 商业化 CDN 服务等等 ) , 是存在服务器端的而非浏览器端 . 如 cdn ,一次请求之后,它会把你的文件“下载”到它 cdn 的服务器,再次有请求过来时,便不会从你的服务器里去取文件,而是从 cdn 节点服务器直接返回已经缓存的文件 .
果酱很好吃 2016-01-14
  • 打赏
  • 举报
回复

location ~ .*\.(gif|jpeg|png|bmp|js|css)$
{
	expires      12h;
}
我只知道这样配置,图片,js,css,就能在浏览器端缓存12小时(天就改成d),可以用chrome 的调试工具查看network查看,会有 from cache的提示 效果更好的话,可用cdn,图片的话,用七牛云也是不错的选择 内存充足的话,就用memcached或是redis这样的内存缓存
baidu_18669827 2016-01-12
  • 打赏
  • 举报
回复
nginx缓存个鬼啊,是客户端缓存吧
Yeehua 2015-03-05
  • 打赏
  • 举报
回复
类似memcached 的框架有hazelcast
proteinboy 2014-12-19
  • 打赏
  • 举报
回复
图片 css js之类的 不是用的CDN么

25,984

社区成员

发帖
与我相关
我的任务
社区描述
高性能WEB开发
社区管理员
  • 高性能WEB开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧