configure 是对Nginx的静态配置,确定Nginx的基本运行环境和功能模块,使用简单的命令行参数就可以完成。但Nginx配置绝不只有configure 这么简单,决定了Nginx的进程数量、运行日志、虚拟主机、方向代理和邮件代理、各种请求逻辑处理、优化调整等方方面面,众多的模块都要依赖配置文件里的指令才能正常工作。Nginx在启动的时将会读取配置文件,根据配置指令调用不同的模块处理,设置他们的运行参数。

配置文件格式
Nginx 配置文件是一个普通的纯文本文件,使用Nginx自定义的配置语法,更接近脚本语言,混合Shell,Perl和C的特性:

  • 与Shell/Perl相同,使用#开始一个注释行;
  • 配置指令以分号结束,可以接受多个参数,使用空白符分割
  • 可以使用单引号或者双引号来定义字符串允许用“\”转义字符
  • 配置指令和 参数也可以用引号来指定,特别是当它含有空格的时候
  • 配置块是特殊的配置指令,它有一个{…} 参数且无须分号结束,{…} 里面可以包含多个配置指令,相当于C语言的复合语句
  • 有的配置指令只能出现在特定的配置块里(即语境Context)
  • 配置块里可以再包含配置块,嵌套层次没有限制,但需符合配置块的语义
  • 可以使用include指令包含其他的配置文件,支持*通配符,类似C语言
  • 使用$var 可以引用预定义的一些变量,增加配置的灵活性
  • 不能识别或错误的配置指令会导致Nginx 解析失败,无法启动

下面列出Ngin 自带的配置文件片段

worker_processes  1;      #设置worker进程为1

events{                   #events 配置模块
    worker_connections 1024;   #worker 最大连接数
}

http{                    #配置HTTP服务,是Nginx的重点
    include    mime.types;    #包含mime.types文件
    default_type   application/octet-stream; #指定默认的MIME类型
}

server{            #server配置块,虚拟主机
   listen 80;      #监听80端口
   server_name localhost;    #主机名称

    location / {                     #location 配置块
            root html;               #设置http请求的根目录
        index index.html index.htm;  #设置默认的index 文件
    }

    errot_page  500 502 503 504 /50x.html;  #配置错误返回页面

    location = /50x.html{      #错误返回页location 配置块
        root html;             #设置http请求的根目录
    }
}

这个配置文件片段在全局域出现了一个配置指令worker_processes ,然后两个大配置块:events和http,分别配置了event模块和http 模块的行为。
events 配置块很简单,里面只有一个worker_connections指令,确定每个worker进程可以处理最大连接数,
http配置块比较复杂,他先用include包含了另一个配置文件mime.type,设置了MIME了类型,然后使用流量server块定义了一个端口为80虚拟主机。server快里又有两个location块,定义了访问虚拟主机上不同路径的具体行为,在这里只指定了文档根目录和设置index文件。

进程配置
以下三个进程配置指令不属于任何配置块,只能在全局域(mian) 里配置。

  1. worker_processes number | auto;
    设置Ngin 能够启动的worker进程的数,它直接影响Nginx的性能。通常worker数与服务器的CPU核心数相等时候,可以获得最大的性能,这时每一个worker都会功能在一个独立的CPU核心上,完全消除CPU调度的成本
    worker_processes 的默认值是1,如果不请求服务器的CPU核心的数量,那么可以设置为auto参数,Nginx 会尝试探测数量并设置。
  2. masrer_processes on | off;
    决定是否启用Nginx的进程池机制,默认是on。如果设置off,那么Nginx不会建立master进程,只会使用worker进程处理请求,worker_processes指令会失效,并发处理能力大大下降。
  3. daemon on | off;
    决定是否守护进程方式运行Nginx,默认值是on,大多数情况下Nginx应该是一个守护进程,进行再后台,不与终端有任何交互,也减少了无谓的资源消耗。

运行日志配置
日志是web服务器非常重要的数字资产,它记录了服务器子啊运行期间的各种信息,可以用来排查故障或者数据分析。
在Nginx 里运行日志分为两种:记录HTTP访问请求的access_log和记录服务器错误信息error_log。

error_log file | stderr level;
指定Ngin 的运行错误日志,默认是安装在目录下的logs/error.log。我们也可以设置其他路基,或者使用标准的错误输出stderr, level是日志允许输出的级别取值 debug|info|notice|warn |error|crit|alert|emerg,只有高于这个级别的日志才会记录下来,默认值是error/

如果配置为最低的debug 日志级别,那么在configure 时必使用 –with-debug 选项。

http配置
Nginx 近90%的功能都是提供HTTP服务,所以HTTP的配置也是最复杂的,
Nginx 使用http块配置HTTP相关所有的功能,包括cache,fastcgi,gzip,server/location,proxy,upstream等,通常的形式是:

http{
    upstream{
        ...
    }
    server{
        listen 80;

        location /{
            ...
        }
    }

    server{
        ...
    }

}

由于http快内容太多,如果我们都在一个配置文件会造成配置文件过度庞大,难以维护。我们在实际工作中通常把server,location等配置分离到单独的文件,用include指令包含进来,

