1、日志记录模块(ngx_http_log_module)

以指定格式写入请求日志。

  • access_log
  1. Syntax: access_log path [format [buffer=size] [gzip[=level]] [flush=time] [if=condition]];
  2. access_log off;
  3. Default: access_log logs/access.log combined;
  4. Context: http, server, location, if in location, limit_except

设置日志写入的路径、格式和配置。例如:

  1. access_log /path/to/log.gz combined gzip flush=5m;
  2. #如果希望gzip正常工作,nginx必须构建zlib库
  • log_format
  1. Syntax: log_format name [escape=default|json|none] string ...;
  2. Default: log_format combined "...";
  3. Context: http

指定日志的格式。日志格式可以包含公共变量和仅在日志写入时存在的变量。

配置样例:

  1. log_format compression '$remote_addr - $remote_user [$time_local] '
  2. '"$request" $status $bytes_sent '
  3. '"$http_referer" "$http_user_agent" "$gzip_ratio"';
  4. access_log /spool/logs/nginx-access.log compression buffer=32k;
  5. #json格式日志:
  6. log_format json '{"@timestamp":"$time_iso8601",'
  7. '"client_ip":"$remote_addr",'
  8. '"size":$body_bytes_sent,'
  9. '"responsetime":$request_time,'
  10. '"upstreamtime":"$upstream_response_time",'
  11. '"upstreamhost":"$upstream_addr",'
  12. '"http_host":"$host",'
  13. '"method":"$request_method",'
  14. '"request_uri":"$request_uri",'
  15. '"xff":"$http_x_forwarded_for",'
  16. '"referrer":"$http_referer",'
  17. '"agent":"$http_user_agent",'
  18. '"status":"$status"}';
  • open_log_file_cache
  1. Syntax: open_log_file_cache max=N [inactive=time] [min_uses=N] [valid=time];
  2. open_log_file_cache off;
  3. Default: open_log_file_cache off;
  4. Context: http, server, location

定义一个缓存,用于存储名称中包含变量的常用日志的文件描述符。缓存常用日志文件相关的元数据信息。

  1. open_log_file_cache max=1000 inactive=20s valid=1m min_uses=2;
  2. #max:缓存的最大文件描述符数量
  3. #min_uses:在inactive定义的时间内,允许描述符在缓存中保持打开状态的最小文件使用数
  4. #inactive:如果在此期间没有访问,则关闭缓存描述符的时间;
  5. #valid:此时间超时后,会检查文件还是否具有相同的名字。验正缓存中各缓存项是否为活动项的时间间隔。

2、压缩相关配置(ngx_http_gzip_module)

是一个使用“gzip”方法压缩响应的过滤器。这通常有助于将传输数据的大小减少一半甚至更多。

  • gzip
  1. Syntax: gzip on | off;
  2. Default: gzip off;
  3. Context: http, server, location, if in location

为响应开启或者取消gzip压缩

  • gzip_comp_level
  1. Syntax: gzip_comp_level level;
  2. Default: gzip_comp_level 1;
  3. Context: http, server, location

设置响应压缩的gzip级别,范围1-9

  • gzip_buffers
  1. Syntax: gzip_buffers number size;
  2. Default: gzip_buffers 32 4k|16 8k;
  3. Context: http, server, location

设置实现压缩功能时缓冲区数量及每个缓存区的大小。size默认大小等同于一个内存页,4K或8K,取决于平台。

  • gzip_disable
  1. Syntax: gzip_disable regex ...;
  2. Default:
  3. Context: http, server, location

取消对匹配到的客户端浏览器的响应报文的gzip压缩。

  • gzip_http_version
  1. Syntax: gzip_http_version 1.0 | 1.1;
  2. Default: gzip_http_version 1.1;
  3. Context: http, server, location

设置压缩响应时,所需的请求的最小HTTP版本。

  • gzip_min_length
  1. Syntax: gzip_min_length length;
  2. Default: gzip_min_length 20;
  3. Context: http, server, location

设置将被gzip处理的响应的最小长度。长度仅从 “Content-Length” 响应头字段确定。

  • gzip_types
  1. Syntax: gzip_types mime-type ...;
  2. Default: gzip_types text/html;
  3. Context: http, server, location

除了“text/html”之外,还允许对指定的mime类型进行gzip处理。特殊值“*”匹配任何MIME类型(0.8.29)。带有“text/html”类型的响应总是被压缩。

  • gzip_vary
  1. Syntax: gzip_vary on | off;
  2. Default: gzip_vary off;
  3. Context: http, server, location

如果gzip,gzip_static或gunzip是活跃的,开启或关闭在响应头插入“Vary:Accept-Encoding”区域。

  • gzip_proxied
  1. Syntax: gzip_proxied off | expired | no-cache | no-store | private | no_last_modified | no_etag | auth | any ...;
  2. Default: gzip_proxied off;
  3. Context: http,server,location

