你已经成功下载并解压了Nginx安装包。现在,为了适应操作系统,为了获得二进制的运行,要对Nginx进行编译配置处理。创建一个应用程序通常分为三步:从源代码到配置,编译和安装编译。配置步骤允许你选择许多选项,这些选项在完成程序的建立安装后不可编辑,因此它直接影响该项目的二进制文件。所以,这一步非常重要,如果想在后来避免意外,必须仔细。
该过程是添加某些开关选项(switch)到配置(configure)脚本,该脚本本来就在源代码安装包中,在下面的内容中我们将了解到,可以激活的开关选项有三种类型,但我们首先研究最容易的。
容易的方法
如果是因为某种原因,你不想打扰配置步骤,例如只是测试或者是简单的安装,因为将来还会重新编译安装该程序,所以你只是简单地使用configure脚本,而并没有使用任何开关选择。执行下列三个命令就可以建立和安装工作版(能够进行web服务)的Nginx:
# ./configure
运行了该命令之后,就开始了一个长时间的程序验证过程,以便确定系统包含所有必要的组成成分。如果配置过程失败,请再次检测先决条件,现在看来,它是引发错误的最常见原因。
# make
命令make对应用程序进行编译,如果配置部分运行良好,那么这一部分不会出现任何错误。
# make install
这是最后一步,复制编译后的文件(也包括资源文件)到安装目录,默认情况下是目录:“/usr/local/nginx”,这一步可能需要以root的身份登录系统,然后来执行安装的操作。为此,如果你没有经过自定义配置就创建了该应用程序,那么你的这个冒险便会错过很多功能,例如可选择的模块和我们即将认识的其他模块。
路径选择
在运行configure脚本命令的时候,可能开启一些开关选项,例如,需要对Nginx各种组成成分指定目录或文件路径。可以运行命令:
# ./configure --help
列出有效的开关变量,以便于安装选择。典型的做法是使用开关命令在命令行添加一些文本,例如,使用开关选项 --conf-path:
# ./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二进制文件安装的路径 | <prefix>/sbin/nginx |
--conf-path=... | 主要配置文件放置目录 | <prefix>/conf/nginx.conf |
--error-log-path=... | 错误日志存放的路径。错误日志在配置文件中须配置得非常正确,该路径只应用于你在配置文件中没有指定任何错误的日志指令时 | <prefix>/logs/error.log |
--pid-path=... | 指定Nginx的pid文件的路径。可以在配置文件中指定pid文件的路径,如果没有具体的指定,则使用在这里对该选项指定的该路径 | <prefix>/logs/nginx.pid 注意:该pid文件是一个简单的文件文件,它包含进程的标识符。该文件应该放置在一个清晰可见的位置,以便其他应用程序能够很容易找到运行该程序的pid |
--lock-path=... | 锁文件(lock file)的存放路径。同样,该文件也可以在配置文件中指定,但是,如果在配置文件中没有指定,则使用该值 | <prefix>/logs/nginx.lock 注意:锁文件允许其他应用程序确定是否一个程序在运行,就Nginx来说,它用于确定该进程没有被启动两次 |
--with-perl_modules_path=... | 定义Perl模块的路径。如果需要包含另外的Perl模块,必须定义该参数 | |
--with-perl=... | Perl二进制文件的路径。用于执行Perl脚本。如果想执行一个Perl脚本,必须设置该路径 | |
--http-log-path=... | 定义被访问文件的日志文件存放路径。该路径只用于在配置文件中没有定义访问日志的情况 | <prefix>/logs/access.log |
--http-client-body-temp-path=... | 该目录用于存储客户端请求产生的临时文件 | <prefix>/client_body_temp |
--http-proxy-temp-path=... | 该目录用于代理存储临时文件 | <prefix>/proxy_temp |
--http-fastcgi-temp-path=... | 指定用于HTTP FastCGI模块使用的临时文件的存放路径 | <prefix>/fastcgi_temp |
--builddir=... | 指定创建应用程序的位置 |
先决条件选项
先决条件的格式有库文件和二进制文件。到现在,你应该已经把它们安装在系统中了,然而即使它们已经安装在系统中,可能有时候配置脚本还是不能找到它们的位置。原因有多种,例如,如果它们安装在非标准路径中。为了修复这些问题,可以使用下表所列的开关项来指出它们所在的路径。
编译选项 | |
--with-cc=... | 指定一个备用的C编译器的位置 |
--with-cpp=... | 指定一个备用的C预处理器的位置 |
--with-cc-opt=... | 定义额外的选项,然后在命令行传递给C编译器 |
--with-ld-opt=... | 定义额外的选项,然后在命令行传递给C连接器 |
--with-cpu-opt=... | 指定不同的目标处理器结构,可以是下列值:pentium,pentiumpro,pentium3,pentium4,athlon,opteron,sparc32,sparc64和ppc64 |
PCRE选项 | |
--without-pcre | 不使用PCRE库。这个设置不推荐使用,因为它会移除对正则表达式的支持,从而使Rewrite模块失去作用。 |
--with-pcre | 强制作用PCRE库 |
--with-pcre=... | 允许指定PCRE库的源代码 |
--with-pcre-opt=... | 用于建立PCRE库的另外的选项 |
MD5选项 | |
--with-md5=... | 指定MD5库源代码的路径 |
--with-md5-opt=... | 用于建立MD5库的另外选项 |
--with-md5-asm | 为建MD5库使用汇编语言源代码 |
SHA1选项 | |
--with-sha1=... | 指定SHA1库的源代码 |
--with-sha1-opt=... | 用于建立SHA1库的另外选项 |
--with-sha1-asm | 为建立SHA1库使用汇编语言源代码 |
zlib选项 | |
--with-zlib=... | 指定zlib库的源代码 |
--with-zlib-opt=... | 用于建立zlib库的另外的选项 |
--with-zlib-asm=... | 使用汇编语言最大限度地优化下列目标结构:Pentium, pentiumpro |
OpenSSL选项 | |
--with-openssl=... | 指定OpenSSL库的源代码路径 |
--with-openssl-opt=... | 为建立OpenSSL库的另外的选项 |
模块选择
在编译Nginx之前需要对模块进行选择,一些模块默认是开启的,有些模块需要手动开启。
默认开启的模块 | 描述 |
--without-http-charset_module | 禁用Charset模块,该模块用于对网页重新编码 |
--without-http-gzip_module | 禁用Gzip压缩模块 |
--without-http_ssi_module | 禁用服务器端包含模块 |
--without-http_access_module | 禁用访问模块,对于指定的IP段,允许访问配置 |
--without-http_userid_module | 禁用用户ID模块。该模块为用户通过cookie验证身份 |
--without-http_auth_basic_module | 禁用基本的认证模块 |
--without-http_autoindex_module | 禁用自动索引模块 |
--without-http_geo_module | 禁用Geo模块,该模块允许你定义依赖于IP地址段的变量 |
--without-http_map_module | 禁用Map模块,该模块允许你声明map区段 |
--without-http_referer_module | 禁用Referer控制模块 |
--without-http_rewrite_module | 禁用Rewrite模块 |
--without-http_proxy_module | 禁用代理模块。该模块用于向其他服务器传输请求 |
--without-http_fastcgi_module | 禁用FastCGI模块。该模块是用于与FastCGI进程配合工作 |
--without-http_memcached_module | 禁用Memcached模块。该模块是用于与memcached守护进程配合工作 |
--without-http_limit_zone_module | 禁用Limit Zone模块。该模块是用于根据定义的zone来限制约束对资源的使用。 |
--without-http_limit_req_module | 禁用Limit Requests模块。该模块允许你限制每个用户请求的总数 |
--without-http_empty_gif_module | 禁用Empty Gif模块。该模块用于在内存中提供一个空白的GIF图像 |
--without-http_browser_module | 禁用Browser模块。该模块用于解释用户代理字符串 |
--without-http_upstream_ip_hash_module | 禁用Upstream模块。该模块用于配置负载均衡结构 |
默认禁用的模块 | 描述 |
--with-http_ssl_module | 开启SSL模块,支持使用HTTPS协议的网页 |
--with-http_realip_module | 开启Real IP的支持,该模块用于从客户请求的头数据中读取real IP地址 |
--with-http_addition_module | 开启Addition模块,该模块允许你追加或前置数据(prepend data)到响应的主体部分 |
--with-http_xslt_module | 开启XSLT模块的支持,该模块实现XSLT转化为XML文档 |
--with-http_image_filter_module | 开启Image Filter模块,该模块是让你修改图像。注意:如果想编译该模块,需要在系统中安装libgd库 |
--with-http_geoip_module | 开启GeoIP模块,该模块通过使用MaxMind's GeoI 二进制数据库来获取客户端在地理上的分布。注意:如果希望编译该模块,需要在系统中安装libgeoip库。 |
--with-http_sub_module | 开启Substitution模块,该模块用于在网页中替换文本 |
--with-http_dav_module | 开启WebDAV模块 |
--with-http_flv_module | 开启FLV模块,该模块用于专门处理.flv(flash视频)文件 |
--with-http_gzip_static_module | 开启Gzip静态模块,该模块用于发送预压缩的文件 |
--with-http_random_index_module | 开启Random Index模块。该模块用于挑选一个随机的文件作为该目录的index |
--with-http_secure_link_module | 开启Secure Link模块,该模块用于在URL中检测关键字的存在 |
--with-http_stub_status_module | 开启Stub Status模块,该模块会产生一个服务器状态和信息页 |
--with-google_perftools_module | 开启google性能工具模块 |
杂项
邮件服务代理 | |
--with-mail | 开启邮件服务代理(mail server proxy)模块,支持POP3,IMAP4和SMTP。该功能默认禁用 |
--with-mail_ssl_module | 开启邮件代理服务对SSL的支持。该功能默认禁用 |
--without-mail_pop3_module | 在邮件代理下禁用POP3功能。在开启邮件代理模块后该功能默认启用 |
--without-mail_imap_module | 对邮件代理服务器禁用IMAP4模块,在开启邮件代理模块后该功能默认启用 |
--without-mail_smtp_module | 对于邮件代理服务器禁用SMTP模块,在开启邮件代理模块后该功能默认启用 |
事件管理 | |
--with-rtsig_module | 开启rtsig模块,使用rtsig作为事件通知机制 |
--with-select_module | 开启select模块,使用select作为事件通知机制。默认情况下,该模块是开启的,除非系统有一种更好的方式发现——kqueue, epoll, rtsig 或 poll |
--without-select_module | 禁用select模块 |
--with-poll_module | 开启poll模块,该模块使用poll作为事件通知机制。默认情况下,如果有效,该模块是开启的,除非系统上有一种更好的方式发现——kqueue, epoll或rtsig |
--without-poll_module | 禁用poll模块 |
用户和组选项 | |
--user=... | 指定启动Nginx进程的默认用户。这个设置仅用于在配置文件中省略user指令来指定用户的情况 |
--group=... | 指定启动Nginx进程默认的用户组。这个设置仅用于在配置文件中省略使用group指令来指定用户的情况 |
其它选项 | |
--with-ipv6 | 开启对IPv6的支持 |
--without-http | 禁用HTTP服务 |
--without-http-cache | 禁用HTTP缓冲功能 |
--add-module=PATH | 通过指定的路径编译添加第三方模块。如果希望编译多个模块,那么该选项可以无限次使用 |
--with-debug | 开启记录额外的调试信息 |
关于prefix开关选项
在配置期间,应该特别注意--prefix开关选项,将来许多配置指令都基于你在这时选择的路径。记住,一旦二进制文件编译完成。prefix就不能再变,然而这并不是一个决定性的问题,因为仍然可以使用绝对路径。
如果你打算与时俱进,想要升级Nginx,以便使用一个新的发布版,默认的prefix(如果没有通过使用--prefix开关选项去覆盖)是/usr/local/nginx——一个不包含版本号的路径,因此,升级Nginx的时候,如果没有指定不同的prefix,新安装的文件就会覆盖先前安装的文件,这种做法可能存在其他问题,因为这有可能会清除你的配置文件和正在运行的二进制文件。因此,推荐使用不同的prefix,利用prefix指明每一个版本号,例如:
# ./configure --prefix=/usr/local/nginx-1.8.0
另外,为了使将来简单一些,可以为/usr/local/nginx建立一个符号链接来指向/usr/local/nginx-1.8.0,一旦升级,该链接便会指向新的/usr/local/nginx-newer.version。