搞懂nginx的最后一根稻草(上)

简介: 搞懂nginx的最后一根稻草

一、HTTP服务器

Nginx本身也是一个静态资源的服务器,当只有静态资源的时候,就可以使用Nginx来做服务器,如果一个网站只是静态页面的话,那么就可以通过这种方式来实现部署。

1、 首先在文档根目录Docroot(/usr/local/var/www)下创建html目录, 然后在html中放一个test.html;

image.png

2、 配置nginx.conf中的server

user mengday staff;
http {
    server {
        listen       80;
        server_name  localhost;
        client_max_body_size 1024M;
        # 默认location
        location / {
            root   /usr/local/var/www/html;
            index  index.html index.htm;
        }
    }
}

3、访问测试

  • http://localhost/ 指向/usr/local/var/www/index.html, index.html是安装nginx自带的html
  • http://localhost/test.html 指向/usr/local/var/www/html/test.html

注意:如果访问图片出现403 Forbidden错误,可能是因为nginx.conf 的第一行user配置不对,默认是#user nobody;是注释的,linux下改成user root; macos下改成user 用户名 所在组; 然后重新加载配置文件或者重启,再试一下就可以了, 用户名可以通过who am i 命令来查看。

4、指令简介

  • server : 用于定义服务,http中可以有多个server块
  • listen : 指定服务器侦听请求的IP地址和端口,如果省略地址,服务器将侦听所有地址,如果省略端口,则使用标准端口
  • server_name : 服务名称,用于配置域名
  • location : 用于配置映射路径uri对应的配置,一个server中可以有多个location, location后面跟一个uri,可以是一个正则表达式, / 表示匹配任意路径, 当客户端访问的路径满足这个uri时就会执行location块里面的代码
  • root : 根路径,当访问http://localhost/test.html,“/test.html”会匹配到”/”uri, 找到root为/usr/local/var/www/html,用户访问的资源物理地址=root + uri = /usr/local/var/www/html + /test.html=/usr/local/var/www/html/test.html
  • index : 设置首页,当只访问server_name时后面不跟任何路径是不走root直接走index指令的;如果访问路径中没有指定具体的文件,则返回index设置的资源,如果访问http://localhost/html/ 则默认返回index.html

5、location uri正则表达式

  • . :匹配除换行符以外的任意字符
  • ? :重复0次或1次
  • + :重复1次或更多次
  • * :重复0次或更多次
  • \d :匹配数字
  • ^ :匹配字符串的开始
  • $ :匹配字符串的结束
  • {n} :重复n次
  • {n,} :重复n次或更多次
  • [c] :匹配单个字符c
  • [a-z] :匹配a-z小写字母的任意一个
  • (a|b|c) : 属线表示匹配任意一种情况,每种情况使用竖线分隔,一般使用小括号括括住,匹配符合a字符 或是b字符 或是c字符的字符串
  • \ 反斜杠:用于转义特殊字符

小括号()之间匹配的内容,可以在后面通过$1来引用,$2表示的是前面第二个()里的内容。正则里面容易让人困惑的是\转义特殊字符。

二、静态服务器

在公司中经常会遇到静态服务器,通常会提供一个上传的功能,其他应用如果需要静态资源就从该静态服务器中获取。

1、在/usr/local/var/www 下分别创建images和img目录,分别在每个目录下放一张test.jpg

http {
    server {
        listen       80;
        server_name  localhost;
        set $doc_root /usr/local/var/www;
        # 默认location
        location / {
            root   /usr/local/var/www/html;
            index  index.html index.htm;
        }
        location ^~ /images/ {
            root $doc_root;
       }
       location ~* \.(gif|jpg|jpeg|png|bmp|ico|swf|css|js)$ {
           root $doc_root/img;
       }
    }
}

自定义变量使用set指令,语法 set 变量名值;引用使用变量名值;引用使用变量名; 这里自定义了doc_root变量。

静态服务器location的映射一般有两种方式:

  • 使用路径,如 /images/ 一般图片都会放在某个图片目录下,
  • 使用后缀,如 .jpg、.png 等后缀匹配模式

访问http://localhost/test.jpg 会映射到 $doc_root/img

