【Linux网络编程】Nginx -- 配置项总结

【0】Nginx 基本配置项

【0.1】块配置项

块配置项由一个块配置项名和一对大括号组成;

events {

}
http {
    server {

    }
}

【0.2】配置项单位

空间大小单位
K或者k千字节(KiloByte, KB);M或者m兆字节(MegaByte, MB) 
时间单位
ms(毫秒),s(秒),m(分钟),h(小时),d(天),w(周, 包含7天),M(月, 包含30天),y(年, 包含365天)

【0.3】用于调试、 定位问题的配置项

1) 是否以守护进程方式运行Nginx
语法: daemon on|off;
默认: daemon on;

2) 是否以master/worker方式工作
语法: master_process on|off;
默认: master_process on;

3) error日志的设置
语法: error_log path/file level;
默认: error_log logs/error.log error;

4) 仅对指定的客户端输出debug级别的日志
语法: debug_connection[IP|CIDR]
注意: 必须放在events{...}中才有效

5) 限制coredump核心转储文件的大小
语法: worker_rlimit_core size;
说明: 核心转储(core dumps),在Linux系统中, 当进程发生错误或收到信号而终止时, 系统会将进程执行时的内存内容(核心映像) 写入一个文件(core文件) , 以作为调试之用;

6) 指定coredump文件生成目录
语法: working_directory path;

【0.4】正常运行的必备配置项

1) 定义环境变量
语法: env VAR|VAR=VALUE

2) 嵌入其他配置文件
语法: includepathfile;

3) pid文件的路径
语法: pid path/file;
默认: pid logs/nginx.pid;
保存master进程ID的pid文件存放路径,默认与configure执行时的参数“--pid-path”所指定的路径相同,但应确保Nginx有权在相应的目标中创建pid文件, 该文件直接影响Nginx是否可以运行

4) Nginx worker进程运行的用户及用户组
语法: user username[groupname];
默认: user nobody nobody;
user用于设置master进程启动后, fork出的worker进程运行在哪个用户和用户组下;当按照“user username;”设置时, 用户组名与用户名相同;
若用户在configure命令执行时使用了参数--user=username和--group=groupname, 此时nginx.conf将使用参数中指定的用户和用户组;

5) 指定Nginx worker进程可以打开的最大句柄描述符个数
语法: worker_rlimit_nofile limit;

6) 限制信号队列
语法: worker_rlimit_sigpending limit;
设置每个用户发往Nginx的信号队列的大小,也就是说, 当某个用户的信号队列满了,这个用户再发送的信号量会被丢掉;

【0.5】优化性能的配置项

1) Nginx worker进程个数
语法: worker_processes number;
默认: worker_processes 1;
建议: 每个worker进程都是单线程的进程, 它们会调用各个模块以实现多种多样的功能;
如果这些模块确认不会出现阻塞式的调用, 那么,有多少CPU内核就应该配置多少个进程;
反之, 如果有可能出现阻塞式调用, 那么需要配置稍多一些的worker进程

2) 绑定Nginx worker进程到指定的CPU内核
语法: worker_cpu_affinity cpumask[cpumask...]

3) SSL硬件加速
语法: ssl_engine device;

4) Nginx worker进程优先级设置
语法: worker_priority nice;
默认: worker_priority 0;
建议: nice值是进程的静态优先级, 它的取值范围是–20~+19, –20是最高优先级, +19是最低优先级;
因此,如果用户希望Nginx占有更多的系统资源,那么可以把nice值配置得更小一些,但不建议比内核进程的nice值(通常为–5)还要小;

【0.6】事件类配置项

1) 是否打开accept锁
语法: accept_mutex[on|off]
默认: accept_mutext on;
说明: accept_mutex这把锁可以让多个worker进程轮流地、序列化地与新的客户端建立TCP连接

2) lock文件的路径
语法: lock_file path/file;
默认: lock_file logs/nginx.lock;
说明: 如果打开了accept锁,并且由于编译程序、操作系统架构等因素导致Nginx不支持原子锁,这时会用文件锁实现accept锁,这样lock_file指定的lock文件才会生效

