Nginx 配置文件中至少包含一条定义虚拟服务器的 server 指令, 当 Nginx 处理一个请求时,第一个被选中的虚拟服务器将用于处理该请求
虚拟服务器通过 http 指令中的 server 指令来定义,示例如下:
http {  | 
http 中可包含多个 server 来指定多个虚拟服务器, 这些虚拟服务器统一由 nginx 进行分发,互相隔离。
listen 指令
正常情况下每个 server 中都会包含一条 listen 指令, 用于指定该虚拟服务器要监听的 IP 地址以及端口, 例如:
server {  | 
如果不填写端口,则采用默认端口(80), 如果不填写 IP 地址,则监听所有地址。
server_name 指令
nginx 根据请求中的 host 头部与 server_name 进行匹配,来进行请求的分发, 如果都没有匹配或者请求中根本就不包含 host 头部, nginx 会将请求路由默认的虚拟主机。server_name 有三种不同的配置格式,且不用配置格式的优先级也不相同。
通配符匹配
通配符格式中的 * 号只能在域名的开头或结尾,并且 * 号两侧只能是 . ,所以 www.*.example.com 和 w*.example.com 是无效的。* 号可以匹配多个域名部分,*.example.com 不仅与 www.example.com 匹配,而且也与 www.sub.example.org 匹配。.example.com 是比较特殊的通配符格式, 可以同时匹配确切名称 example.com 和通配符名称 *.example.com , 例如:
server {  | 
正则匹配
server {  | 
正则匹配格式,必须以 ~ 开头,比如:server_name ~^www\d+\.example\.com$;。如果开头没有 ~ ,则 nginx 认为是精确匹配。在逻辑上,需要添加 ^ 和 $ 锚定符号。正则表达式命名捕获的变量可以在 nginx 进行引用,例如:
server {  | 
精确匹配
server {  | 
精确匹配就是完整匹配域名
匹配顺序
如果有多个 server_name 匹配 host 字段, Nginx 根据以下规则选择第一个相匹配的 server 处理请求:
- 精确匹配
 - 以 
*开始的最长通配符,如*.example.org - 以 
*结尾的最长通配符,如mail.* - 第一个匹配的正则表达式(根据在配置文件中出现的先后顺序)
 
location 指令
location 指令是 nginx 中最关键的指令之一,location 指令的功能是用来匹配不同的 URI 请求,进而对请求做不同的处理和响应。
语法
Location 块通过指定模式来与客户端请求的URI相匹配。
Location 基本语法:
- 匹配 URI 类型,有四种参数可选,当然也可以不带参数。
 - 命名 location,用 
@来标识,类似于定义 goto 语句块。 
location [ = | ~ | ~* | ^~ ] /URI { … }  | 
| 参数 | 解释 | 
|---|---|
| 空 | location 后没有参数直接跟着 标准 URI,表示前缀匹配,代表跟请求中的 URI 从头开始匹配 | 
| = | 精准匹配,请求字符串与其精准匹配,成功则立即处理,停止搜索其他匹配 | 
| ^~ | 前缀匹配,请求字符串头部与其匹配,成功则立即处理,停止搜索其他匹配,一般用来匹配目录 | 
| ~ | 正则匹配,表示 URI 中包含正则表达式, 区分大小写 | 
| ~* | 正则匹配,表示 URI 中包含正则表达式, 不区分大小写 | 
匹配顺序
location 的匹配并不是完全的按照其在配置文件中出现的顺序来匹配的,请求 URI 会按如下规则进行规则进行匹配:
- 先精准匹配 
=,精准匹配成功则会立即停止其他类型匹配; - 没有精准匹配成功时,进行前缀匹配。先查找带有 
^~的前缀匹配,带有^~的前缀匹配成功则立即停止其他类型匹配,普通前缀匹配(不带参数^~)成功则会暂存,继续查找正则匹配; =和^~均未匹配成功前提下,查找正则匹配~和~\*。当同时有多个正则匹配时,按其在配置文件中出现的先后顺序前后匹配,命中则立即停止其他类型匹配;- 所有正则匹配均未成功时,返回步骤 2 中暂存的普通前缀匹配(不带参数 
^~)的结果 (如有多个匹配则取最长匹配返回) 
以上规则优先级从高到低依次是
1. location = # 精准匹配  | 
图片防盗链
在 Nginx上配置图片防盗链非常简单,通过用户客户端 http 请求头中的 referer 信息来做为主要判断,如果图片链接嵌套在非指定的网站上,可以限制其访问。
主要配置如下:
location ~*\.(gif|jpg|jpeg|png|bmp|swf|webp)$ {  | 
location 中指定要防盗链的文件类型;
valid_referers 指定资源访问是通过以下几种方式为合法
none: 直接通过 url 访问,无 referer 值的情况blocked: referer 值被防火墙修改*.example.org: 指定资源在合法的 *.example.org 中可以被引用,支持*通配符~\.google\.: 指定资源在搜索引擎中可访问
valid_referers 如果匹配不上,
$invalid_referer的值为 1,if 判断如果$invalid_referer为 1 则返回 403 错误码
反向代理
反向代理就是后端服务不直接对外暴露,请求首先发送到 nginx,然后 nginx 将请求转发至后端服务器,比如 tomcat php 等,如果后端服务只有一台服务器,nginx 在这里就是起到了代理后端服务接收请求的作用,称之为反向代理。
配置代码
server {  | 
如上配置,Nginx监听 80 端口,故访问该服务器时,会将请求转发至 127.0.0.1:8080 处理,并将 127.0.0.1:8080 返回的结果原样返回。