访问http://localhost/images/test.jpg 当同一个路径满足多个location时,优先匹配优先级高的location,由于^~ 的优先级大于 ~, 所以会走/images/对应的location

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

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

location优先级

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

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

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

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

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

location优先级从高到底:

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

location = / {
    # 精确匹配/,主机名后面不能带任何字符串 /
    [ configuration A ]
}
location / {
    # 匹配所有以 / 开头的请求。
    # 但是如果有更长的同类型的表达式,则选择更长的表达式。
    # 如果有正则表达式可以匹配,则优先匹配正则表达式。
    [ configuration B ]
}
location /documents/ {
    # 匹配所有以 /documents/ 开头的请求,匹配符合以后,还要继续往下搜索。
    # 但是如果有更长的同类型的表达式,则选择更长的表达式。
    # 如果有正则表达式可以匹配,则优先匹配正则表达式。
    [ configuration C ]
}
location ^~ /images/ {
    # 匹配所有以 /images/ 开头的表达式,如果匹配成功,则停止匹配查找,停止搜索。
    # 所以,即便有符合的正则表达式location,也不会被使用
    [ configuration D ]
}
location ~* \.(gif|jpg|jpeg)$ {
    # 匹配所有以 gif jpg jpeg结尾的请求。
    # 但是 以 /images/开头的请求,将使用 Configuration D,D具有更高的优先级
    [ configuration E ]
}
location /images/ {
    # 字符匹配到 /images/,还会继续往下搜索
    [ configuration F ]
}
location = /test.htm {
    root   /usr/local/var/www/htm;
    index  index.htm;
}

注意:location的优先级与location配置的位置无关

目录
相关文章
|
3月前
|
负载均衡 网络协议 关系型数据库
一口把LVS、Nginx及HAProxy工作原理讲清楚了。(附图)
一口把LVS、Nginx及HAProxy工作原理讲清楚了。(附图)
|
3月前
|
缓存 负载均衡 前端开发
【Nginx 第一篇章】认识一下 Nginx
Nginx (engine x) 是一个高性能的 HTTP 和反向代理服务器,也是一个 IMAP/POP3/SMTP 代理服务器。由俄罗斯程序员 Igor Sysoev 开发,并在2004年首次公开发布。Nginx 以其高并发处理能力、低内存消耗、稳定性、丰富的功能集、简单的配置以及低学习曲线而广受欢迎。Nginx 通常被用作 Web 服务器来托管网站,但也可以有效地用作反向代理、负载均衡器和 HTTP 缓存。
69 1
|
5月前
|
前端开发 应用服务中间件 程序员
老程序员分享:Nginx相关面试题
老程序员分享:Nginx相关面试题
58 2
|
域名解析 负载均衡 网络协议
Nginx系列教程(完) -终章总结
Nginx系列教程(完) -终章总结
68 0
|
6月前
|
应用服务中间件 nginx
一文带你彻底搞懂Nginx反向代理
一文带你彻底搞懂Nginx反向代理
3655 1
|
11月前
|
前端开发 应用服务中间件 nginx
Nginx的这些妙用,你肯定有不知道的!
Nginx的这些妙用,你肯定有不知道的!
51 1
|
监控 应用服务中间件 调度
Nginx为什么能快到根本停不下来?
Nginx 以其高性能,稳定性,丰富的功能,简单的配置和低资源消耗而闻名。本文从底层原理分析 Nginx 为什么这么快!
|
负载均衡 网络协议 JavaScript
负载均衡 LVS vs Nginx 对比!还傻傻分不清?
负载均衡 LVS vs Nginx 对比!还傻傻分不清?
|
缓存 负载均衡 监控
负载均衡 LVS vs Nginx 对比,还傻傻分不清?
负载均衡 LVS vs Nginx 对比,还傻傻分不清?
294 0
负载均衡 LVS vs Nginx 对比,还傻傻分不清?
|
负载均衡 应用服务中间件 nginx
Nginx学习笔记(一)6张图带你看清Nginx是啥玩意儿
Nginx学习笔记(一)6张图带你看清Nginx是啥玩意儿
Nginx学习笔记(一)6张图带你看清Nginx是啥玩意儿