精通Nginx(txt+pdf+epub+mobi电子书下载)


发布时间:2020-06-27 14:51:55

点击下载

作者:[瑞士]艾维利(Dimitri Aivaliotis)

出版社:人民邮电出版社

格式: AZW3, DOCX, EPUB, MOBI, PDF, TXT

精通Nginx

精通Nginx试读:

前言

Nginx是一个高性能的Web服务器,在它的设计上使用的系统资源非常少。有很多how-to和示例配置文件在互联网上出现,这会澄清Nginx配置的浑水,这样做你将会学习到在各种环境中如何调整Nginx,以及一些配置模糊的选项的配置,以便设计一个符合你需求的配置文件。

在你已经理解了如何根据自己的需求来构建一个配置文件后,你就不再需要复制-粘贴配置片段了。这是一个过程,而且会有曲折,但是本书中有关技巧的解释,会使你觉得手写Nginx配置文件是一件很舒服的事情。万一事情不像你期望的那样工作,你将能够独立调试该问题,或者至少能够寻求帮助,而不会觉得自己好像都没有尝试过。

这本书是以现代风格所写,这种设计帮助你尽可能快地获取信息。几乎每一章都是一个独立的模块,你可以根据你的需要自由地跳到任何地方获取更深入的特定主题。如果你觉得错过了某些主要的东西,那么你可以返回去读取前面的章节。它们在这种方式下构建以帮助你的配置文件一步步成长。

本书涵盖的内容

第1章,安装Nginx和第三方模块,教你如何在你选择的操作系统上安装Nginx,以及在你的安装中如何包含第三方模块。

第2章,配置向导,讲解了Nginx的配置文件格式,你将会学到每一个不同区段的配置,如何配置全局参数,及location的用处。

第3章,使用Mail模块,探索Nginx的邮件代理模块,详细介绍了配置的方方面面。在本章中还有一个认证服务的代码例子。

第4章,Nginx作为反向代理,介绍反向代理的原理,并且描述Nginx如何充当该角色。

第5章,反向代理高级话题,深入研究使用Nginx作为反向代理解决可伸缩及性能问题。

第6章,Nginx Http服务器,描述如何使用各种模块,包括通过Nginx解决常见的Web问题。

第7章,Nginx与开发者,展示了Nginx如何与你的应用程序集成,以便更快地将内容交付给你的用户。

第8章,故障排除技术,研究了一些常见的配置文件,一旦问题出现如何调试,及调优性能的一些建议。

附录A,指令参考,提供了一个方便的配置指令参考,这些指令贯穿了全书,也有一些以前没有覆盖到的指令。

附录B,Rewrite规则向导,描述如何使用Nginx的rewrite规则模块,并且描述了将Apache格式的rewrite规则转换为Nginx的rewrite规则的一些步骤。

附录C,团体,介绍了可以在线上搜寻到的更多资源。

附录D,针对Solaris操作系统在网络下的调优,详述了有必要存在的Solaris 10版本以上系统下的网络调优。

使用这本书你需要做的

任何现代Linux PC都能够充分地运行本书中的实例代码。用户代码实例在每一章都给定了安装操作指南,基本上归纳如下。

◆ 构建环境:编译器、头文件,等等。

◆ Nginx:最新版本较好。

◆ Ruby:最好从https://rvm.io安装。

◆ Perl:默认版本较好。

谁需要这本书

这本书适用于在安装和配置服务器方面有经验的系统管理员或系统工程师,以满足特定的需求。你不需要已经有使用Nginx的经验。

约定

在本书中,你将会看到一些风格的文本,便于区别两种不同的信息。这里有一些这些格式的例子,并且有解释说明。

代码字符以下列格式显示:"Nginx will attempt to build a dependent library statically if you include a ––with-= option to conigure."

代码块设置如下。

$ export BUILD_DIR=`pwd`

$ export Nginx_INSTALLDIR=/opt/nginx

$ export VAR_DIR=/home/www/tmp

$ export LUAJIT_LIB=/opt/luajit/lib

$ export LUAJIT_INC=/opt/luajit/include/luajit-2.0

在我们想提请你注意代码块的一个特定部分时,对有关的线或项目设置粗体。

$ export BUILD_DIR=`pwd`

$ export Nginx_INSTALLDIR=/opt/nginx

$ export VAR_DIR=/home/www/tmp

$ export LUAJIT_LIB=/opt/luajit/lib

$ export LUAJIT_INC=/opt/luajit/include/luajit-2.0

任何命令行输入或者输出书写如下。

$ mkdir $HOME/build

$ cd $HOME/build && tar xzf nginx-.tar.gz