http{
    include common.conf
    include upstream.conf
    include vhost/*.conf    #包汉vhost下所有的虚拟主机配置文件
}

Server配置
在http块使用server指令定义一个虚拟主机,它必须是一个配置块,在块内部再使用其他用指令来确定主机的端口,域名等参数,然后使用Nginx 就可以对外提供Web服务。

  1. listen port
    listen 指令设置虚拟机主机监听端口,默认是80。实际上 listen 指令还有很多参数,可以设置ip 地址,UNIX Domian、Socket 、SSL、backlog、rcvbuf/sndbuf等,
    server_name name …;
    server_name 指令设置虚拟机主机对外提供服务主机名称,允许使用* 通配符和“~”开头的正则表达式,例如,www.nginx.org 、 *.image.nginx.org,。当Nginx 处理请求的时候将会检查http头部的Host域,选择与server_name匹配的server快服务,从而达到在一个Nginx里实现多个主机的目的。

keepalive_timeout timout;
设置keepalive的超时时间,默认是75s,他通常有利于客户端复用HTTP长链接,提高服务器的性能。如果希望服务器发送完数据后能够主动断连,就可以把他设置为0。

Location配置
localation 配置相当于虚拟机主机上的虚拟目录,Nginx 在成功配置虚拟主机进入server块后,会继续查找陪陪URI的location 快,他是Nginx处理的终点,决定了请求应该锄禾处理。

location 是一个配置块,,但是语法稍多一点,除了{…}外还有其他参数:

location [ = | ~ | ~* | ^~ | @ ] uri{...}

location 使用配置文件里的uri 参数匹配HTTP请求行里的uri,默认是前缀匹配,也支持正则表达式,例如 “localtion /image / {…}” 会匹配“/image/001.jpg”.

location 使用几个前缀来做进一步的匹配限定:

  • = : URI必须完全匹配
  • ~ : 大小写敏感匹配
  • ~* : 大小写不敏感匹配
  • ^~ : 匹配前半部分即可
  • @ : 用于内部子请求,外部无法访问

在server 块里可以配置任意数量的location 快,location 也可以嵌套。Nginx 对location的顺序没有特殊要求,并不是按照配置文件的顺序逐个查找匹配,而是对所有可能的匹配顺序进行排序,查找最佳匹配的location。

不同location里可以有不同的处理方式,灵活的设置location能够让Nginx配置清晰明了,易于维护。比如,我们可以在一个location里面存放静态的html文件,在另外一个location 里存放图片文件,还有一个则调用fastcgi处理PHP请求。这些location 互不干扰,,修改其中一个不会影响其他的正常运行。
例如:

location   /doc/    {...}              #匹配/doc/*.*
location  ~ \.(php)$    {...}          #大小写敏感处理php请求
location  ~* \.(png)$   {...}          #忽略大小写,匹配所有的png文件
location  ~^ /image/    {...}          #匹配/image/*.*,优先级比上一个低
location =  /50x.html   {...}          #只是处理/50x.html这一个文件
location   /        {...}              #匹配任意的URI

需要注意的最后一个 location ,根据Nginx的前缀匹配规则,它能够匹配任意的uri,所以可以吧它作为一个 “黑洞”,处理所有其他的location 不能处理的请求。

文件访问配置

如果把Nginx 用作静态Web服务器,那么文件访问配置就很简单,只需要指定存放路径和文件名即可,这里仅介绍三个最基本的指令,他们可以出现在http快里的任意位置。

  1. root path
    设置请求文档的跟目录,将以path 作为路径查找文件,如果有:
location /image/{              #匹配 /image/*.*
    root /vat/data/;           #文档根目录实际上是/var/data/
}

那么请求 /image/001.jpg 将会返回文件 /var/data/image/001.jpg;
2. alias path
alias 指令同样设置文档的访问目录,但与root 略有不同,它会把location的路径替换成path ,既location 是path 的别名。
把刚才的location配置改为alias

location /image/{              #匹配 /image/*.*
    alias/vat/data/;           #文档根目录实际上是/var/data/
}

那么请求 /image/001.jpg 将会返回文件 /var/data/001.jpg;

3.index file
设置index 文件,即没有指定明确的文件时的默认文件。

upstream 配置

upstream 块不属于虚拟主机,只能在http块配置,它定义了在方向代理时Nginx需要访问的上游服务器集群和负载均衡策略

upstream的基本形式是:

upstream back_end{
    ip_hash;                    #负载均衡策略
    server 127.0.0.1:80;        #一台上游服务器
    server ...  weight=3;       #可以指定多台上游服务器
    server ...  backup;         #备份用的上游服务器
}

upstream块的配置非常简单,server指令指定上游服务器域名或者iP地址,还可以用weight/max_fails/down/backup 等附加参数进赖进一步描述服务器状态。ip_hash指令确定了这些服务器的负载均衡策略,如果不给出明确的策略,Nginx 就使用简单的加权轮询 (round robin)。

upstream 快通常配合proxy_pass、 fastcgi_pass 等反向代理指令使用,把客户的请求转发道后端服务器集群处理,例如:

location /passto{                      #一个转发的location 
    proxy_set_header Host $host;       #转发原始请求头部
    proxy_pass http://back_end;        #转发到upstream块定义的服务器
}