依赖于请求和响应,开启对代理请求的gzip压缩。请求是被代理请求的确定是看请求头中是否出现“Via”区域。

  • 内嵌变量$gzip_ratio

实现压缩比,计算为原始响应大小和压缩响应大小之间的比率,可以用于日志。

  • 配置样例
  1. gzip on;
  2. gzip_min_length 1000;
  3. gzip_proxied expired no-cache no-store private auth;
  4. gzip_types text/plain application/xml;
  5. ----------------------------------
  6. gzip on;
  7. gzip_comp_level 6;
  8. gzip_http_version 1.1;
  9. gzip_vary on;
  10. gzip_min_length 1024;
  11. gzip_buffers 16 8k;
  12. gzip_proxied any;
  13. gzip_disable "MSIE[1-6]\.(?!.*SV1)";
  14. gzip_types text/xml text/plain text/css application/javascript application/xml application/json;

3、HTTPS模块(ngx_http_ssl_module)

此模块提供对HTTPS的必要支持。模块默认没有安装,需要通过–with-http_ssl_module配置参数激活。这个模块需要OpenSSL库支持。

  • ssl
  1. Syntax: ssl on | off;
  2. Default: ssl off;
  3. Context: http, server

该指令在1.15.0版中被废弃。应改为使用listen指令的ssl参数

  • ssl_certificate
  1. Syntax: ssl_certificate file;
  2. Default:
  3. Context: http, server

为给定的虚拟服务器指定具有PEM格式证书的文件。如果除了主证书之外还应指定中间证书,则应按以下顺序在同一文件中指定证书:首先是主证书,然后是中间证书。PEM格式的密钥可以放在同一个文件中。

从版本1.11.0开始,可以多次指定此指令以加载不同类型的证书,例如RSA和ECDSA:

  1. server {
  2. listen 443 ssl;
  3. server_name example.com;
  4. ssl_certificate example.com.rsa.crt;
  5. ssl_certificate_key example.com.rsa.key;
  6. ssl_certificate example.com.ecdsa.crt;
  7. ssl_certificate_key example.com.ecdsa.key;
  8. ...
  9. }

只有OpenSSL 1.0.2或更高版本支持不同证书的单独证书链。对于旧版本,只能使用一个证书链。

应该记住,由于HTTPS协议对最大互操作性的限制,虚拟服务器应该侦听不同的IP地址。

  • ssl_certificate_key
  1. Syntax: ssl_certificate_key file;
  2. Default:
  3. Context: http, server

明确为虚拟服务器指定一个含有加密key的PEM格式文件。即证书的私钥文件。

  • ssl_protocols
  1. Syntax: ssl_protocols [SSLv2] [SSLv3] [TLSv1] [TLSv1.1] [TLSv1.2] [TLSv1.3];
  2. Default: ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
  3. Context: http, server

启用指定的协议。

仅当使用OpenSSL 1.0.1或更高版本时,TLSv1.1和TLSv1.2参数(1.1.13,1.0.12)才起作用。

只有在使用了用TLSv1.3支持构建的OpenSSL 1.1.1时,TLSv1.3参数(1.13.0)才有效。

  • ssl_session_cache
  1. Syntax: ssl_session_cache off | none | [builtin[:size]] [shared:name:size];
  2. Default: ssl_session_cache none;
  3. Context: http, server

设置存储会话的缓存的类型和大小。缓存可以是以下任何类型:

  • off: 严格禁止使用会话缓存:nginx显式地告诉客户机会话不能被重用。
  • none: 会话缓存的使用被轻轻地禁止:nginx告诉客户机会话可以重用,但实际上不会将会话参数存储在缓存中。
  • builtin: 内置OpenSSL缓存;仅被一个工作进程使用。缓存大小是在会话中指定的。如果没有给出大小,则等于20480个会话。使用内置缓存可能会导致内存碎片。
  • shared: 在所有工作进程之间共享的缓存。缓存大小以字节为单位;1M字节可以存储大约4000个会话。每个共享缓存都应该有一个任意名称。具有相同名称的缓存可以在多个虚拟服务器中使用。

两种缓存类型都可以同时使用,但是,只使用没有builtin缓存的shared缓存应该更高效。例如:

  1. ssl_session_cache builtin:1000 shared:SSL:10m;
  • ssl_session_timeout
  1. Syntax: ssl_session_timeout time;
  2. Default: ssl_session_timeout 5m;
  3. Context: http, server