新的术语和重要的字以粗体显示。你在屏幕上看到的字,例如,菜单或者对话框,会出现类似这样的版本:"clicking the Next button moves you to the next screen"。

警告或者重要的事项出现在这样的盒子中。

提示和技巧以这种方式显示。

读者反馈

从读者来的反馈总是受欢迎的,它让我们知道你对本书的想法——什么是你喜欢的,什么是你不喜欢的。对于我们而言读者反馈非常重要,它使我们的课题发挥更大的作用。

向我们发送一般的反馈,只需要简单地发送电子邮件到feedback@packtpub.com,并且在邮件的主题部分提及本书的名称就可以了。

如果你有擅长的主题,并且你对写作或者投稿感兴趣,那么你可以看看我们的作者向导www.packtpub.com/authors。

客户支持

现在你自豪地成为Packt书的所有人了,对于你的购买我们有更多的事情帮助你。

下载示例代码

你购买所有Packt书的示例代码都可以从 http://www.PacktPub.com下载,如果你从别的地方购买了这本书,你可以访问 http://www.PacktPub.com/support,并且注册,那么代码会以邮件的形式直接发送给你。

勘误表

尽管我们非常小心地确保我们内容的准确性,但是错误还是会发生的。如果你在我们的任何一本书中发现了错误——可能是文本的错误,也可能是代码的错误,并把它向我们报告,我们将非常感谢。通过这样,你可以使其他读者免于读取错误,并且帮助我们在本书的后续的版本中更正。如果你想查找任何勘误表,请通过http://www.packtpub.com/support访问它们,选择你要找的书的名称,点击errata submission form链接,就会进入本书详细的勘误表。一旦你的勘误表被校验,那么你的提交将会被接受,并且在我们的网站上的勘误表将会被更新,或者添加到任何存在的勘误表中,在标题部分的勘误表下。通过从 http://www.packtpub.com/support选择标题,任何存在的勘误表都可以被查看。

盗版

在互联网上,对于有版权材料的盗版行为一直是一个持续的跨越全媒体的问题。在Packt,我们非常重视版权和许可,如果你在互联网上偶然发现以任何形式非法拷贝我们的文字的地方,请立即提供给我们地址或者是网站的名字,以便我们能够追究补救办法。

请联系我们copyright@packtpub.com,并且附上涉嫌盗版的材料的链接。

我们非常感谢你帮助保护我们的作者,并且我们会持续给读者带来有价值的内容。

问题

如果有任何方面关于本书的问题,你可以联系我们questions@packtpub.com,我们将会尽量解决。第1章安装Nginx及第三方模块

Nginx最初的设计是成为一个Http服务器,一个能够解决C10K问题的Http服务器。关于C10K这个问题,Daniel Kegel在http://www.kegel.com/c10k.html页面有具体描述,设计一个同时连接处理10000连接的web服务器。为了实现这个目标,Nginx通过基于事件的处理机制并且操作系统也要使用相应的事件机制,便可以解决C10K问题。

在我们开始探索如何配置Nginx之前,首先我们要安装它,这一章将详细讲述如何安装Nginx,以及如何获取正确的模块并且安装和配置它们。Nginx是模块化设计的,并且有非常丰富的社区第三方模块,它们的设计者通过创建这些模块为core Nginx增添了功能,我们可以在编译安装Nginx时将它们添加到Nginx服务器。

在本章中,我们涉及到以下内容。

◆ 使用包管理器安装Nginx。

◆ 通过源代码安装Nginx。

◆ 配置Nginx为Web或者Mail服务器。

◆ 使用各种模块。

◆ 查找并安装第三方模块。

◆ 组合在一起。1.1 使用包管理器安装Nginx

使用包管理器安装Nginx的机会是你所使用的操作系统已经提供了Nginx的安装包。使用包管理器安装Nginx的方法很简单,只需要使用包管理器安装命令就可以了。

◆Linux (基于deb)

sudo apt-get install nginx

◆Linux (基于rpm)

sudo yum install nginx

◆FreeBSD

sudo pkg_install -r nginx

命令sudo表示的是通过操作系统中的超级用户('root')权限执行的命令。如果操作系统支持RBAC (Role-based access control),那么可以用一个不同的命令,例如 'pfexec',来达到同样的目的。

通过上面的命令来安装的Nginx都会被安装到操作系统的标准位置下。如果使用操作系统的安装包安装Nginx,那么通过上面的命令来安装是最好的方式。

Nginx core团队也提供了二进制的标准版本,可以从 http://nginx.org/en/download.html页面下载可用的版本。没有发布Nginx二进制版本的系统用户(例如,CentOS),可用使用下面的指导来安装预测试、预编译二进制版本。1.1.1 CentOS

