天天看点

NGINX 简明教程

nginx 是一款来自俄罗斯的http 和反向代理(reverse proxy)服务器、邮件服务器,以及通用的 tcp/udp 代理服务器,以其高性能被业界广泛采用。本文通过最简洁的方式,将 nginx 核心应用做下介绍。

nginx是一个免费的、开源的、高性能的 http 服务器和反向代理,以及一个 imap/pop3 代理服务器。 nginx以其高性能、稳定性、丰富的功能集、简单的配置和低资源消耗而闻名。

nginx 启动后,有一个主进程(master process)和一个或多个工作进程(worker process),主进程的作用主要是读入和检查nginx的配置信息,以及维护工作进程;工作进程才是真正处理客户端请求的进程。具体要启动多少个工作进程,可以在 nginx 的配置文件<code>nginx.conf</code>中通过<code>worker_processes</code>指令指定。

可以通过以下这些命令来控制 nginx:

其中:

<code>nginx -s stop</code>: 强制停止nginx,不管工作进程当前是否正在处理用户请求,都会立即退出。

<code>nginx -s quit</code>:“优雅地”退出nginx,执行这个命令后,工作进程会将当前正在处理的请求处理完毕后,再退出。

<code>nginx -s reload</code>:重载配置信息。当nginx的配置文件改变之后,同过执行这个命令,使更改的配置信息生效,而无需重新启动nginx.

<code>nginx -s reopen</code>:重新打开日志文件。

服务器名称是用<code>server_name</code>指令来定义的,并且它决定了哪一个<code>server</code>块将用来处理给定的请求。可以使用精确名称、通配符、正则表达式来定义服务器名称。

当寻找一个虚拟服务器的名字,如果指定的名称匹配多个变体,例如,通配符和正则表达式都匹配,将会按照以下的顺序选择第一个匹配的变体:

精确名称

以星号()开头的最长的通配符,例如“.example.org”

以星号()结尾的最长的通配符,例如“mail.”

第一个匹配的正则表达式(根据在配置文件中出现的顺序)

修改 <code>conf/nginx.conf</code> 文件,必须在配置文件 server 块中的监听指令 listen 后启用 ssl 参数,并且指定服务器证书 <code>ssl_certificate</code> 和私钥 <code>ssl_certificate_key</code> 的位置:

服务器证书是一个公共实体,它被发送给连接到服务器的每一个客户机。私钥是一个安全实体,应该存储在具有受限访问的文件中,但它必须可被nginx主进程读取。私钥也可以存储在与服务器证书相同的文件中:

在这种情况下,这个证书文件的访问权限也应受到限制。虽然证书和密钥存储在一个文件中,但只有证书被发送到客户端。

指令 <code>ssl_protocols</code> 和 <code>ssl_ciphers</code> 可用于限制仅包括强版本和密码的 ssl/tls 连接。 默认情况下,nginx 使 用<code>ssl_protocols tlsv1 tlsv1.1 tlsv1.2</code>版本和<code>ssl_ciphers high:!anull:!md5</code>密码,因此通常不需要显式地配置它们。需要注意的是,这些指令的默认值在不同的版本里面已经变更好几次了。

跨多个应用程序实例的负载均衡是优化资源利用率,最大限度地提高吞吐量,降低延迟,并确保容错配置一个常用的技术。

nginx 支持如下负载均衡的机制(或方法):

如果没有指定负载均衡的方法,那么 nginx 默认采用的是轮询的方式。最简单的负载均衡配置如下:

3个同样实例的应用(srv1-srv3)是采用轮询方式。所有请求被代理到一组服务<code>myapp1</code>,同时,nginx 运用 http 负载均衡来分发请求。

反向代理被应用在 nginx 内,包括负载均衡针对 http、https、fastcgi、uwsgi、scgi 以及 memcached。

在为 fastcgi、uwsgi、scgi 或 memcached 设置负载均衡时,分别使用 fastcgi_pass、uwsgi_pass、scgi_pass 和 memcached_pass 指令。

在一些请求需要更长时间才能完成的情况下,最少连接可以更公正地控制应用程序实例的负载。

使用最少连接的负载平衡,nginx 将不会加重一个有过多请求的应用服务负担,而是将它分发新的请求给最不繁忙的服务器。

在 nginx 中需要通过设置<code>least_conn</code>来激活最少连接的负载均衡策略配置:

注意,采用轮询或者最少连接的负载均衡策略,每个客户端的后续请求可能被分配带不同的服务器,不能保证同一个客户端总是指向同一个服务。如果需要告诉客户端分配到一个特定的应用服务,换句话,就是保持客户端的会话粘性(sticky)或者会话持久性(persitent),即总是尝试选着同一个特定的服务器,ip 哈希 负载均衡机制可以被使用。

