Nginx 的配置系统由一个主配置文件和其他一些辅助的配置文件构成。这些配置文件均是纯文本文件,全部位于Nginx安装目录下的conf
目录下。
Nginx配置文件中每个指令必须有;
结束。以#
开头的行会被当做注释。
配置文件通常命名为nginx.conf
并且默认放置在/usr/local/nginx/conf
,/etc/nginx
,或/usr/local/etc/nginx
。
1. Nginx配置文件结构
- Nginx配置文件常用到的几个部分:main(全局设置),server(主机设置),upstream(上游服务器设置,主要为反向代理、负载均衡相关配置),location(URL匹配特定位置后的设置)
- 每部分包含若干个指令。
- main模块:配置影响nginx全局的指令。一般有运行nginx服务器的用户组,nginx进程pid存放路径,日志存放路径,配置文件引入,允许生成worker process数等。
- events模块:配置影响nginx服务器或与用户的网络连接。有每个进程的最大连接数,选取哪种事件驱动模型处理连接请求,是否允许同时接受多个网路连接,开启多个网络连接序列化等。
- http模块:可以嵌套多个server,配置代理,缓存,日志定义等绝大多数功能和第三方模块的配置。如文件引入,mime-type定义,日志自定义,是否使用sendfile传输文件,连接超时时间,单连接请求数等。
- upstream模块:使nginx跨越单机的限制,完成网络数据的接收、处理和转发,该指令用于设置一系列的后端服务器,设置反向代理及后端服务器的负载均衡;
- server模块:主要用于指定虚拟主机域名、IP和端口;
- location模块:配置请求的路由,以及各种页面的处理情况(比如,根目录“/”,“/images”,等等)。
- 他们之间的关系式:
- server继承main,location继承server;
- upstream既不会继承指令也不会被继承。它有自己的特殊指令,不需要在其他地方的应用。
1 | ... # main(全局)模块 |
2. Nginx配置文件详解
2.1 全局模块
1 | # ------------------------------ 全局模块 start ------------------------------ |
2.2 events模块
1 |
|
2.2 http模块
1 | ... # 全局块 |
2.3 upstream模块
1 | ... # 全局块 |
2.3 server模块
1 | ... # 全局块 |
- URL重写(rewrite)配置及信息详解:
- 语法:
rewrite <regex> <replacement> [flag];
regex
:perl兼容正则表达式语句进行规则匹配replacement
:将正则匹配的内容替换成replacementflag
rewrite支持的flag标记last
:本条规则匹配完成后,继续向下匹配新的location URI规则break
:本条规则匹配完成即终止,不再匹配后面的任何规则redirect
:返回302临时重定向,浏览器地址会显示跳转后的URL地址permanent
:返回301永久重定向,浏览器地址栏会显示跳转后的URL地址
- 使用位置:server, location, if
- 语法:
2.4 location模块
语法:location [ = | ~ | ~* | ^~ | @] /uri/ { configuration }
。
匹配模式分为两种:普通字符串(literal string)和正则表达式(regular expression),其中 ~ 和 ~* 用于正则表达式, 其他前缀和无任何前缀都用于普通字符串。
- 前缀含义:
=
:=开头表示精确前缀匹配,只有完全匹配才能生效。~
:~开头表示区分大小写的正则匹配。~*
:~*开头表示不区分大小写的正则匹配。^~
:^~开头表示普通字符串匹配上以后不再进行正则匹配。
1 | ... # 全局块 |
3. Nginx日志配置
Nginx日志主要分为两种:access_log(访问日志)
和error_log(错误日志)
。
- 访问日志可以记录用户的IP地址、浏览器的信息,请求的处理时间等信息。
access_log指令
的作用域:http,server,location,limit_except。
- 错误日志记录了访问出错的信息,可以帮助我们定位错误的原因。
error_log指令
的作用域:main, http, mail, stream, server, location
3.1 Nginx访问日志access_log
访问日志主要记录客户端的请求。客户端向Nginx服务器发起的每一次请求都记录在这里。
客户端IP,浏览器信息,referer,请求处理时间,请求URL等都可以在访问日志中得到。
可以通过log_format指令定义具体要记录哪些信息。
语法:
1 | # 关闭访问日志 |
path
:指定日志的存放位置。format
:指定日志的格式。默认使用预定义的combined。buffer
:用来指定日志写入时的缓存大小。默认是64k。gzip
:日志写入前先进行压缩。压缩率可以指定,从1到9数值越大压缩比越高,同时压缩的速度也越慢。默认是1。flush
:设置缓存的有效时间。如果超过flush指定的时间,缓存中的内容将被清空。if条件判断
:如果指定的条件计算为0或空字符串,那么该请求不会写入日志。
3.1.1 使用log_format自定义日志格式
Nginx预定义了名为combined日志格式,如果没有明确指定日志格式默认使用该格式:
1 | log_format combined '$remote_addr - $remote_user [$time_local] ''"$request" $status $body_bytes_sent ''"$http_referer" "$http_user_agent"'; |
如果不想使用Nginx预定义的格式,可以通过log_format指令来自定义:
1 | log_format name [escape=default|json] string ...; |
- name 格式名称。在access_log指令中引用。
- escape 设置变量中的字符编码方式是json还是default,默认是default。
- string 要定义的日志格式内容。该参数可以有多个。参数中可以使用Nginx变量。
实例:
1 | log_format main '$remote_addr - $remote_user [$time_local] "$request" ' |
- 日志格式设定常用Nginx变量:
$remote_addr
/$http_x_forwarded_for
:用以记录客户端的ip地址;$remote_user
:用来记录客户端用户名称;$time_local
: 用来记录访问时间与时区;$request
: 用来记录请求的url与http协议;$status
: 用来记录请求状态;成功是200,$body_bytes_sent
:记录发送给客户端文件主体内容大小;$http_referer
:用来记录从那个页面链接访问过来的;$http_user_agent
:记录客户浏览器的相关信息;
3.2 Nginx错误日志error_log
错误日志在Nginx中是通过error_log指令实现的。该指令记录服务器和请求处理过程中的错误信息。
语法:error_log file [level];
,默认是:error_log logs/error.log error;
;
级别有:[ debug|info|notice|warn|error|crit|alert|emerg ]
。
基本用法:
1 | error_log /usr/local/nginx/logs/error.log info; |
3.3 通过open_log_file_cache
指令来设置日志文件描述符缓存
Nginx中通过access_log
和error_log
指令配置访问日志和错误日志,通过log_format
我们可以自定义日志格式。
如果日志文件路径中使用了变量,我们可以通过open_log_file_cache
指令来设置缓存,提升性能。它可以配置在http、server、location作用域中。
- 语法:
open_log_file_cache max=N [inactive=time] [min_uses=N] [valid=time];
max
设置缓存中最多容纳的文件描述符数量,如果被占满,采用LRU算法将描述符关闭。inactive
设置缓存存活时间,默认是10s。min_uses
在inactive时间段内,日志文件最少使用几次,该日志文件描述符记入缓存,默认是1次。valid
:设置多久对日志文件名进行检查,看是否发生变化,默认是60s。off
:不使用缓存。默认为off。
基本用法:
1 | open_log_file_cache max=1000 inactive=20s valid=1m min_uses=2; |
4. Nginx配置文件实例:
1 | user cmuser; |
附. Nginx启动命令
运行可执行文件就可以启动nginx
,可以使用-c
参数指定配置文件,比如:
1 | nginx -c /usr/local/nginx/conf/nginx.conf |
如果nginx已经启动,可以使用-s参数的可执行命令来控制:
1 | nginx -s [reload | stop | quit | reopen] |
比如,重载配置文件:
1 | nginx -s reload |