通过创建下面的文件在系统中添加Nginx仓库的yum配置。

sudo vi /etc/yum.repos.d/nginx.repo

[nginx]

name=nginx repo

baseurl=http://nginx.org/packages/centos/6/$basearch/

gpgcheck=0

enabled=1

然后通过执行以下命令来安装Nginx。

sudo yum install nginx

也可以按照前面介绍的URL下载Nginx发布版本安装。1.1.2 Debian

通过从http://nginx.org/keys/nginx_signing.key下载Nginx并安装签名key,将该签名key添加到系统的apt keyring中。

sudo apt-key add nginx_signing.key

将nginx.org仓库追加到/etc/apt/sources.list文件末尾。

vi /etc/apt/sources.list

deb http://nginx.org/packages/debian/ squeeze nginx

deb-src http://nginx.org/packages/debian/ squeeze nginx

然后执行下面的命令安装Nginx。

sudo apt-get update

sudo apt-get install nginx

如果所使用的操作系统在它可用的安装包中没有包括 Nginx,或者是所包含的版本太旧不能满足需要,或者是nginx.org没有提供所需要的安装包,或者是你想使用“development”版本的Nginx,那么可以使用从源代码编译的方法来安装Nginx。1.2 从源代码安装Nginx

Nginx代码提供了两个独立的下载分支——标准版和开发版。开发分支是一个正处于积极开发状态的版本。在这个版本中将会有一些新的功能被集成到其中,在标准版中是找不到这些功能的。当一个“开发”版被发布时,它会经历同样的QA和作为标准版的一组类似功能的测试。因此无论哪一个分支都可以用于生产环境。两者主要的不同在于对第三方模块的支持。在开发版本里内部的API可能会改变,而标准版本却保持不变,因此为了向下兼容第三方模块,在标准版本中第三方模块都可以有效使用。1.2.1 准备编译环境

为了从源代码编译Nginx,系统需要具备某些必要的条件。除了编译器之外,如果想启用SSL支持和能够使用rewrite模块,那么还需要提供相应的OpenSSL和PCRE(Perl Compatible Regular Expressions)库及开发头文件。这依赖于系统,也有可能在系统中这些必要条件已经被默认安装了,如果没有安装,那么需要从其安装包安装或者是从源码下载并解压安装,但是要在Nginx的配置文件中指定它们在系统中安装的位置。

如果在配置文件中使用了–with-=选项,那么Nginx将试图建立一个静态的依赖库。如果你想是的Nginx不依赖于系统的任何其他部分,也可能是你想多榨取一点nginx二进制额外的性能,那么你可能会使用构建静态库的做法。如果你使用的外部库的功能只能从某个版本起(例如,NPN[Next Protocol Negotiation]TLS扩展从OpenSSL 1.0.1版本有效),那么你就不得不将其指定到特定版本解压后的源代码路径。

根据你自己的喜好,可能还会提供其他的、可选的安装包。这些安装包包括MD5和SHA-1以支持哈希算法、zlib压缩库、libatomic库。在Nginx中,很多地方会使用到哈希算法,例如,为了计算URI哈希从而计算缓存key。zlib压缩库被用于投递gzip压缩的内容。如果atomic_ops库有效,那么Nginx将会使用它实现自动内存更新操作,以便实现高性能的内存锁定代码。1.2.2 从源代码编译

可以从http://nginx.org/en/download.html地址下载Nginx,从该页面找到.tar.gz或者.zip格式的下载分支,按照下面的步骤将下载的安装包解压到一个临时的目录中。

$ mkdir $HOME/build

$ cd $HOME/build && tar xzf nginx-.tar.gz

使用下面的命令来配置Nginx。

$ cd $HOME/build/nginx- && ./configure

然后使用下面的命令编译并且安装。

$ make && sudo make install

下表的配置选项将帮助您设计出自己的Nginx二进制。这些选项对Nginx都是有效的,模块可以被独立激活。

在编译自己的二进制Nginx时,你会有很大的灵活性来包含你仅使用的功能。你已经说定使用哪个用户运行Nginx了吗?你要使用默认的logfile位置,以便不用在Nginx的配置文件明确地说明它们吗?表 1-1 所示是配置选项列表,通过它来帮助你设计你自己的nginx命令。表1-1 通用配置选项

如表1-2所示,可以优化编译,这正是下表中的选项的用武之地。表1-2 优化配置选项续表1.3 配置Web或者mail服务器

Nginx是一个独一无二的高性能Web服务器,它也被设计成为一个邮件代理服务器。根据你构建Nginx的目标,可将其配置成一个Web加速器、Web服务器、邮件代理,或者是集所有为一体。你可以将任何服务安装在一个二进制文件中,这样做的好处是可以通过配置文件来设置Nginx服务器的角色,或者根据需要在高性能的环境中安装一个瘦身的二进制Nginx文件。1.3.1 邮件代理的配置选项