3) 使用accept锁后到真正建立连接之间的延迟时间
语法: accept_mutex_delay Nms;
默认: accept_mutex_delay 500ms;
说明: 在使用accept锁后,同一时间只有一个worker进程能够取到accept锁;
accept锁不是阻塞锁,如果取不到会立刻返回;如果有一个worker进程试图取accept锁而没有取到,它至少要等accept_mutex_delay定义的时间间隔后才能再次试图取锁;

4) 批量建立新连接
语法: multi_accept[on|off];
默认: multi_accept off;
说明: 当事件模型通知有新连接时,尽可能地对本次调度中客户端发起的所有TCP请求都建立连接;

5) 选择事件模型
语法: use[kqueue|rtsig|epoll|/dev/poll|select|poll|eventport];
默认: Nginx会自动使用最适合的事件模型

6) 每个worker的最大连接数
语法: worker_connections number;
说明: 定义每个worker进程可以同时处理的最大连接数;

【1】基于 Nginx 配置静态 Web 服务器

静态 Web 服务器的主要功能由 ngx_http_core_module 模块(HTTP 框架的主要成员)实现,Nginx 为配置一个完整的静态 Web 服务器提供如下功能

【1.1】虚拟主机与请求的分发;

1) 监听端口

语法: 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]];
默认: listen 80;
配置块: server

说明:

  • default/default_server: 将所在的server块作为整个Web服务的默认server块;
  • 如果没有设置这个参数,那么将会以在nginx.conf中找到的第一个server块作为默认server块;
  • 当一个请求无法匹配配置文件中的所有主机域名时,就会选用默认的虚拟主机;
  • backlog=num: 表示TCP中backlog队列的大小;默认为 –1,表示不予设置;
  • 在TCP建立三次握手过程中,进程还没有开始处理监听句柄,这时backlog队列将会放置这些新连接;如果backlog队列已满,还有新的客户端试图通过三次握手建立TCP连接,这时客户端将会建立连接失败;
  • rcvbuf=size: 设置监听句柄的SO_RCVBUF参数;
  • sndbuf=size: 设置监听句柄的SO_SNDBUF参数;
  • accept_filter: 设置accept过滤器,只对FreeBSD操作系统有用;
  • deferred: 在设置该参数后,若用户发起建立连接请求,并且完成了TCP的三次握手,内核也不会为了这次的连接调度worker进程来处理,只有用户真的发送请求数据时,内核才会唤醒worker进程处理这个连接;
  • 这个参数适用于大并发的情况下,它减轻了worker进程的负担;当请求数据来临时,worker进程才会开始处理这个连接;
  • bind: 绑定当前端口/地址对,如127.0.0.1:8000,只有同时对一个端口监听多个地址时才会生效;
  • ssl: 在当前监听的端口上建立的连接必须基于SSL协议;

2) 主机名称

语法: server_name name[...];
默认: server_name"";
配置块: server

说明:

  • 在开始处理一个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_bucket_size size;
默认: server_names_hash_bucket_size 32|64|128;
配置块: http、 server、 location

说明: 为了提高快速寻找到相应server name的能力,Nginx使用散列表来存储server name;server_names_hash_bucket_size设置了每个散列桶占用的内存大小

4) server_names_hash_max_size

语法: server_names_hash_max_size size;
默认: server_names_hash_max_size 512;
配置块: http、 server、 location

说明:

  • server_names_hash_max_size会影响散列表的冲突率;
  • server_names_hash_max_size越大,消耗的内存就越多,但散列key的冲突率则会降低,检索速度也更快;server_names_hash_max_size越小,消耗的内存就越小,但散列key的冲突率可能增高;

5) 重定向主机名称的处理

语法: server_name_in_redirect on|off;
默认: server_name_in_redirect on;
配置块: http、server、location

说明:

  • 该配置需要配合server_name使用,
  • 使用on打开时,表示在重定向请求时会使用server_name里配置的第一个主机名代替原先请求中的Host头部;
  • 使用off关闭时, 表示在重定向请求时使用请求本身的Host头部;

6) location

语法: location[=|~|~*|^~|@]/uri/{...}
配置块: server

说明:

  • location的匹配规则
  • 1) =表示把URI作为字符串,以便与参数中的uri做完全匹配
  • 2) ~表示匹配URI时是字母大小写敏感的
  • 3) ~*表示匹配URI时忽略字母大小写问题
  • 4) ^~表示匹配URI时只需要其前半部分与uri参数匹配即可
  • 5) @表示仅用于Nginx服务内部请求之间的重定向,带有@的location不直接处理用户请求

【1.2】文件路径的定义;

1) 以root方式设置资源路径

语法: root path;
默认: root html;
配置块: http、 server、 location、 if

2) 以alias方式设置资源路径

语法: alias path;
配置块: location

alias也是用来设置文件资源路径的,它与root的不同点主要在于解读紧跟location后面的uri参数的方式,这将会致使alias与root以不同的方式将用户请求映射到真正的磁盘文件上;

alias VS root 示例

若有一个请求的URI是/conf/nginx.conf,而用户实际想访问的文件在usr/local/nginx/conf/nginx.conf
location conf {
    alias usr/local/nginx/conf/;
}
location conf {
    root usr/local/nginx/;
}

3) 访问首页

语法: index file...;
默认: index index.html;
配置块: http、 server、 location

4) 根据HTTP返回码重定向页面

语法: error_page code[code...][=|=answer-code]uri|@named_location
配置块: http、 server、 location、 if

5) 是否允许递归使用error_page

语法: recursive_error_pages[on|off];
默认: recursive_error_pages off;
配置块: http、 server、 location
确定是否允许递归地定义error_page

6) try_files

语法: try_files path1[path2]uri;
配置块: server、 location

说明:

  • try_files后要跟若干路径,如path1 path2...,而且最后必须要有uri参数;
  • 意义如下
  • 尝试按照顺序访问每一个path,如果可以有效地读取,就直接向用户返回这个path对应的文件结束请求,否则继续向下访问;
  • 如果所有的path都找不到有效的文件, 就重定向到最后的参数uri上;因此, 最后这个参数uri必须存在, 而且它应该是可以有效重定向的;

【1.3】内存及磁盘资源的分配;

1) HTTP包体只存储到磁盘文件中

语法: client_body_in_file_only on|clean|off;
默认: client_body_in_file_only off;
配置块: http、 server、 location

说明:

  • 当值为非off时,用户请求中的HTTP包体一律存储到磁盘文件中,即使只有0字节也会存储为文件;
  • 当请求结束时,如果配置为on,则这个文件不会被删除(该配置一般用于调试、定位问题),但如果配置为clean,则会删除该文件;

2) HTTP包体尽量写入到一个内存buffer中

语法: client_body_in_single_buffer on|off;
默认: client_body_in_single_buffer off;
配置块: http、 server、 location

说明:

  • 用户请求中的HTTP包体一律存储到内存buffer中,如果HTTP包体的大小超过了client_body_buffer_size设置的值,包体还是会写入到磁盘文件中

3) 存储HTTP头部的内存buffer大小

语法: client_header_buffer_size size;
默认: client_header_buffer_size 1k;
配置块: http、 server

说明:

  • 定义了正常情况下Nginx接收用户请求中HTTP header部分(包括HTTP行和HTTP头部)时分配的内存buffer大小;
  • 若请求中的HTTP header部分会超过这个大小,则large_client_header_buffers定义的buffer将会生效;

4) 存储超大HTTP头部的内存buffer大小

语法: large_client_header_buffers number size;
默认: large_client_header_buffers 48k;
配置块: http、 server

5) 存储HTTP包体的内存buffer大小

语法: client_body_buffer_size size;
默认: client_body_buffer_size 8k/16k;
配置块: http、 server、 location

6) HTTP包体的临时存放目录

语法: client_body_temp_path dir-path[level1[level2[level3]]]
默认: client_body_temp_path client_body_temp;
配置块: http、 server、 location

7) connection_pool_size TCP连接内存池大小

语法: connection_pool_size size;
默认: connection_pool_size 256;
配置块: http、 server

8) request_pool_size HTTP请求内存池大小

语法: request_pool_size size;
默认: request_pool_size 4k;
配置块: http、 server

【1.4】网络连接的设置;

1) 读取HTTP头部的超时时间

语法: client_header_timeout time(默认单位: 秒);
默认: client_header_timeout 60;
配置块: http、 server、 location

2) 读取HTTP包体的超时时间

语法: client_body_timeout time(默认单位: 秒);
默认: client_body_timeout 60;
配置块: http、 server、 location

3) 发送响应的超时时间

语法: send_timeout time;
默认: send_timeout 60;
配置块: http、 server、 location

4) reset_timeout_connection

语法: reset_timeout_connection on|off;
默认: reset_timeout_connection off;
配置块: http、 server、 location

说明

  • 连接超时后将通过向客户端发送RST包来直接重置连接;
  • 这个选项打开后,Nginx会在某个连接超时后,不使用正常情形下的四次握手关闭TCP连接,而是直接向用户发送RST重置包,
  • 不再等待用户的应答,直接释放Nginx服务器上关于这个套接字使用的所有缓存;
  • 相比正常的关闭方式,它使得服务器避免产生许多处于FIN_WAIT_1、FIN_WAIT_2、TIME_WAIT状态的TCP连接;

5) lingering_close

语法: lingering_close off|on|always;
默认: lingering_close on;
配置块: http、 server、 location

说明:

  • 该配置控制Nginx关闭用户连接的方式;
  • always表示关闭用户连接前必须无条件地处理连接上所有用户发送的数据;
  • off表示关闭连接时完全不管连接上是否已经有准备就绪的来自用户的数据;
  • on是中间值, 一般情况下在关闭连接前都会处理连接上的用户发送的数据,除了有些情况下在业务上认定这之后的数据是不必要的;

6) lingering_time

语法: lingering_time time;
默认: lingering_time 30s;
配置块: http、 server、 location

说明:

  • lingering_close启用后,这个配置项对于上传大文件很有用;
  • 当用户请求的Content-Length大于max_client_body_size配置时,Nginx服务会立刻向用户发送413(Requestentity too large) 响应;
  • 但是,很多客户端可能不管413返回值,仍然持续不断地上传HTTP body,这时,经过了lingering_time设置的时间后,Nginx将不管用户是否仍在上传,都会把连接关闭掉;

7) lingering_timeout

语法: lingering_timeout time;
默认: lingering_timeout 5s;
配置块: http、 server、 location

说明:

  • lingering_close生效后,在关闭连接前,会检测是否有用户发送的数据到达服务器,
  • 如果超过lingering_timeout时间后还没有数据可读,就直接关闭连接; 
  • 否则,必须在读取完连接缓冲区上的数据并丢弃掉后才会关闭连接;

8) 对某些浏览器禁用keepalive功能

语法: keepalive_disable[msie6|safari|none]...
默认: keepalive_disablemsie6 safari
配置块: http、 server、 location

说明:

  • HTTP请求中的keepalive功能是为了让多个请求复用一个HTTP长连接;
  • 有些浏览器,如IE 6和Safari,对于使用keepalive功能的POST请求处理有功能性问题;

9) keepalive超时时间

语法: keepalive_timeout time(默认单位: 秒);
默认: keepalive_timeout 75;
配置块: http、 server、 location

说明:

  • 一个keepalive连接在闲置超过一定时间后(默认的是75秒), 服务器和浏览器都会去关闭这个连接;

10) 一个keepalive长连接上允许承载的请求最大数

语法: keepalive_requests n;
默认: keepalive_requests 100;
配置块: http、 server、 location

11) tcp_nodelay 确定对keepalive连接是否使用TCP_NODELAY选项

语法: tcp_nodelay on|off;
默认: tcp_nodelay on;
配置块: http、 server、 location

12) tcp_nopush

语法: tcp_nopush on|off;
默认: tcp_nopush off;
配置块: http、 server、 location

说明:

  • 在打开sendfile选项时,确定是否开启FreeBSD系统上的TCP_NOPUSH或Linux系统上的TCP_CORK功能;
  • 打开tcp_nopush后,将会在发送响应时把整个响应包头放到一个TCP包中发送;

【1.5】MIME 类型的设置;

1) MIME type与文件扩展的映射,定义MIME type到文件扩展名的映射,多个扩展名可以映射到同一个MIME type

语法: type{...};
配置块: http、 server、 location

2) 默认MIME type

语法: default_type MIME-type;
默认: default_type text/plain;
配置块: http、 server、 location

说明:

  • 当找不到相应的MIME type与文件扩展名之间的映射时,使用默认的MIME type作为HTTP header中的Content-Type

3) types_hash_bucket_size

语法: types_hash_bucket_size size;
默认: types_hash_bucket_size 32|64|128;
配置块: http、 server、 location

说明:

  • 为了快速寻找到相应MIME type, Nginx使用散列表来存储MIME type与文件扩展名,types_hash_bucket_size设置了每个散列桶占用的内存大小;

4) types_hash_max_size

语法: types_hash_max_size size;
默认: types_hash_max_size 1024;
配置块: http、 server、 location

说明:

  • types_hash_max_size影响散列表的冲突率,
  • types_hash_max_size越大,就会消耗更多的内存,但散列key的冲突率会降低,检索速度就更快;
  • types_hash_max_size越小,消耗的内存就越小,但散列key的冲突率可能上升;

【1.6】对客户端请求的限制;

1) 按HTTP方法名限制用户请求

语法: limit_except method...{...}
配置块: location

说明:

  • Nginx通过limit_except后面指定的方法名来限制用户请求;
  • 方法名可取值包括: GET、 HEAD、 POST、 PUT、 DELETE、 MKCOL、 COPY、 MOVE、 OPTIONS、 PROPFIND、 PROPPATCH、 LOCK、 UNLOCK或者PATCH;

2) HTTP请求包体的最大值

语法: client_max_body_size size;
默认: client_max_body_size 1m;
配置块: http、 server、 location

3) 对请求的限速

语法: limit_rate speed;
默认: limit_rate 0;
配置块: http、 server、 location、 if

4) limit_rate_after

语法: limit_rate_after time;
默认: limit_rate_after 1m;
配置块: http、 server、 location、 if

说明:

  • 此配置表示Nginx向客户端发送的响应长度超过limit_rate_after后才开始限速

【1.7】文件操作的优化;

1) sendfile系统调用

语法: sendfile on|off;
默认: sendfile off;
配置块: http、 server、 location

说明:

  • 可以启用Linux上的sendfile系统调用来发送文件,它减少了内核态与用户态之间的两次内存复制,从而从磁盘中读取文件后直接在内核态发送到网卡设备,提高了发送文件的效率

2) AIO系统调用

语法: aio on|off;
默认: aio off;
配置块: http、 server、 location

说明:

  • 此配置项表示是否在FreeBSD或Linux系统上启用内核级别的异步文件I/O功能;注意,它与sendfile功能是互斥的

3) directio

语法: directio size|off;
默认: directio off;
配置块: http、 server、 location

说明:

  • 此配置项在FreeBSD和Linux系统上使用O_DIRECT选项去读取文件,缓冲区大小为size,通常对大文件的读取速度有优化作用;注意,它与sendfile功能是互斥的

4) directio_alignment

语法: directio_alignment size;
默认: directio_alignment 512;
配置块: http、 server、 location

说明:

  • 与directio配合使用,指定以directio方式读取文件时的对齐方式;一般情况下, 512B 已经足够了,但针对一些高性能文件系统,如Linux下的XFS文件系统,可能需要设置到4KB作为对齐方式

5) 打开文件缓存

语法: open_file_cache max=N[inactive=time]|off;
默认: open_file_cache off;
配置块: http、 server、 location

说明:

  • 文件缓存会在内存中存储以下3种信息:文件句柄、 文件大小和上次修改时间;已经打开过的目录结构;没有找到的或者没有权限操作的文件信息
  • 配置项3种参数:
  • max:表示在内存中存储元素的最大个数,当达到最大限制数量后,将采用LRU(Least Recently Used)算法从缓存中淘汰最近最少使用的元素;
  • inactive:表示在inactive指定的时间段内没有被访问过的元素将会被淘汰,默认时间为60秒;
  • off:关闭缓存功能

6) 是否缓存打开文件错误的信息

语法: open_file_cache_errors on|off;
默认: open_file_cache_errors off;
配置块: http、 server、 location
  • 说明:此配置项表示是否在文件缓存中缓存打开文件时出现的找不到路径、没有权限等错误信息

7) 不被淘汰的最小访问次数

语法: open_file_cache_min_uses number;
默认: open_file_cache_min_uses 1;
配置块: http、 server、 location

说明:

  • 它与open_file_cache中的inactive参数配合使用,如果在inactive指定的时间段内,访问次数超过了open_file_cache_min_uses指定的最小次数,那么将不会被淘汰出缓存

8) 检验缓存中元素有效性的频率

语法: open_file_cache_valid time;
默认: open_file_cache_valid 60s;
配置块: http、 server、 location

【1.8】对客户端请求的特殊处理;

