Nginx 配置项记录

来源:互联网 发布:mac os 支持ntfs 编辑:程序博客网 时间:2024/05/16 11:09

一、用 HTTP 核心模块配置一个静态 Web 服务器

1、用于调试进程和定位问题的配置项
(1) 是否以守护进程方式运行 Nginx

     语法:daemon on|off     默认:daemon on;

正常情况下应该是以守护进程的方式运行。之所以提供这种功能,是为了方便跟踪调试 Nginx,毕竟用 gdb 调试进程时最繁琐的就是如果继续跟进 fork 出的子进程。

(2) 是否以 master/worker 方式工作

     语法:master_process on|off;     默认:master_process on;

与 daemon 配置相同,提供 master_process 配置也是为了方便跟踪调试 Nginx。如果用 off 关闭了 master_process 方式,就不会 fork 出worker 子进程来处理请求,而是用 master 进程自身来处理请求。

(3) error 日志的设置

     语法:error_log /path/file  level;     默认:error_log logs/error.log error;

设置 error 日志的路径和级别。路径设置为 /dev/null,这样就不会输出任何日志了,这也是关闭 error 日志的唯一手段;路径也可以是 stderr,这样日志输出到标准错误文件中。
level 是日式的输出级别,取值范围是 debug、info、notice、warn、error、crit、alert、emerg,从左到右级别依次增大。

(4) 是否处理几个特殊的调试点

     语法:debug_points [stop | abort]

如果 debug_points 设置为 abort,则会产生一个 coredump 文件,可以使用 gdb 来查看 Nginx 当时的各种信息。

(5) 仅对指定的客户端输出 debug 级别的日志

     语法:debug_connection [IP | CIDR]

这个配置实际上属于事件类配置,因此,它必须防贼 events {...} 中才有效。它的值可以是 IP 地址或 CIDR 地址,例如:

     events {          debug_connection 10.224.66.14;          debug_connection 10.224.57.0/24;     }

这样,仅仅来自以上 IP 地址的请求才会输出 debug 级别的日志,其他请求仍然使用 error_log 中的配置日志级别。

(6) 限制 coredump 和兴转储文件的大小

     语法:worker_rilimit_core size;

限制 coredump 文件的大小,防止硬盘占满,有效帮助用于定位问题。

(7) 指定 coredump 文件生成目录

     语法:working_directory path;

2、正常运行的配置项
(1) 定义环境变量

     语法:env VAR|VAR=VALUE;

(2) 嵌入其他配置文件

     语法:include /path/file

参数既可以是绝对路径,也可以是相对路径。参数的值可以是一个明确的文件名,也可以是含有通配符*的文件名,同时可以嵌入多个配置文件。

(3) pid 文件路径

     语法:pid path/file;     默认:pid logs/nginx.pid;

保存 master 进程 ID 的 pid 文件存放路径。

(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_rilimit_nofile limit;

(6) 限制信号队列

     语法:worker_rlimit_sigpending limit;

设置每个用户发往 Nginx 的信号队列的大小。也就是说,当某个用户的信号队列满了,这个用于再发送的信号量会被丢掉。

3、优化性能的配置项 (1) Nginx worker 进程个数

     语法:worker_processes number;     默认:worker_processes 1;

在 master/worker 运行方式下,定义 worker 进程的个数。

(2) 绑定 Nginx worker 进程指定的 CPU 内核

     语法:worker_cpu_affinity cpumask [cpumask...]

例子:

          worker_processes 4;          worker_cpu_affinity 1000 0100 0010 0001;

(3) SSL 硬件加速

     语法:ssl_engine device;

(4) 系统调用 gettimeofday 的执行频率

     语法:timer_resolution t;

(5) Nginx worker 进程优先级设置

     语法:worker_priority nice;     默认:worker_priority 0;

nice 值是进程的静态优先级,它的取值范围是-20~+19,-20值最高优先级,+19是最低优先级。

4、事件类配置项 (1) 是否打开 accept 锁

     语法:accept_mutex [on|off]     默认:accept_mutex on;

(2) lock 文件的路径

     语法:lock_file path/file;     默认:lock_file logs/nginx.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;

(5) 选择时间模型

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

(6) 每个 worker 的最大连接数

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

5、虚拟主机与请求的分发
(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]];

(2) 主机名称

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

server_name 后可以跟多个主机名称,如:

     server_name www.testweb.com、download.testweb.com;