表1-3是邮件模块独有的配置选项。表1-3 mail配置选项

对于典型的mail代理,我推荐将Nginx配置为:

$ ./configure --with-mail --with-mail_ssl_module --with-openssl=${BUILD_DIR}/openssl-1.0.1c

对于邮件服务器来说,现在几乎每一个邮件服务器的安装都需要安装SSL/TLS,并且没有一个邮件代理启用了预期功能的用户。我推荐静态编译OpenSSL,以便对操作系统中的OpenSSL库没有依赖性。在前面使用的变量BUILD_DIR需要提前设置。1.3.2 指定路径的配置选项

表1-4显示了http模块有效的配置选项,从激活Perl模块到指定临时目录的位置。表1-4 Http配置选项1.4 使用各种模块

在Nginx发布的版本中,除了http和mail模块之外,还有其他一些模块。这些模块在默认安装中没有被安装,但是可以在编译安装时适当地配置选项--with-_module来启用相应的选项,如表1-5所示。表1-5 Http模块配置选项续表

正如你所看到的,所有这些模块都是建立在Http模块的基础之上的,它们提供了额外的功能。在编译时启用这些模块根本不会影响到运行性能,以后在配置使用这些模块时性能会产生影响。

因此,对于网络加速器/代理,就配置选项来说,我想提出以下建议。

$ ./configure --with-http_ssl_module --with-http_realip_module --with-

http_geoip_module --with-http_stub_status_module --with-openssl=${BUILD_

DIR}/openssl-1.0.1c

及Web服务器。

$ ./configure --with-http_stub_status_module

不同之处在于它们面对的客户,处于Web加速角色时,会考虑到SSL请求的终结,也包括处理代理客户和基于客户来源决策。处于Web服务角色时,则仅需要提供默认文件访问能力。

我总是推荐启用stub_status模块,这是因为它提供了收集Nginx如何执行、对其度量的一个方法。

不再使用的模块

有些http模块通常情况下是激活的,但是可以通过设置适当的--without-_module选项禁用它们。如果在配置中不使用这些模块,如表1-6所示,那么你可以禁用它们。表1-6 禁用的配置选项续表1.5 查找并安装第三方模块

由于有多个开源项目,所以在Nginx周围就会有一个活跃的开发社区。由于Nginx的模块化特性,这个社区能够开发和发布模块,从而为Nginx提供额外的功能。它们涵盖了广泛的应用,所以着手开发自己的模块之前应该看看有什么可用模块。

安装第三方模块的过程相当简单,步骤如下。

