Nginx静态文件服务

学习Nginx先从最基本的部分入手,也就是将Nginx作为一个静态文件服务器。

基础静态服务器配置

我们首先来看一个最基础的静态服务器配置:

server {
  listen 8080;
  charset utf-8;
  root /home/zhoulihai/Desktop/work/html;
  index index.html;
}

就是这么简单,甚至连location都不必添加。直接指定根目录,并确保nginx执行用户对这个目录有访问权限即可。当然,这样的配置,远远没有发挥nginx的能力,为什么这么说?请看下面的配置。

http {
    # 这个将为打开文件指定缓存,默认是没有启用的,max 指定缓存数量,
    # 建议和打开文件数一致,inactive 是指经过多长时间文件没被请求后删除缓存。
    open_file_cache max=204800 inactive=20s;

    # open_file_cache 指令中的inactive 参数时间内文件的最少使用次数,
    # 如果超过这个数字,文件描述符一直是在缓存中打开的,如上例,如果有一个
    # 文件在inactive 时间内一次没被使用,它将被移除。
    open_file_cache_min_uses 1;

    # 这个是指多长时间检查一次缓存的有效信息
    open_file_cache_valid 30s;

    # 默认情况下,Nginx的gzip压缩是关闭的, gzip压缩功能就是可以让你节省不
    # 少带宽,但是会增加服务器CPU的开销哦,Nginx默认只对text/html进行压缩 ,
    # 如果要对html之外的内容进行压缩传输,我们需要手动来设置。
    gzip on;
    gzip_min_length 1k;
    gzip_buffers 4 16k;
    gzip_http_version 1.0;
    gzip_comp_level 2;
    gzip_types text/plain application/x-javascript text/css application/xml;

    server {
            listen       80;
            server_name www.test.com;
            charset utf-8;
            root   /data/www.test.com;
            index  index.html index.htm;
           }
}

这段配置是我摘抄的,告诉你两点:启用缓存、启用压缩。根据这个配置,我又自己配置了一份自己的,我建议你也一样,纸上得来终觉浅。

worker_processes  1;
error_log logs/error.log info;

events {
    worker_connections 1024;
}

http {
    open_file_cache max=204800 inactive=20s;
    open_file_cache_min_uses 1;
    open_file_cache_valid 30s;

    gzip on;
    gzip_min_length 1k;
    gzip_buffers 4 16k;
    gzip_http_version 1.0;
    gzip_comp_level 2;
    gzip_types text/plain; 

    server {
        listen 8080;
        charset utf-8;
        root /home/xxx/work/html;
        index index.html;
    }
}

结果是,启用缓存之后,效率明显比不启用快很多,启用压缩之后,又能一定程度的降低带宽消耗。

基础缓存

Nginx同样提供基础缓存功能,在http块中定义proxy_cache_path/path/to/cache levels=1:2 keys_zone=my_cache:10m max_size=10g inactive=60m use_temp_path=off;

开启缓存之后,当Nginx无法从原始服务器获取最新的内容时,Nginx可以分发缓存中陈旧的内容,这样可以确保当原始服务器繁忙或者宕机的情况下,Nginx可以分发旧的内容。

proxy_cache_use_stale error timeout http_500 http_502 http_503 http_504;

配置表示当原始服务器出现错误、超时、或者5XX错误时,Nginx从缓存中读取内容分发给用户。

基础缓存配置中有几项值得注意:

  1. 用于缓存的本地磁盘目录是 /path/to/cache/
  2. levels 在 /path/to/cache/ 设置了一个两级层次结构的目录。将大量的文件放置在单个目录中会导致文件访问缓慢,所以针对大多数部署,我们推荐使用两级目录层次结构。如果 levels 参数没有配置,则 Nginx 会将所有的文件放到同一个目录中。
  3. keys_zone 设置一个共享内存区,该内存区用于存储缓存键和元数据,有些类似计时器的用途。将键的拷贝放入内存可以使 Nginx 在不检索磁盘的情况下快速决定一个请求是 HIT 还是 MISS,这样大大提高了检索速度。一个 1MB 的内存空间可以存储大约 8000 个 key,那么上面配置的 10MB 内存空间可以存储差不多 80000 个 key。
  4. max_size 设置了缓存的上限(在上面的例子中是 10G)。这是一个可选项;如果不指定具体值,那就是允许缓存不断增长,占用所有可用的磁盘空间。当缓存达到这个上线,处理器便调用 cache manager 来移除最近最少被使用的文件,这样把缓存的空间降低至这个限制之下。
  5. inactive 指定了项目在不被访问的情况下能够在内存中保持的时间。在上面的例子中,如果一个文件在 60 分钟之内没有被请求,则缓存管理将会自动将其在内存中删除,不管该文件是否过期。该参数默认值为 10 分钟(10m)。注意,非活动内容有别于过期内容。Nginx 不会自动删除由缓存控制头部指定的过期内容(本例中 Cache-Control:max-age=120)。过期内容只有在 inactive 指定时间内没有被访问的情况下才会被删除。如果过期内容被访问了,那么 Nginx 就会将其从原服务器上刷新,并更新对应的 inactive 计时器。
  6. Nginx 最初会将注定写入缓存的文件先放入一个临时存储区域,use_temp_path=off 命令指示 Nginx 将在缓存这些文件时将它们写入同一个目录下。我们强烈建议你将参数设置为 off 来避免在文件系统中不必要的数据拷贝。use_temp_path 在 Nginx 1.7 版本和 Nginx Plus R6 中有所介绍。