前言:
你真的了解如何将 Nginx 配置为Web服务器吗
阅读之前,建议先阅读初识 Nginx。 之后,我们来了解一下 Nginx 配置。
抽象来说,将 Nginx 配置为 Web 服务器就是定义处理哪些 URLS
和如何处理这些URLS
对应的请求。具体来说,就是定义一些虚拟服务器(Virtual Servers),控制具有特定 IP 和域名的请求。
更具体的来说, Nginx 通过定义一系列 locations
来控制对 URIS
的选择。每一个 location 定义了对映射到自己的请求的处理场景:返回一个文件或者代理请求,或者根据不同的错误代码返回不同的错误页面。另外,根据 URI
的不同,请求也可以被重定向到其它 server 或者 location 。
设置虚拟服务器
listen
:
Nginx 配置文件至少包含一个 server
命令 ,用来定义虚拟服务器。当请求到来时, Nginx 会首先选择一个虚拟服务器来处理该请求。
虚拟服务器定义在 http
上下文中的 server
中:
http {
server {
# Server configuration
}
}
注意: http 中可以定义多个 server
server
配置块使用 listen
命令监听本机 IP 和端口号(包括 Unix domain socket and path),支持 IPv4、IPv6,IPv6地址需要用方括号括起来:
server {
listen 127.0.0.1:8080; # IPv4地址,8080端口
# listen [2001:3CA1:10F:1A:121B:0:0:10]:80; # IPv6地址,80端口
# listen [::]:80; # 听本机的所有IPv4与IPv6地址,80端口
# The rest of server configuration
}
上述配置,如果不写端口号,默认使用80端口,如果不写 IP ,则监听本机所有 IP。
server_name:
如果多个 server
的 listen IP
和端口号一模一样, Nginx 通过请求头中的 Host 与 server_name 定义的主机名进行比较,来选择合适的虚拟服务器处理
请求:
server {
listen 80;
server_name lufficc.com www.lufficc.com;
...
}
server_name
的参数可以为:
- 完整的主机名,如:api.lufficc.com 。
- 含有通配符(含有 ),如:.lufficc.com 或 api.* 。
- 正则表达式,以 ~ 开头。
通配符只能在开头或结尾,而且只能与一个 . 相邻。
www.*.example.org
和w*.example.org
均无效。
但是,可以使用正则表达式匹配这些名称,例如~^www\..+\.example\.org$
和~^w.*\.example\.org$
。 而且 * 可以匹配多个部分。 名称* .example.org
不仅匹配
www.example.org
,还匹配www.sub.example.org
。 对于正则表达式:Nginx
使用的正则表达式与Perl
编程语言(PCRE
)使用的正则表达式兼容。 要使用正则表达式,且必须以 ~ 开头。
命名的正则表达式可以捕获变量,然后使用:
server {
server_name ~^(www\.)?(?<domain>.+)$;
location / {
root /sites/$domain;
}
}
小括号 () 之间匹配的内容,也可以在后面通过 $1
来引用,$2
表示的是前面第二个 () 里的内容。因此上述内容也可写为:
server {
server_name ~^(www\.)?(.+)$;
location / {
root /sites/$2;
}
}
一个 server_name
示例:
server {
listen 80;
server_name api.lufficc.com *.lufficc.com;
...
}
同样,如果多个名称匹配 Host 头部, Nginx 采用下列顺序选择:
- 完整的主机名,如 api.lufficc.com。
- 最长的,且以 * 开头的通配名,如:*.lufficc.com。
- 最长的,且以 * 结尾的通配名,如:api.* 。
- 第一个匹配的正则表达式。(按照配置文件中的顺序)
即优先级:api.lufficc.com
> *.lufficc.com > api.*
> 正则。
如果 Host 头部不匹配任何一个 server_name ,Nginx 将请求路由到默认虚拟服务器。默认虚拟服务器是指:nginx.conf 文件中第一个 server 或者 显式用 default_server 声明: