译文:Nginx——高性能的Web服务器与反向代理软件

17 | 12 | 2014

唔,是这样的,最近在看Linux的服务器架设,然后自然而然的看到了Nginx与Apache2的对比。个人比较喜欢Nginx,翻看linuxjournal.com时找到这篇2008年写的关于Nginx的文章就拿来翻译了一下。也算是通过这种方式对Nginx加深理解吧。

原文请进:http://www.linuxjournal.com/magazine/nginx-high-performance-web-server-and-reverse-proxy

作者:Reese, Will
来源:Linux Journal. Sep2008, Issue 173, p62-67. 6p.
文献类型:Product Review
主题语:*WEB servers EVALUATION
人物:SYSOEV, Igor
摘要:The article reviews the Nginx web server and reverse proxy, created by Igor Sysoev.
ISSN:1075-3583
入藏编号:33986734

 

下面是译文:

Nginx:高性能的Web服务器与反向代理软件

2008年9月1日,作者 Will Reese

引言:你的Web服务器有性能问题?这位俄国人或许可以帮助你。

总所周知,Apache是目前最流行的Web服务器软件,并且也是到目前为止最成功的开源项目。自从1996年4月起,与其他的Web服务器软件相比,Apache在越来越多的网站上使用。许多大型网站也在使用Apache,其中包括YouTube、facebook、Wiki百科以及Craigslist,要知道这些网站每个月会被访问数十亿次。多年来,Apache已经证明了自身是一个非常稳定、安全而且可以配置的Web服务器软件。尽管Apache是一个优秀的Web服务器软件,那么会不会有另外一款Web服务器软件,拥有与Apache相同的功能,而且有更简单的配置以及更优秀的性能呢?答案是肯定的,这种Web服务器软件确实存在,它就是Nginx。

Nginx,含义为“EngineX”(引擎X),是一个高性能的Web服务器与反向代理软件。它是由他的创始人Igor Sysoev为俄罗斯第二大的网站www.rambler.ru开发的。Rambler网站从2004年夏天开始使用Nginx,至今为止,网站的日均访问量为5亿次。与Apache相似,Nginx同样被许多大型网站使用,其中包括WordPress、YouPorn、Hulu以及MochiMedia。截止到2008年5月份,Nginx已经在Web服务器软件中排名第四了,它正在为超过两百万个网站服务。现在它仅仅落后于Apache、IIS以及GFE,事实上,它已经是Linux系统上排名第二的Web服务器软件了。

为什么使用Nginx?

与Apache类似,Nginx拥有所有Web服务器软件应有的功能:

  • Static file serving.(静态文件服务)
  • SSL/TLS support.(SSL/TLS支持)
  • Virtual hosts.(虚拟主机)
  • Reverse proxying.(反向代理)
  • Load balancing.(负载均衡)
  • (压缩数据流)
  • Access controls.(访问控制)
  • URL rewriting.(URL重写)
  • Custom logging.(自定义日志)
  • Server-side includes.(SSI指令)
  • (WebDAV通信协议)
  • FLV streaming.(FLV视频流)
  • (Fast公共网关接口)

Nginx是稳定安全的服务器软件,而且你可以在下面的文章中看到,关于它的配置非常简便。然而,与Apache相比,Nginx的优势在于他的性能强且效率高。

我将一个简单的网站同时布置在运行Nginx v0.5.22与Apache v2.2.8的服务器上,然后使用AB工具(Apache基准测试工具)进行了一个简单测试。在测试的过程中,我使用vmsata与top命令监测系统的运行情况。结果表明,在静态内容服务方面,Nginx比Apache优秀;在并发100线程测试中,双方同样优秀。Apache使用4进程工作(线程模式),使用30%CPU和17M内存,每秒处理6500个请求。Nginx使用单进程工作,使用15%CPU和1M内存,每秒处理11500个请求。

Nginx的架构让他能够在使用较少的系统资源时每秒处理更多的请求。它由一个主进程与一个或多个工作进程组成,主进程负责将工作分配给工作进程。每个工作进程使用Linux内核的I/O多路复用(epoll/select/poll)以事件驱动或异步这两种方式处理多个请求。这样做使得Nginx可以快速处理大量的并发请求,并且系统资源的开销非常小。Apache可以通过配置来选择使用预分叉模式(每个请求使用一个进程)或是线程模式(每个请求使用一个线程)。尽管Apache的线程模式的执行效率高于它的预分叉模式,但仍然比使用Nginx的事件驱动架构使用更多的内存和CPU。

Nginx可以在绝大部分的Linux发行版本上运行。本文中,我使用的是Ubuntu 8.04(Hardy)以及Nginx 0.5.33。如果在你的Linux系统中没有Nginx,或者你希望使用新版本的Nginx,你可以通过下面的命令来下载安装最新的Nginx稳定版本(截稿时最新版本为0.6.31)。

在Root权限下执行以下命令安装Nginx:

