Nginx入门-在Linux上安装Nginx
介绍
简而言之,Nginx(发音为“engine x”)是一个小型、功能强大并且可扩展的 web/proxy 服务器。根据Netcraft最近的一次调查,Nginx已经支持了全球超过15%的网站,共111,680,078家 ,其中不乏Netflix和WordPress.com这样的庞然大物。
Nginx基于Simplified BSD许可(一个开源许可)发行,可以从在线仓库或者源代码进行安装。在本文中,我们将会涵盖如何在Debian,Ubuntu以及CentOS下安装Nginx。需要特别注意的一点是,在线仓库中的版本通常都会滞后一点。如果我们想体验最新的功能和bug修正,那么我推荐根据源代码来构建,或者直接从nginx.org下载安装包。
通过使用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日过期了。显然,如果我们希望使用最新的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,由于当前不支持运行时启用模块,所以必须在编译时选择启用的模块。通过运行./configure --help,可以找到配置脚本中提供的所有编译时选项,包括可选模块。不幸的是,如果我们已经安装了Nginx但又想添加某一个模块,我们必须先卸载它,再重新用所需模块进行编译。
对于标准的HTTP模块列表,请参考表1:
名称 描述 版本 禁用参数
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
名称 描述 版本 启用参数
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。
名称 描述 配置参数
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
[1]: Sept. 2013 Web Server Survey, http://news.netcraft.com/archives/2013/09/05/september-2013-web-server-survey.html
[2]: download page, http://nginx.org/download/
[3]: Nginx wiki, http://wiki.nginx.org/Modules
[4]: Nginx modules, http://wiki.nginx.org/Modules
[5]: Nginx modules, http://wiki.nginx.org/Modules
[6]: Nginx modules, http://wiki.nginx.org/Modules
© 著作权归作者所有