1) 忽略不合法的HTTP头部

语法: ignore_invalid_headers on|off;
默认: ignore_invalid_headers on;
配置块: http、 server

说明:

  • 如果将其设置为off,那么当出现不合法的HTTP头部时,Nginx会拒绝服务,并直接向用户发送400(Bad Request)错误;
  • 如果将其设置为on,则会忽略此HTTP头部

2) HTTP头部是否允许下划线

语法: underscores_in_headers on|off;
默认: underscores_in_headers off;
配置块: http、 server

3) 对If-Modified-Since头部的处理策略

语法: if_modified_since[off|exact|before];
默认: if_modified_since exact;
配置块: http、 server、 location

说明:

  • 出于性能考虑,Web浏览器一般会在客户端本地缓存一些文件,并存储当时获取的时间;下次向Web服务器获取缓存过的资源时,就可以用If-Modified-Since头部把上次获取的时间带上,而if_modified_since将根据后面的参数决定如何处理If-Modified-Since头部
  • 参数:
  • off: 表示忽略用户请求中的If-Modified-Since头部;此时如果获取一个文件,那么会正常地返回文件内容,HTTP响应码通常是200;
  • exact: 将If-Modified-Since头部包含的时间与将要返回的文件上次修改的时间做精确比较,
  • 如果没有匹配上,则返回200和文件的实际内容,
  • 如果匹配上,则表示浏览器缓存的文件内容已经是最新的了,没有必要再返回文件从而浪费时间与带宽,这时会返回304 NotModified,浏览器收到后会直接读取自己的本地缓存;
  • before: 是比exact更宽松的比较,只要文件的上次修改时间等于或者早于用户请求中的If-Modified-Since头部的时间,就会向客户端返回304 Not Modified

4) 文件未找到时是否记录到error日志

语法: log_not_found on|off;
默认: log_not_found on;
配置块: http、 server、 location

5) merge_slashes

语法: merge_slashes on|off;
默认: merge_slashes on;
配置块: http、 server、 location

说明:

  • 此配置项表示是否合并相邻的“/”;
  • 例如,/test///a.txt,在配置为on时,会将其匹配为location/test/a.txt;如果配置为off,则不会匹配,URI将仍然是//test///a.txt

6) DNS解析地址

语法: resolver address...;
配置块: http、 server、 location

7) DNS解析的超时时间

语法: resolver_timeout time;
默认: resolver_timeout 30s;
配置块: http、 server、 location

8) 返回错误页面时是否在Server中注明Nginx版本

语法: server_tokens on|off;
默认: server_tokens on;
配置块: http、 server、 location

【2】基于 Nginx 配置负载均衡服务器

1) upstream块

语法: upstream name{...}
配置块: http

说明:

  • upstream块定义了一个上游服务器的集群,便于反向代理中的proxy_pass使用

示例: 

upstream backend {
    server backend1.example.com;
    server backend2.example.com;
    server backend3.example.com;
}
server {
    location / {
        proxy_pass http://backend;
    }
}

2) server

语法: server name[parameters];
配置块: upstream

说明:

  • server配置项指定了一台上游服务器的名字,这个名字可以是域名、IP地址端口、UNIX句柄等

参数:

  • weight=number:设置向这台上游服务器转发的权重,默认为1
  • max_fails=number:该选项与fail_timeout配合使用,指在fail_timeout时间段内,
  • 如果向当前的上游服务器转发失败次数超过number,则认为在当前的fail_timeout时间段内这台上游服务器不可用; 
  • max_fails默认为1,如果设置为0,则表示不检查失败次数;
  • fail_timeout=time:fail_timeout表示该时间段内转发失败多少次后就认为上游服务器暂时不可用,用于优化反向代理功能;
  • 它与向上游服务器建立连接的超时时间、读取上游服务器的响应超时时间等完全无关;
  • fail_timeout默认为10秒;
  • down:表示所在的上游服务器永久下线,只在使用ip_hash配置项时才有用
  • backup:在使用ip_hash配置项时它是无效的,它表示所在的上游服务器只是备份服务器,只有在所有的非备份上游服务器都失效后,才会向所在的上游服务器转发请求;

3) ip_hash

语法: ip_hash;
配置块: upstream