1.定位你想要使用的模块(在https://github.com或者是http://wiki.nginx.org/3rdPartyModules查找)。

2.下载该模块。

3.解压缩源代码安装包。

4.如果有README文件,那么阅读README文件,查看在安装中是否有依赖安装。

5.通过/configure–add-module=选项配置使用该模块。

这个过程会给你的Nginx二进制文件与模块附加这个功能。

需要注意的是,很多第三方模块是实验性质的,因此在将这些模块用于生成系统之前要测试使用这些模块。另外请记住,Nginx的开发版本中可能会有API的变化,会导致第三方模块出现问题。

安装说明详见:http://wiki.nginx.org/ HttpLuaModule#Installation,我们将在下一部分将该模块作为一个安装第三方库的示例使用。

特别应该提到的是ngx_lua这个第三方模块,ngx_lua模块提供了启用Lua的功能,而不是像Perl一样在配置时嵌入式脚本语言。该模块对于Perl模块来说最大的优点就是它的无阻塞性,并与其他第三方模块紧密集成。对于它的安装说明完整的描述详见:http://wiki.nginx.org/HttpLuaModule#Installation。

我们将以这个模块为例在下一节中介绍如何安装第三方模块。1.6 组合在一起

现在你已经大概了解了各种配置选项,接下来你可以根据自己的需要设计一个二进制文件。下面的例子中,指定了prefix、user、group,某些路径禁用了某些模块,启用了一些其他模块,包括一些第三方模块。

$ export BUILD_DIR=`pwd`

$ export Nginx_INSTALLDIR=/opt/nginx

$ export VAR_DIR=/home/www/tmp

$ export LUAJIT_LIB=/opt/luajit/lib

$ export LUAJIT_INC=/opt/luajit/include/luajit-2.0

$ ./configure \

--prefix=${Nginx_INSTALLDIR} \

--user=www \

--group=www \

--http-client-body-temp-path=${VAR_DIR}/client_body_temp \

--http-proxy-temp-path=${VAR_DIR}/proxy_temp \

--http-fastcgi-temp-path=${VAR_DIR}/fastcgi_temp \

--without-http_uwsgi_module \

--without-http_scgi_module \

--without-http_browser_module \

--with-openssl=${BUILD_DIR}/../openssl-1.0.1c \

--with-pcre=${BUILD_DIR}/../pcre-8.32 \

--with-http_ssl_module \

--with-http_realip_module \

--with-http_sub_module \

--with-http_flv_module\

--with-http_gzip_static_module \

--with-http_gunzip_module \

--with-http_secure_link_module \

--with-http_stub_status_module \

--add-module=${BUILD_DIR}/ngx_devel_kit-0.2.17 \

--add-module=${BUILD_DIR}/ngx_lua-0.7.9

接下来跟随的大量输出显示了在您的系统上能找到什么样的配置,概要打印出来,如下所示。

Configuration summary

+ using PCRE library: /home/builder/build/pcre-8.32

+ using OpenSSL library: /home/builder/build/openssl-1.0.1c

+ md5: using OpenSSL library

+ sha1: using OpenSSL library

+ using system zlib library

nginx path prefix: "/opt/nginx"

nginx binary file: "/opt/nginx/sbin/nginx"

nginx configuration prefix: "/opt/nginx/conf"

nginx configuration file: "/opt/nginx/conf/nginx.conf"

nginx pid file: "/opt/nginx/logs/nginx.pid"

nginx error log file: "/opt/nginx/logs/error.log"

nginx http access log file: "/opt/nginx/logs/access.log"

nginx http client request body temporary files: "/home/www/tmp/

client_body_temp"

nginx http proxy temporary files: "/home/www/tmp/proxy_temp" nginx http fastcgi temporary files: "/home/www/tmp/fastcgi_temp"

如上所示,configure找到了所有我们要查找的条目,并且按照我们的喜好设置了路径。现在,你可以构建你的Nginx并且安装它了,正如本章一开始提到的。1.7 总结

本章介绍了各种Nginx的有效模块,通过编译你自己的二进制文件,你可以定制Nginx能够为你提供哪些功能。构建和安装软件对于你来说应该不会陌生,所以在创造一个构建环境或确保所有依赖关系都存在上不会花很多的时间。一个 Nginx 的安装应该是按照你的需要,能随时启用或禁用模块,正如你看到的,启用或者是禁用一个模块应该感到很容易。

接下来我们将介绍基本的Nginx配置概述,以便感受一下在通常情况下Nginx是如何配置的。第2章配置指南

Nginx 的配置文件的格式非常合乎逻辑。学习这种格式以及如何使用每个部分是基础,这将有助于你手工创建一个配置文件。通过这一章的下列讨论话题将帮助你达到这个目的。

◆ 基本配置格式。

◆ Nginx全局配置参数。

◆ 使用include文件。

◆ Http的server部分。

◆ 虚拟服务器部分。

◆ location——在哪儿,什么时候,怎么样。

◆ mail的server部分。

◆ 完整的示例配置文件。2.1 基本配置格式

基本的Nginx配置文件由若干个部分组成。每一个部分都是通过下列方法定义的。

{

;

}

需要注意的是每一个指令行都由分号结束(;),这标记着一行的结束。大括号({})实际上表示一个新上下文(context),但是大多数情况下我们将它们作为“节、部分(section)”来读。2.2 Nginx的全局配置参数

全局配置部分被用于配置对整个server都有效的参数和前一个章节中的例外格式。全局部分可能包含配置指令,例如,user和worker_processes,也包括“节、部分(section)”。例如,events,这里没有大括号({})包围全局部分。

在全局部分中,最重要的配置指令都在表2-1中,这些指令将会是你处理的最重要部分。表2-1 全局配置指令

下面是一个使用这些指令的简短的例子。

# we want nginx to run as user 'www'

user www;

# the load is CPU-bound and we have 12 cores

worker_processes 12;

# explicitly specifying the path to the mandatory error log

error_log /var/log/nginx/error.log;

# also explicitly specifying the path to the pid file

pid  /var/run/nginx.pid;

# sets up a new configuration context for the 'events' modul eevents {

# we're on a Solaris-based system and have determined that nginx

# will stop responding to new requests over time with the default

# connection-processing mechanism, so we switch to the second-best use /dev/poll;

# the product of this number and the number of worker_processes

# indicate s how many simultaneous connections per IP:port pair are

# accepted

worker_connections 2048;

}

这一部分应该放置在nginx.conf文件的顶部。2.3 使用include文件

