配置文件详解
nginx 基础配置文件分为五块,分别是全局、事件管理、HTTP、Server、Location
Tips:
- 每个指令必须有分号结束
#
表示注释- 当配置文件中没有指定某些指令的值,或者没有写入某些指令,那这些指令将按照 nginx 默认值运行
示例配置文件
# 全局指令
user nobody;
worker_processes 4;
worker_rlimit_nofile 65535;
events {
# 事件管理指令
use epoll;
worker_connections 65535;
}
http {
# 影响所有服务器的HTTP配置指令
include mime.types;
default_type application/octet-stream;
sendfile on;
gzip on;
server {
# 影响虚拟服务器的配置指令
# 一个HTTP块中可配置多个server块,用于设置不同的下虚拟主机
listen 80;
server_name localhost www.example.com;
keepalive_timeout 20;
charset utf-8;
location / {
# 处理特定的http请求(URL)的配置指令,
# 一个server块中可配置多个location块去匹配各种URL
root /home/www/html;
index index.php index.html index.htm;
}
}
}
# 其他模块的配置文件块,如Mail、Stream块等
1. 全局块
配置影响 nginx 全局的指令,一般有运行 nginx 服务器的用户组、允许生成的 nginx 进程数、nginx 进程 pid 的存放路径、日志存放路径、配置文件的引入、单个进程最多打开的文件数
# 定义Nginx运行用户和用户组,默认是nobody
user user [group];
# 指定openssl使用的引擎,默认是系统定义,可使用openssl engine -t 获取系统支持的openssl引擎
ssl_engine engine;
# nginx默认每返回一次事件模型都会调用gettimeofday()函数(C语言中获取获取当前时间的函数)更新缓存时钟,当记录$upstream_reponse_time或者$msec变量的日志时需要准确时间,可以手动指定gettimeofday()函数的调用间隔时间
timer_resolution 100ms;
# Nginx进程数,建议设置为CPU总核心数,可设置为auto表示和内核相关,有几内核就开启几个进程。8个以上性能提升不大,且稳定性变低
worker_processes 8;
# 分别给每个进程绑定一个CPU,仅能用于Linux。四核可以用四位二进制
worker_cpu_affinity 00000001 00000010 00000100 00001000 ... ...;
# 设置worker进程优先级-20~19。值越小越优先,实际使用中性能优化不明显
worker_priority 20;
# 全局错误日志定义类型
error_log /usr/local/nginx/logs/error.log info; # [debug | info | notice | warn | error | crit]
# 进程PID文件
pid /usr/local/nginx/logs/nginx.pid;
# 工作模式和连接数上限,即指定进程可以打开的最大描述符数目
# 这个此指令是指当一个nginx进程打开的最多的文件描述符数目,理论值为系统同一时间最多打开文件数(ulinit -n)与nginx进程数相除,但因为nginx调度时分配请求到进程并不均匀,所以最好和(ulimit -u)保持一致。现在的linux2.6内核同一时间最多打开文件数为65535
worker_rlimit_nofile 65535;
# 设置每个用户能够发往worker进程的信号的数量
# 以下是调试选项
# 关闭nginx守护进程,默认开启。非调试不用
daemon off;
# 关闭nginx多进程模式,默认开启。非调试不用
master_process off;
# 设置coredump(核心转储)文件大小
worker_rlimit_core 50M;
# 设置coredump文件的生成目录
working_directory /tmp/coredump/;
2. 事件管理
配置影响 nginx 服务器或与用户的网络连接的指令,一般有指定处理连接请求的事件驱动模型、单个进程是否允许同时接受多个网路连接、开启多个网络连接序列化、HTTP 层面的超时时间、请求头缓存大小、文件缓存相关
events {
# 设置网路连接序列化(使用互斥锁),防止惊群现象发生(当一个连接到来,多个睡眠进程被唤醒导致多个进程争夺一个连接,但只有一个进程能获取到连接),默认为on
accept_mutex on;
# 如果一个进程没有互斥锁,它将延迟多久。默认500ms
accept_mutex_delay 500ms;
# 设置一个进程是否同时接受多个网络连接,默认为off
multi_accept off;
# 参考事件模型
# 和apache相似,nginx针对不同的操作系统,有不同的事件模型
# 1. 标准事件模型:当系统不存在更有效的方法,nginx默认选择select或poll
# 2. 高效事件模型:
# * kqueue:使用于FreeBSD 4.1+ OpenBSD 2.9+ NetBSD 2.0和MacOS X 但使用双处理器的MacOS X系统使用kqueue可能会造成内核崩溃
# * epoll:使用于Linux内核2.6版本及以后的系统。现在基本都使用此模式
# * /dev/poll:使用于Solaris 7 11/99+ HP/UX 11.22+(eventport) IRIX 6.5.15+ 和 Tru64 UNIX5.1A+
# * eventport:使用于Solaris 10 为了防止内核崩溃问题,有必要安装安全补丁
use epoll; # [select | poll | kqueue | epoll | /dev/poll | eventport | rtsig]
# 单个进程最大连接数,和前面的工作进程相配合,尽量大但别把CPU跑满。理论上每台nginx服务器最大连接数为worker_processes * worker_connections
worker_connections 65535;
# 调试指定的单个连接,需要在主模块中指定error_log路径
debug_connection 192.168.1.1;
}
3. HTTP
nginx 最基础的模块之一,一个 http 处理模块可进行 http 相关参数配置,其中可以包含多个 server 块
http {
# 仅限http块的指令
# 设置虚拟服务器名hash表的最大值,默认512字节
server_names_hash_max_size 512;
# 设置虚拟服务器名hash表中篮子的大小,默认为一路处理器缓存的大小32/64/128,需同时调整两个设置才能更好的优化
server_names_hash_bucket_size 32;
# 通用指令,在http块、server块、location块都可以使用的指令
# 调试
# 将客户端的请求存储在文件中,请求完成后文件也不会被删除,默认off
client_body_in_file_only on;
# 将客户端请求存储在缓冲区,建议在使用$request_body变量时启用此指令以减少复制操作,默认off
client_body_in_single_buffer on;
# 设置客户端请求缓冲区的大小,如果请求超过缓冲区大小则写入到临时文件,默认是两个内存分页大小,根据CPU平台不同大小不同8k/16k
client_body_buffer_size 8k;
# 设置存储请求体临时文件的目录,可以通过指定数字来设置子目录,最多三级子目录,子目录名由数字组成,指定的数字就是子目录名的长度。例子中创建的文件可能为/tmp/nginx/client_temp/123/1234/00012345
client_body_temp_path /tmp/nginx/client_temp 3 4;
# 设置请求体的读超时,默认60s。只有在一个readstep没有获取到主体才设置超时,在设定时间后客户端还是没有发送任何东西,nginx返回408错误"Request time out"
client_body_timeout 60s;
# 设置客户端请求体的最大消息长度,默认1m。当客户端请求体超过此大小,客户端会获取413错误"Request Entity Too Large"
client_max_body_size 1m;
# 设置文件使用的默认的MIME_type,当MIME map没有明确指定类型时使用设置的默认类型
default_type application/x-ns-proxy-autoconfig;
# 允许使用O_DIRECT(FreeBSD,Linux),F_NOCACHE(Mac OS X)或directio()函数(Solaris)来读取大于指定的大小的文件,此指令会禁止设置的请求使用sendfile。默认关闭off
directio 4m;
# 设置当返回错误码时显示指定的页面,可以设置多个错误码返回同一个页面,或者更改返回的错误码。当错误代码是由代理服务器或FastCGI处理返回的,也可以隐藏它们的返回码,如果不隐藏则忽略等号。还可以使用@符设置返回一个location_name,在重定向时就不需要改变URL
error_page 404 502 503 /4o4.html;
error_page 404 =200 /index.html; # 将404改为200,并返回主页
error_page 404 = /404.php; # 错误码由FastCGI处理返回
error_page 404 /404.php; # 不更改FastCGI返回的错误码
location / (
error_page 404 @errorback;
)
location @errorback (
proxy_pass http://baidu.com;
)
# 设置如何比较文件修改时间和If-Modified-Since请求头中的时间,默认是exact
if_modified_since off; # 不比较
if_modified_since exact; # 精确比较
if_modified_since before; # 文件修改时间应该小于if-modified-since请求头中的时间
# 设置默认主页文件,可以使用变量名,按照指定顺序检查文件是否存在,绝对路径可以放在最后面
index index.html /var/www/index.php;
# http超时时间,默认75s。作用是保持客户端到服务端的连接在设定的时间内持续有效,当出现对服务器的后续请求时,该功能避免建立或重新建立连接,但参数不宜过大,造成无效的http连接占用资源。此处是http层面的keepalive,并非Tcp层面的keeplive
keepalive_timeout 60;
# 设置可通过一个keepalive连接发起的最大请求数,默认100
keepalive_requests 100;
# 限制单个连接的传输速度,单位是字节/秒。但如果客户端建立两个连接则速度翻倍
limit_rate 4k;
# 当传输完指定大小(1M)后再开始限速,需在其后配合limit_rate指令
limit_rate_after 1m;
# 设置是否在error_log中记录文件未找到的错误,默认on
log_not_found on;
# 设置是否在access_log中记录子请求记录,例如:重写规则或SSI请求。默认off
log_subrequest off;
# 设置是否开启IE浏览器的显示友好的HTTP错误信息,默认on。开启后会对响应码大于400的请求进行填充内容达到512字节
msie_padding on;
# 为IE浏览器开启或关闭用页面刷新代替页面重定向的功能,默认off
msie_refresh off;
# 为打开文件指定缓存数量和时间,默认off。max指定缓存数量,建议和单个进程打开的最多文件描述符数目一致。inactive指定多长时间后文件没被请求就删除缓存(还需要参考open_file_cache_min_uses指定的次数)
open_file_cache max=65535 inactive=20s;
# 指定在搜索一个文件时是否记录缓存错误(cache error),默认值off
open_file_cache_errors on;
# open_file_cache指令中inactive参数指定的时间内,被缓存的文件最少的请求次数。如果在指定时间内请求低于这个数,文件缓存将被移除。默认1次
open_file_cache_min_uses 1;
# 指定多长时间后检查一次缓存的有效信息,默认值60s。
open_file_cache_valid 30s;
# 设置当请求被重定向时,是否在URL中显示端口,默认on,即当请求被重定向时,nginx在URL中不显示端口
port_in_redirect on;
# 设置是否允许error_page指令进行多次重定向,如果禁止当error_page指令重定向的错误页面出现问题时将直接输出默认错误页,如果允许的话重定向也有次数限制,默认off
recursive_error_pages off;
# 设置DNS解析服务器,默认使用53端口,后面可以跟多个DNS服务器,还可以使用valid设置缓存时间
resolver 8.8.8.8 valid=3600s;
# 设置DNS解析服务器超时时间,默认30s
resolver_timeout 30s;
# 设置请求的根文档路径,当使用root设置时在location块中匹配规则的路径是root指定的路径加上location匹配的路径
root /var/www;
# 设置是否使用sendfile系统调用来传输文件,以提升文件传输性能,如果网站是上传下载网站建议关闭此选项减轻压力,默认off
sendfile on;
# 设置当重定向时,是以什么进行拼接,off时是以当前请求主机头进行拼接,设置为on时是以server_name指定的第一个值进行拼接,如果指定了完整的返回路径(即包含指定主机头的完整路径),此设置无效。默认on
server_name_in_redirect on;
# 设置是否在错误页显示nginx版本号,默认on
server_tokens on;
# 设置是否禁用Nagle算法(每一次操作产生的包需等待0.2s后再发送),加快数据传输。开启后每产生一个包就进行传输,即使这个包只有一个字节的数据,这样可以使交互式的应用程序极大的受益,但因为每个包典型情况下会包含一个字节的数据和四十个字节的包头,很容易造成网络堵塞,但现在的网络传输速率可以忽略这种情况了。使用此设置时前面必须开启了sendfile,默认开启
tcp_nodelay on;
# 设置是否禁用Nagle算法。配置一次发送数据的包的大小,而不是等待0.2s就发送,当包大小累计到指定的大小时才发送,此选项虽然和上一个选项有冲突但在实际使用中可以同时启用,nginx会先填满包再尽快发送,默认off
tcp_nopush off;
# 设置扩展名对应的MIME类型,一个MIME类型可以对应多个扩展名
types {
text/html html;
image/gif gif;
image/jpeg jpg;
}
# 以下指令仅限于http块、server块
# 设置客户端请求头的缓冲区大小,默认1k。如果设置的客户端请求头缓冲区还是放不下请求头,可以用large_client_header_buffers设置一个更大的缓冲区
client_header_buffer_size 1k;
# 设置客户端请求头超时时间,默认60s。只有当一个readstep没有获取请求头才设置超时,在设定时间后客户端还是没发送任何东西,nginx返回408错误"Resquest time out"
client_header_timeout 60s;
# 设置更大长度的客户端请求头的缓冲区,如果客户端请求头的长度还是大于这个缓冲区,nginx返回414错误"Request URL too Large",如果请求头的一行大于这个缓冲区,nginx返回400错误"Bad request"默认是一个分页大小4k/8k,根据平台不同,默认大小不同
large_client_header_buffers 4k;
}
4. Server
用于配置虚拟主机的块,包含在 http 块中,可以包含多个
server {
# 设置监听的IP地址和端口,在linux下使用IPv6必须使用全地址,不能使用缩写。因为使用缩写他首先监听的还是IPv4
# IPv4
listen 127.0.0.1:80;
listen 127.0.0.1;
listen 80;
listen *:80;
listen localhost:80;
# IPv6
listen [::]80;
listen [fe80::1];
# 基于虚拟服务器主机名的请求,当同时使用正则表达式或通配符匹配时其优先顺序如下
# 1. 精确名称
# 2. 以星号开头的最长的通配符匹配的名称
# 3. 以星号结尾的最长的通配符匹配的名称
# 4. 第一个匹配的正则表达式
# Tips:通配符*只能用在开头和结尾处,且必须在.号两边。可以同时匹配多个主机名,用空格隔开
server_name www.example.com *.example.com www.example.*;
}
5. Location
包含在 server 块中,可包含多个。
location 指令可以根据 URL 进行不同配置,可以使用字符串匹配 和正则匹配,要使用正则必须使用
-
字符串
- 直接跟要匹配的 URL,如:
/
- 使用等号进行精准匹配,如:
= /
- 使用
^~
匹配 URL 开头,如:^~ /image
- 直接跟要匹配的 URL,如:
-
正则
- 不区分大小写:
~*
- 区分大小写:
~
- 不区分大小写:
-
优先级
= > ^~ > ~ > 常规字符串 > /
Tips:如果为同级匹配条件,字符串优先匹配最长的结果,正则表达式则优先使用位置靠前的匹配
-
命名的 location 块
使用
@
指定一个命名的 location 块,该块不能被外部客户端访问,只能被 nginx 内部配置的指令访问。所以一般用于内部重定向。如:error_page 和 try_fileslocation = / { # 只匹配对/的请求 } location ^~ /images/ { # 匹配所有以/images/开头的请求并停止匹配 } location ~* \.(gif|jpg|jpeg)$ { # 匹配所有以gif,jpg,jpeg结尾的请求,不区分大小写,但所有对/images/目录下的请求都会匹配上面的location块 } location / { # 通用匹配:匹配所有请求,因为所有请求都是以/开始的。但还是会匹配其他的常规字符串和正则表达式,如果匹配上,优先使用其他匹配 }
# 指令指定的location只能被内部请求调用,外部请求会返回404错误"Not Found"
# 内部请求有:指令error_page重定向的请求。ngx_http_ssi_module模块中使用include virtual命令创建的子请求。ngx_http_rewrite_module模块使用rewrite指令修改的请求
error_page 404 /404.html;
location /404.html {
internal;
}
# 设置只接受指定的HTTP请求方法,其他方法都不能请求,可以和ngx_http_access_module、ngx_http_auth_basic_module模块中的指令一起使用
# 配合ngx_http_access_module中的deny指令限制192.168.1.1/24中的IP只能使用GET和HEAD请求(GET请求包含了HEAD请求)
limit_except GET {
allow 192.168.1.1/24;
deny all;
}
# 给location块匹配的路径设置别名,此指令不能配合正则表达式的匹配方式使用,切必须结合重写指令或root指令一起使用
location /i/ {
# 当请求/i/top.gif时实际返回的是/spool/www/images/top.gif
alias /spool/www/images/;
}
# 配合NginxHttpAccessModule模块或者NginxHttpAuthBasicMoudle模块设置访问控制,只有当两个模块中至少有一个检查成功才可以正常访问。默认off
location / {
satisfy_any on;
allow 192.168.1.0/24;
deny all;
auth_basic "closed site";
auth_basic_user_file conf/htpasswd;
}
# 让nginx测试指定的每个文件是否存在,并使用找到的第一个文件作为URL,如果没找到则调用最后指定的命名的location块,此指令的最后一个参数必须是一个location块的名称
location / {
try_file index.html index.htm @fallback;
}
location @fallback {
root /var/www/error;
index index.html;
}