Configuring static resources such as images with Nginx

C

Nginx配置图片等静态资源

Nginx是一个高性能的HTTP和反向代理web服务器,关于Nginx配置的操作细节如下:

场景一:图片静态服务器

/usr/local/nginx/html下创建一个目录名为 images 和 static 目录 各自都放一个 test.jpg

http {
    server {
        #监听端口
        listen       80;

        #服务名称用于配置域名
        server_name  localhost;
        client_max_body_size 1024M;
        #设置一个变量
        set $static_path /usr/local/nginx/html;

        # 默认location
        location / {
            root   /usr/local/nginx/html/www;
            index  index.html index.htm;
        }

	# 访问的时候实际路径是$static_path加/images/
        location ^~ /images/ {
            root $static_path;
	    # 过期时间 3600 秒	
            expires      -3600s;
        }

        location ~* \.(gif|jpg|jpeg|png|bmp|ico|swf|css|js)$ {
            root $static_path/static;
	    # 过期时间 3600 秒	
            expires      -3600s;
        }
    }
}

实例:

情况一:

访问 http://localhost/test.jpg 会匹配到 location ~* \.(gif|jpg|jpeg|png|bmp|ico|swf|css|js)$下的

root $static_path/static;路径规则

情况二:

访问 http://localhost/images/test.jpg 会匹配到 location ^~ /images/ 的  root $static_path; 路径规则;其实此时是匹配到 location ~* 和 location ^~ 的,但是由于 ^~ 的优先级大于 ~,故匹配到 /images/ 目录。

总结

常见的location路径映射路径有以下几种:

  • =:进行普通字符精确匹配。也就是完全匹配
  • ^~:前缀匹配。如果匹配成功,则不再匹配其他location
  • ~:表示执行一个正则匹配,区分大小写
  • ~*:表示执行一个正则匹配,不区分大小写
  • /xxx/:常规字符串路径匹配
  • /:通用匹配,任何请求都会匹配到

location优先级

当一个路径匹配多个location时究竟哪个location能匹配到时有优先级顺序的,而优先级的顺序于location值的表达式类型有关,和在配置文件中的先后顺序无关。相同类型的表达式,字符串长的会优先匹配。

以下是按优先级排列说明:

  • 等号类型(=)的优先级最高。一旦匹配成功,则不再查找其他匹配项,停止搜索。
  • ^~类型表达式,不属于正则表达式。一旦匹配成功,则不再查找其他匹配项,停止搜索。
  • 正则表达式类型(~ ~*)的优先级次之。如果有多个location的正则能匹配的话,则使用正则表达式最长的那个。
  • 常规字符串匹配类型。按前缀匹配。
  • / 通用匹配,如果没有匹配到,就匹配通用的

优先级搜索问题: 不同类型的location映射决定是否继续向下搜索。

等号类型、^~类型: 一旦匹配上就停止搜索了,不会再匹配其他location了

正则表达式类型(~ ~*),常规字符串匹配类型/xxx/: 匹配到之后,还会继续搜索其他其它location,直到找到优先级最高的,或者找到第一种情况而停止搜索。

location优先级从高到底:

(location =)>(location 完整路径)>(location ^~ 路径)>(location ~,~ 正则顺序)>(location 部分起始路径)>(/)*

# 配置1 
location = / {
    # 精确匹配/,主机名后面不能带任何字符串 /
}

# 配置2 
location / {
    # 匹配所有以 / 开头的请求。有更长的同类型的表达式,则选择更长的表达式。
    # 如果有正则表达式可以匹配,则优先匹配正则表达式。
}

# 配置3 
location /xxxxx/ {
    # 匹配所有以 /xxxxx/ 开头的请求,匹配符合以后,还要继续往下搜索。
    # 但是如果有更长的同类型的表达式,则选择更长的表达式。
    # 如果有正则表达式可以匹配,则优先匹配正则表达式。
}

# 配置4 
location ^~ /xxxxx/ {
    # 匹配所有以 /xxxxx/ 开头的表达式,如果匹配成功,则停止匹配查找,停止搜索。
    # 所以,即便有符合的正则表达式location,也不会被使用
}

# 配置5 
location ~* \.(gif|jpg|jpeg)$ {
    # 匹配所有以gif jpg jpeg结尾的请求。
    # 但是 以/xxxxx/开头的请求,将使用配置4,其具有更高的优先级
}

# 配置6 
location /xxxxx/ {
    # 字符匹配到/xxxxx/,还会继续往下搜索
}


location = /test.htm {
    root   /usr/local/nginx/html/test;
    index  index.htm;
}

About the author

Haosen Yu
By Haosen Yu

Haosen Yu

Get in touch

School of Electronics and Computer Science
University of Southampton
Southampton
SO17 1BJ
United Kingdom

Visitor Map


This page was last updated in 2024.
HTML validated with no errors.
Image Hosting: Aliyun OSS.
Please report concerns to the webmaster.

error: Content is protected !!