客户端可以重用会话参数的期限。

  • 配置样例:
  1. """
  2. 为了减少处理器负载,建议:
  3. 1. 将工作进程数设置为处理器数,
  4. 2. 启用keep-alive连接,
  5. 3. 启用共享session缓存,
  6. 4. 禁用内置session缓存,
  7. 5. 并可能延长会话生存时间(默认为5分钟)
  8. """
  9. worker_processes auto;
  10. http {
  11. ...
  12. server {
  13. listen 443 ssl;
  14. keepalive_timeout 70;
  15. ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
  16. ssl_ciphers AES128-SHA:AES256-SHA:RC4-SHA:DES-CBC3-SHA:RC4-MD5;
  17. ssl_certificate /usr/local/nginx/conf/cert.pem;
  18. ssl_certificate_key /usr/local/nginx/conf/cert.key;
  19. ssl_session_cache shared:SSL:10m;
  20. ssl_session_timeout 10m;
  21. ...
  22. }

4、反向代理模块(ngx_http_proxy_module)

此模块允许将请求传递到其它的服务器。

  • proxy_pass
  1. Syntax: proxy_pass URL;
  2. Default:
  3. Context: location, if in location, limit_except

设置一个被代理服务器的协议和地址以及选项URI,将其映射到一个location。协议可以指定“http”或“https”。地址可以指定为域名或IP地址,以及可选端口:

  1. proxy_pass http://localhost:8000/uri/;

指定UNIX socket路径时,路径应放到关键字:unix后面,并用冒号括起来。

  1. proxy_pass http://unix:/tmp/backend.socket:/uri/;

如果域名解析为多个地址,则所有地址将以轮询(round-robin)方式使用。此外,可以将地址指定为服务器组。

参数值不能包含变量。在这种情况下,如果将地址指定为域名,则会在所描述的服务器组中搜索该名称,如果找不到,则使用解析程序确定该名称。

请求URI按如下方式传递到服务器:

  • 如果proxy_pass指定了URI,那么标准请求URI中匹配了location的部分要被指令中指定的URI替代。
  1. location /name/ {
  2. proxy_pass http://127.0.0.1/remote/;
  3. }
  • 如果proxy_pass没有指定URI,当原始请求被处理时,请求URI将以客户端发送的相同形式传递给服务器;或者当处理改变的URI时,传递完全规范化的URI。(1.1.12之前,只传递原始的URI)
  1. location /some/path/ {
  2. proxy_pass http://127.0.0.1;
  3. }

在某些情况下,无法确定要替换的请求URI部分:

  • 当使用正则表达式指定location时,并也在命名location内,proxy_pass应该做没有URI的指定。
  • 当location中使用rewrite指令更改URI时,将使用相同的配置来处理请求(break):
  1. location /name/ {
  2. rewrite /name/([^/]+) /users?name=$1 break;
  3. proxy_pass http://127.0.0.1;
  4. }
  5. #在这种情况下,将忽略指令中指定的URI,并将完全更改的请求URI传递给服务器。
  • 当proxy_pass中使用了变量时,如果在指令中指定了URI,则其会传递给服务器,原始请求URI被其替换。
  1. location /name/ {
  2. proxy_pass http://127.0.0.1$request_uri;
  3. }

5、php相关模块(ngx_http_fastcgi_module)

这个模块允许传递一个请求给FastCGI Server。

基本相关知识

1、什么是FastCGI

FastCGI是一个可伸缩地、高速地在HTTP server和动态脚本语言间通信的接口。多数流行的HTTP server都支持FastCGI,包括Apache、Nginx和lighttpd等。同时,FastCGI也被许多脚本语言支持,其中就有PHP。

FastCGI接口方式采用C/S结构,可以将HTTP服务器和脚本解析服务器分开,同时在脚本解析服务器上启动一个或者多个脚本解析守护进程。当HTTP服务器每次遇到动态程序时,可以将其直接交付给FastCGI进程来执行,然后将得到的结果返回给浏览器。这种方式可以让HTTP服务器专一地处理静态请求或者将动态脚本服务器的结果返回给客户端,这在很大程度上提高了整个应用系统的性能。

2、Nginx+FastCGI运行原理

Nginx不支持对外部程序的直接调用或者解析,所有的外部程序(包括PHP)必须通过FastCGI接口来调用。FastCGI接口在Linux下是socket(这个socket可以是文件socket,也可以是ip socket)。为了调用CGI程序,还需要一个FastCGI的 wrapper(wrapper可以理解为用于启动另一个程序的程序),这个wrapper绑定在某个固定socket上,如端口或者文件socket。当Nginx将CGI请求发送给这个socket的时候,通过FastCGI接口,wrapper接收到请求,然后派生出一个新的线程,这个线程调用解释器或者外部程序处理脚本并读取返回数据;接着,wrapper再将返回的数据通过FastCGI接口,沿着固定的socket传递给Nginx;最后,Nginx将返回的数据发送给客户端。这就是Nginx+FastCGI的整个运作过程。
Nginx常用模块二 - 图1

3、spawn-fcgi与PHP-FPM

FastCGI接口方式在脚本解析服务器上启动一个或者多个守护进程对动态脚本进行解析,这些进程就是FastCGI进程管理器,或者称为FastCGI引擎。spawn-fcgi与PHP-FPM就是支持PHP的两个FastCGI进程管理器。

spawn-fcgi是HTTP服务器lighttpd的一部分,目前已经独立成为一个项目,一般与lighttpd配合使用来支持PHP。但是lighttpd的spwan-fcgi在高并发访问的时候,会出现内存泄漏甚至自动重启FastCGI的问题。Nginx是个轻量级的HTTP server,必须借助第三方的FastCGI处理器才可以对PHP进行解析,因此Nginx+spawn-fcgi的组合也可以实现对PHP的解析。

PHP-FPM也是一个第三方的FastCGI进程管理器,它是作为PHP的一个补丁来开发的,在安装的时候也需要和PHP源码一起编译,也就是说PHP-FPM被编译到PHP内核中,因此在处理性能方面更加优秀。同时PHP-FPM在处理高并发方面也比spawn-fcgi引擎好很多,因此,推荐使用Nginx+PHP/PHP-FPM这个组合对PHP进行解析。

FastCGI 的主要优点是把动态语言和HTTP Server分离开来,所以Nginx与PHP/PHP-FPM经常被部署在不同的服务器上,以分担前端Nginx服务器的压力,使Nginx专一处理静态请求和转发动态请求,而PHP/PHP-FPM服务器专一解析PHP动态请求。

  • fastcgi_pass
  1. Syntax: fastcgi_pass address;
  2. Default:
  3. Context: location, if in location

设置FastCGI server的地址,地址可以是IP或者域名加上端口号。

  1. fastcgi_pass localhost:9000;
  2. #也可以是UNIX socket路径
  3. fastcgi_pass unix:/tmp/fastcgi.socket;

如果域名解析为多个地址,则所有地址都将以循环方式使用。此外,可以将地址指定为服务器组。参数值不能包含变量。

  • fastcgi_index
  1. Syntax: fastcgi_index name;
  2. Default:
  3. Context: http, server, location

设置fastcgi默认的主页资源文件名

  • fastcgi_param
  1. Syntax: fastcgi_param parameter value [if_not_empty];
  2. Default:
  3. Context: http, server, location

设置应传递给FastCGI服务器的参数。该值可以包含文本、变量及其组合。如果当前级别没有定义,会从上一级继承。

对于PHP来说的最小化配置:

  1. fastcgi_param SCRIPT_FILENAME /home/www/scripts/php$fastcgi_script_name;
  2. fastcgi_param QUERY_STRING $query_string;

SCRIPT_FILENAME参数用于PHP确定请求脚本的名字

QUERY_STRING参数用于传递请求的参数

对于处理POST请求的脚本,还需要以下三个参数:

  1. fastcgi_param REQUEST_METHOD $request_method;
  2. fastcgi_param CONTENT_TYPE $content_type;
  3. fastcgi_param CONTENT_LENGTH $content_length;

如果PHP编译时使用了–enable-force-cgi-redirect配置参数,则REDIRECT_STATUS参数应该使用200值被传递

  1. fastcgi_param REDIRECT_STATUS 200;
  • fastcgi_cache_path
  1. Syntax: fastcgi_cache_path path [levels=levels] [use_temp_path=on|off] keys_zone=name:size [inactive=time]
  2. [max_size=size] [manager_files=number] [manager_sleep=time] [manager_threshold=time] [loader_files=number]
  3. [loader_sleep=time] [loader_threshold=time] [purger=on|off] [purger_files=number] [purger_sleep=time]
  4. [purger_threshold=time];
  5. Default:
  6. Context: http

设置缓存的路径和其他参数。缓存数据存储在文件中。levels的目录层级为1到3级,每级的取值为1或者2;levels=1:2表示定义的2层目录结构,levels=1:2:2表示定义的3层目录结构。

  1. fastcgi_cache_path /data/nginx/cache levels=1:2 keys_zone=one:10m;

缓存的文件名看起来如下:

/data/nginx/cache/c/29/b7f54b2df7773722d382f4809d65029c

一个缓存响应首先写入到临时文件,然后再重命名此文件,临时文件目录是否使用由use_temp_path参数定义的,如果这个参数省略或者设置为on,则临时文件目录为fastcgi_temp_path参数指定的位置,如果设置为off,则临时文件将直接放在缓存目录中。此外,所有活动key和有关数据的信息都存储在共享内存区域中,其名称和大小由keys_zone参数配置。1M字节的区域可以存储大约8000个key。

inactive参数指定时间内没有被访问的缓存数据将被清除,其默认值为10分钟;

max_size参数设置最大缓存大小,如果超出,缓存管理器将删除最近最少被使用的数据

  • fastcgi_cache
  1. Syntax: fastcgi_cache zone | off;
  2. Default: fastcgi_cache off;
  3. Context: http, server, location

定义用于缓存的一个共享内存区域,同一个区域可以被用于多个位置;off取消缓存继承

  • fastcgi_cache_key
  1. Syntax: fastcgi_cache_key string;
  2. Default:
  3. Context: http, server, location

定义一个缓存的key,例如:

  1. fastcgi_cache_key localhost:9000$request_uri;
  • fastcgi_cache_methods
  1. Syntax: fastcgi_cache_methods GET | HEAD | POST ...;
  2. Default: fastcgi_cache_methods GET HEAD;
  3. Context: http, server, location

定义缓存的客户端的请求方法,“GET”和“HEAD”方法总是被缓存,建议显式列出。

  • fastcgi_cache_min_uses
  1. Syntax: fastcgi_cache_min_uses number;
  2. Default: fastcgi_cache_min_uses 1;
  3. Context: http, server, location

定义响应被缓存后的最小访问次数

  • fastcgi_keep_conn
  1. Syntax: fastcgi_keep_conn on | off;
  2. Default: fastcgi_keep_conn off;
  3. Context: http, server, location

默认情况下,fastcgi服务器将在发送响应后立即关闭连接。当该指令设置为on时,nginx将指示fastcgi服务器保持连接打开,建议开启。

  • fastcgi_cache_valid
  1. Syntax: fastcgi_cache_valid [code ...] time;
  2. Default:
  3. Context: http, server, location

设置不同的响应码的缓存时间。例如:

  1. fastcgi_cache_valid 200 302 10m;
  2. fastcgi_cache_valid 404 1m;

响应码为200和302的缓存时间为10分钟;404响应码缓存时间为1分钟

  1. fastcgi_cache_valid 5m;

如果仅设置时间,则只有200,301,302响应码被缓存

  1. fastcgi_cache_valid 200 302 10m;
  2. fastcgi_cache_valid 301 1h;
  3. fastcgi_cache_valid any 1m;

还可以指定any参数来缓存任何响应

缓存参数也可以直接在响应头中设置。这比使用指令设置缓存时间具有更高的优先级。例如:如果头包含“Set-Cookie”字段,则不会缓存此类响应。

设置FastCGI的例子:

  1. location / {
  2. fastcgi_pass localhost:9000;
  3. fastcgi_index index.php;
  4. fastcgi_param SCRIPT_FILENAME /home/www/scripts/php$fastcgi_script_name;
  5. fastcgi_param QUERY_STRING $query_string;
  6. fastcgi_param REQUEST_METHOD $request_method;
  7. fastcgi_param CONTENT_TYPE $content_type;
  8. fastcgi_param CONTENT_LENGTH $content_length;
  9. }

设置缓存的例子

  1. http {
  2. fastcgi_cache_path /var/cache/nginx/fcgi_cache
  3. levels=1:2:1 keys_zone=fcgicache:20m inactive=120s;
  4. ...
  5. server {
  6. location ~* \.php$ {
  7. ...
  8. fastcgi_cache fcgicache;
  9. fastcgi_cache_key $request_uri;
  10. fastcgi_cache_valid 200 302 10m;
  11. fastcgi_cache_valid 301 1h;
  12. fastcgi_cache_valid any 1m;
  13. ...
  14. }
  15. }

Nginx常用模块三

1、负载平衡模块(ngx_http_upstream_module)

用于定义服务器组,这些服务器组可以被proxy_pass, fastcgi_pass, uwsgi_pass, scgi_pass, memcached_pass, grpc_pass指令引用。

  • upstream
  1. Syntax: upstream name { ... }
  2. Default:
  3. Context: http

定义服务器组,服务器可以侦听不同的端口,另外,侦听TCP和Unix scoket的服务器可以混用。例如:

  1. upstream backend {
  2. server backend1.example.com weight=5;
  3. server 127.0.0.1:8080 max_fails=3 fail_timeout=30s;
  4. server unix:/tmp/backend3;
  5. server backup1.example.com backup;
  6. }

默认情况下,使用加权轮询平衡算法分配请求,上面的例子中,如果有7个请求,则backend1.example.com服务器会分配5个,第二个和第三个服务器各分配一个;如果在与服务器通信期间发生错误,则请求将传递到下一个服务器,依此类推,直到尝试所有运行中的服务器为止。如果无法从任何服务器获得成功的响应,客户端将得到backup1.example.com的响应。

  • server
  1. Syntax: server address [parameters];
  2. Default:
  3. Context: upstream

定义服务器地址和其它参数,地址可以是IP地址或者域名加可选端口,也可以是使用“unix”开头的UNIX socket路径,端口如果没有指定,默认为80。一个可以解析为多个地址的域名一次性定义了多个服务器。

能定义的参数有:

weight=number : 设置权重,默认是1

max_conns=number: 限制与代理服务器同时进行活动连接的最大数目,默认为0,意思是不限制

max_fails=number: 失败尝试最大次数;超出此处指定的次数时 server将被标记为不可用,默认为1

fail_timeout=time: 后端服务器标记为不可用状态的连接超时时
长,默认10s

backup: 标记这个服务器为备份服务器

down: 将服务器标记为永久不可用。配合ip_hash使用,实现灰度发布。

  • ip_hash
  1. Syntax: ip_hash;
  2. Default:
  3. Context: upstream

使用ip_hash的负载平衡方式。该方法确保来自同一客户端的请求总是传递到同一服务器,除非该服务器不可用。在后一种情况下,客户机请求将传递到另一个服务器。如果其中一个服务器需要临时删除,则应使用down参数对其进行标记,以保留客户端IP地址的当前哈希。

例如:

  1. upstream backend {
  2. ip_hash;
  3. server backend1.example.com;
  4. server backend2.example.com;
  5. server backend3.example.com down;
  6. server backend4.example.com;
  7. }
  • least_conn
  1. Syntax: least_conn;
  2. Default:
  3. Context: upstream

最少活跃连接调度算法,同时也要考虑权重,如果连接数相同,则使用加权轮询平衡算法。

  • least_time
  1. Syntax: least_time header | last_byte [inflight];
  2. Default:
  3. Context: upstream
  4. This directive appeared in version 1.7.10.

以最小的平均响应时间和最少的活动连接数做为负载平衡算法。同时考虑服务器的权重。如果有多个这样的服务器,则使用加权循环平衡方法。商业版本才支持这个指令。

  • hash
  1. Syntax: hash key [consistent];
  2. Default:
  3. Context: upstream
  4. This directive appeared in version 1.7.2.

基于指定的key的hash算法来建立client-server映射表实现对请求的调度,此处的key可以是文本、变量或二者组合。作用:将请求分类,同一类请求将发往同一个upstream server,使用consistent参数,将使用ketama一致性hash算法,适用于后端是Cache服务器(如varnish)时使用。

hash $request_uri consistent;

hash $remote_addr;

  • keepalive
  1. Syntax: keepalive connections;
  2. Default:
  3. Context: upstream
  4. This directive appeared in version 1.1.4.

为到上游服务器的连接激活缓存。connections参数为同上游服务器的空闲保持连接的最大数量。connections参数应该设置为足够小的数字,以便上游服务器可以处理新的传入连接。

带keepalive的memcached上游配置示例:

  1. upstream memcached_backend {
  2. server 127.0.0.1:11211;
  3. server 10.0.0.2:11211;
  4. keepalive 32;
  5. }
  6. server {
  7. ...
  8. location /memcached/ {
  9. set $memcached_key $uri;
  10. memcached_pass memcached_backend;
  11. }
  12. }

对于HTTP,proxy_http_version指令应该设置到1.1,并且“Connection”头区域应该被清空。

  1. upstream http_backend {
  2. server 127.0.0.1:8080;
  3. keepalive 16;
  4. }
  5. server {
  6. ...
  7. location /http/ {
  8. proxy_pass http://http_backend;
  9. proxy_http_version 1.1;
  10. proxy_set_header Connection "";
  11. ...
  12. }
  13. }

对于FastCGI服务器,fastcgi_keep_conn应该被设置。

  1. upstream fastcgi_backend {
  2. server 127.0.0.1:9000;
  3. keepalive 8;
  4. }
  5. server {
  6. ...
  7. location /fastcgi/ {
  8. fastcgi_pass fastcgi_backend;
  9. fastcgi_keep_conn on;
  10. ...
  11. }
  12. }

注:负载平衡方法应该在keepalive指令前面配置;SCGI和uwsgi协议没有保持连接的概念。

  • health_check (nginx plus支持的健康检查机制)
  • nginx_upstream_check_module (淘宝开发的第三方健康检查模块)

下载地址:https://codeload.github.com/yaoweibin/nginx_upstream_check_module/zip/master

配置案例:

  1. upstream backend {
  2. server backend1.example.com weight=5;
  3. server backend2.example.com:8080;
  4. server unix:/tmp/backend3;
  5. server backup1.example.com:8080 backup;
  6. server backup2.example.com:8080 backup;
  7. }
  8. server {
  9. location / {
  10. proxy_pass http://backend;
  11. }
  12. }

2、重定向模块(ngx_http_rewrite_module)

这个模块使用PCRE正则表达式更改请求的URI,返回重定向指令并有条件的选择配置。

break, if, return, rewrite,set指令执行顺序如下:

  • 这个模块的指令在server级别是顺序执行
  • 重复
    • 基于请求的URI查找对应的一个location
    • 在找到的location中,模块指令按顺序执行
    • 如果请求的URI被重写,则循环重复,但不超过10次
  • break
  1. Syntax: break;
  2. Default:
  3. Context: server, location, if

停止处理当前的ngx-http-rewrite-module指令集。如果该指令是在location中,那么在这个location中,对请求的进一步处理将继续进行。

  1. if ($slow) {
  2. limit_rate 10k;
  3. break;
  4. }
  • if
  1. Syntax: if (condition) { ... }
  2. Default:
  3. Context: server, location

若条件判断为真,则执行花括号内的指令,并且将括号内的配置应用到请求上。if指令中的配置是从上一层配置中继承的。

条件判断式的有如下种类:

  • 一个变量名。如果值为空或者0,则为flase
  • 比较字符串变量使用”=“和”!=”
  • 测试一个变量是否与一个正则表达式匹配,正则表达式前使用””(区分大小写)或”“(不区分大小写)操作符,正则表达式能使用“$1到$9”变量,以便后面可以重复使用;不匹配,使用“!~” 和 “!~”操作符,如果正则表达式中含有”}“或”;”符号,应使用单引号或双引号将正则表达式括起来。
  • 测试一个文件是否存在使用”-f”和”!-f”
  • 测试一个目录是否存在使用”-d”和”!-d”
  • 测试一个文件、目录、或符号链接文件是否存在,使用”-e”和”!-e”
  • 测试一个文件是否可执行使用”-x”和”!-x”

例如:

  1. if ($http_user_agent ~ MSIE) {
  2. rewrite ^(.*)$ /msie/$1 break;
  3. }
  4. if ($http_cookie ~* "id=([^;]+)(?:;|$)") {
  5. set $id $1;
  6. }
  7. if ($request_method = POST) {
  8. return 405;
  9. }
  10. if ($slow) {
  11. limit_rate 10k;
  12. }
  13. if ($invalid_referer) {
  14. return 403;
  15. }

$invalid_referer是一个内建变量,由valid_referers指令进行设置

  • return
  1. Syntax: return code [text];
  2. return code URL;
  3. return URL;
  4. Default:
  5. Context: server, location, if

停止处理,返回状态码code给客户端。返回非标准码444将关闭该连接,而且不发送响应header。

  • rewrite
  1. Syntax: rewrite regex replacement [flag];
  2. Default:
  3. Context: server, location, if

如果regex匹配了一个请求的URI,该URI被替换为replacement。rewrite 指令在配置文件中按照出现的顺序执行。可使用flag中止进一步的处理。如果replacement以“http://”,“https://”为起始的字符串,将中止处理,并返回重定向指令给客户端。
flag参数的值可以为:

  • last 停止当前ngx_http_rewrite_module模块指令集的处理,并为修改后的URI寻找新的匹配的location
  • break 停止当前ngx_http_rewrite_module模块指令集的处理,与break指令作用相同
  • redirect 返回302代码的临时重定向,当replacement不以“http://”,“https://”为起始的字符串时使用
  • permanent 返回301代码的永久重定向

例子:

  1. server {
  2. ...
  3. rewrite ^(/download/.*)/media/(.*)\..*$ $1/mp3/$2.mp3 last;
  4. rewrite ^(/download/.*)/audio/(.*)\..*$ $1/mp3/$2.ra last;
  5. return 403;
  6. ...
  7. }

但如果这些指令被放入“/download/” location区块中,应将last flag替换为break,否则nginx会不断循环,达到10次后,返回500 error

  1. location /download/ {
  2. rewrite ^(/download/.*)/media/(.*)\..*$ $1/mp3/$2.mp3 break;
  3. rewrite ^(/download/.*)/audio/(.*)\..*$ $1/mp3/$2.ra break;
  4. return 403;
  5. }

如果replacement包含请求参数,原来的请求参数将被追加在后面。如果不希望追加原来的请求参数,可在replacement字符串的末尾添加一个“?”符号,例如:

  1. rewrite ^/users/(.*)$ /show?user=$1? last;
  • rewrite_log
  1. Syntax: rewrite_log on | off;
  2. Default: rewrite_log off;
  3. Context: http, server, location, if

是否开启ngx_http_rewrite_module模块的日志,如果开启,该模块的日志将被记录进入error_log中,日志的级别为notice

  • set
  1. Syntax: set $variable value;
  2. Default:
  3. Context: server, location, if

为变量赋值。value可包含:文本,变量,或文本和变量的组合


3、引用模块(ngx_http_referer_module)

用于阻止“referer”头字段中具有无效值的请求访问站点。

  • valid_referers
  1. Syntax: valid_referers none | blocked | server_names | string ...;
  2. Default:
  3. Context: server, location

定义referer首部的合法可用值,不能匹配的将是非法值。指定“referer”请求头字段值,该值将导致内置变量$invalid_referer为空字符串。否则,变量值为“1”。搜索匹配项不区分大小写。参数如下:

none: 请求报文首部没有referer首部

blocked: “referer”字段存在于请求头中,但其值已被防火墙或代理服务器删除;这些值是不以“http://”或“https://”开头的字符串;

server_names: “referer”请求头字段包含一个服务器名称;

arbitrary string: 任意字符串,定义服务器名称和一个可选的URI前缀,开头和结尾可以使用“*”;检查时,忽略“referer”字段的服务器端口。

regular expression: 正则表达式匹配到的字符串。第一个符号应该是“~”。应该注意,表达式将与“http://”或“https://”之后开始的文本匹配。

配置举例

  1. valid_referers none blocked server_names
  2. *.example.com example.* www.example.org/galleries/
  3. ~\.google\.;
  4. if ($invalid_referer) {
  5. return 403;
  6. }

4、ngx_stream_core_module模块

基于tcp或udp的服务连接的反向代理,即工作于传输层的反向代理或调度器。此模块从1.9.0版开始可用。这个模块在默认情况下不会构建,应该使用–with-stream配置参数来启用它。

  • listen
    设置服务器接收的地址和端口组合,也可以只设置端口
  1. Syntax: listen address:port [ssl] [udp] [proxy_protocol] [backlog=number] [rcvbuf=size] [sndbuf=size] [bind]
  2. [ipv6only=on|off] [reuseport] [so_keepalive=on|off|[keepidle]:[keepintvl]:[keepcnt]];
  3. Default:
  4. Context: server

例如:

  1. listen 127.0.0.1:12345;
  2. listen *:12345;
  3. listen 12345; # same as *:12345
  4. listen localhost:12345;
  5. listen [::1]:12345;
  6. listen [::]:12345;
  7. listen unix:/var/run/nginx.sock;
  8. listen 127.0.0.1:12345-12399;
  9. listen 12345-12399;

配置案例

  1. worker_processes auto;
  2. error_log /var/log/nginx/error.log info;
  3. events {
  4. worker_connections 1024;
  5. }
  6. stream {
  7. upstream backend {
  8. hash $remote_addr consistent;
  9. server backend1.example.com:12345 weight=5;
  10. server 127.0.0.1:12345 max_fails=3 fail_timeout=30s;
  11. server unix:/tmp/backend3;
  12. }
  13. upstream dns {
  14. server 192.168.0.1:53535;
  15. server dns.example.com:53;
  16. }
  17. server {
  18. listen 12345;
  19. proxy_connect_timeout 1s;
  20. proxy_timeout 3s;
  21. proxy_pass backend;
  22. }
  23. server {
  24. listen 127.0.0.1:53 udp reuseport;
  25. proxy_timeout 20s;
  26. proxy_pass dns;
  27. }
  28. server {
  29. listen [::1]:12345;
  30. proxy_pass unix:/tmp/stream.socket;
  31. }
  32. }

5、ngx_stream_proxy_module模块

允许代理TCP/UDP和UNIX socket数据流

  • proxy_pass
  1. Syntax: proxy_pass address;
  2. Default:
  3. Context: server

设置被代理服务器的地址。可以是域名或IP地址和一个端口,或者UNIX socket路径

  1. proxy_pass localhost:12345;
  2. proxy_pass unix:/tmp/stream.socket;
  • proxy_timeout
  1. Syntax: proxy_timeout timeout;
  2. Default: proxy_timeout 10m;
  3. Context: stream, server

设置客户端或代理服务器连接上两个连续读或写操作之间的超时时间。如果在这段时间内没有数据传输,则连接将关闭。

  • proxy_connect_timeout
  1. Syntax: proxy_connect_timeout time;
  2. Default: proxy_connect_timeout 60s;
  3. Context: stream, server

定义与被代理服务器建立连接的超时时间

  • proxy_bind
  1. Syntax: proxy_bind address [transparent] | off;
  2. Default:
  3. Context: stream, server
  4. This directive appeared in version 1.9.2.

指定到被代理服务器数据包的源IP地址。参数可以包含变量,off表示取消从上一级的继承配置,以便让系统自动分配本地的地址。

transparent参数允许到代理服务器的传出连接源自非本地IP地址,例如来自客户端的实际IP地址

  1. proxy_bind $remote_addr transparent;

配置案例

  1. server {
  2. listen 127.0.0.1:12345;
  3. proxy_pass 127.0.0.1:8080;
  4. }
  5. server {
  6. listen 12345;
  7. proxy_connect_timeout 1s;
  8. proxy_timeout 1m;
  9. proxy_pass example.com:12345;
  10. }
  11. server {
  12. listen 53 udp reuseport;
  13. proxy_timeout 20s;
  14. proxy_pass dns.example.com:53;
  15. }
  16. server {
  17. listen [::1]:12345;
  18. proxy_pass unix:/tmp/stream.socket;
  19. }