listen address:port[default(deprecated in 0.8.21)|default_server|
[backlog=num|rcvbuf=size|sndbuf=size|accept_filter=filter|deferred|
bind|ipv6only=[on|off]|ssl]]
解释
1.address:port :
listen 127.0.0.1:8000; listen 127.0.0.1; #注意:不加端口时,默认监听 80端口 2.使用ipv6listen [::]:8000; listen [fe80::1]; listen [:::a8c9:1234]:80;3 default default_server 将所在的server块作为整个Web服务的默认server块。如果没有设置这个参数, 那么将会以在nginx.conf中找到的第一个server块作为默认server块。为什么需要默认虚拟主机 呢?当一个请求无法匹配配置文件中的所有主机域名时,就会选用默认的虚拟主机 4 backlog=num 表示TCP中backlog队列的大小。默认为–1表示不予设置。在TCP建 立三次握手过程中,进程还没有开始处理监听句柄,这时backlog队列将会放置这些新连接。 可如果backlog队列已满,还有新的客户端试图通过三次握手建立TCP连接,这时客户端将会 建立连接失败 5. rcvbuf=size:设置监听句柄的SO_RCVBUF参数。 · sndbuf=size:设置监听句柄的SO_SNDBUF参数。 · accept_filter:设置accept过滤器,只对FreeBSD操作系统有用。
6 deferred
在设置该参数后,若用户发起建立连接请求,并且完成了TCP的三次握手, 内核也不会为了这次的连接调度worker进程来处理,只有用户真的发送请求数据时(内核已 经在网卡中收到请求数据包),内核才会唤醒worker进程处理这个连接。这个参数适用于大 并发的情况下,它减轻了worker进程的负担。当请求数据来临时,worker进程才会开始处理 这个连接。只有确认上面所说的应用场景符合自己的业务需求时,才可以使用deferred配 置
7 bind
绑定当前端口/地址对,如127.0.0.1:8000。只有同时对一个端口监听多个地址时 才会生效 8.ssl 在当前监听的端口上建立的连接必须基于SSL协议。 ssl:SL协议的三个特性
① 保密:在握手协议中定义了会话密钥后,所有的消息都被加密;
② 鉴别:可选的客户端认证,和强制的服务器端认证;
③ 完整性:传送的消息包括消息完整性检查(使用MAC)。
语法: server_name name[...];
默认: server_name"";
配置块 server
server_name后可以跟多个主机名称, 如server_name www.testweb.com 、 download.testweb.com; 在开始处理一个HTTP请求时,Nginx会取出header头中的Host,与每个server中的 server_name进行匹配,以此决定到底由哪一个server块来处理这个请求。有可能一个Host与 多个server块中的server_name都匹配,这时就会根据匹配优先级来选择实际处理的server块。 server_name与Host的匹配优先级如下 1)首先选择所有字符串完全匹配的server_name,如www.testweb.com 。 2)其次选择通配符在前面的server_name,如*.testweb.com。 3)再次选择通配符在后面的server_name,如www.testweb.* 。 4)最后选择使用正则表达式才匹配的server_name,如~^\.testweb\.com$。如果Host与所有的server_name都不匹配,这时将会按下列顺序选 择处理的server块。
1)优先选择在listen配置项后加入[default|default_server]的server块。
2)找到匹配listen端口的第一个server块
(3)server_names_hash_bucket_size server_names_hash_max_size 语法: server_names_hash_bucket_size size;
默认: server_names_hash_bucket_size 32|64|128;
配置块: http、server、location语法: server_names_hash_max_size size;
默认: server_names_hash_max_size 512;
配置块: http、server、location
为了提高快速寻找到相应server name的能力,Nginx使用散列表来存储server_name。 server_names_hash_bucket_size设置了每个散列桶占用的内存大小。 erver_names_hash_max_size会影响散列表的冲突率。server_names_hash_max_size越大, 消耗的内存就越多,但散列key的冲突率则会降低,检索速度也更server_names_hash_max_size越小,消耗的内存就越小,但散列key的冲突率可能增高 语法: server_name_in_redirect on|off;
默认: server_name_in_redirect on;
配置块: http、server或者location
该配置需要配合server_name使用。在使用on打开时,表示在重定向请求时会使用 server_name里配置的第一个主机名代替原先请求中的Host头部,而使用off关闭时,表示在重 定向请求时使用请求本身的Host头部。 语法: location[=|~|~*|^~|@]/uri/{...}
配置块 server
location会尝试根据用户请求中的URI来匹配上面的/uri表达式,如果可以匹配,就选择 location{}块中的配置来处理用户请求。 当然,匹配方式是多样的,下面介绍location的匹配规则(可使用正则表达式) 1)=表示把URI作为字符串,以便与参数中的uri做完全匹配 2)~表示匹配URI时是字母大小写敏感的。 3)~*表示匹配URI时忽略字母大小写问题。 4)^~表示匹配URI时只需要其前半部分与uri参数匹配即可。 5)@表示仅用于Nginx服务内部请求之间的重定向,带有@的location不直接处理用户请 求注意 1.location是有顺序的,当一个请求有可能匹配多个location时,实际上这个请求会 被第一个location处理 2.在以上各种匹配方式中,都只能表达为“如果匹配...则...”。如果需要表达“如果不匹配... 则...”,就很难直接做到。有一种解决方法是在最后一个location中使用/作为参数,它会匹配 所有的HTTP请求,这样就可以表示如果不能匹配前面的所有location,则由“/”这个location处 理。例如
location / {
# /可以匹配所有请求
…
}
语法: root path;
默认: root html;
配置块: http、server、location、if
例子:
location /download/ {
root optwebhtml;
}
在上面的配置中,如果有一个请求的URI是/download/index/test.html,那么Web服务器将 会返回服务器上optwebhtmldownload/index/test.html文件的内容。 语法: alias path;
配置块: location
alias也是用来设置文件资源路径的,它与root的不同点主要在于如何解读紧跟location后
面的uri参数,这将会致使alias与root以不同的方式将用户请求映射到真正的磁盘文件上。例
如,如果有一个请求的URI是/conf/nginx.conf,而用户实际想访问的文件:
location conf {
alias usr/local/nginx/conf/;
}
如果用root设置,那么语句如下所示: location conf {
root usr/local/nginx/;
}
使用alias时,在URI向实际文件路径的映射过程中,已经把location后配置的/conf这部分 字符串丢弃掉,因此,/conf/nginx.conf请求将根据alias path映射为path/nginx.conf。root则不 然,它会根据完整的URI请求来映射,因此,/conf/nginx.conf请求会根据root path映射为 path/conf/nginx.conf。这也是root可以放置到http、server、location或if块中,而alias只能放置 到location块中的原因 语法: index file...;
默认: index index.html;
配置块: http、server、location
有时,访问站点时的URI是/,这时一般是返回网站的首页,而这与root和alias都不同。 这里用ngx_http_index_module模块提供的index配置实现。index后可以跟多个文件参数,Nginx 将会按照顺序来访问这些文件,例如: location {
root path;
index index.html htmlindex.php /index.php;
}
接收到请求后,Nginx首先会尝试访问path/index.php文件,如果可以访问,就直接返回文 件内容结束请求,否则再试图返回pathhtmlindex.php文件的内容,依此类推。 语法: error_page code[code...][=|=answer-code]uri|@named_location
配置块: http、server、location、if
解释: 1. 当对于某个请求返回错误码时,如果匹配上了error_page中设置的code,则重定向到新 的URI中。例如: error_page 404 404.html;
error_page 502 503 504 50x.html;
error_page 403 http://example.com/forbidden.html
;
error_page 404 = @fetch;
2.虽然重定向了URI,但返回的HTTP错误码还是与原来的相同。用户可以通 过“=”来更改返回的错误码,例如
error_page 404 =200 empty.gif;
error_page 404 =403 forbidden.gif;
3. 如果不想修改URI,只是想让这样的请求重定向到另一个location中进行处理,那么可以 这样设
location / (
error_page 404 @fallback;
)
location @fallback (
proxy_pass http://backend
;
)
语法: recursive_error_pages[on|off];
默认: recursive_error_pages off;
配置块: http、server、location
(6)try_files 语法: try_files path1[path2]uri;
配置块: server、location
try_files后要跟若干路径,如path1 path2...,而且最后必须要有uri参数,意义如下:尝试 按照顺序访问每一个path,如果可以有效地读取,就直接向用户返回这个path对应的文件结 束请求,否则继续向下访问。如果所有的path都找不到有效的文件,就重定向到最后的参数 uri上。因此,最后这个参数uri必须存在,而且它应该是可以有效重定向的 try_files systemmaintenance.html $uri $uri/index.html $uri.html @other;
location @other {
proxy_pass http://backend
;
}
上面这段代码表示如果前面的路径,如systemmaintenance.html等,都找不到,就会反向 代理到http://backend 服务上。还可以用指定错误码的方式与error_page配合使用,例如 location {
try_files $uri $uri /error.phpc=404 =404;
}