2019独角兽企业重金招聘Python工程师标准>>>
nginx 安装详解(better version)
编译自:
installing-nginx-open-source
目录
- 选择 Stable 还是 Mainline?
- 选择预编译的 pacakge 还是从源码编译?
- 从源码编译 nginx
- 安装 nginx 的依赖库
- 下载源码 tarball
- 配置编译选项
- 配置 nginx 文件安装路径
- 配置 nginx gcc 选项
- 指定 nginx 并发模型
- nginx 的模块
- 默认编译的模块
- 默认不编译的模块
- 第三方模块
- 静态链接模块和动态链接模块
- 完成安装
- 安装预编译的 package
- 预编译的 package 所包含的模块
- 安装 Red Hat/CentOS packages
选择 Stable 还是 Mainline?
nginx 提供两种版本的源码包:
-
mainline 版。该版本包含最新的特性和bug修改,并且总是保持更新。该版本是可靠的,但它可能会包含实验性的模块,以及一定数量的新 bug。
-
stable 版。该版本不包含新特性,但包含关键 bug 修复。推荐使用该版用于生产环境。
选择预编译的 pacakge 还是从源码编译?
mainline 版和 stable 版都提供两种安装方式:
-
从预编译的 package 进行安装。这是快速和容易的安装方式。预编译的 package 包含几乎所有的 nginx 官方模块,且适用于大多数流行的操作系统。
-
从源码编译安装。这种方式更为灵活:你可以添加特定的模块,包含添加第三方的模块,或者应用最新的安全补丁。
从源码编译 nginx
从源码编译安装的方式更为灵活:你可以添加特定的模块,包含添加第三方的模块,或者应用最新的安全补丁。
安装 nginx 的依赖库
在编译安装 nginx 之前,需要首先安装 nginx 的依赖:
- PCRE 库 - nginx 的 core 和 rewrite 模块依赖 PCRE 库。它提供对于正则表达式的支持:
$ wget ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/pcre-8.38.tar.gz
$ tar -zxf pcre-8.38.tar.gz
$ cd pcre-8.38
$ ./configure
$ make
$ sudo make install
译注:也可用 yum install pcre-devel
替代
- zlib 库 - nginx 的 gzip 模块依赖 zlib 库。用于对 HTTP headers 进行压缩:
$ wget http://zlib.net/zlib-1.2.8.tar.gz
$ tar -zxf zlib-1.2.8.tar.gz
$ cd zlib-1.2.8
$ ./configure
$ make
$ sudo make install
译注:也可用 yum install zlib-devel
替代
- OpenSSL 库 - nginx 的 SSL 模块依赖该库,用于支持 HTTPS 协议:
$ wget http://www.openssl.org/source/openssl-1.0.2f.tar.gz
$ tar -zxf openssl-1.0.2f.tar.gz
$ cd openssl-1.0.2f
$ ./configure darwin64-x86_64-cc --prefix=/usr
$ make
$ sudo make install
译注:也可用 yum install openssl-devel
替代
下载源码 tarball
源码 tarball 下载地址是:http://nginx.org/en/download.html
mainline 版:
$ wget http://nginx.org/download/nginx-1.11.1.tar.gz
$ tar zxf nginx-1.11.1.tar.gz
$ cd nginx-1.11.1
stable 版:
$ wget http://nginx.org/download/nginx-1.10.1.tar.gz
$ tar zxf nginx-1.10.1.tar.gz
$ cd nginx-1.10.1
配置编译选项
源码包中提供 configure 脚本用于在编译前定义 nginx 各方面的配置。 执行 configure 脚本最后生成 Makefile,make 命令根据 Makefile 进行编译安装。
子目录:
- 配置 nginx 文件安装路径
- 配置 nginx gcc 选项
- 指定 nginx 并发模型
- nginx 的模块
- 默认编译的模块
- 默认不编译的模块
- 第三方模块
- 静态链接模块和动态链接模块
配置示例:
$ ./configure \
--sbin-path=/usr/local/nginx/nginx \
--conf-path=/usr/local/nginx/nginx.conf \
--pid-path=/usr/local/nginx/nginx.pid \
--with-pcre=../pcre-8.38 \
--with-zlib=../zlib-1.2.8 \
--with-http_ssl_module \
--with-stream \
--with-mail=dynamic \
--add-module=/usr/build/nginx-rtmp-module \
--add-dynamic-module=/usr/build/3party_module
配置 nginx 文件安装路径
使用 configure 脚本可设置 nginx 的文件安装路径,包括 nginx 二进制文件和配置文件,以及设置依赖库如 PCRE 和 SSL 的源码所在路径(用于对其进行静态编译)。
--prefix=path
定义 nginx 文件的安装路径。configure 的其他选项如果使用相对路径,那么以此路径为基础路径。(except for paths to libraries sources)。nginx.conf 文件中的相对路径也以此为基础路径。默认
--prefix=/usr/local/nginx
--sbin-path=path
设置 nginx 二进制程序的路径名,这个名字只在安装期间使用。默认
--sbin-path=prefix/sbin/nginx
--conf-path=path
设置 nginx.conf 的路径。nginx 可在启动时手动以
-c file
参数指定其他配置文件。默认--conf-path=prefix/conf/nginx.conf
--pid-path=path
设置 nginx.pid 文件的路径。安装nginx之后,可在
nginx.conf
文件中使用 pid 指令修改该路径。默认--pid-path=prefix/logs/nginx.pid
--error-log-path=path
设置 nginx 错误日志的路径。安装nginx之后,可在
nginx.conf
文件中使用 error_log 指令修改该路径。默认--error-log-path=prefix/logs/error.log
--http-log-path=path
设置 nginx 访问日志的路径。安装nginx之后,可在
nginx.conf
文件中使用 access_log 指令修改该路径。默认--http-log-path=prefix/logs/access.log
--user=name
设置启动 worker 进程时所使用的非特权用户名。安装nginx之后,可在
nginx.conf
文件中使用 user 指令修改用户名。默认--user=nobody
--group=name
设置启动 worker 进程时所使用的非特权用户组名。安装nginx之后,可在
nginx.conf
文件中使用 user 指令修改用户组名。默认--group=nobody
--with-pcre=path
设置 PCRE 库的源码路径。首先需要下载和解压 PCRE 库。要求 PCRE 的版本范围为 4.4 — 8.38。设置之后,其余的就交给 ./configure 和 make 命令。nginx 使用 PCRE 库用于支持正则表达式。正则表达式在 location 指令和 rewrite 模块中会用到。
--with-pcre-jit
编译 PCRE 库时,加入 “just-in-time compilation” 支持 (1.1.12, the pcre_jit directive)
--with-zlib=path
设置 zlib 库的源码路径。首先需要下载和解压 zlib 库。 要求 zlib 库的版本范围为 1.1.3 — 1.2.8,设置之后,其余的就交给 ./configure 和 make 命令。gzip 压缩模块依赖 zlib 库。
配置 nginx gcc 选项
指定编译相关选项:
--with-cc-opt=parameters
为 CFLAGS 变量设置额外的参数。比如 FreeBSD 下使用 PCRE 库,必须指定
--with-cc-opt="-I /usr/local/include"
。 比如 希望增加 select() 支持的文件数,可指定:--with-cc-opt="-D FD_SETSIZE=2048"
--with-ld-opt=parameters
设置链接时的额外参数。比如,FreeBSD 使用 PCRE 库时,必须指定
--with-ld-opt="-L /usr/local/lib"
。
指定 nginx 并发模型
可参考:Connection Processing Methods
--with-select_module
--without-select_module
是否编译 select 模块。使用 select 模块可使 nginx 工作于
select()
模式。 如果 nginx 不支持其他更合适的模块,如kqueue
,epoll
或者/dev/poll
,该模块被自动编译。
--with-poll_module
--without-poll_module
是否编译 poll 模块。使用 poll 模块可使 nginx 工作于
poll()
模式。 如果 nginx 不支持其他更合适的模块,如kqueue
,epoll
或者/dev/poll
,该模块被自动编译。
nginx 的模块
nginx 由很多模块组成。一些模块被默认编译进 nginx,因此不需要在 configure
脚本的选项中显式地指定。但是如果你希望不编译某个默认模块,可使用 --without-MODULE
选项将其排除在外。
没有默认编译的模块以及第三方模块,必须在执行 configure
脚本时进行显式地指定。对于这些模块,其中一部分是静态链接到 nginx 库,另一些是可动态链接到 nginx 库。
- 如果是静态链接到 nginx,当每次 nginx 启动时,这些模块被加载到 nginx 中。
- 如果是动态链接到 nginx,只有当在
nginx.conf
中指定了的该模块,模块才会被加载到 nginx 中。
默认编译的模块
如果你希望不编译某个默认模块,可使用 --without-MODULE
选项将其排除在外:
$ ./configure --sbin-path=/usr/local/nginx/nginx --conf-path=/usr/local/nginx/nginx.conf --pid-path=/usr/local/nginx/nginx.pid --with-http_ssl_module --with-stream --with-pcre=../pcre-8.38 --with-zlib=../zlib-1.2.8 **--without-http_empty_gif_module**
http_charset_module
在响应首部的 “Content-Type” 字段添加指定的字符集,能够对数据进行字符集转换。
http_gzip_module
使用 gzip 对响应报文进行压缩,可减少传输的数据大小,可减少一半或更多。
http_ssi_module
Processes SSI (Server Side Includes) commands in responses passing through it.
http_userid_module
为客户端标识设置合适的 cookies
http_access_module
Limits access to certain client addresses. 通过 “IP地址” 限制某个客户端的访问
http_auth_basic_module
使用 HTTP 基本认证协议,对客户端进行认证,以限制对资源的访问。
http_autoindex_module
Processes requests ending with the slash character (‘/’) and produces a directory listing.
http_geo_module
Creates variables with values depending on the client IP address.
http_map_module
Creates variables whose values depend on values of other variables.
http_split_clients_module
Creates variables suitable for A/B testing, also known as split testing.
http_referer_module
对客户端的访问,如果在请求首部的 Referer 字段有无效的值,则阻止其对某个站点的访问。
http_rewrite_module
使用正则表达式修改请求 URI,并返回重定向指令;根据条件判断选择配置。依赖于 PCRE 库。
http_proxy_module
将请求转发给其他服务器
http_fastcgi_module
将请求转发给 FastCGI 服务器。
http_uwsgi_module
将请求转发给 uwsgi 服务器。
http_scgi_module
将请求转发给 SCGI 服务器。
http_memcached_module
从一个 memcached 服务器获取响应。
http_limit_conn_module
对每个定义的 key,限制其连接数,特别是限制来自同一个 IP 地址的连接数。
http_limit_req_module
对每个定义的 key,限制其请求的处理速率,特别是限制来自同一个 IP 地址的请求处理速率。
http_empty_gif_module
Emits single-pixel transparent GIF.
http_browser_module
Creates variables whose values depend on the value of the “User-Agent” request header field.
http_upstream_hash_module
激活基于 hash 的负载均衡策略
http_upstream_ip_hash_module
激活基于 IP hash 的负载均衡策略
http_upstream_least_conn_module
激活基于 “最小连接数” 的负载均衡策略
http_upstream_keepalive_module
激活 keepalive 连接保持
http_upstream_zone_module
激活共享内存区
默认不编译的模块
一些模块是默认不编译的,你需要使用 ./configure
命令添加该选项。在这些默认不编译的模块中,有些模块可编译为动态模块,如下:
mail stream geoip image_filter perl xslt
示例:
$ ./configure --sbin-path=/usr/local/nginx/nginx --conf-path=/usr/local/nginx/nginx.conf --pid-path=/usr/local/nginx/nginx.pid --with-pcre=../pcre-8.38 --with-zlib=../zlib-1.2.8 **--with-http_ssl_module** **--with-stream** **--with-mail**
--with-threads
Enables NGINX to use thread pools. See Thread Pools in NGINX Boost Performance 9x! blog post for details.
--with-file-aio
Enables asynchronous I/O.
--with-ipv6
Enables IPv6 support.
--with-http_ssl_module
Provides support for HTTPS. Requires an SSL library such as OpenSSL.See the ngx_http_ssl_module reference for the list of directives.
--with-http_v2_module
Provides support for HTTP/2.See the ngx_http_v2_module reference for the list of directives and the “HTTP/2 Module in NGINX” blog post for details.
--with-http_realip_module
Changes the client address to the one sent in the specified header field. See the ngx_http_realip_module reference for the list of directives.
--with-http_addition_module
Adds text before and after a response. See the ngx_http_addition_module reference for the list of directives.
--with-http_xslt_module or --with-http_xslt_module=dynamic
Transforms XML responses using one or more XSLT stylesheets. The module requires the Libxml2 and XSLT libraries. See the ngx_http_xslt_module reference for the list of directives. The module can also be compiled as dynamic.
--with-http_image_filter_module or --with-http_image_filter_module=dynamic
Transforms images in JPEG, GIF, and PNG formats. The module requires the LibGD library. See ngx_http_image_filter_module reference for the list of directives. The module can also be compiled as dynamic.
--with-http_geoip_module or --with-http_geoip_module=dynamic
Allows creating variables whose values depend on the client IP address. The module uses MaxMind GeoIP databases. See the ngx_http_geoip_module reference for the list of directives. The module can also be compiled as dynamic.
--with-http_sub_module
Modifies a response by replacing one specified string by another. See the ngx_http_sub_module reference for the list of directives.
--with-http_dav_module
Intended for file management automation via the WebDAV protocol. See the ngx_http_dav_module reference for the list of directives.
--with-http_flv_module
Provides pseudo-streaming server-side support for Flash Video (FLV) files. See the ngx http_flv_module reference for the list of directives.
--with-mp4_module
Provides pseudo-streaming server-side support for MP4 files. See the ngx_http_mp4_module reference for the list of directives.
--with-http_gunzip_module
Decompresses responses with Content-Encoding: gzip for clients that do not support zip encoding method. See the ngx_http_gunzip_module for the list of directives.
--with-http_gzip_static_module
Allows sending precompressed files with the *.gz filename extension instead of regular files. See the ngx_http_gzip_static_module for the list of directives.
--with-http_auth_request_module
Implements client authorization based on the result of a subrequest. See the http_auth_request_module for the list of directives.
--with-http_random_index_module
Processes requests ending with the slash character (‘/’) and picks a random file in a directory to serve as an index file. See the ngx_http_random_index_module for the list of directives.
--with-http_secure_link_module
Used to check authenticity of requested links, protect resources from unauthorized access, and limit link lifetime. See the ngx_http_secure_link_module for the list of directives.
--with-http_slice_module
Allows splitting a request into subrequests, each subrequest returns a certain range of response. Provides more effective caching of large files. See the ngx_http_slice_module reference for the list of directives.
--with-http_degradation_module
Allows returning an error when a memory size exceeds the defined value.
--with-http_stub_status_module
Provides access to basic status information. See the ngx_http_stub_status_module reference for the list of directives. Note that NGINX Plus customers do not require this module as they are already provided with extended status metrics and interactive dashboard.
--with-http_perl_module or --with-http_perl_module=dynamic
Used to implement location and variable handlers in Perl and insert Perl calls into SSI. Requires the PERL library. See the ngx_http_perl_module reference for the list of directives. The module can also be compiled as dynamic.
--with-mail or --with-mail=dynamic
Enables mail proxy functionality. See the ngx_mail_core_module reference for the list of directives. The module can also be compiled as dynamic.
--with-mail_ssl_module
Provides support for a mail proxy server to work with the SSL/TLS protocol. Requires an SSL library such as OpenSSL. See the ngx_mail_ssl_module reference for the list of directives.
--with-stream or --with-stream=dynamic
Enables the TCP proxy functionality. See the ngx_stream_core_module reference for the list of directives. The module can also be compiled as dynamic.
--with-stream_ssl_module
Provides support for a stream proxy server to work with the SSL/TLS protocol. Requires an SSL library such as OpenSSL. See the ngx_stream_ssl_module reference for the list of directives.
--with-google_perftools_module
Allows using Google Performance tools library.
--with-cpp_test_module --with-debug
Enables the debugging log.
第三方模块
你可以为 nginx 编译第三方模块,一些第三方模块可参见:modules。 使用第三方模块,需要自己承担稳定性的风险,因为第三方模块的稳定性是没有保证的。
静态链接模块和动态链接模块
静态链接模块
大多数被编译进 nginx 的模块是被静态链接的,它们在编译 nginx 时被构建到 nginx 中,并且被 nginx 的可执行文件静态地链接。被静态链接的模块无法被 disabled,只有重新编译 nginx 才能达到这个目的。
以静态方式编译第三方模块,如下所示,在执行 configure 脚本时,添加 --add-module=
选项,并输入模块的路径:
$ ./configure ... --add-module=/usr/build/nginx-rtmp-module
动态链接模块
某些 nginx 模块也可以被编译为共享对象(*.so 文件),并在运行时被加载到 nginx 中。这种方式提供了更多的灵活性,因为可以自由选择加载或不加载某个动态模块。要加载某个动态模块,只要在 nginx.conf
中使用 load_module指令指定该模块。
支持动态加载的模块,它们不是默认编译的:
mail stream geoip image_filter perl xslt
以动态方式编译第三方模块,如下所示,在执行 configure 脚本时,添加 --add-dynamic-module=
选项,并输入模块的路径:
$ ./configure ... --add-dynamic-module=/path/to/module
生成的 *.so 文件可在 prefix/modules/
目录中找到,例如默认的路径为 /usr/local/nginx/modules
。
安装完成后,如果要加载某个动态模块,只要在 nginx.conf
中使用 load_module指令指定该模块。
相关扩展阅读: Introducing Dynamic Modules in NGINX 1.9.11 Extending NGINX
完成安装
使用 configure 脚本配置完成后,可进行编译安装:
$ make
$ sudo make install
安装顺利完成后,执行 nginx
命令,启动 nginx:
$ sudo nginx
安装预编译的 package
安装预编译的 package 相对更简单和快速。缺点是缺少灵活性。可安装预编译的 package 的系统有: Red Hat, CentOS, Debian, Ubuntu 以及 SLES。
预编译的 package 所包含的模块
关于预编译的 package 所包含的模块,请参见 linux_packages 。
安装 Red Hat/CentOS packages
nginx 为 Red Hat/CentOS 5, 5.x, 6, 6.x, 7 and 7.x 提供了预编译 package,package 有两个来源:
-
默认的 Red Hat or CentOS yum 仓库。这是最快的方式,但所提供的 package 版本比较老旧。比如说,CentOS 7.0 默认提供 nginx/1.6.2 released in September, 2014
-
nginx repo。为了从 nginx repo 安装 package,你需要设置相应的 yum 仓库。这里提供最新版本的 package
从默认的 Red Hat/CentOS 仓库安装 nginx
-
安装 EPEL 仓库:
$ sudo yum install epel-release
-
更新仓库,并安装 nginx:
$ sudo yum update
-
验证所安装的 nginx 版本:
$ sudo nginx -v nginx version: nginx/1.6.3
从 nginx repo 安装 nginx
-
设置 yum 仓库:
$ cd /etc/yum.repos.d $ sudo vi /etc/yum.repos.d/nginx.repo
-
添加如下内容:
[nginx] name=nginx repo baseurl=http://nginx.org/packages/mainline/OS/OSRELEASE/$basearch/ gpgcheck=0 enabled=1
其中:
- “OS” 是 rhel 或者 centos
- “OSRELEASE” 为系统版本:5, 5.x, 6, 6.x, 7, 7.x
- “/mainline” 是最新的 mainline 版。删除 “/mainline” 是安装最新的 stable 版
比如,为 CentOS 7.0 获取最新的 mainline package:
[nginx]
name=nginx repo
baseurl=http://nginx.org/packages/mainline/centos/7/$basearch/
gpgcheck=0
enabled=1
-
保存退出
-
更新仓库,并安装 nginx:
$ sudo yum update
-
运行 nginx:
$ sudo nginx
-
验证 nginx 是否启动:
$ curl -I 127.0.0.1 HTTP/1.1 200 OK Server: nginx/1.11.1
版权信息:
本文编译自 installing-nginx-open-source