一、什么是Nginx
Nginx 是一个免费的,开源的,高性能的HTTP服务器和反向代理,以及IMAP / POP3代理服务器。 Nginx 以其高性能,稳定性,丰富的功能,简单的配置和低资源消耗而闻名。
Nginx 有一个主线程( master process)和几个工作线程(worker process)。主线程的目的是加载和验证配置文件、维护工作线程。
工作线程处理实际的请求,Nginx 采用基于事件的模型和依赖操作系统的机制在工作线程之间高效地分发请求。工作线程的数量可配置,也可自动调整为服务器CPU的数量。
Nginx 及其模块的工作方式由配置文件确定。 默认情况下,配置文件名为 nginx.conf。
二、配置文件介绍
Nginx 配置的核心是定义要处理的 URL
以及如何响应这些 URL
请求,即定义一系列的虚拟服务器(Virtual Servers)控制对来自特定域名或者 IP 的请求的处理。
每一个虚拟服务器定义一系列的 location
控制处理特定的 URI 集合。每一个location
定义了对映射到自己的请求的处理场景,可以返回一个文件或者代理此请求。
Nginx 由不同的模块组成,这些模块由配置文件中指定的指令控制。 指令分为简单指令和块指令。
一个简单指令包含指令名称和指令参数,以空格分隔,以分号(;
)结尾。 块指令与简单指令类似,但是由大括号({
和}
)包围。 如果块指令大括号中包含其他指令,则称该指令为上下文(如: events
, http
, server
和 location
)。
配置文件中的放在上下文之外的指令默认放在主配置文件中(类似继承主配置文件)。 events
和 http
放置在主配置文件中,server
放置在http
块指令中,location
放置在server
块指令中。
配置文件的注释以 #
开始。
三、配置文件如何配置
1、静态内容
http {
server {
listen 8080; # 改server块监听的端口号,不设置默认是80
root /data/upl; # 当location块中没有设置root时,会使用此root指令 location / { # 这里的 / 部分代表URI,是对请求的匹配,如要写正则,前面加个~
root /data/www;
} location /images/ {
root /data;
} }
}
1)如果 URI
匹配多个 location
块,Nginx 采用最长前缀匹配原则(类似计算机网络里面的IP匹配)
2)改配置的意思可以理解为对于 http://localhost/images/example.png
请求,nginx 将响应 /data/images/example.png
文件。 如果不存在,nginx 将返回404。URI
不以 /images/
开头的请求将映射到 /data/www
目录。 例如,对于 http://localhost/some/example.html
请求,nginx 将响应 /data/www/some/example.html
文件。
2、server_name
如果多个 server
的 listen
IP 和端口号一模一样, Nginx 通过请求头中的 Host 与 server_name
定义的主机名进行比较,来选择合适的虚拟服务器处理请求:
server {
listen 80;
server_name domain.com
...
}
server_name
的参数可以为:
- 完整的主机名,如:
api.domain.com
。 - 含有通配符(含有
*
),如:*.domain.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)使用的正则表达式兼容。 要使用正则表达式,且必须以 ~
开头。
同样,如果多个名称匹配 Host
头部, Nginx 采用下列顺序选择:
- 完整的主机名,如
api.lufficc.com
。 - 最长的,且以
*
开头的通配名,如:*.lufficc.com
。 - 最长的,且以
*
结尾的通配名,如:api.*
。 - 第一个匹配的正则表达式。(按照配置文件中的顺序)
- 完整的主机名,如
即优先级:api.lufficc.com
> *.lufficc.com
> api.*
> 正则。
如果 Host
头部不匹配任何一个 server_name
,Nginx 将请求路由到默认虚拟服务器。默认虚拟服务器是指:nginx.conf
文件中第一个 server
或者 显式用 default_server
声明
3、代理服务器
Nginx 的一个常见应用是将其设置为代理服务器(Proxy Server),即接受客户端的请求并将其转发给代理服务器,再接受代理服务器发来的响应,将它们发送到客户端。
比如我们可以用一个 Nginx 实例实现对图片文件的请求使用本地文件系统,而其他请求转发到代理服务器。
首先,修改 Nginx 的配置文件中的http块如下:
http {
server {
listen 8080;
root /data/upl; location / {
proxy_pass http://localhost:8080/;
} location ~ \.(gif|jpg|png)$ {
root /data/images;
}
}
}
此服务器将过滤以.gif,.jpg或.png结尾的请求,并将它们映射到 /data/images
目录(通过向 root
指令的参数添加请求的URI),并将所有其他请求发送给上面配置的代理服务器。这样,图片和其他请求就可以使用不同的服务器来处理。
4、使用变量
你可以使用变量来使 Nginx 在不同的请求下采用不同的处理方式。变量是在运行时计算的,用作指令的参数。 变量由 $
开头的符号表示。 变量基于 Nginx 的状态定义信息,例如当前处理的请求的属性。
有很多预定义变量,例如核心的 HTTP 变量,你也可以使用 set
,map
和 geo
指令定义自定义变量。 大多数变量在运行时计算,并包含与特定请求相关的信息。 例如,$remote_addr
包含客户端 IP 地址,$uri
保存当前URI值。
一些常用的变量如下:
变量名称 | 作用 |
---|---|
$uri |
请求中的当前URI(不带请求参数),它可以通过内部重定向,或者使用index指令进行修改,$uri 不包含主机名,如 /foo/bar.html 。 |
$arg_name |
请求中的的参数名,即“?”后面的arg_name=arg_value 形式的arg_name
|
$hostname |
主机名 |
$args |
请求中的参数值 |
$query_string |
同 $args
|
$request |
代表客户端的请求地址 |
$request_uri |
这个变量等于包含一些客户端请求参数的原始URI,它无法修改,不包含主机名,如:/cnphp/test.php?arg=freemouse 。 |