一、HTTP服务器
Nginx本身也是一个静态资源的服务器,当只有静态资源的时候,就可以使用Nginx来做服务器,如果一个网站只是静态页面的话,那么就可以通过这种方式来实现部署。
1、 首先在文档根目录Docroot(/usr/local/var/www)
下创建html目录, 然后在html中放一个test.html;
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自带的htmlhttp://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配置的位置无关