Nginx入门-在Linux上安装Nginx

介绍

简而言之,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下从头开始构建一个包的默认步骤,而我们都知道,使用./configuremakemake install的常规安装步骤,会使得卸载包变得困难,因为系统没有办法去跟踪哪些文件在安装过程中被添加或修改。

总而言之,你应该有一个有说服力的原因(一个真正强有说服力的原因!),才可以选择上面提到的这种方式来编译一个包。虽然你也许有一些这类的原因,但是最常见的一个原因是要在系统中安装某个包的更新版本,或者为了添加某个特定的功能。

如果你构建并安装了一个.deb或者一个.rpm文件,那么相应的包管理器(aptitude/apt-get或者yum)就能够感知到包的存在,并且它可以确保你没有覆盖之前安装的包的文件。另一方面,make install命令会覆盖安装过程中遇到的所有文件。我们稍后会讨论,当我们必须要从源代码编译并安装一个包时,可选的其他方式。

既然我们已经决定使用Nginx的最新版本,那么久需要按照如下步骤,从http://nginx.org/download/下载已经压缩好的tar文件,并且在构建之前进行解压缩。

  1. 下载tar包:wget http://nginx.org/download/nginx-1.5.6.tar.gz
  2. 解压缩:tar xvzf nginx-1.5.6.tar.gz
  3. 进入上一步自动创建的目录: cd nginx-1.5.6

然后

  1. cd nginx-1.5.6 (如果你希望列出所有的配置选项,可以使用--help选项)。./configure命令的输出会显示出Nginx的安装目录(如图5所示的 /usr/local/nginx

图5 Nginx安装路径

  1. make
  2. make install

虽然安装完成了,但是Nginx所在目录还没有被添加到PATH环境变量中(如图6所示)


图6 PATH变量(之前)

现在我们将/usr/local/nginx/sbin目录添加到PATH变量中,并检查我们刚刚从源代码安装的Nginx版本(如图7所示)。


图7 PATH变量(之后),并且从源代码安装了Nginx v1.5.6版本

注意:在安装过程中,可能系统会提示缺少库文件(如图8所示)。这时我们可以选择安装提供该库文件(例如我们遇到的libpcre3-devzlib1g-dev文件)的包,或者在配置是忽略这些提示。


图8 缺少库文件

在Ubuntu 12.04 LTS上安装Nginx

虽然Ubuntu的最新版本是13.10(代号 Saucy Salamander,于2013年十月17日发布),我们还是决定在Ubuntu 12.04 LTS(代号 Precise Pangolin)上进行安装,因为Canonical提供了直到2017年4月份的延长支持。

我们会继续通过sudo aptitudeupdate来更新源代码,然后从分发版的在线仓库中安装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

从仓库安装

  1. http://nginx.org/packages/centos/6 处下载并运行nginx yum配置文件。确保你选择了合适的架构;”noarch“是一个稳妥的选择:

    1. 下载:wget http://nginx.org/packages/centos/6/noarch/RPMS/nginx-release-centos-6-0.el6.ngx.noarch.rpm
    2. 安装:wget http://nginx.org/packages/centos/6/noarch/RPMS/nginx-release-centos-6-0.el6.ngx.noarch.rpm
  2. 安装Nginx:yum install nginx

  3. 启动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/Ubuntuupdate-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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,015评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,262评论 1 292
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,727评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,986评论 0 205
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,363评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,610评论 1 219
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,871评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,582评论 0 198
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,297评论 1 242
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,551评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,053评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,385评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,035评论 3 236
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,079评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,841评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,648评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,550评论 2 270

推荐阅读更多精彩内容

  • Nginx入门-在Linux上安装Nginx 介绍 简而言之,Nginx(发音为“engine x”)是一个小型、...
    呵呵哒1991阅读 697评论 0 1
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 170,569评论 25 707
  • 1. Nginx的模块与工作原理 Nginx由内核和模块组成,其中,内核的设计非常微小和简洁,完成的工作也非常简单...
    rosekissyou阅读 10,126评论 5 124
  • 第一章 Nginx简介 Nginx是什么 没有听过Nginx?那么一定听过它的“同行”Apache吧!Ngi...
    JokerW阅读 32,462评论 24 1,003
  • 近期最火爆的纪录片莫过于《零零后》了。 对于《零零后》我并不陌生。因为之前在纪录片《小人国》里看过,记录的是北京幼...
    育见阅读 1,155评论 2 10