《Nginx HTTP Server》

第2章:下载和安装Nginx

在这一章,我们将继续采取必要的步骤,向着建立一个有用的Nginx前进,这一刻是保证Web服务器能够顺利运作的关键时刻——在安装Nginx Web服务器时有一些必要的库和工具,这些库和工具的选择取决于编译Nginx时选择的参数决定,但需要你在将Nginx的代码编译为二进制执行命令之选择安装这些必要的组件,并进行其他系统相关的配置。

本章主题

  1. 下载和编译安装Nginx之前的必要程序
  2. 下载一个合适的Nginx源代码版本
  3. 配置Nginx编译时的选项
  4. 通过init脚本来控制应用程序
  5. 配置系统启动时自动启动Nginx

准备先决条件

正如你想到的,我们下载该程序的一个源代码包并且手动编译,而不是使用包管理工具,例如Yum,Aptitude或Yast来安装。这么做有两个原因。首先,在Linux发布版本中,该包可能无效,实际上,很少有提供下载的自动安装的仓库(repositories),即便有,大部份包含的也是过期的版本。其次,更重要的是,有一个不得不提的事实,我们需要在编译时对多种重要的选项进行配置,也正是基于这种情况,才有了不得不手动编译安装的结果,因此也就致使你需要在系统上安装这些工具和库文件,在Nginx编译时根据需要进行处理。

依赖于编译时的模块选择,可能需要不同的安装前提条件。在这里,我们将指导你安装最常见的工具和库,例如GCC、PCRE、zlib和OpenSSL。

GCC——GNU编译器集合

Nginx是一个由C语言编写的程序,因此首先需要在系统上安装一个编译工具,例如GNU和GCC,GCC通常由大多数Linux的发行版本安装,但如果因为某种原因没有安装,那么这一步必须进行。

GCC是一个开源编译器集合,是用于处理各种各样的语言:C、C++、Java、Ada、FORTRAN,等等。在Linux世界中,它是最通用的编译器。它支持大量的处理器,例如x86、AMD64、PowerPC、ARM、MIPS等。

首先确定系统上是否已经安装GCC,如下所示:

[alex@example.com ~]$ gcc

如果有下面的输出,则表明GCC已经正确安装在系统上,你可以跳过这一步,进行下面的步骤:

gcc: no input files

如果收到下面的消息,则必须安装和编译GCC:

~bash: gcc: command not found

GCC可以使用默认包管理器和仓库(repositories)来安装,包管理器的选择依赖于你使用的Linux发布版本,包管理器有不同的实现:yum是基于Red Hat的发布版本;apt用于Debian和Ubuntu;yast用于SuSE Linux;等等。这里是典型处理方式,使用yum或apt下载和安装GCC:

[root@example.com ~]# yum install gcc

如果使用apt-get:

[root@example.com ~]# apt-get install gcc

如果使用其他安装包管理器,那么语法可能有所不同,你可能需要全名用man工具来查找相关文档。无论哪种方式,你的安装包管理程序能够正确下载和安装GCC,之后自动解决依赖关系。

PCRE库

在Nginx编译需要PCRE(Perl Compatible Regular Expression),因为Nginx的Rewrite模块和HTTP核心模块会使用到PCRE正则表达式语法,在后面,你将发现这一点。需要安装两个安装包pcre和pcre-devel。第一个安装包提供编译版本的库,而第二个提供开发阶段的头文件和编译项目的源代码,这正是我们需要的理由。

可以使用下面示例中的命令来安装这两种软件包。

使用yum来安装:

[root@example.com ~]# yum install pcre pcre-devel

或者安装与PCRE相关的所有的安装包:

[root@example.com ~]# yum install pcre*

如果用apt-get:

[root@example.com ~]# apt-get install libpcre3 libpcre3-dev

如果这些安装包已经安装在系统上,你会收到一条信息Nothing to do(见下图),换句话说,安装包管理器没有安装或升级任何部份。

zlib库

zlib库提供了开发人员的压缩算法,在Nginx的各种模块中需要使用gzip压缩。你可以再次使用包管理程序来安装这个组件,如同安装PCRE一样,同样需要安装库和它的源代码:zlib和zlib-devel。