在开始处理一个 HTTP 请求时,Nginx 会取出 header 头中的 Host,与每个 server 中的 server_name 进行匹配,以此决定到底由哪一个 server 块来处理这个请求。

(3) server_names_hash_bucket_size

     语法:server_names_hash_bucket_size size;     默认:server_names_hash_bucket_size 32|64|128;     配置块:http、sever、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、sever、location

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

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

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

(6) location

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

location 会尝试根据用户请求中的 URI 来匹配上面的 /uri 表达式,如果可以匹配,就选择 location {} 块中的配置来处理用户请求。当然,匹配方式是多样的,下面介绍 location 的匹配规则。
1) = 表示把 URI 作为字符串,以便与参数中的 uri 做完全匹配。例如:

     location = / {          # 只有当用户请求是 / 时,才会使用该 location 下的配置          ...     }

2) ~ 表示匹配 URI 时是字母大小写敏感的。
3) ~* 表示匹配 URI 时忽略字母大小写问题。
4) ~ 表示匹配 URI 时只需要其前半部分与 uri 参数匹配即可。例如:

     location ^~ /images/ {          # 以 /images/ 开始的请求都匹配上          ...     }

5) @ 表示仅用于 Nginx 服务器内部请求之间的重定向,带有 @ 的 location 不直接处理用户请求。
当然。在 uri 参数里是可以用则这表达式的,例如:

     location ~* \.(gif|jpg|jpeg)$ {          # 匹配以 .gif、.jpg、.jpeg 结尾的请求          ...     }

注意,当一个请求匹配多个 location 时,响应第一个请求。

6、文件你路径的定义
(1)以 root 方式设置资源路径

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

例如:定义资源文件相对于 HTTP 请求的根目录。

     location /download/ {          root /opt/web/html/;     }

在上面的配置中,如果有一个请求的 URI 是 /download/index/test.html,那么 Web 服务器将会放回服务器上 /opt/web/html/dowdnload/index/test.html 文件的内容。

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

     语法:alias path;     配置块:location

alias 与 root 的不同点主要在于如何解读紧跟 location 后面的 uri 参数。例如,有一个请求的 URI 是 /conf/nginx.conf,而用户实际想访问的文件在 /usr/local/nginx/conf/nginx.conf
使用 alias 来进行设置:

     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。

(3)访问首页

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

有时,访问站点时的 URI 是 /,这是一般是返回网站的首页,而这与 root 和 alias 都不同。这里用 ngx_http_index_module 模块提供的 index 配置实现。index 后可以跟多个文件参数,Nginx 将会按照顺序来访问这些文件,例如:

     location / {          root path;          index /index.html /html/index.php /index.php;     }

请收到请求后,Nginx 首先会尝试访问 path/index.php 文件,如果可以访问,就直接返回文件内容结束请求,否二再尝试返回 path/html/index.php 文件的内容。

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

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

当对于某个请求返回错误码时,如果匹配上了 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

注意,虽然重定向了 URI,但返回的 HTTP 错误码还是与原来的相同。用户可以通过“=”来更改返回的错误码,例如:

     error_page 404 =200 /empth.gif;     error_page 404 = 404 /forbidden.gif;

也可以不指定确切的返回错误码,而是由重定向后实际处理的真实结果来决定,这时,只要把“=”后面的错误码去掉即可,例如:

     error_page 404 = /empty.gif;

如果不想修改 URI,只是想让这样的请求重定向到另一个 location 中进行处理,那么可以这样处理:

     location / {          error_page 404 @fallback;     }     location @fallback {          proxy_pass http://backend;     }

这样,返回 404 的请求会被反向代理到  http://backend; 上游服务器中处理。

(5)是否允许递归使用 error_page

     语法: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 /system/maintenance.html $uri $uri/index.html $uri.html @other;     location @other {          proxy_pass http:backend;     }

上面这段代码表示如果前面的路径,如 /system/maintenance.html 等,都找不到,就反向代理到 http:backend 服务上。还可以用指定错误码的方式与 error_page 配合使用,例如:

     location / {          try_files $uri $uri/ /error.php?c=404 =404;     }

7、内存及磁盘资源的分配 (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

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

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

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

     语法:lager_client_header_buffers number size;     默认:lager_client_header_buffer 4 8k;     配置块: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 clent_body_temp;     配置块:http sever location

(7)connection_pool_size

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

Nginx 对于每个建立成功的 TCP 连接会预先分配一个内存池,上面的 size 配置项将会指定这个内存池的初始大小,用于减少内核对于小块内存的分配次数。

(8)request_pool_size

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

Nginx 开始处理 HTTP 请求时,将会为每个请求都分配一个内存池,size 配置项将制定这个内存池的初始大小,用于减少内核对于小块内存的分配次数。

8、网络连接的设置
(1)读取 HTTP 头部的超时时间

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

超时返回480。

(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

(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

(7)lingering_timeout

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

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

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

(9)keepalive 超时时间

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

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

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

(11)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

9、MIME 类型的设置
(1)MIME type 与文件扩展的映射

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

定义 MIME type 到文件扩展名的映射。多个多个扩展名可以映射到同一个 MIME type。例如:

     types {          text/html     html;          text/html     conf;          image/gif     gif;          image/jpeg     jpg;     }

(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 的冲突率就会降低,检索速度就更快。

10、对客户端请求的限制
(1)按 HTTP 方法名限制用户请求

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

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

     limit_except GET {          allow 192.168.1.0/32;          deny all;     }

注意:允许 GET 方法就意味着也允许 HEAD 方法。因此,上面这段代码表示的是禁止 GET 方法和 HEAD 方法,但其他 HTTP 方法是允许的。
备注(by Eddy):上面说代码是禁止 GET 方法和 HEAD 方法,但是 nginx 的官方文档是这样说的: Please note that this will limit access to all methods except GET and HEAD.这里说,除了 GET 和 HEAD 方法外,其他都被限制。到底是谁对谁错,有待验证。

(2)HTTP 请求包体的最大值

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

浏览器在发送含有较大 HTTP 包体的请求时,其头部会有一个 Content-Length 字段,client_max_body_size 是用来限制 Content-Length 所示值的大小的。

(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 后才开始限速。例如:

     limit_rate_after 1m;     limit_rate 100k;

11、文件操作的优化
(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     默认: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 种信息。

     1)文件句柄、文件大小和上次修改时间。     2)已经打开过的目录结构。     3)没有找到的或者没有权限操作的文件信息。

这样,通过读取缓存就减少了对磁盘的操作。
该配置项后面跟3中参数。

     1)max:表示在内存中存储元素的最大个数。当达到最大限制数量后,将采用 LRU(Least Recently Used)算法从缓存中淘汰最近最少使用的元素。     2)inactive:表示在 inactive 制定的时间段内没有被访问过的元素将会被淘汰。默认时间为60秒。     3)off:关闭缓存功能。

例如:

      open_file_cache max=1000 inactive=20s;

(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_calid 60s;     配置块:http server location

默认为每 60 秒检查一次缓存中的元素是否仍有效。

12、对客户端请求的特殊处理
(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

默认为 off,表示 HTTp 头部的名称中不允许带“_”。

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

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

处于性能考虑,Web 浏览器一般会在客户端本地缓存一些文件,并存储当时获取的时间。这样,下次向 Web 服务器获取缓存过得资源时,就可以用 IF-Modified-Since 头部把上次获取的时间捎带上,而 if_modify_since 将根据后面的参数决定如何处理 IF-Modified-Since 头部。
相关参数说明:

  • off:表示忽略用户请求中的 IF-Modified-Since 头部。这是,如果获取一个文件,那么会正常地返回文件内容。HTTP 响应码通常是200。
  • exact:将 IF-Modified-Since 头部包含的时间与将要返回的文件上次修改的时间做精准比较,如果没有匹配上,则返回200和文件的实际内容,如果匹配上,则表示浏览器缓存的文件内容已经是最新的了,没有必要再返回文件从而浪费时间与带宽了,这时会返回 304 Not Modified,浏览器收到后会直接读取自己的本地缓存。
  • before:是比 exact 更宽松的比较。只要文件的上次修改时间等于或者遭遇用户请求中的 IF-Modified-Since 头部的时间,就会想客户端返回 304 Not Midified。

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

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

当处理用户请求且需要访问文件时,如果没有找到文件,是否将错误日志记录到 error.log 文件中。

(5)merge_slashes

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

(6)DNS 解析地址

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

设置 DNS 名字解析服务器的地址,例如:

     resolver 127.0.0.1 192.0.2.1;

(7)DNS 解析的超时时间

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

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

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

13、ngx_http_core_model 模块提供的变量

暂时还不知怎么运用,保留参考《深入理解 Nginx 模块开发与架构解析》2.4.9。

二、用 HTTP proxy module 配置一个反向代理服务器 1、负载均衡的基本配置 ]]
(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句柄等,在其后还可以跟下列参数。

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

例如:

     upstream backend {          server backend1.example.com     weight=5;          server 127.0.0.1:8000                  max_fails=3 fail_timeout=30s;          server unix:/tmp/backend3;     }

(3)ip_hash

     语法:ip_hash     配置块:upstream

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

     upstream backend {          ip_hash;          server backend1.example.com;          server backend2.example.com;          server backend3.example.com down;          server backend4.example.com;     }

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

如果需要将负载均衡时的一些信息记录到 access_log 日志中,那么定义日志格式时可以使用负载均衡功能提供的变量。(暂时不知道怎么使用,具体变量参考《深入理解 Nginx 模块开发与框架解析》P64表格2-2)

2、反向代理的基本配置
(1)proxy_pass

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

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

     proxy_pass http://localhost:8000/url/;

也可以是 UNIX 句柄:

     proxy_pass http://unix:/path/to/backend.socket:/uri/;

还可以加上负载均衡中所示,直接使用 upstream 块,例如:

     upstream backend {          ...     }     server {          location / {               proxy_pass http://backend;          }     }

用户可以把 HTTP 转换成更安全的 HTTPS,例如:

     proxy_pass https://192.168.0.1;

默认情况下反向代理是不会转发请求中的 Host 头部的。如果需要转发,那么必须加上配置:

     proxy_set_header Host $host;

(2) proxy_method

     语法:proxy_method method;     配置项:http server location

此配置项表示转发时的协议方法名。例如设置为:

     proxy_method POST;

那么客户端发来的 GET 请求在转发时方法名也会改为 POST。

(3)proxy_hide_header

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

Nginx 会将上游服务器的响应转发给客户端,但默认不会转发以下 HTTP 头部字段:Data、Server、X-Pad 和 X-Accel-*。使用 proxy_hide_header 后可以任意地指定哪些 HTTP 头部字段不能被转发。例如:

     proxy_hide_header Cache-Control;     proxy_hide_header MicrosoftOfficeWebServer;

(4)proxy_pass_header

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

与 proxy_hide_header 功能相反,proxy_pass_header 会将原来禁止转发的 header 设置为允许转发。例如:

     proxy_pass_header X-Accel_Redirect;

(5)proxy_pass_request_body

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

作为确定是否向上游服务器发送 HTTP 包体部分。

(6)proxy_pass_request_headers

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

作用为确定是否转发 HTTP 头部。

(7)proxy_redirect

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

当上游服务器返回的响应时重定向或者刷新请求(如 HTTP 响应码是 301 或者 302)时,proxy_redirect 可以重设 HTTP 头部的 location 或 refresh 字段。例如:如果上游服务器发出的响应时 302 重定向请求,location 字段的 URI 是 http://localhost:8000/two/some/uri/,那么在下面的配置情况下,实际转发给客户端的 location 是  http://frontend/one/some/uri/。

     proxy_redirect http://localhost:8000/two/ http://frontend/one/;

这里可以使用 ngx-http-core-module 提供的变量来设置新的 location 字段。例如:

     proxy_redirect http://localhost:8000/ http://$host:$server_prot/;

也可以省略 replacement 参数中的主机名部分,这时会用虚拟主机名称来填充。例如:

     proxy_redirect http://localhost:8000/two/ /one/;

使用 off 参数时,将使 location 或者 refresh 字段维持不变。例如:

     proxy_redirect off;

使用默认的 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/;     }

(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 开始向客户端发送响应包,之后的过程中若出现错误也是不允许换下一台上游服务器继续处理的。这很好理解,这样才可以更好的保证客户端只收到来自一个上游服务器的应答。proxy_nextt_upstream 的参数用来说明在哪些情况下会继续选择下一台上游服务器转发请求。

  • 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 功能一出错就选择另一台上游服务器再次转发。

Nginx 的反向代理模块还提供了很多种配置,如设置连接的超时时间、临时文件如何存储,以及最重要的如何缓存上游服务器响应等功能。这些配置可以通过阅读 ngx_http_proxy_module 模块的说明了解,只有深入地理解,才能实现一个高性能的方向代理服务器。



本文记录的配置项并不包含 Nginx 的所有配置项,这些配置项都来源于《深入理解 Nginx 模块开发与框架解析》一书。 全部的配置项请参考官网: http://nginx.org/en/docs/ 官网配置项查阅方法:官网根据 nginx 的各个模块进行分类。根据配置项所属的模块点进去之后,就能看到该模块的所有配置项说明。
原创粉丝点击