在Nginx的配置文件中,include文件可以在任何地方,以便增强配置文件的可读性,并且能够使得部分配置文件重新使用。使用include文件,要确保被包含的文件自身有正确的Nginx语法,即配置指令和块(blocks),然后指定这些文件的路径。

include /opt/local/etc/nginx/mime.types;

在路径中出现通配符,表示可以配置多个文件。

include /opt/local/etc/nginx/vhost/*.conf;

如果没有给定全路径,那么Nginx将会依据它的主配置文件路径进行搜索。

Nginx测试配置文件很容易,通过下面的命令来完成。

nginx -t -c

该命令将测试Nginx的配置文件,包括include文件,但是它只检查语法错误。2.4 Http的server部分

在Http中,server部分或者是Http配置context是可用的,除非在编译安装Nginx时没有包含Http模块(也就是使用了--without-http)。这部分控制了Http模块的方方面面,是使用最多的一个部分。

本部分的指令用于处理Http连接,因此该模块提供了相当数量的指令。为了更容易理解这些指令我们将它们划分为不同的类型来讲述。2.4.1 客户端指令

如表2-2所示,这一组指令用于处理客户端连接本身的各个方面,以及不同类型的客户端。表2-2 Http客户端指令续表2.4.2 文件I/O指令

这些指令用于控制Nginx如何投递静态文件,以及如何管理文件描述符参见表2-3。表2-3 Http文件I/O指令续表2.4.3 Hash指令

如表2-4所示,这组hash指令控制Nginx分配给某些变量多大的静态内存。在启动和重新配置时,Nginx会计算需要的最小值。在Nginx发出警告时,你几乎只需要调整一个*_hash_max_size 指令的参数值就可以达到效果。*_hash_bucket_size 变量被设置了默认值,以便满足多处理器缓存行降低检索所需要的检索查找,因此基本不需要改变,额外更详细的内容参考http://nginx.org/en/docs/hash. html。表2-4 Http hash指令2.4.4 Socket指令

如表2-5所示,这些指令描述了Nginx如何设置创建TCP套接字的变量选项。表2-5 Http套接字指令2.4.5 示例配置文件

下面是一个Http配置部分的例子。

http {

include  /opt/local/etc/nginx/mime.types;

default_type application/octet-stream;

sendfile on;

tcp_nopush on;

tcp_nodelay on;

keepalive_timeout 65;

server_names_hash_max_size 1024;

}

在nginx.conf文件中上面的这部分内容跟随在全局配置指令之后。2.5 虚拟server部分

任何由关键字server开始的部分都被称作“虚拟服务器”部分。它描述的是一组根据server_name 指令逻辑分割的资源,这些虚拟服务器响应 Http 请求,因此它们都包含在http部分中。

一个虚拟服务器由listen和server_name指令组合定义,listen指令定义了一个IP地址/端口组合或者是UNIX域套接字路径。

listen address[:port];

listen port;

listen unix:path;

如表2-6所示,listen指令唯一地标识了在Nginx下的套接字绑定,此外还有一些其他的可选参数。表2-6 listen指令的参数

server_name指令是相当简单的,但可以用来解决一些配置问题。它的默认值为"",这意味着server部分没有server_name指令,对于没有设置Host头字段的请求将会匹配该server处理。这种情况可用于,例如,丢弃这种缺乏Host头的请求。

server {

listen 80;

return 444;

}

在这个例子中使用的Http非标准代码444将会使得Nginx立即关闭一个连接。

除了普通的字符串之外,Nginx也接受通配符作为server_name的参数。

◆ 通配符可以替代部分子域名:*.example.com。

◆ 通配符可以替代顶级域部分:www.example.*。

◆ 一种特殊形式将匹配子域或域本身:

.example.com(匹配*.example.com也包括example.com)。

通过在域名前面加上波浪号(〜),正则表达式也可以被作为参数应用于server_name。

server_name~^www\.example\.com$;

server_name~^www(\d+).example\.(com)$;

后一种形式是利用捕获,可以在以后引用中进一步配置(用$1,$2等)指令中使用。

对于一个特定的请求,确定哪些虚拟服务器提供该请求的服务时,应该遵循下面的逻辑。

1.匹配IP地址和listen指令指定的端口。

2.将Host头字段作为一个字符串匹配server_name指令。

3.将Host头字段与server_name指令值字符串的开始部分做匹配。

4.将Host头字段与server_name指令值字符串的尾部分做匹配。

5.将Host头字段与server_name指令值进行正则表达式匹配。

6.如果所有Host头匹配失败,那么将会转向listen指令标记的default_server。

7.如果所有的Host头匹配失败,并且没有default_server,那么将会转向第一个server的listen指令,以满足第1步。

这个逻辑体现在下面的图2-1中。图2-1 Host头匹配流程图

default_server 被用于处理其他方式没有处理的请求。因此推荐总是明确地设置default_server,以便这些没有被处理的请求通过这种定义的方式处理。

除了这个用法外,default_server 也可以使用同样的 listen 指令配置若干个虚拟服务器。这里设置的任何指令都将会在匹配的server区段有效。2.6 Locations——where,when,how

location指令可以用在虚拟服务器server部分,并且意味着提供来自客户端的URI或者内部重定向访问。除少数情况外,location也可以被嵌套使用,它们被作为特定的配置尽可能地处理请求。

location定义如下。

location [modifier] uri {...}

或者是命名location。

location @name {…}

命名 location 仅对内部访问重定向,在进入一个 location 之前它会保留被请求的 URI部分。命名location只能够在server级别定义。

表2-7中的修饰符会影响location的处理。表2-7 location修饰符

当一个请求进入时,URI将会被检测匹配一个最佳的location。

◆ 没有正则表达式的location被作为最佳的匹配,独立于含有正则表达式的location顺序。

◆ 在配置文件中按照查找顺序进行正则表达式匹配,在查找到第一个正则表达式匹配之后结束查找,那么就由这个最佳的location提供请求处理。

这里比较匹配描述的是解码URI,例如,在URI中的"%20",将会匹配location中的"" (空格)。

命名location仅可以在内部重定向的请求中使用。

表2-8中的指令仅在location中使用。表2-8 仅用于location的指令

另外,http部分的其他指令也可以在location中指定,参考附录A指令参考有完整列表。

指令try_files在这里也值得一提,它也可以用在server部分,但是最常见的还是在location部分中。try_files指令将会按照给定它的参数列出的顺序进行尝试,一个被匹配的将会被使用。

它经常被用于从一个变量去匹配一个可能的文件,然后将处理传递到一个命名location,看下面的例子。

location / {

try_files $uri $uri/ @mongrel;

}

location @mongrel {

proxy_pass http://appserver;

}

在这里有一个隐含的目录索引,如果给定的URI作为一个文件没有被找到,那么处理将会通过代理被传递到 appserver。我们将会在本书的其他部分讨论如何最好地使用location、try_files和proxy_pass来解决特定的问题。

除以下前缀外,locations可以被嵌套。

◆ 具有 "="前缀。

◆ 命名location。

最佳实践表明正则表达式location被嵌套在基于字符串的location,看下面的例子。

# ffirst, we enter through the root

location / {

# then we ffind a most-specific substring

# note that this is not a regular expression

location ^~ /css {

# here is the regular expression that then gets matched

location~* /css/.*\.css$ {

}

}

}2.7 mail的server部分

mail 服务部分,或者是 mail 的配置内容部分,仅在构建 Nginx 时使用了 mail 模块(--with-mail)才有效。这个部分控制了mail模块的所有方面。

作为mail模块允许配置影响代理邮件连接的所有方面,也可以为每个server指定。这个server也可以接受listen和server_name 指令,这些指令我们在http server部分已经看过了。

Nginx能够代理IMAP、POP3和SMTP协议,表2-9中列出了该模块有效的指令。表2-9 Mail模块指令

如果Nginx在编译时支持了SSL(--with-mail_ssl_module),那么表2-10所示指令在前面的mail模块中可以使用。表2-10 Mail模块的SSL指令2.8 完整的样本配置文件

以下示例是一个样本配置文件,它包括了在本章讨论的各个不同方面。请注意,不要复制粘贴该样本配置文件,因为它很可能不是你需要的配置,而只是显示了一个完整配置文件的架构而已。

user www;

worker_processes 12;

error_log /var/log/nginx/error.log;

pid /var/run/nginx.pid;

events {

use /dev/poll;

worker_connections 2048;

}

http {

include  /opt/local/etc/nginx/mime.types;

default_type application/octet-stream;

sendfile on;

tcp_nopush on;

tcp_nodelay on;

keepalive_timeout 65;

server_names_hash_max_size 1024;

server {

listen 80;

return 444;

}

server {

listen 80;

server_name www.example.com;

location / {

try_files $uri $uri/ @mongrel;

}

location @mongrel {

proxy_pass http://127.0.0.1:8080;

}

}

}2.9 总结

在本章,我们看到了如何构建 Nginx 的配置文件。模块化的本质值得思考,从某种意义上讲,Nginx本身也是模块化的。全局的配置区段负责各个方面,对于Nginx来说是一个整体。Nginx负责处理的每一种协议单独成为一个部分。我们还可以通过在这些协议配置内(http或者mail)指定server来定义每一个请求如何被处理,以便请求被路由到特定的 IP 地址和端口上。在http区段中,使用locations来匹配URI请求,这些 locations可以嵌套使用,或者按其他顺序使用,以确保请求被路由到正确的文件系统区域或者应用程序服务器。

本章没有涵盖编译到二进制 Nginx 命令中各种模块提供的配置选项,这些额外的指令将会遍及本书的始终,因此特定的模块被用于解决一个问题。对于 Nginx 配置中的变量也没有解释,这些变量也将会在本书后边的内容中讨论。本章的焦点是基于 Nginx 的基本配置。第3章使用mail模块

Nginx被设计为不但能够提供Web服务,而且还提供了邮件代理服务。在本章中你将会学习到如何将Nginx配置为一个代理POP3、IMAP和SMTP的服务器。在下面的内容中我们将测试Nginx作为邮件服务代理服务器运行。本章包括以下部分。

◆ 基本代理服务。

◆ 认证服务。

◆ 与Memcached结合。

◆ 解释日志文件。

◆ 操作系统限制。3.1 基本代理服务

Nginx的mail代理模块的前身是FastMail。开发者们有必要为他们的用户提供一个单独的IMAP端点,而邮件用户账户在上游邮件服务器中的某一个服务器上。那时的典型代理程序是类 UNIX 的派生模式,这意味着每一个连接都需要派生一个新的进程。IMAP连接非常持久,这就意味着这些进程将会在系统中停留很长时间,这将会导致代理服务器非常缓慢,因为它要管理这些进程每一个连接的生存期。对于这类服务,Nginx基于事件进程模型更好一些。作为一个邮件代理,Nginx能够直接投递到任何数量的mailbox服务中,这里的邮件账户是系统中实际的账户。这就提供了一个端点到用户的通信能力,通过缩放mailbox的数量决定用户的数量。无论是商业的,还是开源的邮件解决方案,例如,Atmail和Zimbra,都是建立在这种模型的基础之上的。

图3-1将帮助理解它是如何工作的。图3-1 代理模块工作原理

每一个进入的请求将会基于相应的协议处理,mail代理模块可能被配置为不同的协议POP3、IMAP或者SMTP方式,Nginx需要一个用户名/密码的认证服务器。如果认证成功,那么连接被代理到邮件服务器,在认证服务的响应中会指示具体的邮件服务器。如果认证不成功,那么客户端连接被终止。认证服务决定客户端使用POP3、IMAP、SMTP 服务,以及由哪一个邮件服务器提供访问。可能许多邮件服务器都使用这种方式,Nginx 可以通过一个中央网关为所有这些邮件服务器提供代理服务。

代理的行为就是某人或者某事的代表,在这种情况下,Nginx 充当了邮件客户端,终结了客户端的连接并且打开一个新的到上游服务器的连接,这意味着在邮件客户端和实际的邮件mailbox服务器或者邮件中继主机之间没有直接通信。

如果有任何基于信息邮件规则包含在客户端连接中,这些规则将不会工作,除非mail软件能够支持扩展,例如,SMTP协议的XCLIENT。

在设计一个架构中包含一个代理服务器是很重要的,代理服务器将会比一个典型的上游服务器支持更多的连接。作为一个 mailbox 服务器,并不是越多的处理器和内存越好,但是需要考虑到账户的持续连接数。3.1.1 POP3服务

Post Office Protocol是一个Internet标准协议,用于从邮箱服务器收取邮件,该协议当前的版本是3,也就是POP3。在一个会话中,邮件客户端通常会从邮箱服务器上获取所有新的邮件,然后关闭该连接。在关闭连接之后,邮箱服务器将会删除所有被标记为已收取的邮件。

为了将Nginx作为POP3代理,在Nginx的配置文件中需要配置一些基本的指令。

mail {

auth_http localhost:9000/auth;

server {

listen 110;

protocol pop3;

proxy on;

}

}

这个配置片段启用了mail模块,并且为它配置了POP3服务,查询认证服务运行在同机器的9000端口上,Nginx将监听在所有本地IP地址的110端口上提供POP3代理服务。你可能注意到在这里我们没有配置实际的邮件服务器——认证服务的工作告诉Nginx一个特定的客户应该连接哪一个邮件服务器。

如果你的服务器只能支持某些功能(或者你仅提供某种功能),Nginx有足够的灵活性宣布这些功能。

mail {

pop3_capabilities TOP USER;

}

capabilities是一种宣传方法用于可选的命令,对于POP3来说,在认证前或者认证后,客户端可以请求支持capabilities,所以在Nginx中这些配置很重要。

你也可以指定支持哪一种认证方式。

mail {

pop3_auth apop cram-md5;

}

试读结束[说明:试读内容隐藏了图片]

下载完整电子书


相关推荐

最新文章


© 2020 txtepub下载