1. 基础知识
1.1 基本配置
main # 全局配置
events { # nginx 工作模式配置
}
http { # http 设置
....
server { # 服务器主机配置
....
location { # 路由配置
....
}
location path {
....
}
location otherpath {
....
}
}
server {
....
location {
....
}
}
upstream name { # 负载均衡配置
....
}
}
如果想要生成 nginx 规范配置,可以参考nginxconfig.io
下面是 nginx
一些配置中常用的内置全局变量,你可以在配置的任何位置使用它们。
变量名 | 功能 |
---|---|
$host |
请求信息中的 Host ,如果请求中没有 Host 行,则等于设置的服务器名 |
$request_method |
客户端请求类型,如 GET 、POST |
$remote_addr |
客户端的 IP 地址 |
$args |
请求中的参数 |
$content_length |
请求头中的 Content-length 字段 |
$http_user_agent |
客户端 agent 信息 |
$http_cookie |
客户端 cookie 信息 |
$remote_addr |
客户端的 IP 地址 |
$remote_port |
客户端的端口 |
$server_protocol |
请求使用的协议,如 HTTP/1.0 、HTTP/1.1\ |
$server_addr |
服务器地址 |
$server_name |
服务器名称 |
$server_port |
服务器的端口号 |
1.2 location 匹配规则
语法规则:location [=|~|~*|^~] /uri/ { … }
模式 | 含义 |
---|---|
location = /uri | = 表示精确匹配,只有完全匹配上才能生效 |
location ^~ /uri | ^~ 开头对 URL 路径进行前缀匹配,并且在正则之前。 |
location ~ pattern | 开头表示区分大小写的正则匹配 |
location ~* pattern | 开头表示不区分大小写的正则匹配 |
location /uri | 不带任何修饰符,也表示前缀匹配,但是在正则匹配之后 |
location / | 通用匹配,任何未匹配到其它 location 的请求都会匹配到,相当于 switch 中的 default |
前缀匹配时,Nginx 不对 url 做编码,因此请求为 /static/20%/aa
,可以被规则 ^~ /static/ /aa
匹配到(注意是空格)
多个 location 配置的情况下匹配顺序为:
- 首先精确匹配
=
- 其次前缀匹配
^~
- 其次是按文件中顺序的正则匹配
- 然后匹配不带任何修饰的前缀匹配。
- 最后是交给
/
通用匹配 - 当有匹配成功时候,停止匹配,按当前匹配规则处理请求
意:前缀匹配,如果有包含关系时,按最大匹配原则进行匹配。比如在前缀匹配:location /dir01
与 location /dir01/dir02
,如有请求 http://localhost/dir01/dir02/file
将最终匹配到 location /dir01/dir02
例子,有如下匹配规则:
location = / {
echo "规则 A";
}
location = /login {
echo "规则 B";
}
location ^~ /static/ {
echo "规则 C";
}
location ^~ /static/files {
echo "规则 X";
}
location ~ \.(gif|jpg|png|js|css)$ {
echo "规则 D";
}
location ~* \.png$ {
echo "规则 E";
}
location /img {
echo "规则 Y";
}
location / {
echo "规则 F";
}
那么产生的效果如下:
- 访问根目录
/
,比如http://localhost/
将匹配规则 A
- 访问
http://localhost/login
将匹配规则 B
,http://localhost/register
则匹配规则 F
- 访问
http://localhost/static/a.html
将匹配规则 C
- 访问
http://localhost/static/files/a.exe
将匹配规则 X
,虽然规则 C
也能匹配到,但因为最大匹配原则,最终选中了规则 X
。你可以测试下,去掉规则 X ,则当前 URL 会匹配上规则 C
。 - 访问
http://localhost/a.gif
,http://localhost/b.jpg
将匹配规则 D
和规则 E
,但是规则 D
顺序优先,规则 E
不起作用,而http://localhost/static/c.png
则优先匹配到规则 C
- 访问
http://localhost/a.PNG
则匹配规则 E
,而不会匹配规则 D
,因为规则 E
不区分大小写。 - 访问
http://localhost/img/a.gif
会匹配上规则 D
, 虽然规则 Y
也可以匹配上,但是因为正则匹配优先,而忽略了规则 Y
。 - 访问
http://localhost/img/a.tiff
会匹配上规则 Y
。
访问 http://localhost/category/id/1111
则最终匹配到规则 F ,因为以上规则都不匹配,这个时候应该是 Nginx 转发请求给后端应用服务器,比如 FastCGI(php),tomcat(jsp),Nginx 作为反向代理服务器存在。
理解 Nginx 中 Server 和 Location 的匹配逻辑
1.3 nginx 日志
Nginx 日志主要有两种:access_log(访问日志) 和 error_log(错误日志)。
1.3.1 access_log 访问日志
access_log 主要记录客户端访问 Nginx 的每一个请求,格式可以自定义。通过 access_log 你可以得到用户地域来源、跳转来源、使用终端、某个 URL 访问量等相关信息。
nginx log 文件默认地址 /var/log/nginx/
;
log_format 指令用于定义日志的格式,语法: log_format name string;
其中 name 表示格式名称,string 表示定义的格式字符串。log_format 有一个默认的无需设置的组合日志格式。
默认的无需设置的组合日志格式
log_format combined '$remote_addr - $remote_user [$time_local] '
' "$request" $status $body_bytes_sent '
' "$http_referer" "$http_user_agent" ';
access_log 指令用来指定访问日志文件的存放路径(包含日志文件名)、格式和缓存大小,语法:access_log path [format_name [buffer=size | off]];
其中 path 表示访问日志存放路径,format_name 表示访问日志格式名称,buffer 表示缓存大小,off 表示关闭访问日志。
log_format 使用示例:在