1. # 全局块
  2. ...
  3. # events 块
  4. events {
  5. ...
  6. }
  7. # http 块
  8. http {
  9. # http 全局块
  10. ...
  11. # server 块,每一个 server 就代表一个虚拟主机
  12. server {
  13. # server 全局块
  14. ...
  15. # location 块
  16. location / {
  17. ...
  18. }
  19. }
  20. server {
  21. ...
  22. }
  23. # http 全局块
  24. ...
  25. }
  • 全局块:主要是影响 Nginx 整体运行的指令;常会有user、 worker_processes、include、error_log、pid
  • events 块:控制 Nginx 如何处理访问连接,比如设置每个进程的最大连接数、选取哪种事件驱动模型处理请求等
  • http 块:可以嵌套多个 server 块,配置代理、缓存、日志等
  • server 块:配置虚拟主机的相关参数,可以有多个
  • location 块:配置请求的路由,以及各种页面的处理逻辑

命令都可以在 http://nginx.org/en/docs 查询到。
下面的是常见的配置。
分号不要忘记。

Tips:

  1. 方括号 [ ] 中的内容说明是选填的;
  2. 上下文:代表可以放在哪个命令块中;
  3. 中划线代表或;
  4. 斜体是要填的值

指令的优先级

  1. 向上覆盖:子配置不存在时,直接使用父配置块;子配置存在时,直接覆盖父配置块

解释1:

  1. server {
  2. access_log logs/access.log info;
  3. location / {
  4. }
  5. location /x {
  6. access_log logs/access.x.log debug;
  7. }
  8. }

第 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.* 当多个域名被匹配中时使用的顺序是规则是:

    1. 如果能精确匹配中就使用精确匹配的
    2. 否则就尝试匹配 * 在前面的泛域名
    3. 再尝试匹配 * 在后面的泛域名
    4. 如果还没匹配中,那么会使用正则表达式匹配,多个正则表达式时根据出现的顺序匹配
    5. 以上都没匹配,那么就是使用 default_server 指令兜底匹配

什么是 **default_server**?
如果某个 server 块中的 listen 指定了default_server指令那么该 server 就是 default_server;否则的话就是第 1 个 server 块。

使用正则表达式匹配时可以获取域名作为变量

  1. server {
  2. server_name ~^(www\.)?(.+)$
  3. location / {
  4. # URL 中被正则匹配中的第 2 项
  5. return /$2;
  6. }
  7. }

server_name_in_redirect

  • 语法:server_name_in_redirect on | off;
  • 默认值:server_name_in_redirect off;
  • 上下文:http, server, location

    如果是 off ,当 server_name 有多个值时,并且匹配中了第 2 个,如果使用重定向,那么重定向之后的域名就是匹配中的那个;但如果是 on,那么将使用第 1 个。

  1. http {
  2. server {
  3. server_name wwww.xu.org www.xu.com;
  4. server_name_in_redirect off;
  5. return 302 /redirect;
  6. }

如果是 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

  1. server {
  2. listen 8087;
  3. server_name localhost;
  4. location = / {
  5. return 301 https://$host:8320/PortalWeb;
  6. }
  7. location = / {
  8. return 403;
  9. }
  10. }

说明监听 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”‘;