# apt-get install nginx

现在,Nginx已经安装完成了,你可以通过使用start(启动)、stop(停止)以及restart(重启)命令来操作Web服务器:

# /etc/init.d/nginx start
# /etc/init.d/nginx stop
# /etc/init.d/nginx restart

大部分配置更改后无需重启(restart)服务器,仅需要使用reload命令。使用这条命令的优点是能够在重载配置之前检查Nginx配置文件错误:

# nginx -t
# /etc/init.d/nginx reload

接下来,让我们先启动服务吧:

# /etc/init.d/nginx start

Nginx现在应该已经开始在服务器上运行了。这个时候,我们打开浏览器,输入“http://127.0.0.1”,我们会看到一个欢迎页面“Welcome to nginx!”。

主要配置文件

安装完Nginx,让我们来看看它的配置文件“/etc/nginx/nginx.conf”。这个文件是Nginx服务器相关内容的设置,例子如下:

user www-data;

worker_processes  1;

error_log  /var/log/nginx/error.log;

pid  /var/run/nginx.pid;

events {

worker_connections  1024;

}

http {

include  /etc/nginx/mime.types;

default_type  application/octet-stream;

access_log  /var/log/nginx/access.log;

sendfile  on;

keepalive_timeout  65;

tcp_nodelay  on;

gzip  on;

include /etc/nginx/sites-enabled/*;

}

我们不需要对这个文件进行更改,但是我们可以说说这个文件的功能,好让我们能够理解Nginx是怎么工作的。首先,“worker_processes”参数是设置Nginx启动时的工作进程数量。如果服务器拥有多核处理器或是需要执行大量的磁盘IO操作,那么就可以尝试增加数值以获得更好的性能。然后下面的“worker_connections”参数指的是每个工作进程所能执行的并发连接数上限。如果需要确定Nginx的最大并大连接数,只需要将“worker_processes”的数值乘以“worker_connections”的数值就知道了。

“error_log”和“access_log”参数设置的是默认的日志记录的位置。你可以在每一个网站的基础设置中进行详细的设置,本文后面会有介绍。与Apache类似,Nginx默认运行在 www-data用户组,但是这个用户设置非常容易修改。Nginx在执行启动命令时需要知道主进程的进程ID,“pid”参数所表示进程ID储存在“/var/run/nginx.pid”文件中。

“sendfile”参数指的是允许Nginx使用一种特殊的Linux系统调用在网络上高效的传输文件。“gzip”参数设置Nginx对每个响应进行压缩,这是一种通过使用更多的CPU资源来节省带宽,并缩短响应时间的功能。除此之外,Nginx还提供了另外一种压缩模式——“gzip precompression”(预先压缩)(0.6.24版本可用)。这个模式中,Nginx会在服务器上检查预先压缩好的“.gz”文件,并为开启gzip功能的客户提供服务。这样做能够有效避免重复压缩浪费CPU资源。

最后设置我们所关心的“sites-enabled”目录指令。在“/etc/nginx”目录中,我们可以看到“/etc/nginx/sites-available”和“/etc/nginx/sites-enabled”两个文件夹。你需要为每一个部署在Nginx上的网站建立配置文件,配置文件建立在“/etc/nginx/sites-available”,然后需要在“/etc/nginx/sites-enabled”中为网站创建符号链接(symlink)指向之前所创建的配置文件。Nginx主要的配置文件都在“/etc/nginx/sites-enabled”文件夹中。这有助于你管理配置文件,使得Nginx可以非常容易的启用或禁用特定的网站。

静态Web服务器

我们已经介绍了主要的配置文件,那么接下来,让我们一起创建一个名为“basic”的网站配置文件。在开始之前,我们需要禁用Ubuntu系统为我们创建的默认站点:

# rm -f /etc/nginx/sites-enabled/default

现在,创建一个新的配置文件“/etc/nginx/sites-available/basic”,并写入以下内容:

server {

listen  127.0.0.1:80;

server_name  basic;

access_log  /var/log/nginx/basic.access.log;

error_log  /var/log/nginx/basic.error.log;

location  / {

root  /var/www/basic;

index  index.html index.htm;

}

}

创建网页的根文件夹以及index.html文件:

# mkdir /var/www/basic

# cd /var/www/basic

# echo "Basic Web Site" > index.html

启用网站并重启Nginx:

# cd /etc/nginx/sites-enabled

# ln -s ../sites-available/basic .

# /etc/init.d/nginx restart

如果你在你的浏览器中打开“http://127.0.0.1/”,你应该可以看到“basic”网站的一个页面了。如你所见,使用Nginx来架起一个网站就是这么简单。

让我们再回头看一下我们所创建的配置文件。“server”大括号中的所有参数是用于定义一个新的虚拟服务器。“listen”参数设置的是这台服务器接受请求的IP地址与端口,“server_name”参数指的是虚拟服务器的主机名。正如上文所说,“access_log”与“error_log”参数可以在每个站点上分别设置。为每一个网站配置独立的日志文件是一个非常好的习惯。

接下来我们讲讲“location”参数,它让你可以修改网站不同部分的位置。在我们的例子中,我们只为网站指定了一个位置。而你在自己使用时,可以指定多个位置,也可以使用正则表达式来定义位置。在我们的“location”中有两个参数:“root”和“index”。“root”参数可以定义网站的根目录。例如我们在请求“/img/test.gif”文件时,请求将寻找“/var/www/localhost/img/test.gif”这个文件位置。最后。“index”参数会告诉Nginx这个网站的默认文件名。

安全模式静态Web服务器

网上商店等网站,需要安全通信(HTTPS)来保护信用卡交易与客户信息。与Apache类似,Nginx通过SSL模块支持HTTPS连接,这很容易设置。

首先,你需要生成一个SSL证书。“openssl”命令将询问几个问题,你可以直接敲回车跳过:

# apt-get install openssl

# mkdir /etc/nginx/ssl

# cd /etc/nginx/ssl

# openssl req -new -x509 -nodes -out server.crt -keyout server.key

在“/etc/nginx/sites-available/secure”下创建一个新的配置文件,文件中包括以下内容:

server {

listen   127.0.0.1:443;

server_name  secure;

access_log  /var/log/nginx/secure.access.log;

error_log  /var/log/nginx/secure.error.log;

ssl on;

ssl_certificate /etc/nginx/ssl/server.crt;

ssl_certificate_key /etc/nginx/ssl/server.key;

location / {

root   /var/www/secure;

index  index.html index.htm;

}

}

创建根目录与“index.html”文件:

# mkdir /var/www/secure

# cd /var/www/secure

# echo "Secure Web Site" > index.html

启用网站并重启Nginx:

# cd /etc/nginx/sites-enabled

# ln -s ../sites-available/secure .

# /etc/init.d/nginx restart

接着在浏览器中打开“https://127.0.0.1”(注意是https),你可能会看到无法验证证书的警告。这是应为我们使用的是自己签名的证书做这个例子。在浏览器设置中选择接受这个证书,然后我们就能看到这个页面已经是“安全网站”了。

这里的配置文件与之前的非常类似,仅有些许不同。首先,我们可以看到新的服务器使用的是443端口,这是安全服务的标准端口。然后,我们需要将“ssl”参数设置为“on”(启动);如果你是自己编译Nginx,而不是使用Ubuntu软件包安装的,那么你需要确保使用的是“–with-http_ssl_module”;否则,SSL模块将无法使用。最后,我们使用“ssl_certificate”参数与“ssl_certificate_key”参数指向我们在前面创建的密钥与证书。

虚拟主机

在许多情况下,你需要将多个网站运行在单一的服务器上。这个功能就是虚拟主机,Nginx支持基于IP地址和基于网址两种方式的虚拟主机。

让我们创建两个虚拟主机:“one.example.com”和“two.example.com”。首先,我们需要在“/etc/hosts”文件中添加一行记录,从而将“one.example.com”和“two.example.com”两个网站解析到我们的服务器(在通常情况下,会使用DNS这样做):

# echo "127.0.0.1 one.example.com two.example.com" >> /etc/hosts

现在,我们需要为每个站点创建配置文件。首先,创建“/etc/nginx/sites-available/one”这个文件,输入以下内容:

server {

listen   127.0.0.1:80;

server_name  one.example.com;

access_log  /var/log/nginx/one.access.log;

error_log /var/log/nginx/one.error.log;

location / {

root   /var/www/one;

index  index.html index.htm;

}

}

然后,将“one”文件进行复制为“/etc/nginx/sites-available/two”,并把文件中所有的“one”字符改为“two”:

# cd /etc/nginx/sites-available

# cp one two

# sed -i "s/one/two/" two

创建根目录与“index.html”文件:

# mkdir /var/www/{one,two}

# echo "Site 1" > /var/www/one/index.html

# echo "Site 2" > /var/www/two/index.html

启用网站并重启Nginx:

# cd /etc/nginx/sites-enabled

# ln -s ../sites-available/one .

# ln -s ../sites-available/two .

# /etc/init.d/nginx restart

现在,如果你在浏览器中打开“http://one.example.com/”,你应该可以看到页面显示的是“Site 1”。同样,打开“http://two.example.com/”后,你会看到“Site 2”。

我们刚刚创建了两个基于网址的虚拟主机,他们都是运行在“127.0.0.1”服务器上,仅仅是“server_name”参数不同。那么对于基于IP地址的虚拟主机,只需要改变“listen”参数,为不同网站配置不同IP地址就可以了。

现在,先禁用这两台虚拟主机:

# rm -f /etc/nginx/sites-enabled/one

# rm -f /etc/nginx/sites-enabled/two

# /etc/init.d/nginx restart

不要忘记删除之前加入到“/etc/hosts”文件中的那一条记录。