采用 ip 哈希的策略,客户端的 ip 地址被用作一个哈希 key,决定哪个服务应该被选中来服务客户端的请求。这种方式,确保了同一个客户端来的请求将总是被指向同一个服务,除非这个服务不可用了。

配置ip 哈希负载均衡,只需要通过设置<code>ip_hash</code>来激活:

可以通过使用服务器的权重来影响 nginx 的负载均衡算法,在上述轮询、最少请求、基于ip 哈希负载均衡配置中,服务器的权重没有配置,意味着所有服务器的权重都是一样的。特别是轮询,它意味着或多或少平等的分发请求到服务器(请求够多,并且请求以均匀方式进行处理,并完成够快)

当配置了一个 weight 变量到一个指定的服务后,权重被作为一个 nginx 的负载均衡的决定的一部分:

采用上面的配置,如果来了5个请求,3个到srv1,1个到srv2,1个到srv3。在最近的nginx版本中,同样可以使用权重针对最少连接和ip 哈希的负载均衡策略。

反向代理在 nginx 中实现了被动的健康监测,如果响应从一个特定的服务器失败,携带着错误,nginx 将标记这个服务器是失败的,并将尝试一段时间避免选择这个服务器作为后续请求的服务器。

<code>fail_timeout</code> 和 <code>max_fails</code> 用于设定指定时间内,应该发生连续不成功的数目。默认<code>max_fail</code>等于1,如果设置成0,相当于关闭这个服务器的健康监测。<code>fail_timeout</code>参数,定义多久服务器被标识失败。过了服务器<code>fail_timeout</code>失败超时间隔后,nginx 将开始探测存活的客户端的请求,如果探测成功,服务被标识成存活状态。

压缩响应通常会显着减少传输数据的大小。 然而,由于压缩在运行时发生,所以会增加处理开销,这可能会对性能产生负面影响。

在向客户端发送响应之前,nginx 会执行压缩,但不会“重复压缩”已经压缩过的响应。

要启用压缩,在 gzip 指令上请使用<code>on</code>参数:

默认情况下,nginx 仅压缩使用mime 类型 为 <code>text/html</code>的响应。要压缩其他 mime 类型的响应,请包含<code>gzip_types</code>指令并列出相应的类型。

要指定要压缩的响应的最小长度,请使用<code>gzip_min_length</code>指令。默认值为20字节,下面示例调整为1000:

默认情况下,nginx 不会压缩对代理请求的响应(来自代理服务器的请求)。请求是否来自代理服务器是由请求中<code>via</code>头字段的是否存来确定的。要配置这些响应的压缩,请使用<code>gzip_proxied</code>指令。该指令具有多个参数来指定 nginx 应压缩哪种代理请求。例如,仅对不会在代理服务器上缓存的请求进行压缩响应,为此,<code>gzip_proxied</code>指令具有指示 nginx 在响应中检查<code>cache-control</code>头字段的参数,如果值是 no-cache、no-store 或 private,则压缩响应。另外,您必须包括 expired 的参数来检查<code>expires</code>头字段的值。这些参数在以下示例中与 auth 参数一起设置,该参数检查<code>authorization</code>头字段的存在(授权响应特定于最终用户,并且通常不被缓存):

与大多数其他指令一样,配置压缩的指令可以包含在<code>http</code>上下文中,也可以包含在 <code>server</code> 或 <code>location</code> 块中。

gzip 压缩的整体配置可能如下所示。

某些客户端不支持使用 gzip 编码方法的响应。同时,可能需要存储压缩数据,或者即时压缩响应并将它们存储在缓存中。为了都能成功地服务于接受或者不接受压缩数据的客户端,针对后一种类型的客户端时,nginx 可以在将数据发送时即时解压缩数据。

要启用运行时解压缩,请使用<code>gunzip</code>指令。

<code>gunzip</code>指令可以在与<code>gzip</code>指令相同的上下文中指定:

要将文件的压缩版本发送到客户端而不是常规文件,请在适当的上下文中将<code>gzip_static</code>指令设置为 on。

在这种情况下,为了服务<code>/path/to/file</code>的请求,nginx 尝试查找并发送文件<code>/path/to/file.gz</code>。如果文件不存在,或客户端不支持 gzip,则 nginx 将发送未压缩版本的文件。

请注意,<code>gzip_static</code>指令不启用即时压缩。它只是使用压缩工具预先压缩的文件。要在运行时压缩内容(而不仅仅是静态内容),请使用<code>gzip</code>指令。

继续阅读