# 全局块
...
# events 块
events {
...
}
# http 块
http {
# http 全局块
...
# server 块,每一个 server 就代表一个虚拟主机
server {
# server 全局块
...
# location 块
location / {
...
}
}
server {
...
}
# http 全局块
...
}
- 全局块:主要是影响 Nginx 整体运行的指令;常会有user、 worker_processes、include、error_log、pid 等
- events 块:控制 Nginx 如何处理访问连接,比如设置每个进程的最大连接数、选取哪种事件驱动模型处理请求等
- http 块:可以嵌套多个 server 块,配置代理、缓存、日志等
- server 块:配置虚拟主机的相关参数,可以有多个
- location 块:配置请求的路由,以及各种页面的处理逻辑
命令都可以在 http://nginx.org/en/docs 查询到。
下面的是常见的配置。
分号不要忘记。
Tips:
- 方括号 [ ] 中的内容说明是选填的;
- 上下文:代表可以放在哪个命令块中;
- 中划线代表或;
- 斜体是要填的值
指令的优先级
- 向上覆盖:子配置不存在时,直接使用父配置块;子配置存在时,直接覆盖父配置块
解释1:
server {
access_log logs/access.log info;
location / {
}
location /x {
access_log logs/access.x.log debug;
}
}
第 1 个 location
命令块中没有配置 access_log
,那么将使用其父命令块 server
的配置;而第 2 个 location
命令块因为配置有 access_log
所以将会覆盖父命令块的配置,只生效自己的。
未分类
- 语法:user user [group];
- 默认值:user nobody nobody;
- 上下文:main
配置 Nginx 运行所使用的用户和用户组,如果用户组不填那么将认为用户组名和用户是一样的
- 语法:worker_processes _number | _auto;
- 默认值:worker_processes 1;
- 上下文:main
- 语法:error_log file [level];
- 默认值:error_log logs/error.log error;
- 上下文:main, http, main, stream, server, location
level:日志级别,严重程度从低到高有:debug, info, notice, warn, error, crit, alert, emerg
- 语法:include _file | _mask;
- 默认值:无
- 上下文:所有
可以包含其他的配置文件,让配置文件整体上更便于维护;其中 mask 代表统配。 include mime.types; include vhosts/*.conf;
- 语法:client_max_body_size size;
- 默认值:client_max_body_size 1m;
- 上下文:http, server, location
设置客户端被允许的最大请求体。超过限制大小就返回
413 Request Entity Too Large
设置 0 则不限制大小。
http 命令块中的内容
- 语法:server { … }
- 默认值:无
- 上下文:http
用于配置虚拟服务器。
常见命令块
server_name
重要
- 语法:server_name name …;
- 默认值:server_name “”;
- 上下文:server
Nginx 有两种监听处理请求的方式,一个是通过域名,一个是通过 IP、端口;
server_name
就是域名的方式。 监听的主机名,可以用 模糊匹配,也可以用正则表达式,如: server_name xu.example.org .example xu.example.* 当多个域名被匹配中时使用的顺序是规则是:- 如果能精确匹配中就使用精确匹配的
- 否则就尝试匹配
*
在前面的泛域名 - 再尝试匹配
*
在后面的泛域名 - 如果还没匹配中,那么会使用正则表达式匹配,多个正则表达式时根据出现的顺序匹配
- 以上都没匹配,那么就是使用
default_server
指令兜底匹配
什么是 **default_server**
?
如果某个 server
块中的 listen
指定了default_server
指令那么该 server
就是 default_server
;否则的话就是第 1 个 server
块。
使用正则表达式匹配时可以获取域名作为变量
server {
server_name ~^(www\.)?(.+)$
location / {
# URL 中被正则匹配中的第 2 项
return /$2;
}
}
server_name_in_redirect
- 语法:server_name_in_redirect on | off;
- 默认值:server_name_in_redirect off;
- 上下文:http, server, location
如果是 off ,当
server_name
有多个值时,并且匹配中了第 2 个,如果使用重定向,那么重定向之后的域名就是匹配中的那个;但如果是 on,那么将使用第 1 个。
http {
server {
server_name wwww.xu.org www.xu.com;
server_name_in_redirect off;
return 302 /redirect;
}
如果是 off,那么访问 www.xu.com 之后被重定向到 www.xu.com/redirect
如果是 on,那么访问 www.xu.com 之后被重定向到 www.xu.org/redirect
listen
重要
- 语法:listen address[:port];
- 默认值:server_name :80 | :8000;
- 上下文:server
常用来匹配监听端口,匹配中时由该
listen
所在的server
处理请求。 默认情况下,如果是超级用户就用80,否则用8000; 语法看这里 http://nginx.org/en/docs/http/ngx_http_core_module.html#listen 值用这几种形式:- ip:port:地址精确表示模式,如果服务器上多块网卡(多个IP),那么可以用这种方式配置
- ip:监听的是 ip:80
- port:监听写的端口
- default_server:自动使用默认地址
location
- 语法:location [ = | ~ | ~* | ^~ ] uri { … }
location @name { … }
- 默认值:server_name :80 | :8000;
- 上下文:server, location
根据匹配到的路径去响应。 修饰符: = :精确匹配 ~ :大小写敏感的正则 ~* :忽略大小写的正则 还有其他可以看docs
server {
listen 8087;
server_name localhost;
location = / {
return 301 https://$host:8320/PortalWeb;
}
location = / {
return 403;
}
}
说明监听 8087
端口,匹配所有的路径,匹配中后返回 http 状态码 301
重定向到目标路径
access_log
- 语法:access_log path [format [buffer=size] [gzip[=level]] [flush=time] [if=condition]];
access_log off;
- 默认值:access_log logs/access.log combined;
- 上下文:http, server, location, if in location, limit_except
访问日志所在的路径,根据配置的日志格式不同里面的内容不同;不同的命令块有不同的配置,根据需要找。 参数说明
- path:path 路径是可以包含变量,将不同的请求路径的日志放到不同的文件中
access_format
- 语法:access_log name [escape=default|json|none] string …;
- 默认值: log_format combined “…”;
- 上下文:http
只能放在
http
指令块中,用于配置日志的格式,默认的combined
日志格式是: ‘$remote_addr - $remote_user [$time_local] ‘ ‘“$request” $status $body_bytes_sent ‘ ‘“$http_referer” “$http_user_agent”‘;