虚拟主机与请求分发
配置监听端口,中括号为可选参数(server)
listen address:port [ default | default_server | backlog=num rcvbuf=size | accept_filter=filter | deferred | bind | ipv6only=[on|off] | ssl ]
default/default_server:把这个server快作为整个Web服务的默认块。如果没有设置,在nginx.conf中找到第一个server块作为默认server块。当一个请求无法匹配配置文件中所有主机域名时,会选用默认虚拟主机。
backlog=num:表示TCP中backlog等待队列大小。默认-1,表示不设置。
rcvbuf=size:表示监听句柄的SO_RCVBUF,套接字接收缓冲区大小。
sndbuf=size:表示监听句柄的SO_SNDBUF,套接字发送缓冲区大小。
accept_filter:设置accept过滤器,只对FreeBSD操作系统有效。
deferred:就算TCP三次握手结束时内核也不会分配worker处理,当用户发送数据时才分配worker处理。
bind:绑定当前端口/地址对,只有同时对一个端口监听多个地址时才会生效。
ssl:当前监听端口必须使用ssl协议。
配置主机名称(server)
server_name name1 name2 ...;
处理请求时,nginx会取出header中的Host,与每个server中的server_name进行匹配,决定由哪个server处理这个请求,优先级如下:
字符串完全匹配
通配符在前面 *.testweb.com
通配符在后面 www.testweb.*
正则表达式 ~^\.testweb\.com$
如果所有server_name和Host都不匹配,就按照下面优先级处理:
优先选择listen配置加入了default/default_server的server块。
匹配listen端口的第一个server块。
重定向主机名的处理(http/server/location)
server_name_in_redirect on | off;(默认为on)
on重定向时使用server_name配置的第一个主机名替换原先的host请求头。off则使用请求本身的host头部。
location模块(server)
location [=|~|~*|^*|@] /uri/ {...}
location会根据用户的uri来匹配上面的表达式,如果可以匹配则选择该location处理。
匹配规则:
= 完全匹配
~ 大小写敏感匹配
~* 大小写不敏感匹配
^~ 以配置的uri开始的请求都会被匹配
@ nginx服务内部重定向,不直接处理用户请求
location / {} 匹配所有请求
请求会被第一个匹配的location处理。
文件路径定义
root方式设置资源路径(http/server/location/if)
root path;
location /download/ {
root /opt/web/html/;
}
匹配/download/index/test.html。返回/opt/web/html/download/index/test.html。
读取文件路径:root路径+uri路径
alias方式设置资源路径(loction),与spring boot静态资源映射类似
alias path;
location /download/ {
alias /opt/web/html/;
}
匹配/download/index/test.html。返回/opt/web/html/index/test.html。
读取文件路径:alias路径+(uri - location路径)
首页访问(http/server/location)
index file1 file2 ...;
index index.html;(默认)
//访问跟目录返回首页
location \ {
index index.html index.php;
}
HTTP返回码重定向页面
//重定向页面,保留原来的返回码。
error_page 404 /404.html;
error_page 502 503 504 /50x.html;
error_page 403 http://example.com/forbidden.html; //重定向到另一个location
error_page 404 = @ fetch; //重定向到另一个location
//重定向页面,返回新的的返回码。
error_page 404 =200 /empty.gif;
error_page 404 =403 /forbidden.gif;
try_files
try_files path1 path2... uri
如果path都找不到,则重定向到uri。
TCP和Http内存池分配(http/server)
request_pool_size
单次http连接时分配的内存,http结束时销毁request_pool_size。
单次tcp连接时分配connection_pool_size的内存,http结束时销毁connection_pool_size。
如果是keep-alive连接,单次TCP连接可以用于多次http请求。
网络连接的设置
读取http头的超时时间(http/server/location)
client_header_timeout 60;(默认60s)
客户端与服务器建立连接后,开始接收http头部的等待时间,超过这个时间没有读取到用户发来的字节,认为超时,向用户返回408(request time out)。
读取http包体的超时时间(http/server/location)
client_header_timeout 60;(默认60s)
与请求头类似,不过这是读取包体(post放在body里)才有效。
发送相应的超时时间(http/server/location)
send_timeout 60;(默认60s)
nginx向客户端发送了数据包,但是客户端没有接收,过了这个超时时间,nginx会主动关闭这个连接。
发送相应的超时时间(http/server/location)
reset_timeout_connection on | off;
reset_timeout_connection off;(默认)
开启时,连接超时后不走四次挥手而是向客户端发送RST重置连接,释放套接字资源(例如滑动窗口)。RST关闭连接可能会带来一些问题。
关闭用户连接的方式(http/server/location)
lingering_close off | on |always
lingering_close on;(默认)
always:关闭连接前必须无条件处理连接上的所有用户发送的数据。
off:关闭连接前不理会连接上是否有准备就绪的来自用户发送的数据。
on:一般来说关闭连接前会处理连接上用户发送的数据。除了有些情况下业务认定之后数据是不需要的。
关闭前的超时时间(http/server/location)
lingering_timeout 5s;(默认)
在关闭前等待lingering_timeout 时间,如果没有数据可读,直接关闭连接。如果有,则在读取完连接缓存区的数据并丢弃后关闭连接。
lingering_time(http/server/location)
lingering_time 30;(默认)
用户请求的content-length大于max_client_body_size配置时,nginx会返回413(request entity too large)响应。但是很多客户端不理会,仍然会继续上传,这时经过lingering_time时间后,此时nginx不管用户是否在上传都会把连接关掉。
禁用keepalive(http/server/location)
keepalive_disable [ msie6 | safari | none ]...
keepalive_disable msie6 safari;(默认)
keepalive功能是为了让多个请求复用一个http长连接,这个功能对服务器性能提升有帮助。但是例如IE6和safari,它们使用keepalive时发送post请求处理有性能问题。所以默认IE6和safari禁止keepalive。
keepalive超时时间
MIME类型设置(http/server/location)
设置mime type到文件扩展名的映射。多个扩展名可以映射到同一个MIME type。
types {
text/html html;
text/html conf;
image/gif gif;
image/jpeg jpeg jpg;
}
按照请求方式限制客户端的请求(location)
参数取值包括:GET、HEAD、POST、PUT、DELETE、MKCOL、COPY、MOVE、OPTIONS、PROPFIND、PROPPATCH、LOCK、UNLOCK或PATCH。
limit_except GET POST {
allow 192.168.1.0/32;
deny all;
}
limit_except表示允许(限制除了),后面配置的请求方式,限制其他的方式。注意,允许GET将自动允许HEAD,反过来也一样。
HTTP包体请求最大值(http/server/location)
client_max_body_size size;
client_max_body_size 1m;
浏览器发送含有较大HTTP包体的请求时,头部会有一个content-length字段,client_max_body_size是用来限制content-length表示的值的大小,当用户上传大文件时,nginx收完请求头发现content-length大于限制的大小就直接返回413(request entity too large),而不用等接收完整个包体。
对请求限速(http/server/location/if)
表示限制服务器响应客户端时每秒发送的字节数,可用于下载限速。
limit_rate speed;
limit_rate 0;(默认,0为不限速)
可以针对不同客户端限速
server {
if ($slow) {
set $limit_rate 400k;
}
}
超过指定大小才开始限速(http/server/location/if)
limit_rate_after 1m;
limit_rate_after 100k;
响应长度超过limit_rate_after后才开始限速。
文件操作优化
开启sendfile(http/server/location)
sendfile on | off;(默认off)
可以启用Linux上的sendfile系统调用来发送文件,减少了用户态和内核态的两次内存复制。这样从磁盘读取文件后直接在内核态发送到网卡设备,提高发送效率。
打开文件缓存(http/server/location)
文件缓存会保存以下三种信息:
1、文件句柄、文件大小和上次修改事件。
2、已经打开过的目录结构。
3、没有找到的或没有权限的文件信息。
这样通过读取缓存可以减少对磁盘的操作。
open_file_cache off;(默认关闭)
open_file_cache max=1000 inactive=20s;
max:当内存中存储的元素到达1000时,采用LRU(least recently used)算法,移除最近最少使用的元素来保存新元素。
inactive:20s没有被访问过的元素会被淘汰。默认60s。
是否缓存打开文件错误的信息(http/server/location)
open_file_cache_errors on| off;
表示是否缓存打开文件时出现找不到路径或没有权限的等错误。
不被淘汰的最小访问次数(http/server/location)
open_file_cache_min_uses 1;
在inactive时间内被访问大于或等于open_file_cache_min_uses次的纪录不会被淘汰。
文件缓存检查频率
open_file_cache_valid 60s;
默认60s检查一次缓存中元素是否有效。
客户端请求的特殊处理
忽略不合法的http头部(http/server)
ignore_invalid_headers on| off;
ignore_invalid_headers on;(默认)
off:出现不合法头部时,nginx会拒绝服务,并响应400(bad request)错误。
on:则会忽略此HTTP头部。
http头是否允许下划线(http/server)
underscores_in_headers off | on;
默认为off,不允许头部名称中带"_"(下划线)
If-Modified-Since处理策略(http/server/location)
if_modified_since [off | exact | before];
if_modified_since exact;(默认)
if_modified_since代表浏览器本地缓存文件时的时间。
off:忽略该头部,每次返回最新文件。
exact:将if-modified-since与文件上次修改时间做精确对比,如果没有匹配上则返回文件最新内容,如果匹配上了则返回304(not modified),表示客户端文件是最新的,客户端收到读取本地缓存,没必要浪费宽带。
before:只要文件上次修改时间早于或等于if-modified-since时间就返回304给客户端。
合并多个/符号(http/server/location)
merge_slashes on | off;
merge_slashes on;(默认)
url中多个/符号相邻出现时合并为一个。
DNS地址解析(http/server/location)
resolver address....;
resolver 127.0.0.1 192.168.1.1;
设置dns服务解析地址
DNS地址解析超时时间(http/server/location)
resolver_timeout time;
resolver_timeout 30s;(默认)
返回错误页时是否标明nginx版本(http/server/location)
server_tokens on | off;
server_tokens on;(默认)
处理请求时出错,是否在响应的server头部中表明nginx版本。
负载均衡配置
集群配置(http)
upstream name {....}
upstream定义了一个上有服务器集群,便于反向代理的proxy_pass使用。
upstream backend {
server backend1.example.com;
server backend2.example.com;
server backend3.example.com;
}
server {
location /backend {
proxy_pass http://backend;
}
}
server配置(upstream)
server name [parameters];
集群中单台机器的配置。
upstream backend {
server backend1.example.com weight=5;
server 127.0.0.1:8080 max_fails=30s fail_timeout=30s;
server unix:/tmp/backend3;
}
name可以是域名,ip:port,unix句柄等。其后面的参数如下:
weight:设置服务器权重,默认1。
max_fails:默认1,表示fail_timeout时间段内,如果向上游服务器转发失败次数超过max_fails配置次数,则认为在fail_timeout时间段内服务器不可用。
fail_timeout:默认10s,表示在此时间段内转发失败次数超过max_fails次,则这段时间上有服务器不可用。
down:表示这台服务器永久下线。只有在使用ip_hash配置项才有用。
backup:在使用ip_hash配置时是无效的。表示只有其他上有服务器都不可用时才转发给它。
ip_hash配置(upstream)
ip_hash与权重不可以同时使用。
upstream backend {
ip_hash;
server backend1.example.com;
server backend2.example.com down;
}
通过对用户ip进行hash,让同一个用户每次请求同一个上游服务器。如果有一台服务器暂时不可用,不能直接删除,而是使用down参数进行标识,确保转发策略的一致性。
反向代理配置
proxy_pass配置(location/if)
proxy_pass url;
将当前请求反向代理到URL参数指定的服务器上。
proxy_pass http://localhost:8080/uri/;(常见url)
proxy_pass http://unix:/path/to/backend.socket:/uri/;(unix句柄)
proxy_pass http://backend;(upstream块)
默认反向代理不会转发Host头部,如果需要转发,加上配置:
proxy_set_header Host $host;
代理转发时请求方式配置(http/server/location)
proxy_method POST;
转发时客户端get请求也会改为post请求。
禁止转发响应头配置(http/server/location)
proxy_hide_header Cache-Control;
proxy_hide_header MicrosoftOfficeWebServer;
在转发响应给客户端时,配置在proxy_hide_header后面的响应头都会被忽略。
允许转发响应头配置(http/server/location)
proxy_pass_header Cache-Control;
proxy_pass_header MicrosoftOfficeWebServer;
在转发响应给客户端时,配置在proxy_pass_header后面的响应头都会被转发。
proxy_redirect(http/server/location)
proxy_redirect [ default | off | redirect replacement]
proxy_redirect default;(默认)
当上有服务器返回的是重定向或者刷新请求时(301/302),proxy_redirect可以重设头部的location或refresh字段,
off:关闭location的修改。
default:按照proxy_pass配置项,和所属的location配置项重组发送给客户端的location。
以下配置效果相同:
location /one/ {
proxy_pass http://upstream:port/two/;
proxy_redirect default;
}
location /one/ {
proxy_pass http://upstream:port/two/;
proxy_redirect http://upstream:port/two/ /one/;
}