介绍
简而言之,Nginx(发音为“engine x”)是一个小型、功能强大并且可扩展的 web/proxy 服务器。根据Netcraft最近的一次调查,Nginx已经支持了全球超过15%的网站,共111,680,078家 [1],其中不乏Netflix和WordPress.com这样的庞然大物。
Nginx基于Simplified BSD许可(一个开源许可)发行,可以从在线仓库或者源代码进行安装。在本文中,我们将会涵盖如何在Debian,Ubuntu以及CentOS下安装Nginx。需要特别注意的一点是,在线仓库中的版本通常都会滞后一点。如果我们想体验最新的功能和bug修正,那么我推荐根据源代码来构建,或者直接从nginx.org下载安装包。
使用在线仓库在Debian Wheezy 7.2 上安装Nginx
通过使用Debian GNU/Linux包管理器的高级界面工具——aptitude
,我们可以查看Nginx相关的包列表(如图1所示)。但是,我建议你先运行命令aptitude update
,以便可以看到可用包的最新列表。
图1
(顺便提一下,第一列中的”p“表示当前操作系统上没有安装此包)
如果我们不知道要安装哪个包,可以在命令aptitude search
后跟上一个包名,例如aptitude search nginx
,这样可以帮助我们进行选择。根据列出的各个包的说明,我们将选择安装nginx-full
(如图2所示)。需要重点注意的是,每个包的描述中都列出了在使用仓库进行安装时,默认会安装的其他模块,我们将在本文稍后部分再对其进行介绍。
图2 使用在线仓库在Debian Wheezy 7.2上安装nginx-full
现在,我们已经安装了Nginx,但还没有启动它。随后我们运行service nginx start
启动Nginx,即可在浏览器中打开其启动页面(如图3所示)。
图3 Nginx启动页面
接下来这条命令会显示我们刚安装的Nginx的版本(如图4所示)
图4 从仓库中安装的Nginx v1.2.1版本
但是,如今Nginx的最新版本已经是1.5.6(译者注:现在已经是1.9.11),而版本1.2.1已经与2012年6月5日过期了[2]。显然,如果我们希望使用最新的Nginx版本,就需要从源代码进行安装。
使用源代码在Debian Wheezy 7.2上安装Nginx
请注意,以下指令代表了在Linux下从头开始构建一个包的默认步骤,而我们都知道,使用./configure
,make
和make install
的常规安装步骤,会使得卸载包变得困难,因为系统没有办法去跟踪哪些文件在安装过程中被添加或修改。
总而言之,你应该有一个有说服力的原因(一个真正强有说服力的原因!),才可以选择上面提到的这种方式来编译一个包。虽然你也许有一些这类的原因,但是最常见的一个原因是要在系统中安装某个包的更新版本,或者为了添加某个特定的功能。
如果你构建并安装了一个.deb
或者一个.rpm
文件,那么相应的包管理器(aptitude
/apt-get
或者yum
)就能够感知到包的存在,并且它可以确保你没有覆盖之前安装的包的文件。另一方面,make install
命令会覆盖安装过程中遇到的所有文件。我们稍后会讨论,当我们必须要从源代码编译并安装一个包时,可选的其他方式。
既然我们已经决定使用Nginx的最新版本,那么久需要按照如下步骤,从http://nginx.org/download/下载已经压缩好的tar文件,并且在构建之前进行解压缩。
- 下载tar包:
wget
http://nginx.org/download/nginx-1.5.6.tar.gz - 解压缩:
tar xvzf nginx-1.5.6.tar.gz
- 进入上一步自动创建的目录:
cd nginx-1.5.6
然后
-
cd nginx-1.5.6
(如果你希望列出所有的配置选项,可以使用--help
选项)。./configure
命令的输出会显示出Nginx的安装目录(如图5所示的/usr/local/nginx
)
图5 Nginx安装路径
make
make install
虽然安装完成了,但是Nginx所在目录还没有被添加到PATH环境变量中(如图6所示)
图6 PATH变量(之前)
现在我们将/usr/local/nginx/sbin
目录添加到PATH变量中,并检查我们刚刚从源代码安装的Nginx版本(如图7所示)。
图7 PATH变量(之后),并且从源代码安装了Nginx v1.5.6版本
注意:在安装过程中,可能系统会提示缺少库文件(如图8所示)。这时我们可以选择安装提供该库文件(例如我们遇到的libpcre3-dev
和zlib1g-dev
文件)的包,或者在配置是忽略这些提示。
图8 缺少库文件
在Ubuntu 12.04 LTS上安装Nginx
虽然Ubuntu的最新版本是13.10(代号 Saucy Salamander,于2013年十月17日发布),我们还是决定在Ubuntu 12.04 LTS(代号 Precise Pangolin)上进行安装,因为Canonical提供了直到2017年4月份的延长支持。
我们会继续通过sudo aptitude
和update
来更新源代码,然后从分发版的在线仓库中安装nginx-full。因为Ubuntu默认禁止root账户,所以必须加上关键字"sudo"
(如图9所示)。除此之外,其他的所有安装步骤都跟我们之前在Debian上的操作几乎一样。从源代码进行安装也是一样的。
图9 在Ubuntu上从仓库安装nginx-full包
但是,我们可以看到,可用的版本比之前更低(如图10所示)。
图10 在Ubuntu上从仓库安装的Nginx版本
同之前一样,我们会在从源代码进行安装之前,删除(卸载)掉nginx相关的所有包(如图11所示)。
图11
同之前一样,在从源代码安装Nginx之后,我们的包都是最新的版本了(如图12所示)。
图12
但是,当我们在尝试启动Nginx时——就像我们在Debian中做的那样——我们很可能会得到一个nginx: unrecognized service的错误消息(如图13所示)。
图13
这是因为我们是从源代码安装的该包,因此启动脚本没有被放置在合适的地方。对于这种情况,我们或者可以使用全路径(/usr/local/nginx/sbin/nginx)来运行主程序以启动nginx守护进程,或者可以编写一个脚本来帮我们做这件事,当然,最后一种也是最好的方式,是能够像其他程序一样,使用常见的参数(start, stop, restart, reload
等等)。同时,我们也可以使用随本教程提供的启动脚本(读者可以自行修改来满足需求)。
一旦我们将启动脚本添加到/etc/init.d
目录(并将其命名为nginx),我们就需要将DAEMON变量指向到目录/usr/local/nginx/sbin/nginx
,并将安装目录(/usr/local/nginx/sbin
)添加到PATH变量中(请参考图14a和14b)。
图14a Nginx启动脚本(之前)
图14b Nginx启动脚本(之后)
然后我们就可以按如下方式来运行脚本(如图15a所示)
图15a Nginx在端口80监听,PID为1931
同时,我们还需要确保nginx.conf文件”知道“从哪找到Nginx的PID。因此我们注释掉nginx.conf
中的如下几行(如图15c所示,该文件一般在/usr/local/nginx/conf
目录下)并将目录改为启动脚本中的目录(如图15b所示)。
图15b 文件
/var/run/$NAME.pid
(此处$NAME=nginx) 包含了Nginx的当前PID
图15c
使用checkinstall
包来跟踪所有通过安装脚本创建或修改的文件
checkinstall
包(如图16所示)可以跟踪所有在安装过程中创建或修改的文件。它还可以创建并安装一个与包管理器兼容的包(.deb
或者.rpm
)(如图16和17所示),这样你就可以在不需要这个包的时候完整的卸载掉。关于它的用法请检查附带的man手册。
图16a 安装checkinstall包
图16b 使用checkinstall创建一个.deb文件并进行安装(I)
图16c 使用checkinstall创建一个.deb文件并进行安装(II)
当我们运行 aptitude search nginx
后,会连同注释(之前在安装时作为描述)一起显示出我们已经安装了的包(如图17所示)。
图17
在CentOS 6.4上安装Nginx
从仓库安装
-
从http://nginx.org/packages/centos/6 处下载并运行nginx yum配置文件。确保你选择了合适的架构;”noarch“是一个稳妥的选择:
- 下载:
wget http://nginx.org/packages/centos/6/noarch/RPMS/nginx-release-centos-6-0.el6.ngx.noarch.rpm
- 安装:
wget http://nginx.org/packages/centos/6/noarch/RPMS/nginx-release-centos-6-0.el6.ngx.noarch.rpm
- 下载:
安装Nginx:
yum install nginx
启动Nginx:
service nginx start
从源代码安装
按照同Debian和Ubuntu一样的流程
启用模块
根据Nginx的wiki[3],由于当前不支持运行时启用模块,所以必须在编译时选择启用的模块。通过运行./configure --help
,可以找到配置脚本中提供的所有编译时选项,包括可选模块。不幸的是,如果我们已经安装了Nginx但又想添加某一个模块,我们必须先卸载它,再重新用所需模块进行编译。
对于标准的HTTP模块列表,请参考表1[4]:
名称 | 描述 | 版本 | 禁用参数 |
---|---|---|---|
HTTP Core | 控制端口、位置、错误页面、别名及其他必要项 | -without-http | |
Access | 根据IP地址允许/禁止访问 | –without-http_access_module | |
Auth Basic | 基础HTTP认证 | –without-http_auth_basic_module | |
Auto Index | 生成自动目录列表 | –without-http_autoindex_module | |
Browser | 解析“User-Agent” | 0.4.3 | –without-http_browser_module |
Charset | 重新对页面编码 | –without-http_charset_module | |
Empty GIF | 从内存中提供一个1x1的图片 | 0.3.10 | –without-http_empty_gif_module |
FastCGI | FastCGI 支持 | –without-http_fastcgi_module | |
Geo | 使用IP地址的键/值对来设置变量 | 0.1.17 | –without-http_geo_module |
Gzip | 对响应进行Gzip压缩 | –without-http_gzip_module | |
Headers | 设置任意的HTTP响应头 | ||
Index | 控制哪些文件可以用作索引 | ||
Limit Requests | 限制客户端连接的频率 | 0.7.20 | –without-http_limit_req_module |
Limit Conn | 基于一个变量来限制并发连接 | –without-http_limit_conn_module | |
Log | 自定义访问日志 | ||
Map | 使用任意的键/值对来配置变量 | 0.3.16 | –without-http_map_module |
Memcached | Memcached支持 | –without-http_memcached_module | |
Proxy | 代理到上游服务器 | –without-http_proxy_module | |
Referer | 根据Referer头信息来过滤请求 | –without-http_referer_module | |
Rewrite | 使用正则表达式来改写请求 | –without-http_rewrite_module | |
SCGI | 支持SCGI协议 | 0.8.42 | –without-http_scgi_module |
Split Clients | 根据一些条件类分隔客户端 | 0.8.37 | –without-http_split_clients_module |
SSI | 支持Server-side Includes 命令 | –without-http_ssi_module | |
Upstream | 用于负载均衡 | –without-http_upstream_ip_hash_module (只禁用ip_hash 指令) | |
User ID | 发起身份确认cookie | –without-http_userid_module | |
uWSGI | uWSGI 协议支持 | 0.8.40 | –without-http_uwsgi_module |
X-Accel | X-Sendfile-like 模块 |
表1 标准的HTTP模块
对于可选的HTTP模块列表,请参考表2[5]
名称 | 描述 | 版本 | 启用参数 |
---|---|---|---|
Addition | 在页面后追加文字 | –with-http_addition_module | |
Auth Request | 基于子请求的结果来实现客户端认证 | 1.5.4 | –with-http_auth_request_module |
Degradation | 在低内存情况下,允许对某些地址返回204或者444 | 0.8.25 | –with-http_degradation_module |
Embedded Perl | 在Nginx配置文件中使用Perl | 0.3.21 | –with-http_perl_module |
FLV | Flash流视频 | 0.4.7 | –with-http_flv_module |
GeoIP | 使用来自MaxMind GeoIP二进制文件的信息来创建变量 | 0.8.6, 0.7.63 | –with-http_geoip_module |
Google Perftools | Google性能工具支持 | 0.6.29 | –with-google_perftools_module |
Gzip Precompression | 对静态文件启用预压缩版本 | 0.6.23 | –with-http_gzip_static_module |
Gunzip | 即时对经过gzip压缩的响应进行解压缩 | 1.3.6 | –with-http_gunzip_module |
Image Filter | 使用Libgd来转换图片 | 0.7.54 | 0.7.54 |
MP4 | 启用mp4流媒体及其seeking功能 | 1.1.3, 1.0.7 | –with-http_mp4_module |
Random Index | 将目录索引随机化 | 0.7.15 | –with-http_random_index_module |
Real IP | 使用nginx作为后端服务器时启用 | 0.3.8 | –with-http_realip_module |
Secure Link | 使用秘钥来保护页面 | 0.7.18 | –with-http_secure_link_module |
SSL | 支持HTTPS/SSL | –with-http_ssl_module | |
Stub Status | 查看服务器统计信息 | 0.1.18 | –with-http_stub_status_module |
Substitution | 替换页面中的文字 | –with-http_sub_module | |
WebDAV | 支持WebDAV 穿越 | 0.3.38 | –with-http_dav_module |
XSLT | 使用XSLT对页面进行再处理 | 0.7.8 | –with-http_xslt_module |
表2 可选的HTTP模块
对于邮件模块列表,请参考表3[6]。
名称 | 描述 | 配置参数 |
---|---|---|
Mail Core | 配置邮件模块的核心参数 | –with-mail |
POP3 | POP3设置 | –without-mail_pop3_module |
IMAP | IMAP设置 | –without-mail_imap_module |
SMTP | SMTP设置 | –without-mail_smtp_module |
Auth HTTP | 使用Nginx来认证邮件服务 | |
Proxy | Nginx可以代理 IMAP、POP3及SMTP协议 | |
SSL | 该模块可以确保为POP3/IMAP/SMTP提供SSL/TLS支持 | –with-mail_ssl_module |
表3 邮件模块
举例说明,我们可以重新编译Nginx,以便添加其他模块(如图18所示)。
图18 使用其他模块重新编译Nginx
将Nginx添加为一个系统服务
-
Debian/Ubuntu :
update-rc.d –f nginx defaults
(在Ubuntu上使用sudo
)
注意:如果已经存在/etc/rcrunlevel.d/[SK]??name 这样的文件,那么update-rc.d将不会起作用。这样做的目的,是为了避免修改可能经过系统管理员调整过的已有配置。只有不存在任何该类文件的情况下,例如该服务从未被安装过,该程序才会安装相应的链接。
- CentOS: chkconfig nginx on
-
Sept. 2013 Web Server Survey, http://news.netcraft.com/archives/2013/09/05/september-2013-web-server-survey.html ↩
-
download page, http://nginx.org/download/ ↩
-
Nginx wiki, http://wiki.nginx.org/Modules ↩
-
Nginx modules, http://wiki.nginx.org/Modules ↩
-
Nginx modules, http://wiki.nginx.org/Modules ↩
-
Nginx modules, http://wiki.nginx.org/Modules ↩