使用yum:

[root@example.com ~]# yum install zlib zlib-devel

使用apt-get:

[root@example.com ~]# apt-get install zlib1g zlib1g-dev

这些安装包会快速安装完毕,并且没有依赖问题。

OpenSSL

OpenSSL项目是一个协作开发健壮的、商业级的、全功能的、开源工具执行于安全套接层(SSL v2/v3)和传输层安全(TLS v1)的协议,也是一个完整强壮的通用加密库。该项目的管理者是来自世界范围内社区的志愿者,他们使用互联网表达、计划和开发OpenSSL工具箱,有关文档可以查看http://www.openssl.org。

在Nginx中,如果服务器提供安全网页时则会用到OpenSSL库,我们需要安装库文件和它的开发安装包。安装openssl和openssl-devel过程如下。

[root@example.com ~]# yum install openssl openssl-devel

使用apt-get:

[root@example.com ~]# apt-get install openssl openssl-dev

注意你所在国家的法律和法规。一些国家不允许使用强壮的密码算法,对于你的使用,OpenSSL和Nginx项目的作者、出版社和开发者将不承担相关法律责任。

现在已经安装完成所有的前提条件,你可以开始准备下载和编译Nginx的源代码了。

下载Nginx

这种处理下载的方式会让我们发现各种资源,管理员可自行支配、所有与Nginx相关联的网站、社区(communities)和维基(wiki)。我们也将快速讨论你见到的不同版本,最后选择一个最合适你安装的版本。

网站和资源

尽管Nginx是一个新且刚刚成长起来的项目,但是在互联网上已经有相当数量的资源和积极的社区管理员和开发者。

官方网站是www.nginx.net,相当的简单,除了最新版本的下载连接,并不提供更多的信息和文档,而与之相反的是,你会在官方维基网站(wiki.nginx.org)上发现很多有趣的文档和例子。