说明:

  • 在有些场景下,我们可能会希望来自某一个用户的请求始终落到固定的一台上游服务器中;
  • 例如,假设上游服务器会缓存一些信息,如果同一个用户的请求任意地转发到集群中的任一台上游服务器中,那么每一台上游服务器都有可能会缓存同一份信息,这既会造成资源的浪费,也会难以有效地管理缓存信息;
  • ip_hash就是用以解决上述问题的,它首先根据客户端的IP地址计算出一个key,将key按照upstream集群里的上游服务器数量进行取模,然后以取模后的结果把请求转发到相应的上游服务器中;这样就确保了同一个客户端的请求只会转发到指定的上游服务器中;
  • ip_hash与weight(权重)配置不可同时使用,如果upstream集群中有一台上游服务器暂时不可用,不能直接删除该配置,而是要down参数标识,确保转发策略的一贯性;

4) 记录日志时支持的变量

nginx查询修改当前时间 nginx 时间单位_Nginx

【3】基于 Nginx 配置反向代理服务器

1) proxy_pass

语法: proxy_pass URL;
配置块: location、 if

说明:

  • 此配置项将当前请求反向代理到URL参数指定的服务器上,URL可以是主机名或IP地址加端口的形式

2) proxy_method 配置转发时的协议方法名

语法: proxy_method method;
配置块: http、 server、 location

3) proxy_hide_header:任意地指定哪些HTTP头部字段不能被转发

语法: proxy_hide_header the_header;
配置块: http、 server、 location

说明:

  • Nginx会将上游服务器的响应转发给客户端,但默认不会转发以下HTTP头部字段:Date、 Server、 X-Pad和X-Accel-*;

4) proxy_pass_header 将原来禁止转发的header设置为允许转发

语法: proxy_pass_header the_header;
配置块: http、 server、 location

5) proxy_pass_request_body 确定是否向上游服务器发送HTTP包体部分

语法: proxy_pass_request_body on|off;
默认: proxy_pass_request_body on;
配置块: http、 server、 location

6) proxy_pass_request_headers 确定是否转发HTTP头部

语法: proxy_pass_request_headers on|off;
默认: proxy_pass_request_headers on;
配置块: http、 server、 location

7) proxy_redirect

语法: proxy_redirect[default|off|redirect replacement];
默认: proxy_redirect default;
配置块:http、 server、 location

说明:

  • 当上游服务器返回的响应是重定向或刷新请求(如HTTP响应码是301或者302)时,proxy_redirect可以重设HTTP头部的location或refresh字段;

配置 :
proxy_redirect http://localhost:8000/two/
    http://frontendonesome; 如果上游服务器发出的响应是302重定向请求,location字段的URI是http://localhost:8000/two/some/uri/,实际转发给客户端的location是http://frontendonesome/uri/

8) proxy_next_upstream

语法:proxy_next_upstream[error|timeout|invalid_header|http_500|http_502|http_503|http_504|http_404|off];
默认: proxy_next_upstream error timeout;
配置块: http、 server、 location

说明:

  • 此配置项表示当向一台上游服务器转发请求出现错误时,继续换一台上游服务器处理这个请求;
  • 上游服务器一旦开始发送应答,Nginx反向代理服务器会立刻把应答包转发给客户端,因此,一旦Nginx开始向客户端发送响应包,之后的过程中若出现错误是不允许换下一台上游服务器继续处理的;这样才可以更好地保证客户端只收到来自一个上游服务器的应答;
  • 参数用来说明会继续选择下一台上游服务器转发请求的情况
  • error: 当向上游服务器发起连接、发送请求、读取响应时出错;
  • timeout: 发送请求或读取响应时发生超时;
  • invalid_header: 上游服务器发送的响应是不合法的;
  • http_500: 上游服务器返回的HTTP响应码是500;
  • http_502: 上游服务器返回的HTTP响应码是502;
  • http_503: 上游服务器返回的HTTP响应码是503;
  • http_504: 上游服务器返回的HTTP响应码是504;
  • http_404: 上游服务器返回的HTTP响应码是404;
  • off:关闭proxy_next_upstream功能—出错就选择另一台上游服务器再次转发;

参考致谢
本博客为博主的学习实践总结,并参考了众多博主的博文,在此表示感谢,博主若有不足之处,请批评指正。

【1】深入理解 Nginx 模块开发与架构解析