如下图所示,维基提供了大量的文档和配置例子——而且已被证明在许多环境下对你非常有用。如果有具体的问题想问,可以使用论坛(forum.nginx.org),很快就会有积极的社区用户回答你的问题。另外,Nginx邮件列表,会将你询问的任何问题转发到Nginx论坛,这也将证实了Nginx有一个优秀的资源库。如果你需要直接帮助,可以在Freenode的Nginx IRC频道(http://webchat.freenode.net/)寻求帮助,总有一群人在有规律的提供帮助。

还有其他有趣的资源信息——blogosphere,对于你执行的一个简单的兴趣查询,会返回大量的博客文档,例如Nginx的配置和模块。

现在我们到官方网站开始下载源代码,进而编译和安装Nginx,在下载之前,让我们快速看一下这些可用的版本及其提供的功能。

一个常见问题是开发版本“在生产服务器上是否足够稳定?” Cliff Wells,nginx.org维基网站的创始人和社区维护人员认为:“我一般使用和推荐最新的开发版本”早期的用户很少报告危险的问题。具体选择什么版本由你决定,本书所给的指令都是适用的,不管发布的是什么版本,因为Nginx开发者们决定新版本的向后兼容性。你可能会发现很多关于版本改变的信息、bug修复,这些均可以在官方网站的更改日志页中找到。

版本分支

Igor Sysoev,一个有才能的俄罗斯开发人员和服务器管理员,最早从2002年开始这个开源项目,在2004年第一个版本到当前的版本,Nginx现在已经在Internet上占据了6.55%的份额,创造了稳定的发展,功能健全而灵活。

这个项目目前有三种版本支流。

  • 稳定版本:这是通常被推荐使用的版本,开发者和用户认可的版本,但是通常有点滞后于开发版本。当前最新的稳定版本为0.7.66,发布于2010年7月7日。
  • 开发版本:这是用于下载的最新版本可见版本,虽然它足以在生产环境中部署,但是你可能还是会发现有bug,因此,还是推荐使用稳定版本,尽管它没有最新版本的功能。当前最新的开发版本是0.8.40,发布于2010年7月7日。
  • 旧版版本:如果你因为某些原因对老版本感兴趣,那么你会找到两个版本,有一个旧版本和一个旧的稳定版本:0.5.38和0.6.39。

功能

作为稳定版本0.7.66,Nginx提供了一个令人印象深刻的多样化功能,和你想象的相反,不是所有的都关系到HTTP内容。这里有一个web分支(branch)的主要功能列表,引自官方网站nginx.net:

  • 处理静态文件、索引文件(index file)和自动索引(auto indexing),打开文件描述符缓冲;
  • 通过缓冲加速反向代理,简单的负载均衡和容错;
  • 加速远程支持FastCGI服务器,简单的负载均衡和容错;
  • 模块化结构。过滤器包括gzip压缩,字节服务(byte rang),分块响应(chunked responses),XSLT,SSI和图片大小过滤器。在单个页中能够并行处理多重SSI包含,如果通过FastCGI或proxied服务器,这些均可处理。
  • SSL和TLS SNI支持(具有SNI(Server Name Indication)和TLS,在服务器上做虚拟主机需要使用TLS)。

Nginx也能够作为邮件代理服务器,这方面内容在本书没有详述。

  • 用户在外部使用HTTP认证服务器重定向到IMAP/POP3后端服务器。
  • 用户在外部使用HTTP认证服务器,连接重定向到内部的SMTP后台服务器。
  • 认证方法如下:
    • POP3: USER/PASS, APOP, AUTH LOGIN/PLAIN/CRAM-MD5
    • IMAP: LOGIN, AUTH LOGIN/PLAIN/CRAM-MD5
    • SMTP: AUTH LOGIN/PLAIN/CRAM-MD5
  • 支持SSL
  • 支持STARTTLS和STLS

Nginx能够被许多计算机结构和操作系统编译,像Windows,Linux,Mac OS,FreeBSD及Solaris操作系统,也可以运行在32位或64位的结构下。

下载并解压

一旦决定选择使用的版本,就到nginx.net找到相关URL,然后下载到home目录,下载的安装包中包括要编译的源代码,可以通过wget来下载:

[alex@example.com ~]$ mkdir src && cd src
[alex@example.com src]$ wget http://nginx.org/download/nginx-0.7.66.tar.gz

我们将使用0.7.66版本,这是2010年6月7日发布的最新稳定版本。下载完成后可在当前目录下解压安装包:

[alex@example.com src]$ tar zxf nginx-0.7.66.tar.gz

你已经成功下载并解压了Nginx安装包,现在,为了适应操作系统,为了获得二进制的运行,要对Nginx进行编译配置处理。

配置选项

创建一个应用程序通常分为三步,从源代码到配置、编译和安装编译。配置步骤允许你选择许多选项,这些选项在完成程序的建立安装后不可编辑,因此它直接影响该项目的二进制文件。所以,这一步非常重要,如果想在后来避免意外,必须仔细,例如在一个无计划的目录中缺乏指定的模块或文件。

该过程是添加某些开关选项(switch)到配置(configure)脚本,该脚本就在源代码安装包中,在下面的内容中我们将了解到,可以激活的开关选项有三种类型,但我们首先研究最容易的。

容易的方法

如果是因为某种原因,你不想打扰配置步骤,例如只是测试或者是简单的安装,因为将来还会重新编译安装该程序,所以你只是简单地使用configure脚本,而并没有全名用任何开关选项。执行下列三个命令就可以建立和安装工作版(能够进行Web服务)的Nginx:

[alex@example.com nginx-0.7.66]# ./configure

运行了该命令后,就开始了一个长时间的程序验证过程,以便确定系统包含所有必要的组成成分。如果配置过程失败,请再次检测先决条件,现在看来,它是引发错误的最常见原因。要想查看为什么该命令会失败,也可以求助于“objs/autoconf.err”文件,该文件提供了更详细的报告:

[alex@example.com nginx-0.7.66]# make

命令make对应用程序进行编译,如果配置部分运行良好,那么这一部分不会出现任何错误。

[root@example.com nginx-0.7.66]# make install

这是最后一步,复制编译后的文件(也包括资源文件)到安装目录,默认情况下是目录“/usr/local/nginx”,这一步可能需要以root的身份登录系统,然后来执行安装的操作,这依赖于你对当前用户授予“/usr/local”的权限。

为此,如果你没有经过自定义配置就创建了该应用程序,那么你的这个冒险便会错过很多功能,例如可选择的模块和我们即将认识的其他模块。

路径选项

在运行configure脚本命令的时候,可能开启一些开关选项,例如,需要对Nginx各种组成成分指定目录或文件路径。会注意配置脚本提供的开关选项,可能会因下载的版本而不同。下面列举的选项都在稳定发布版本0.7.66中有效。如果使用的是其他版本,可以运行“./configure --help”命令列出有效的开关变量,以便于安装的选择。

典型的做法是使用开关命令在命令行添加一些文本,例如,使用开关选项--conf-path:

[alex@example.com nginx-0.7.66]# ./configure --conf-path=/etc/nginx/nginx.conf

下表中,全部列出配置时的开关选项。

选项用法默认值
--prefix=...指定安装Nginx的基础目录/usr/local/nginx.
注意:如果你在配置时使用了相对路径,则连接到基础目录。
示例:指定定--conf- path=conf/nginx.conf则配置文件会在目录:/usr/local/ nginx/conf/nginx.conf
--sbin-path=...Nginx二进制文件安装的路径/sbin/nginx.
--conf-path=...主要配置文件放置的目录/conf/nginx.conf.
--error-log- path=...错误日志存放的路径。
错误日志在配置文件中须配置得非常正确,该路径只应用于你在配置文件中没有指定任何错误的日志指令时
/logs/error.log.
--pid-path=...指定Nginx的pid文件的路径。可以在配置文件中指定pid文件的路径,如果没有具体的指定,则使用在这里对该选项指定的该路径/logs/nginx.pid.
注意:该pid文件是一个简单的文本文件,它包含进程的标识符。该文件应该放置在一个清晰可见的位置,以便其他应用程序能够很容易找到运行该程序的pid
--lock-path=...锁文件(lock file)在存放路径。同样,该文件也可以在配置文件中指定,但是,如果在配置文件中没有指定,则使用该值/logs/nginx.lock.
注意:锁文件允许其他应用程序确定是否一个程序在运行,就Nginx来说,它用于确定该进程没有被启动两次
--with-perl_modules_path=...定义Perl模块的路径。如果需要包含另外的Perl模块,必须定义该参数 
--with-perl=...Perl二进制文件的路径。用于执行Perl脚本。如果想执行一个Perl脚本,必须设置该路径 
--http-log-path=...定义被访问文件的日志文件存放路径。该路径只用于在配置文件中没有定义访问日志的情况/logs/access.log.
--http-client-body-temp-path=...该目录用于存储客户端请求产生的临时文件/client_body_temp.
--http-proxy-temp-path=...该目录用于代理存储临时文件/proxy_temp.
--http-fastcgi-temp-path=...指定用于HTTP FastCGI模块使用的临时文件的存放/fastcgi_temp.
--builddir=...指定创建应用程序的位置 

先决条件选项

先决条件的格式有库文件和二进制文件。到现在,你应该已经把它们安装在系统中了,然而即使它们已经安装在系统中,可能有时候配置脚本还是不能找到它们的位置。原因有多种,例如,如果它们安装在非标准路径中。为了修复这些问题,可以全名用下表所列的开关项来指出它们所在的路径。在杂项中,将其他的依赖选择组织在一起。

Compiler options 
--with-cc=...Specifies an alternate location for the C compiler.
--with-cpp=...Specifies an alternate location for the C preprocessor.
--with-cc-opt=...Defines additional options to be passed to the C compiler command line.
--with-ld-opt=...Defines additional options to be passed to the C linker command line.
--with-cpu-opt=...Specifies a different target processor architecture, among the following values: pentium, pentiumpro, pentium3, pentium4, athlon, opteron, sparc32, sparc64, and ppc64.
PCRE options 
--without-pcreDisables usage of the PCRE library. This setting is not recommended, as it will remove support for regular expressions, consequently disabling the Rewrite module.
--with-pcreForces usage of the PCRE library.
--with-pcre=...Allows you to specify the path of the PCRE library source code.
--with-pcre-opt=...Additional options for building the PCRE library.
MD5 options 
--with-md5=...Specifies the path to the MD5 library sources.
--with-md5-opt=...Additional options for building the MD5 library.
--with-md5-asmUses assembler sources for the MD5 library.
SHA1 options 
--with-sha1=...Specifies the path to the SHA1 library sources.
--with-sha1-opt=...Additional options for building the SHA1 library.
--with-sha1-asmUses assembler sources for the SHA1 library.
zlib options 
--with-zlib=...Specifies the path to the zlib library sources.
--with-zlib-opt=...Additional options for building the zlib library.
--with-zlib-asm=...Uses assembler optimizations for the following target architectures: pentium, pentiumpro.
OpenSSL options 
--with-openssl=...Specifies the path of the OpenSSL library sources.
--with-openssl-opt=...Additional options for building the OpenSSL library.

模块选项

模块,将在第4章和后面几章讨论,在编译Nginx之前需要对模块进行选择,一些模块默认是开启的,在些模块需要手动开启,详细情况参考下文。

默认开启的模块

下表列出的模块默认情况下是开启的,可以通过下列开关项关闭这些模块。

Modules enabled by defaultDescription
--without-http_charset_moduleDisables the Charset module for re-encoding web pages.
--without-http_gzip_moduleDisables the Gzip compression module. Disables the Server Side Include module.
--without-http_ssi_moduleDisables the Server Side Include module.
--without-http_userid_moduleDisables the User ID module providing user identification via cookies.
--without-http_access_moduleDisables the Access module allowing access configuration for IP address ranges.
--without-http_auth_basic_moduleDisables the Basic Authentication module.
--without-http_autoindex_moduleDisables the Automatic Index module.
--without-http_geo_moduleDisables the Geo module allowing you to define variables depending on IP address ranges.
--without-http_map_moduleDisables the Map module that allows you to declare map blocks.
--without-http_referer_moduleDisables the Referer control module.
--without-http_rewrite_moduleDisables the Rewrite module.
--without-http_proxy_moduleDisables the Proxy module for transferring requests to other servers.
--without-http_fastcgi_moduleDisables the FastCGI module for interacting with a FastCGI process.
--without-http_memcached_moduleDisables the Memcached module for interacting with the memcache daemon.
--without-http_limit_zone_moduleDisables the Limit Zone module for restricting resource usage according to defined zones.
--without-http_limit_req_moduleDisables the Limit Requests module allowing you to limit the amount of requests per user.
--without-http_empty_gif_moduleDisables the Empty Gif module for serving a blank GIF image from memory.
--without-http_browser_moduleDisables the Browser module for interpreting the User Agent string.
--without-http_upstream_ip_hash_moduleDisables the Upstream module for configuring load-balanced architectures.
默认禁用的模块

下表列出的开关选项允许你开启默认禁用的模块。

Modules disabled by defaultDescription
--with-http_ssl_moduleEnables the SSL module for serving pages using HTTPS.
--with-http_realip_moduleEnables the Real IP module for reading the real IP address from the request header data.
--with-http_addition_moduleEnables the Addition module which lets you append or prepend data to the response body.
--with-http_xslt_moduleEnables the XSLT module for applying XSL transformations to XML documents.
Note: You will need to install the libxml2 and libxslt libraries on your system if you wish to compile these modules.
--with-http_image_filter_moduleEnables the Image Filter module that lets you apply modification to images.
Note: You will need to install the libgd library on your system if you wish to compile this module.
--with-http_geoip_moduleEnables the GeoIP module for achieving geographic localization using MaxMind's GeoIP binary database.
Note: You will need to install the libgeoip library on your system if you wish to compile this module.
--with-http_sub_moduleEnables the Substitution module for replacing text in web pages.
--with-http_dav_moduleEnables the WebDAV module (Distributed Authoring and Versioning via Web).
--with-http_flv_moduleEnables the FLV module for special handling of .flv (flash video) files.
--with-http_gzip_static_moduleEnables the Gzip Static module for sending pre-compressed files.
--with-http_random_index_moduleEnables the Random Index module for picking a random file as the directory index.
--with-http_secure_link_moduleEnables the Secure Link module to check the presence of a keyword in the URL.
--with-http_stub_status_moduleEnables the Stub Status module, which generates a server statistics and information page.
--with-google_perftools_moduleEnables the Google Performance Tools module.

杂项

下表列出的是在配置脚本中有效的一些选项,例如,邮件代理服务功能或时间管理功能。

Mail server proxy options 
--with-mailEnables mail server proxy module. Supports POP3, IMAP4, SMTP. It is disabled by default.
--with-mail_ssl_moduleEnables SSL support for the mail server proxy. It is disabled by default.
--without-mail_pop3_moduleDisables the POP3 module for the mail server proxy. It is enabled by default when the mail server proxy module is enabled.
--without-mail_imap_moduleDisables the IMAP4 module for the mail server proxy. It is enabled by default when the mail server proxy module is enabled.
--without-mail_smtp_moduleDisables the SMTP module for the mail server proxy. It is enabled by default when the mail server proxy module is enabled.
Event management:
Allows you to select the event notification system for the Nginx sequencer. For advanced users only.
--with-rtsig_moduleEnables the rtsig module to use rtsig as event notification mechanism.
--with-select_moduleEnables the select module to use select as event notification mechanism. By default, this module is enabled unless a better method is found on the system—kqueue, epoll, rtsig, or poll.
--without-select_moduleDisables the select module.
--with-poll_moduleEnables the poll module to use poll as event notification mechanism. By default, this module is enabled if available, unless a better method is found on the system—kqueue, epoll, or rtsig.
--without-poll_moduleDisables the poll module.
User and group options 
--user=...Default user account for starting the Nginx worker processes. This setting is used only if you omit to specify the user directive in the configuration file.
--group=...Default user group for starting the Nginx worker processes. This setting is used only if you omit to specify the group directive in the configuration file.
Other options 
--with-ipv6Enables IPv6 support.
--without-httpDisables the HTTP server.
--without-http-cacheDisables HTTP caching features.
--add-module=PATHAdds a third-party module to the compile process by specifying its path. This switch can be repeated indefinitely if you wish to compile multiple modules.
--with-debugEnables additional debugging information to be logged.

配置举例

这里有一些configuration脚本命令的例子,可能应用于各种不同的情况,在这些例子中,路径开关选项被忽略,因为在每个系统中它们都被明确指定,保留默认值只是为了能够正常工作。

请注意,这些配置没有包含第三方模块,有关安装附加模块的更多信息,请参考第5章。

关于prefix开关选项

在配置期间,应该特别注意--prefix开关选项,将来许多配置指令(我们将在后面的章节进一步尝试)都基于你在这时选择的路径。记住,一旦二进制文件编译完成,prefix就能不再变,然而这并不是一个决定性的问题,因为仍然可以使用绝对路径。

如果你打算与时俱进,想要升级Nginx,以便使用一个新的发布版,默认的prefix(如果没有通过使用--prefix开关选项去覆盖)是/usr/local/nginx——一个不包含版本号的路径,因此,升级Nginx的时候,如果没有指定不同的prefix,新安装的文件就会覆盖先前安装的文件,这种做法可能存在其他问题,因为这有可能会清除你的配置文件和正在运行的二进制文件。

因此推荐使用不同的prefix,利用prefix指明第一个版本号,例如:

./configure --prefix=/usr/local/nginx-0.7.66

另外,为了使将来简单一些,可以为/usr/local/nginx建立一个符号链接来指向/usr/local/nginx-0.7.66,一旦升级,该链接便会指向新的/usr/local/nginx-newer.version。这会(例如)使用init脚本总是能够使用最新安装的Nginx版本。

普通的HTTP和HTTPS服务器

第一个例子描述的是这样一种情况,为HTTP服务开启HTTPS服务,并包含最重要的功能和模块,而与邮件相关的选项都被禁用:

./configure --user=www-data --group=www-data --with-http_ssl_module \
--with-http_realip_module

可以看出,命令行相当简单,大多数开关选项都被省略。原因是:默认的配置是相当高效的,并且大多数模块已被启用。你只需要为HTTPS协议包含http_ssl模块即可。考虑到Nginx服务器可能被用作后端运行,所以顺便又添加了“real IP”模块,该模块用于检索访问者的IP地址。

开启所有的模块

以下这一种情况:整个安装包。开启所有的模块支持,由自己来决定是否在运行时使用它们。

./configure --user=www-data --group=www-data \ 
    --with-http_ssl_module --with-http_realip_module \ 
    --with-http_addition_module --with-http_xslt_module \
    --with-http_image_filter_module --with-http_geoip_module \ 
    --with-http_sub_module --with-http_dav_module \
    --with-http_flv_module --with-http_gzip_static_module \ 
    --with-http_random_index_module \ 
    --with-http_secure_link_module --with-http_stub_status_module

这种配置开启了最广泛的配置选择,第4章~第7章提供了关于模块配置的详细信息。

在这种安装下,所有可选模块都被开启,因此需要安装额外的库,例如libgeoip(用于Geo IP模块);libgd(用于Image Filter模块);libxml2和libxslt(用于XSLT模块)。可以通过系统中的安装包管理器来安装这些先决条件,例如可以通过yum来安装libxml2,也可以通过apt-get来安装libxml2。

邮件服务器代理

最后一个建立的配置稍微有点特殊,它用于开启邮件代理功能,这是Nginx不被重视的一面,以下配置开启与该功能相关的所有模块:

./configure --user=www-data --group=www-data \ 
    --with-mail --with-mail_ssl_module

如果愿意彻底禁用HTTP服务功能,而只是将Nginx用于邮件代理,可以添加一个--without-http开关选项。

注意,在前面列出的命令中,www-data用于运行Nginx进程的用户和组(user和group),所以工作进程将以此组合来运行。因此,系统上必须有这样的用户和用户组。添加用户和用户组的相关信息,可以参阅第1章。

建立配置的问题

在某些情况下,configure命令可能会失败——在一个很长的检查列表后,你可能会在终端上收到一些错误的信息,很多情况下(但不是全部),这些错误与丢失先决条件或没有指定路径相关。

在这种情况下,需要继续下面的工作,即仔细校验,以确保有所有需要编译的应用程序,并且要随意翻阅objs/autoconf.err文件,该文件详细记录了编译出错的相关问题,它是在configure进程进行期间产生的,它会详细告诉你进程在哪里出了问题。

请确保先决条件

基本的四个先决条件是:GCC,PCRE,zlib和OpenSSL。最后是三个库,针对每个库,必须安装两个安装包:一个是库自身,另一个是开源代码。确定你已经安装两者。请参阅在本章开始部分的先决条件。注意其他先决条件,例如其他的扩展模块可能需要libXML2和libXSLT,例如HTTP XSLT模块。

如果肯定已经正确安装所有的先决条件,那么造成编译错误的原因是configure脚本无法定位先决条件文件的位置。在这种情况下,确定你包含的开关选项与相关的文件路径相关联。

例如,下列开关项允许你指定OpenSSL库文件的位置:

./configure [...] --with-openssl=/usr/lib64

所以,配置脚本会在前面指定的路径寻找OpenSSL库。

目录的存在和可写性

一定记得检查明显的错误,第一个人迟早都会犯一些最初级的错误。确定一下对于存放Nginx文件的目录,运行配置和编译脚本的用户是否有读和写的权限,也要确定一下在配置脚本各个开关项中指定的路径是否存在,是否有效。

最后,所有的问题都解决后,需要看一下“configuration summary”,差不多类似于下图。

编译和安装

配置过程相关重要——它会产生一个makefile,依赖于应用程序所选择的开关项,会根据需求在系统上执行一个较长时间的检查。一旦configure脚本成功执行,你就可以继续编译Nginx。

编译该项目就是在该项目的源代码目录下执行make命令:

[alex@example.com nginx-0.7.66]$ make

一个成功的build编译应该会出现最后的信息:make[1]: leaving directory followed by the project source path.

此外,在编译时可能发生的问题,大多数可以归因于找不到先决条件或指定的路径无效。如果是这些原因,可以再次运行configure脚本,然后再重新检查开关选项和所有的先决条件选项。也可能是你下载了比较新的版本,新版本可能不向后兼容,针对这种情况,最好的选择就是访问官方网站找老一点的版本。

如果一个编译进程成功完成,需要准备下一步——安装应用程序:

[alex@example.com nginx-0.7.66]$ make install

命令make install会执行makefile文件中的安装部分。换句话说,它执行了一些简单的操作,例如复制二进制文件和配置文件到指定的安装目录。如果用于存储HTML文件和日志文件的目录不存在,则新建这些目录。make install这一步一般不会有问题,除非系统遇到一些异常情况,例如存储空间或内存不足。

在目录/usr/local/下安装应用程序时,可能需要root的权限,这依赖于你对目录的权限设置。

控制Nginx服务

眼下,你应该成功安装并建立了Nginx,默认的位置为/usr/local/nginx,因此我们将来的例子都将基于这个目录。

守护进程和服务

下一步,显然是执行Nginx,然而,在这么做之前,重要的是了解一下这个应用程序的性质。计算机应用程序有两个类型——有的需要用户在前端输入命令后立即运行;有的则不然,运行于后台。Nginx属性后者,即经常提及的作为守护进程运行的那种程序。守护进程的名称后通常带有“d”字样。这里有几个例子——httpd是HTTP服务器的守护进程;named是域名服务器的守护进程;crond是任务调度程序的守护进程。然而,需要注意,Nginx不是这种情况。从命令行启动Nginx的时候,守护进程会立即返回到命令行提示符,在大多数情况下,用不着向终端屏幕输出数据。

因此,启动Nginx的时候,屏幕上不会出现任何文本信息,并且提示符会立即返回,虽然这似乎令人吃惊,但这是一个好的迹象,相反,这意味着你的守护进程已经正确运行,说明你的配置没有任何错误。

用户和组

一个最普遍的麻烦来源是,对Nginx设置的是一个无效的访问权限的时候——由于用户或用户组的错误配置,经常会报告“403 Forbidden”错误,因为Nginx不能访问你需要的文件。

根据进程的功能,可能需要两个不同级别的进程权限:

  1. Nginx的master进程,由root启动,在大多数类Unix系统上,由root帐户开启的进程允许在开放任何端口的TCP套接字,但是其他用户启动的程序只能监听在1024以上的端口。如果不是以root帐户启动Nginx,将无法得到标准的端口(如80或443),即无法启动。而且,通过user指令在配置文件中指定的用户和组用于工作进程,在这里不予考虑。
  2. Nginx的工作进程,由配置文件中user指令(详见第3章)指定的帐户开始运行,配置文件中的设置优于在配置时使用configure脚本开关选项指定的用户。如果没有做任何指定,工作进程将以用户nobody开始,用户组为nobody组(或nogroup,具体取决于操作系统)。

Nginx命令行开关项

Nginx二进制文件接收命令行参数,用于执行各种操作,控制后台进程。为了获取该命令的全部参数列表,可以请求help帮助,使用下面的命令即可:

[alex@example.com ~]$ cd /usr/local/nginx/sbin
[alex@example.com sbin]$ ./nginx -h

下面将描述这些开关项的作用,一些用于控制守护进程,一些用于在应用配置上执行各种操作。

启动和停止守护进程

可以通过不带任何参数的Nginx二进制文件来启动Nginx。如果该守护进程已经运行,就会有一条消息指出已经有一个套接字在指定端口监听:

[emerg]: bind() to 0.0.0.0:80 failed (98: Address already in use) [...]
[emerg]: still could not bind().

除了这一点,你可以控制这个守护进程,可以停止它,重启它,或只是重新载入配置文件。控制是通过nginx -s命令向进程发送信号来实现的(详见下表)。

命令描述
nginx -s stop立即停止守护进程(使用TERM信号)
nginx –s quit温和地停止守护进程(使用QUIT信号)
nginx –s reopen重新打开日志文件
nginx –s reload重新载入配置文件
评论 X

      友荐云推荐
      Copyright 2011-2014. YiiBook.com