《高性能Linux服务器构建实战:运维监控、性能调优与集群应用》
机械工业出版社出版发行1
第一章轻量级HTTP服务器Nginx
本章主要介绍Nginx的配置管理和使用。作为一个轻量级的HTTP服务器,Nginx与Apache相比,小
巧而精致:在性能上,它占用很少的系统资源,能支持更多的并发连接,达到更高的访问效率;在功能上,
Nginx是优秀的代理服务器和负载均衡服务器;在安装配置上,Nginx安装简单、配置灵活。下面就开始详
细介绍nginx的配置与使用。
1.1什么是Nginx
相信很多读者都对Apache非常熟悉,与Apache类似,Nginx是一款高性能的HTTP和
反向代理服务器软件,也是一个IMAP/POP3/SMTP代理服务器。Nginx(发音是“enginex”)
由俄罗斯的程序设计师IgorSysoev所开发(Igor将源代码以类BSD许可证的形式发布),
可以运行在UNIX,GNU/Linux,BSD,MacOSX,Solaris,以及MicrosoftWindows等
操作系统中。随着Nginx在很多大型网站的稳定运行,其稳定、高效的特性逐渐被越来越多
的用户认可。
1.2为什么要选择Nginx
1.2.1Nginx与Apache的异同
Nginx和Apache一样,都是一个HTTP服务器软件,功能实现上都采用模块化结构设
计,都支持通用的语言接口,如PHP、Perl、Python等,同时还支持正、反向代理,虚拟主
机,URL重写,压缩传输,SSL加密传输等。它们之间最大的差别是Apache处理速度很慢,
且占用很多内存资源,而Nginx却恰恰相反;在功能实现上,Apache的所有模块都支持动、
静态编译,而Nginx模块都是静态编译的,同时,Apache对Fcgi支持不好,而Nginx对Fcgi
的支持非常的好;最重要的是,在处理连接方式上,Nginx支持epoll,而Apache却不支持;
在大小上,Nginx安装包仅仅有几百K,和Nginx比起来Apache绝对是庞然大物。在了解
了Nginx和Apache之间的异同点后基本知道了Nginx作为HTTP服务器的优势所在。
1.2.2选择Nginx的优势所在
通过上面的简单介绍,Nginx作为HTTP服务器的优势是显而易见的,它有很多其它
《高性能Linux服务器构建实战:运维监控、性能调优与集群应用》
机械工业出版社出版发行2
Web服务器无法比拟的性能和优势:
作为Web服务器,nginx处理静态文件、索引文件以及自动索引效率非常高。
作为代理服务器,Nginx可以实现无缓存的反向代理加速,提高网站运行速度。
作为负载均衡服务器,Nginx既可以在内部直接支持Rails和PHP,也可以支持HTTP
代理服务器,对外进行服务。同时支持简单的容错和利用算法进行负载均衡。
在性能方面,Nginx是专门为性能优化而开发的,在实现上非常注重效率。它采用内核
Poll模型,可以支持更多的并发连接,最大可以支持对50000个并发连接数的响应,而且
占用很低的内存资源。
在稳定性方面,Nginx采取了分阶段资源分配技术,使得对CPU与内存的占用率非常
低。Nginx官方表示Nginx保持10000个没有活动的连接,这些连接只占2.5M内存,因此,
类似DOS这样的攻击对Nginx来说基本上是没有任何作用的。
在高可用性方面,Nginx支持热部署,启动速度特别迅速,因此可以在不间断服务的情
况下,对软件版本或者配置进行升级,即使运行数月也无需重新启动,几乎可以做到7×24
小时的不间断运行。
1.3Nginx的模块与工作原理
Nginx由内核和模块组成,其中,内核的设计非常微小和简洁,完成的工作也非常简单,
仅仅通过查找配置文件将客户端请求映射到一个locationblock(location是Nginx配置中的
一个指令,用于URL匹配),而在这个location中所配置的每个指令将会启动不同的模块去
完成相应的工作。
Nginx的模块从结构上分为核心模块、基础模块和第三方模块,HTTP模块、EVENT
模块和MAIL模块等属于核心模块,HTTPAccess模块、HTTPFastCGI模块、HTTPProxy
模块和HTTPRewrite模块属于基本模块,而HTTPUpstreamRequestHash模块、Notice模
块和HTTPAccessKey模块属于第三方模块,用户根据自己的需要开发的模块都属于第三方
模块。正是有了这么多模块的支撑,Nginx的功能才会如此强大。
Nginx的模块从功能上分为三类,分别是:
1)Handlers(处理器模块)。此类模块直接处理请求,并进行输出内容和修改headers
信息等操作。handlers处理器模块一般只能有一个。
2)Filters(过滤器模块)。此类模块主要对其他处理器模块输出的内容进行修改操作,
《高性能Linux服务器构建实战:运维监控、性能调优与集群应用》
机械工业出版社出版发行3
最后由Nginx输出。
3)Proxies(代理类模块)。就是Nginx的HTTPUpstream之类的模块,这些模块主
要与后端一些服务比如fastcgi等操作交互,实现服务代理和负载均衡等功能。
图1-1展示了Nginx的模块下一次常规的HTTP请求和响应的过程。
Nginx内核
Handlers(处理器模块)
Filters(过滤器模块1)
Filters(过滤器模块2)
Filters(过滤器模块N)
HTTP发出请求
HTTP响应请求
选择一个Handlers
处理器模块
生成内容
处理内容
图1-1Nginx的HTTP模块请求和响应过程
在工作方式上,Nginx分为单工作进程和多工作进程两种模式。在单工作进程模式下,
除主进程外,还有一个工作进程,工作进程是单线程的;在多工作进程模式下,每个工作进
程包含多个线程。Nginx默认为单工作进程模式。
Nginx的模块直接被编译进Nginx,因此属于静态编译方式。启动Nginx后,Nginx的
模块被自动加载,不像在Apache一样,首先将模块编译为一个so文件,然后在配置文件中
指定是否进行加载。在解析配置文件时,Nginx的每个模块都有可能去处理某个请求,但是
同一个处理请求只能由一个模块来完成。
1.4Nginx的安装与配置
1.4.1下载与安装Nginx
Nginx的官方网站是http://sysoev.ru/nginx/,英文主页为http://nginx.net,从这里可
以获得Nginx的最新版本信息。Nginx有三个版本:稳定版、开发版和历史稳定版。开发版
更新较快,包含最新的功能和bug的修复,但同时也可能会遇到新的bug,开发版一旦更新
《高性能Linux服务器构建实战:运维监控、性能调优与集群应用》
机械工业出版社出版发行4
稳定下来,就会被加入稳定版分支中。然而有些新功能不一定会被加到旧的稳定版中去。稳
定版本更新较慢,但是bug较少,可以作为生产环境的首选,因此通常建议使用稳定版。历
史稳定版本为以往稳定版本的汇总,不包含最新的功能。
这里选择当前的稳定版本nginx-0.7.65作为介绍对象,开始介绍编译安装。在安装Nginx
之前,确保系统已经安装了gcc、openssl-devel、pcre-devel和zlib-devel软件库。
Linux开发库是在安装系统时通过手动选择安装的,gcc、openssl-devel、zlib-devel三个
软件库可以通过安装光盘直接选择安装得到,而pcre-devel库默认不在系统光盘中,所以这
里重点介绍pcre-devel库。
1.安装Nginx所需的pcre-devel库
安装pcre库是为了使Nginx支持HTTPRewrite模块。下面进行安装,过程如下。
[root@localhosthome]#tarzxvfpcre-8.02.tar.gz
[root@localhosthome]#cdpcre-8.02
[root@localhostpcre-8.02]#make
[root@localhostpcre-8.02]#makeinstall
2.开始安装Nginx
Nginx的安装非常简单。在默认情况下,经过编译安装的Nginx包含了大部分可用模
块。可以通过“./configure--help”选项设置各个模块的使用情况,例如对不需要的http_ssi
模块,可通过“--without-http_ssi_module”方式关闭此模块;同理,如果需要“http_perl”
模块,那么可以通过“--with-http_perl_module”方式安装此模块。下面是安装过程:
[root@localhosthome]#tarzxvfnginx-0.7.65.tar.gz
[root@localhosthome]#cdnginx-0.7.65
[root@localhostnginx-0.7.65]#./configure\
--with-http_stub_status_module--prefix=/opt/nginx
[root@localhostnginx-0.7.65]#make
[root@localhostnginx-0.7.65]#makeinstall
在上面的configure选项中“--with-http_stub_status_module”可以用来启用Nginx的
《高性能Linux服务器构建实战:运维监控、性能调优与集群应用》
机械工业出版社出版发行5
NginxStatus功能,以监控Nginx的当前状态。
至此,Nginx已经安装完成了。
1.4.2Nginx配置文件结构
Nginx的配置文件是一个纯文本文件,它一般位于Nginx安装目录的conf目录下,整个
配置文件是以block的形式组织的。每个block一般以一个大括号“{}”来表示,block可以
分为几个层次,整个配置文件中Main指令位于最高层,在Main层下面可以有Events、HTTP
等层级,而在HTTP层中又包含有Server层,即serverblock,serverblock中又可分为location
层,并且一个serverblock中可以包含多个locationblock。
一个完整的配置文件结构如图1-2所示。
Main
Events
HTTP
lacation
Server
lacation
Server
图1-2Nginx配置文件结构
在了解完配置文件结构之后,就可以开始配置和调试Nginx了。
1.4.3配置与调试Nginx
Nginx安装完毕后,会产生相应的安装目录,根据前面的安装路径,Nginx的配置文件
路径为/opt/nginx/conf,其中nginx.conf为Nginx的主配置文件。这里重点介绍下nginx.conf
这个配置文件。
Nginx配置文件主要分成四部分:main(全局设置)、server(主机设置)、upstream(负
《高性能Linux服务器构建实战:运维监控、性能调优与集群应用》
机械工业出版社出版发行6
载均衡服务器设置)和location(URL匹配特定位置的设置)。main部分设置的指令将影响
其他所有设置;server部分的指令主要用于指定主机和端口;upstream指令主要用于负载均
衡,设置一系列的后端服务器;location部分用于匹配网页位置。这四者之间的关系式:server
继承main,location继承server,upstream既不会继承其他设置也不会被继承。
在这四个部分当中,每个部分都包含若干指令,这些指令主要包含Nginx的主模块指令、
事件模块指令、HTTP核心模块指令,同时每个部分还可以使用其他HTTP模块指令,例如
HttpSSL模块、HttpGzipStatic模块和HttpAddition模块等。
下面通过一个Nginx配置实例,详细介绍下nginx.conf每个指令的含义。为了能更清楚
地了解Nginx的结构和每个配置选项的含义,这里按照功能点将Nginx配置文件分为7个部
分逐次讲解,下面就围绕这7个部分进行介绍。
1.Nginx的全局配置
下面这段内容是对Nginx的全局属性配置,代码如下:
usernobodynobody;
worker_processes4;
error_loglogs/error.lognotice;
pidlogs/nginx.pid;
worker_rlimit_nofile65535;
events{
useepoll;
worker_connections65536;
}
对上面这段代码中每个配置选项的含义解释如下:
user是个主模块指令,指定NginxWorker进程运行用户以及用户组,默认由nobody账
号运行。
worker_processes是个主模块指令,指定了Nginx要开启的进程数。每个Nginx进程平
均耗费10M~12M内存。根据经验,一般指定一个进程足够了,如果是多核CPU,建议指定
和CPU的数量一样的进程数即可。
error_log是个主模块指令,用来定义全局错误日志文件。日志输出级别有debug、info、
notice、warn、error、crit可供选择,其中,debug输出日志最为最详细,而crit输出日志最
少。
pid是个主模块指令,用来指定进程id的存储文件位置。
worker_rlimit_nofile用于绑定worker进程和CPU,Linux内核2.4以上可用。
《高性能Linux服务器构建实战:运维监控、性能调优与集群应用》
机械工业出版社出版发行7
events指令是设定Nginx的工作模式及连接数上限。
events{
useepoll;
worker_connections65536;
}
use是个事件模块指令,用来指定Nginx的工作模式。Nginx支持的工作模式有select、
poll、kqueue、epoll、rtsig和/dev/poll。其中select和poll都是标准的工作模式,kqueue和
epoll是高效的工作模式,不同的是epoll用在Linux平台上,而kqueue用在BSD系统中。
对于Linux系统,epoll工作模式是首选。
worker_connections也是个事件模块指令,用于定义Nginx每个进程的最大连接数,默
认是1024.最大客户端连接数由worker_processes和worker_connections决定,即
Max_client=worker_processesworker_connections,在作为反向代理时,max_clients变为:
max_clients=worker_processesworker_connections/4。
进程的最大连接数受Linux系统进程的最大打开文件数限制,在执行操作系统命令
“ulimit-n65536”后worker_connections的设置才能生效。
2.HTTP服务器配置
接下来开始进行HTTP服务器设置。
下面这段内容是Nginx对HTTP服务器相关属性的配置,代码如下:
http{
includeconf/mime.types;
default_typeapplication/octet-stream;
log_formatmain''$remote_addr-$remote_user[$time_local]''
''"$request"$status$bytes_sent''
''"$http_referer""$http_user_agent"''
''"$gzip_ratio"'';
log_formatdownload''$remote_addr-$remote_user[$time_local]''
''"$request"$status$bytes_sent''
''"$http_referer""$http_user_agent"''
''"$http_range""$sent_http_content_range"'';
《高性能Linux服务器构建实战:运维监控、性能调优与集群应用》
机械工业出版社出版发行8
client_max_body_size20m;
client_header_buffer_size32K;
large_client_header_buffers432k;
Sendfileon;
tcp_nopushon;
tcp_nodelayon;
keepalive_timeout60;
client_header_timeout10;
client_body_timeout10;
send_timeout10;
下面详细介绍下这段代码中每个配置选项的含义。
include是个主模块指令,实现对配置文件所包含的文件的设定,可以减少主配置文件
的复杂度。类似于Apache中的include方法。
default_type属于HTTP核心模块指令,这里设定默认类型为二进制流,也就是当文件
类型未定义时使用这种方式,例如在没有配置PHP环境时,Nginx是不予解析的,此时,
用浏览器访问PHP文件就会出现下载窗口。
下面的代码实现对日志格式的设定。
log_formatmain''$remote_addr-$remote_user[$time_local]''
''"$request"$status$bytes_sent''
''"$http_referer""$http_user_agent"''
''"$gzip_ratio"'';
log_formatdownload''$remote_addr-$remote_user[$time_local]''
''"$request"$status$bytes_sent''
''"$http_referer""$http_user_agent"''
''"$http_range""$sent_http_content_range"'';
log_format是Nginx的HttpLog模块指令,用于指定Nginx日志的输出格式。main为此
日志输出格式的名称,可以在下面的access_log指令中引用。
client_max_body_size用来设置允许客户端请求的最大的单个文件字节数。
client_header_buffer_size用于指定来自客户端请求头的headerbuffer大小。对于大多数
请求,1K的缓冲区大小已经足够,如果自定义了消息头或有更大的Cookie,可以增加缓冲
区大小。这里设置为32K。
large_client_header_buffers用来指定客户端请求中较大的消息头的缓存最大数量和大小,
《高性能Linux服务器构建实战:运维监控、性能调优与集群应用》
机械工业出版社出版发行9
“4”为个数,“128K”为大小,最大缓存量为4个128K。
sendfile参数用于开启高效文件传输模式。将tcp_nopush和tcp_nodelay两个指令设置为
on用于防止网络阻塞。
keepalive_timeout设置客户端连接保持活动的超时时间。在超过这个时间之后,服务器
会关闭该连接。
client_header_timeout设置客户端请求头读取超时时间。如果超过这个时间,客户端还
没有发送任何数据,Nginx将返回“Requesttimeout(408)”错误。
client_body_timeout设置客户端请求主体读取超时时间。如果超过这个时间,客户端还
没有发送任何数据,Nginx将返回“Requesttimeout(408)”错误,默认值是60。
send_timeout指定响应客户端的超时时间。这个超时仅限于两个连接活动之间的时间,
如果超过这个时间,客户端没有任何活动,Nginx将会关闭连接。
3.HttpGzip模块配置
下面配置Nginx的HttpGzip模块。这个模块支持在线实时压缩输出数据流。要查看是
否安装了此模块,需要使用下面的命令:
[root@localhostconf]#/opt/nginx/sbin/nginx-V
nginxversion:nginx/0.7.65
configurearguments:--with-http_stub_status_module--with-http_gzip_static_module
--prefix=/opt/nginx
通过/opt/nginx/sbin/nginx-V命令可以查看安装Nginx时的编译选项,由输出可知,我们已
经安装了HttpGzip模块。
下面是HttpGzip模块在Nginx配置中的相关属性设置:
gzipon;
gzip_min_length1k;
gzip_buffers416k;
gzip_http_version1.1;
gzip_comp_level2;
gzip_typestext/plainapplication/x-javascripttext/cssapplication/xml;
gzip_varyon;
gzip用于设置开启或者关闭gzip模块,“gzipon”表示开启GZIP压缩,实时压缩输出
数据流。
gzip_min_length设置允许压缩的页面最小字节数,页面字节数从header头的
Content-Length中获取。默认值是0,不管页面多大都进行压缩。建议设置成大于1K的字
《高性能Linux服务器构建实战:运维监控、性能调优与集群应用》
机械工业出版社出版发行10
节数,小于1K可能会越压越大。
gzip_buffers表示申请4个单位为16K的内存作为压缩结果流缓存,默认值是申请与原
始数据大小相同的内存空间来存储gzip压缩结果。
gzip_http_version用于设置识别HTTP协议版本,默认是1.1,目前大部分浏览器已经支
持GZIP解压,使用默认即可。
gzip_comp_level用来指定GZIP压缩比,1压缩比最小,处理速度最快;9压缩比最大,
传输速度快,但处理最慢,也比较消耗cpu资源。
gzip_types用来指定压缩的类型,无论是否指定,“text/html”类型总是会被压缩的。
gzip_vary选项可以让前端的缓存服务器缓存经过GZIP压缩的页面,例如用Squid缓存
经过Nginx压缩的数据。
4.负载均衡配置
下面设定负载均衡的服务器列表。
upstreamixdba.net{
ip_hash;
server192.168.12.133:80;
server192.168.12.134:80down;
server192.168.12.135:8009max_fails=3fail_timeout=20s;
server192.168.12.136:8080;
}
upstream是Nginx的HTTPUpstream模块,这个模块通过一个简单的调度算法来实现客
户端IP到后端服务器的负载均衡。在上面的设定中,通过upstream指令指定了一个负载均
衡器的名称ixdba.net。这个名称可以任意指定,在后面需要的地方直接调用即可。
Nginx的负载均衡模块目前支持4种调度算法,下面进行分别介绍,其中后两项属于第
三方的调度方法。
?轮询(默认)。每个请求按时间顺序逐一分配到不同的后端服务器,如果后端某台
服务器宕机,故障系统被自动剔除,使用户访问不受影响。
?Weight。指定轮询权值,Weight值越大,分配到的访问机率越高,主要用于后端每
个服务器性能不均的情况下。
?ip_hash。每个请求按访问IP的hash结果分配,这样来自同一个IP的访客固定访
问一个后端服务器,有效解决了动态网页存在的session共享问题。
《高性能Linux服务器构建实战:运维监控、性能调优与集群应用》
机械工业出版社出版发行11
?fair。比上面两个更加智能的负载均衡算法。此种算法可以依据页面大小和加载时
间长短智能地进行负载均衡,也就是根据后端服务器的响应时间来分配请求,响应
时间短的优先分配。Nginx本身是不支持fair的,如果需要使用这种调度算法,必
须下载Nginx的upstream_fair模块。
?url_hash。按访问url的hash结果来分配请求,使每个url定向到同一个后端服务器,
可以进一步提高后端缓存服务器的效率。Nginx本身是不支持url_hash的,如果需
要使用这种调度算法,必须安装Nginx的hash软件包。
在HTTPUpstream模块中,可以通过server指令指定后端服务器的IP地址和端口,同
时还可以设定每个后端服务器在负载均衡调度中的状态。常用的状态有:
?down,表示当前的server暂时不参与负载均衡。
?backup,预留的备份机器。当其他所有的非backup机器出现故障或者忙的时候,
才会请求backup机器,因此这台机器的压力最轻。
?max_fails,允许请求失败的次数,默认为1。当超过最大次数时,返回
proxy_next_upstream模块定义的错误。
?fail_timeout,在经历了max_fails次失败后,暂停服务的时间。max_fails可以和
fail_timeout一起使用。
注意当负载调度算法为ip_hash时,后端服务器在负载均衡调度中的状态不能是
weight和backup。
5.server虚拟主机配置
下面介绍对虚拟主机的配置。建议将对虚拟主机进行配置的内容写进另外一个文件,然
后通过include指令包含进来,这样更便于维护和管理。
server{
listen80;
server_name192.168.12.188www.ixdba.net;
indexindex.htmlindex.htmindex.jsp;
root/web/wwwroot/www.ixdba.net
charsetgb2312;
server标志定义虚拟主机开始,listen用于指定虚拟主机的服务端口,server_name用来
指定IP地址或者域名,多个域名之间用空格分开。Index用于设定访问的默认首页地址,root
指令用于指定虚拟主机的网页根目录,这个目录可以是相对路径,也可以是绝对路径。
《高性能Linux服务器构建实战:运维监控、性能调优与集群应用》
机械工业出版社出版发行12
Charset用于设置网页的默认编码格式。
access_loglogs/www.ixdba.net.access.logmain;
access_log用来指定此虚拟主机的访问日志存放路径,最后的main用于指定访问日志
的输出格式。
6.URL匹配配置
URL地址匹配是进行Nginx配置中最灵活的部分。location支持正则表达式匹配,
也支持条件判断匹配,用户可以通过location指令实现Nginx对动、静态网页进行过滤处理。
以下这段设置是通过location指令来对网页URL进行分析处理,所有扩展名
以.gif、.jpg、.jpeg、.png、.bmp、.swf结尾的静态文件都交给nginx处理,而expires用来指
定静态文件的过期时间,这里是30天。
location~.\.(gif|jpg|jpeg|png|bmp|swf)${
root/web/wwwroot/www.ixdba.net;
expires30d;
}
以下这段设置是将upload和html下的所有文件都交给nginx来处理,当然,upload和
html目录包含在/web/wwwroot/www.ixdba.net目录中。
location~^/(upload|html)/{
root/web/wwwroot/www.ixdba.net;
expires30d;
}
在最后这段设置中,location是对此虚拟主机下动态网页的过滤处理,也就是将所有
以.jsp为后缀的文件都交给本机的8080端口处理。
location~..jsp${
indexindex.jsp;
proxy_passhttp://localhost:8080;
}
7.StubStatus模块配置
StubStatus模块能够获取Nginx自上次启动以来的工作状态,此模块非核心模块,需要
《高性能Linux服务器构建实战:运维监控、性能调优与集群应用》
机械工业出版社出版发行13
在Nginx编译安装时手工指定才能使用此功能。
以下指令实指定启用获取Nginx工作状态的功能。
location/NginxStatus{
stub_statuson;
access_loglogs/NginxStatus.log;
auth_basic"NginxStatus";
auth_basic_user_file../htpasswd;
}
stub_status设置为“on”表示启用StubStatus的工作状态统计功能。access_log用来指
定StubStatus模块的访问日志文件。auth_basic是Nginx的一种认证机制。auth_basic_user_file
用来指定认证的密码文件,由于Nginx的auth_basic认证采用的是与Apache兼容的密码文
件,因此需要用Apache的htpasswd命令来生成密码文件,例如要添加一个webadmin用户,
可以使用下面方式生成密码文件:
/usr/local/apache/bin/htpasswd-c/opt/nginx/conf/htpasswdwebadmin
会得到以下提示信息:
Newpassword:
输入密码之后,系统会要求再次输入密码。确认之后添加用户成功。
要查看Nginx的运行状态,可以输入http://ip/NginxStatus,然后输入刚刚创建的用户名
和密码就可以看到如下信息:
Activeconnections:1
serveracceptshandledrequests
393411393411393799
Reading:0Writing:1Waiting:0
Activeconnections表示当前活跃的连接数,第三行的三个数字表示Nginx当前总共处
理了393411个连接,成功创建393411次握手,总共处理了393799个请求。最后一行的
Reading表示Nginx读取到客户端Header信息数,Writing表示Nginx返回给客户端的Header
信息数,“Waiting”表示Nginx已经处理完,正在等候下一次请求指令时的驻留连接数。
在最后这段设置中,设置了虚拟主机的错误信息返回页面,通过error_page指令可以定
制各种错误信息的返回页面。在默认情况下,Nginx会在主目录的html目录中查找指定的
返回页面,特别需要注意的是,这些错误信息的返回页面大小一定要超过512K,否者会被
ie浏览器替换为ie默认的错误页面。
error_page404/404.html;
error_page500502503504/50x.html;
location=/50x.html{
roothtml;
}
《高性能Linux服务器构建实战:运维监控、性能调优与集群应用》
机械工业出版社出版发行14
}
}
1.4.4Nginx的启动、停止和平滑重启
在完成对nginx.conf文件的配置后,就可以启动服务了,Nginx自身提供了一些用于日
常维护的命令,下面进行详细的介绍。
1.Nginx基本信息检查
(1)检查Nginx配置文件的正确性
Nginx提供的配置文件调试功能非常有用,可以快速定位配置文件存在的问题。执行如
下命令检测配置文件的正确性:
/opt/nginx/sbin/nginx–t或者
/opt/nginx/sbin/nginx-t-c/opt/nginx/conf/nginx.conf
其中,“-t”参数用于检查配置文件是否正确,但并不执行。“-c”参数用于指定配置文
件路径,如果不指定配置文件路径,Nginx默认会在安装时指定的安装目录下查找
conf/nginx.conf文件。
如果检测结果显示如下信息,说明配置文件正确。
theconfigurationfile/opt/nginx/conf/nginx.confsyntaxisok
configurationfile/opt/nginx/conf/nginx.conftestissuccessful
(2)显示Nginx的版本以及相关编译信息
在命令行执行以下命令可以显示安装Nginx的版本信息。
/opt/nginx/sbin/nginx-v
执行以下命令显示安装的Nginx版本和相关编译信息:
/opt/nginx/sbin/nginx-V
不但显示Nginx的版本信息,同时显示nginx在编译时指定的相关模块信息。
2.Nginx的启动、关闭与重启
Nginx对进程的控制能力非常强大,可以通过信号指令控制进程。常用的信号有:
?QUIT,表处理完当前请求后,关闭进程。
?HUP,表示重新加载配置,也就是关闭原有的进程,并开启新的工作进程。此操作
《高性能Linux服务器构建实战:运维监控、性能调优与集群应用》
机械工业出版社出版发行15
不会中断用户的访问请求,因此可以通过此信号平滑的重启Nginx。
?USR1,用于Nginx的日志切换,也就是重新打开一个日志文件,例如每天要生成
一个新的日志文件时,可以使用这个信号来控制。
?USR2,用于平滑升级可执行程序。
?WINCH,从容关闭工作进程。
(1)Nginx的启动
Nginx的启动非常简单,只需输入:
/opt/nginx/sbin/nginx
即可完成nginx的启动。nginx启动后,可以通过如下命令查看Nginx的启动进程:
[root@localhostlogs]#ps-ef|grepnginx
root165721011:14?00:00:00nginx:masterprocess
/opt/nginx/sbin/nginx
nobody1659116572011:15?00:00:00nginx:workerprocess
nobody1659216572011:15?00:00:00nginx:workerprocess
nobody1659316572011:15?00:00:00nginx:workerprocess
nobody1659416572011:15?00:00:00nginx:workerprocess
(2)Nginx的关闭
如果要关闭Nginx进程,可以使用如下命令:
kill-XXXpid
其中,XXX就是信号名,pid是Nginx的进程号,可以通过如下两个命令获取:
ps-ef|grep"nginx:masterprocess"|grep-v"grep"|awk-F''''''{print$2}''
cat/opt/nginx/logs/nginx.pid
(3)Nginx的平滑重启
要不间断服务地重新启动Nginx,可以使用如下命令:
kill-HUP‘cat/opt/nginx/logs/nginx.pid‘
1.5Nginx常用配置实例
Nginx作为一个HTTP服务器,在功能实现方面和性能方面都表现得非常卓越,完全可
以与Apache相媲美,几乎可以实现Apache的所有功能,下面就介绍一些Nginx常用的配
《高性能Linux服务器构建实战:运维监控、性能调优与集群应用》
机械工业出版社出版发行16
置实例,具体包含虚拟主机配置、负载均衡配置、防盗链配置以及日志管理等。
1.5.1虚拟主机配置实例
下面在Nginx中创建三个虚拟主机,需要说明的是,这里仅仅列出了虚拟主机配置部分。
http{
server{
listen80;
server_namewww.domain1.com;
access_loglogs/domain1.access.logmain;
location/{
indexindex.html;
root/web/www/domain1.com/htdocs;
}
}
server{
listen80;
server_namewww.domain2.com;
access_loglogs/domain2.access.logmain;
location/{
indexindex.html;
root/web/www/domain2.com/htdocs;
}
}
include/opt/nginx/conf/vhosts/www.domain2.com.conf;
}
这里用到了include指令,其中/opt/nginx/conf/vhosts/www.domain2.com.conf的内容为:
server{
listen80;
server_namewww.domain3.com;
access_loglogs/domain3.access.logmain;
location/{
indexindex.html;
root/web/www/domain3.com/htdocs;
}
}
1.5.2负载均衡配置实例
下面通过Nginx的反向代理功能配置一个Nginx负载均衡服务器。后端有三个服务节点,
《高性能Linux服务器构建实战:运维监控、性能调优与集群应用》
机械工业出版社出版发行17
用于提供Web服务,通过Nginx的调度实现三个节点的负载均衡。
http
{
upstreammyserver{
server192.168.12.181:80weight=3max_fails=3fail_timeout=20s;
server192.168.12.182:80weight=1max_fails=3fail_timeout=20s;
server192.168.12.183:80weight=4max_fails=3fail_timeout=20s;
}
server
{
listen80;
server_namewww.domain.com192.168.12.189;
indexindex.htmindex.html;
root/ixdba/web/wwwroot;
location/{
proxy_passhttp://myserver;
proxy_next_upstreamhttp_500http_502http_503errortimeoutinvalid_header;
include/opt/nginx/conf/proxy.conf;
}
}
}
在上面这个配置实例中,首先定义了一个负载均衡组myserver,然后在location部分通
过“proxy_passhttp://myserver”实现负载调度功能,其中proxy_pass指令用来指定代理的
后端服务器地址和端口,地址可以是主机名或者IP地址,也可以是通过upstream指令设定
的负载均衡组名称。
proxy_next_upstream用来定义故障转移策略,当后端服务节点返回500、502、503、504
和执行超时等错误时,自动将请求转发到upstream负载均衡组中的另一台服务器,实现故
障转移。最后通过include指令包含进来一个proxy.conf文件。
其中/opt/nginx/conf/proxy.conf的内容为:
proxy_redirectoff;
proxy_set_headerHost$host;
proxy_set_headerX-Real-IP$remote_addr;
proxy_set_headerX-Forwarded-For$proxy_add_x_forwarded_for;
proxy_connect_timeout90;
proxy_send_timeout90;
proxy_read_timeout90;
proxy_buffer_size4k;
proxy_buffers432k;
《高性能Linux服务器构建实战:运维监控、性能调优与集群应用》
机械工业出版社出版发行18
proxy_busy_buffers_size64k;
proxy_temp_file_write_size64k;
Nginx的代理功能是通过httpproxy模块来实现的。默认在安装Nginx时已经安装了http
proxy模块因此可直接使用httpproxy模块。下面详细解释proxy.conf文件中每个选项代表的
含义。
?proxy_set_header:设置由后端的服务器获取用户的主机名或者真实IP地址,以及
代理者的真实IP地址。
?client_body_buffer_size:用于指定客户端请求主体缓冲区大小,可以理解为先保存
到本地再传给用户。
?proxy_connect_timeout:表示与后端服务器连接的超时时间,即发起握手等候响应
的超时时间。
?proxy_send_timeout:表示后端服务器的数据回传时间,即在规定时间之内后端服
务器必须传完所有的数据,否则,Nginx将断开这个连接。
?proxy_read_timeout:设置Nginx从代理的后端服务器获取信息的时间,表示连接
建立成功后,Nginx等待后端服务器的响应时间,其实是Nginx已经进入后端的排
队之中等候处理的时间。
?proxy_buffer_size:设置缓冲区大小,默认,该缓冲区大小等于指令proxy_buffers
设置的大小。
?proxy_buffers:设置缓冲区的数量和大小。nginx从代理的后端服务器获取的响应
信息,会放置到缓冲区。
?proxy_busy_buffers_size:用于设置系统很忙时可以使用的proxy_buffers大小,官
方推荐的大小为proxy_buffers2。
?proxy_temp_file_write_size:指定proxy缓存临时文件的大小。
1.5.3防盗链配置实例
Nginx的防盗链功能也非常强大。在默认情况下,只需要进行简单的配置,即可实
现防盗链处理。请看下面的这个实例:
location~\.(jpg|gif|png|swf|flv|wma|wmv|asf|mp3|mmf|zip|rar)${
valid_referersnoneblocked.ixdba1.netixdba1.net;
if($invalid_referer){
rewrite^/http://www.ixdba.net/img/error.gif;
《高性能Linux服务器构建实战:运维监控、性能调优与集群应用》
机械工业出版社出版发行19
#return403;
}
}
location/images{
root/opt/nginx/html;
valid_referersnoneblocked.ixdba1.netixdba1.net;
if($invalid_referer){
return403;
}
}
在上面这段防盗链设置中,分别针对不同文件类型和不同的目录进行了设置,读者可以
根据自己的需求进行类似的设定。
“jpg|gif|png|swf|flv|wma|wmv|asf|mp3|mmf|zip|rar”表示对以jpg、gif、png、swf、flv、
wma、wmv、asf、mp3、mmf、zip和rar为后缀的文件实行防盗链处理。
“.ixdba1.netixdba1.net”表示这个请求可以正常访问上面指定的文件资源。
if{}中的内容的意思是:如果地址不是上面指定的地址就跳转到通过rewrite指定的地址,
也可以直接通过return返回403错误。
要做更加复杂的防盗链处理,可以使用Nginx的HttpAccessKeyModule,通过这个模块
可以实现功能更强大的防盗链处理,更详细的参考官方文档。
1.5.4日志分割配置实例
Nginx没有类似Apache的cronolog日志分割处理的功能,但是,可以通过nginxNginx
的信号控制功能利用脚本来实现日志的自动切割。请看下面的一个实例。
Nginx对日志进行处理的脚本:
#/bin/bash
savepath_log=''/home/nginx/logs''
nglogs=''/opt/nginx/logs''
mkdir-p$savepath_log/$(date+%Y)/$(date+%m)
mv$nglogs/access.log$savepath_log/$(date+%Y)/$(date+%m)/access.$(date+%Y%m%d).log
mv$nglogs/error.log$savepath_log/$(date+%Y)/$(date+%m)/error.$(date+%Y%m%d).log
kill-USR1`cat/opt/nginx/logs/nginx.pid`
将这段脚本保存后加入到Linux的crontab守护进程,让此脚本在每天凌晨0点执行,
就可以实现日志的每天分割功能了。
其中,变量savepath_log指定分割后的日志存放的路径,而变量nglogs指定Nginx日志
《高性能Linux服务器构建实战:运维监控、性能调优与集群应用》
机械工业出版社出版发行20
文件的存放路径。最后一行,通过Nginx的信号“USR1”实现了日志的自动切换功能。
1.6Nginx性能优化技巧
1.6.1编译安装过程优化
1.减小Nginx编译后的文件大小
在编译Nginx时,默认以debug模式进行,而在debug模式下会插入很多跟踪和ASSERT
之类的信息,编译完成后,一个Nginx要有好几兆字节。在编译前取消Nginx的debug模式,
编译完成后Nginx只有几百千字节,因此可以在编译之前,修改相关源码,取消debug模式,
具体方法如下:
在Nginx源码文件被解压后,找到源码目录下的auto/cc/gcc文件,在其中找到如下几
行:
#debug
CFLAGS=”$CFLAGS-g”
注释掉或删掉这两行,即可取消debug模式。
2.为特定的CPU指定CPU类型编译优化
在编译Nginx时,默认的GCC编译参数是“-O”,要优化GCC编译,可以使用以下两
个参数:
--with-cc-opt=''-O3''
--with-cpu-opt=CPU#为特定的CPU编译,有效的值包括:pentium,pentiumpro,pentium3,
pentium4,athlon,opteron,amd64,sparc32,sparc64,ppc64
要确定CPU类型,可以通过如下命令:
[root@localhosthome]#cat/proc/cpuinfo|grep"modelname"
1.6.2利用TCMalloc优化Nginx的性能
TCMalloc的全称为Thread-CachingMalloc,是谷歌开发的开源工具“google-perftools”
中的一个成员。与标准的glibc库的malloc相比,TCMalloc库在内存分配效率和速度上要
高很多,这在很大程度上提高了服务器在高并发情况下的性能,从而降低系统负载。下面简
《高性能Linux服务器构建实战:运维监控、性能调优与集群应用》
机械工业出版社出版发行21
单介绍如何为Nginx添加TCMalloc库支持。
要安装TCMalloc库,需要安装libunwind(32位操作系统不需要安装)和google-perftools
两个软件包,libunwind库为基于64位CPU和操作系统的程序提供了基本函数调用链和函
数调用寄存器功能。下面介绍利用TCMalloc优化Nginx的具体操作过程:
1.安装libunwind库
可以从http://download.savannah.gnu.org/releases/libunwind下载相应的libunwind版本,
这里下载的是libunwind-0.99-alpha.tar.gz,安装过程如下:
[root@localhosthome]#tarzxvflibunwind-0.99-alpha.tar.gz
[root@localhosthome]#cdlibunwind-0.99-alpha/
[root@localhostlibunwind-0.99-alpha]#CFLAGS=-fPIC./configure
[root@localhostlibunwind-0.99-alpha]#makeCFLAGS=-fPIC
[root@localhostlibunwind-0.99-alpha]#makeCFLAGS=-fPICinstall
2.安装google-perftools
可以从http://google-perftools.googlecode.com下载相应的google-perftools版本,这里下
载的是google-perftools-1.8.tar.gz,安装过程如下:
[root@localhosthome]#tarzxvfgoogle-perftools-1.8.tar.gz
[root@localhosthome]#cdgoogle-perftools-1.8/
[root@localhostgoogle-perftools-1.8]#./configure
[root@localhostgoogle-perftools-1.8]#make&&makeinstall
[root@localhostgoogle-perftools-1.8]#echo"/usr/local/lib">/etc/ld.so.conf.d/usr_local_lib.conf
[root@localhostgoogle-perftools-1.8]#ldconfig
至此,google-perftools安装完成。
3.重新编译Nginx
为了使Nginx支持google-perftools,需要在安装过程中添加“–
with-google_perftools_module”选项重新编译Nginx,安装代码如下:
[root@localhostnginx-0.7.65]#./configure\
>--with-google_perftools_module--with-http_stub_status_module--prefix=/opt/nginx
[root@localhostnginx-0.7.65]#make
[root@localhostnginx-0.7.65]#makeinstall
到这里Nginx安装完成。
《高性能Linux服务器构建实战:运维监控、性能调优与集群应用》
机械工业出版社出版发行22
4.为google-perftools添加线程目录
创建一个线程目录,这里将文件放在/tmp/tcmalloc下,操作如下:
[root@localhosthome]#mkdir/tmp/tcmalloc
[root@localhosthome]#chmod0777/tmp/tcmalloc
5.修改Nginx主配置文件
修改nginx.conf文件,在pid这行的下面添加如下代码:
#pidlogs/nginx.pid;
google_perftools_profiles/tmp/tcmalloc;
接着,重启Nginx,完成google-perftools的加载。
6.验证运行状态
为了验证google-perftools已经正常加载,通过如下命令查看:
[root@localhosthome]#lsof-n|greptcmalloc
nginx2395nobody9wREG8,801599440/tmp/tcmalloc.2395
nginx2396nobody11wREG8,801599443/tmp/tcmalloc.2396
nginx2397nobody13wREG8,801599441/tmp/tcmalloc.2397
nginx2398nobody15wREG8,801599442/tmp/tcmalloc.2398
由于在Nginx配置文件中,设置worker_processes的值为4,因此开启了4个Nginx线
程,每个线程会有一行记录。每个线程文件后面的数字值就是启动的Nginx的PID值。
至此,利用TCMalloc优化Nginx的操作完成。
1.6.3Nginx内核参数优化
内核参数的优化,主要是在Linux系统中针对Nginx应用而进行的系统内核参数优化,
常见的优化参数值如下。
下面给出一个优化实例以供参考:
net.ipv4.tcp_max_tw_buckets=6000
net.ipv4.ip_local_port_range=102465000
net.ipv4.tcp_tw_recycle=1
net.ipv4.tcp_tw_reuse=1
net.ipv4.tcp_syncookies=1
net.core.somaxconn=262144
《高性能Linux服务器构建实战:运维监控、性能调优与集群应用》
机械工业出版社出版发行23
net.core.netdev_max_backlog=262144
net.ipv4.tcp_max_orphans=262144
net.ipv4.tcp_max_syn_backlog=262144
net.ipv4.tcp_synack_retries=1
net.ipv4.tcp_syn_retries=1
net.ipv4.tcp_fin_timeout=1
net.ipv4.tcp_keepalive_time=30
将上面的内核参数值加入/etc/sysctl.conf文件中,然后执行如下命令使之生效:
[root@localhosthome]#/sbin/sysctl-p
下面是对实例中选项的含义进行介绍:
?net.ipv4.tcp_max_tw_buckets参数用来设定timewait的数量,默认是180000,这里
设为6000。
?net.ipv4.ip_local_port_range选项用来设定允许系统打开的端口范围。
?net.ipv4.tcp_tw_recycle选项用于设置启用timewait快速回收。
?net.ipv4.tcp_tw_reuse选项用于设置开启重用,允许将TIME-WAITsockets重新用
于新的TCP连接。
?net.ipv4.tcp_syncookies选项用于设置开启SYNCookies,当出现SYN等待队列溢
出时,启用cookies进行处理。
?net.core.somaxconn选项默认值是128,这个参数用于调节系统同时发起的tcp连
接数,在高并发的请求中,默认的值可能会导致链接超时或者重传,因此,需要结
合并发请求数来调节此值。
?net.core.netdev_max_backlog选项表示当每个网络接口接收数据包的速率比内核处
理这些包的速率快时,允许发送到队列的数据包的最大数目。
?net.ipv4.tcp_max_orphans选项用于设定系统中最多有多少个TCP套接字不被关联
到任何一个用户文件句柄上。如果超过这个数字,孤立连接将立即被复位并打印出
警告信息。这个限制只是为了防止简单的DoS攻击。不能过分依靠这个限制甚至
人为减小这个值,更多的情况是增加这个值。
?net.ipv4.tcp_max_syn_backlog选项用于记录那些尚未收到客户端确认信息的连接
请求的最大值。对于有128MB内存的系统而言,此参数的默认值是1024,对小内
存的系统则是128。
?net.ipv4.tcp_synack_retries参数的值决定了内核放弃连接之前发送SYN+ACK包的
数量。
?net.ipv4.tcp_syn_retries选项表示在内核放弃建立连接之前发送SYN包的数量。
《高性能Linux服务器构建实战:运维监控、性能调优与集群应用》
机械工业出版社出版发行24
?net.ipv4.tcp_fin_timeout选项决定了套接字保持在FIN-WAIT-2状态的时间。默认
值是60秒。正确设置这个值非常重要,有时候即使一个负载很小的Web服务器,
也会出现因为大量的死套接字而产生内存溢出的风险。
?net.ipv4.tcp_keepalive_time选项表示当keepalive启用的时候,TCP发送keepalive
消息的频度。默认值是2(单位是小时)。
1.7实战Nginx与PHP(FastCGI)的安装、配置与优化
1.7.1什么是FastCGI
FastCGI是一个可伸缩地、高速地在HTTPserver和动态脚本语言间通信的接口。多数
流行的HTTPserver都支持FastCGI,包括Apache、Nginx和lighttpd等,同时,FastCGI也
被许多脚本语言所支持,其中就有PHP。
FastCGI是从CGI发展改进而来的。传统CGI接口方式的主要缺点是性能很差,因为
每次HTTP服务器遇到动态程序时都需要重新启动脚本解析器来执行解析,然后结果被返回
给HTTP服务器。这在处理高并发访问时,几乎是不可用的。另外传统的CGI接口方式安
全性也很差,现在已经很少被使用了。
FastCGI接口方式采用C/S结构,可以将HTTP服务器和脚本解析服务器分开,同时在
脚本解析服务器上启动一个或者多个脚本解析守护进程。当HTTP服务器每次遇到动态程序
时,可以将其直接交付给FastCGI进程来执行,然后将得到的结果返回给浏览器。这种方式
可以让HTTP服务器专一地处理静态请求或者将动态脚本服务器的结果返回给客户端,这在
很大程度上提高了整个应用系统的性能。
1.7.2Nginx+FastCGI运行原理
Nginx不支持对外部程序的直接调用或者解析,所有的外部程序(包括PHP)必须通过
FastCGI接口来调用。FastCGI接口在Linux下是socket,(这个socket可以是文件socket,
也可以是ipsocket)。为了调用CGI程序,还需要一个FastCGI的wrapper(wrapper可以理
解为用于启动另一个程序的程序),这个wrapper绑定在某个固定socket上,如端口或者文
件socket。当Nginx将CGI请求发送给这个socket的时候,通过FastCGI接口,wrapper接
纳到请求,然后派生出一个新的线程,这个线程调用解释器或者外部程序处理脚本并读取返
《高性能Linux服务器构建实战:运维监控、性能调优与集群应用》
机械工业出版社出版发行25
回数据;接着,wrapper再将返回的数据通过FastCGI接口,沿着固定的socket传递给Nginx;
最后,Nginx将返回的数据发送给客户端,这就是Nginx+FastCGI的整个运作过程。详细的
过程,如图1-3所示。
图1-3Nginx+FastCGI运行原理
1.7.3spawn-fcgi与PHP-FPM
前面介绍过,FastCGI接口方式在脚本解析服务器上启动一个或者多个守护进程对
动态脚本进行解析,这些进程就是FastCGI进程管理器,或者称之为FastCGI引擎,
spawn-fcgi与PHP-FPM就是支持PHP的两个FastCGI进程管理器。
下面简单介绍spawn-fcgi与PHP-FPM的异同。
spawn-fcgi是HTTP服务器lighttpd的一部分,目前已经独立成为一个项目,一般与
lighttpd配合使用来支持PHP,但是ligttpd的spwan-fcgi在高并发访问的时候,会出现内存
泄漏甚至自动重启FastCGI的问题。
Nginx是个轻量级的HTTPserver,必须借助第三方的FastCGI处理器才可以对PHP进
行解析,因此Nginx+spawn-fcgi的组合也可以实现对PHP的解析,这里不过多讲述。
PHP-FPM也是一个第三方的FastCGI进程管理器,它是作为PHP的一个补丁来开发的,
在安装的时候也需要和PHP源码一起编译,也就是说PHP-FPM被编译到PHP内核中,因
此在处理性能方面更加优秀;同时它在处理高并发方面也比spawn-fcgi引擎好很多,因此,
推荐Nginx+PHP/PHP-FPM这个组合对PHP进行解析。
FastCGI的主要优点是把动态语言和HTTPServer分离开来,所以Nginx与
PHP/PHP-FPM经常被部署在不同的服务器上,以分担前端Nginx服务器的压力,使Nginx
《高性能Linux服务器构建实战:运维监控、性能调优与集群应用》
机械工业出版社出版发行26
专一处理静态请求和转发动态请求,而PHP/PHP-FPM服务器专一解析PHP动态请求。
1.7.4PHP与PHP-FPM的安装及优化
1.下载安装包
从www.php.net官方网站下载PHP源码包,这里下载的是稳定版php-5.2.13.tar.gz。
从http://php-fpm.org/downloads/下载对应的PHP-FPM源码包,这里下载的是
php-5.2.13-fpm-0.5.13.diff.gz。
需要注意,在下载软件包版本时,尽量使PHP和PHP-FPM版本一致,如果版本之间相
差太大,可以会出现兼容问题。
2.配置安装环境
安装PHP需要下面软件包的支持,如果没有安装,请自行安装。
gccgcc-c++libxml2libxml2-develautoconflibjpeglibjpeg-devellibpnglibpng-develfreetype
freetype-develzlibzlib-develglibcglibc-develglib2glib2-devel
由于各个Linux系统版本的不确定性,读者也可以在安装PHP过程中,根据错误提示
信息,安装对应的软件库。
3.开始编译安装PHP和PHP-FPM
编译安装PHP和PHP-FPM很简单,下面是安装过程:
[root@localhostlocal]#tarzxvfphp-5.2.13.tar.gz
[root@localhostlocal]#gzip-cdphp-5.2.13-fpm-0.5.13.diff.gz|patch-dphp-5.2.13-p1
[root@localhostlocal]#cdphp-5.2.13
[root@localhostphp-5.2.13]#./configure--prefix=/usr/local/php--enable-fastcgi--enable-fpm
[root@localhostphp-5.2.13]#make
[root@localhostphp-5.2.13]#makeinstall
[root@localhostphp-5.2.13]cpphp.ini-dist/usr/local/php/lib/php.ini
其中,第二步将PHP-FPM作为补丁加入PHP源码中。
在“./configure”编译选项中,指定将PHP安装到/usr/local下,“--enable-fastcgi”是启
用对PHP的FastCGI支持,“--enable-fpm”是激活对FastCGI模式的fpm支持。
在编译PHP时可以加入很多编译选项,但是这里为了介绍PHP的FastCGI功能没有加
《高性能Linux服务器构建实战:运维监控、性能调优与集群应用》
机械工业出版社出版发行27
入更多的编译选项。
4.配置与优化PHP-FPM
PHP的全局配置文件是php.ini,在上面的步骤中,已经将此文件复制到了
/usr/local/php/lib/php.ini下。可以根据每个应用需求的不同,对php.ini进行相应的配置。
下面重点介绍PHP-FPM引擎的配置文件。
根据上面指定的安装路径,PHP-FPM的默认配置文件为/usr/local/php/etc/php-fpm.conf。
php-fpm.conf是一个XML格式的纯文本文件,其内容很容易看明白。这里重点介绍几
个重要的配置标签:
标签listen_address是配置fastcgi进程监听的IP地址以及端口,默认是127.0.0.1:9000。
127.0.0.1:9000
标签display_errors用来设置是否显示PHP错误信息,默认是0,不显示错误信息,设
置为1可以显示PHP错误信息。
0
标签user和group用于设置运行FastCGI进程的用户和用户组。需要注意的是,这里指
定的用户和用户组要和Nginx配置文件中指定的用户和用户组一致。
nobody
nobody
标签max_children用于设置FastCGI的进程数。根据官方建议,小于2GB内存的服务
器,可以只开启64个进程,4GB以上内存的服务器可以开启200个进程。
5
标签request_terminate_timeout用于设置FastCGI执行脚本的时间。默认是0s,也就是
无限执行下去,可以根据情况对其进行修改。
0s
标签rlimit_files用于设置PHP-FPM对打开文件描述符的限制,默认值为1024。这个标
签的值必须和Linux内核打开文件数关联起来,例如要将此值设置为65535,就必须在Linux
命令行执行''ulimit-HSn65536''。
1024
标签max_requests指明了每个children最多处理多少个请求后便会被关闭,默认的设置
是500。
500
标签allowed_clients用于设置允许访问FastCGI进程解析器的IP地址。如果不在这里
《高性能Linux服务器构建实战:运维监控、性能调优与集群应用》
机械工业出版社出版发行28
指定IP地址,Nginx转发过来的PHP解析请求将无法被接受。
127.0.0.1
5.管理FastCGI进程
在配置完php-fpm后,就可以启动FastCGI进程了。启动fastcgi进程有两种方式:
/usr/local/php/bin/php-cgi--fpm
或者
/usr/local/php/sbin/php-fpmstart
建议采用第二种方式启动FastCGI进程。
/usr/local/php/sbin/php-fpm还有其他参数,具体为start|stop|quit|restart|reload|logrotate。
每个启动参数的含义如下:
?start,启动PHP的FastCGI进程。
?stop,强制终止PHP的FastCGI进程。
?quit,平滑终止PHP的FastCGI进程。
?restart,重启PHP的FastCGI进程。
?reload,重新加载PHP的php.ini。
?logrotate,重新启用log文件。
reload是个很重要的参数,它可以在PHP的FastCGI进程不中断的情况下重新加载改动
过的php.ini,因此通过php-fpm可以平滑变更FastCGI模式下的PHP设置。
在FastCGI进程启动后,其监听的IP地址和端口也随即启动,可以通过ps和netstat查
看相关信息。
[root@localhostphp]#netstat-antl|grep9000
tcp00127.0.0.1:90000.0.0.0:LISTEN
[root@localhostphp]#ps-ef|grepphp-cgi
root35671017:06?00:00:00/usr/local/php/bin/php-cgi--fpm
--fpm-config/usr/local/php/etc/php-fpm.conf
nobody35683567017:06?00:00:00/usr/local/php/bin/php-cgi--fpm
--fpm-config/usr/local/php/etc/php-fpm.conf
nobody35693567017:06?00:00:00/usr/local/php/bin/php-cgi--fpm
--fpm-config/usr/local/php/etc/php-fpm.conf
nobody35703567017:06?00:00:00/usr/local/php/bin/php-cgi--fpm
--fpm-config/usr/local/php/etc/php-fpm.conf
nobody35713567017:06?00:00:00/usr/local/php/bin/php-cgi--fpm
--fpm-config/usr/local/php/etc/php-fpm.conf
《高性能Linux服务器构建实战:运维监控、性能调优与集群应用》
机械工业出版社出版发行29
nobody35723567017:06?00:00:00/usr/local/php/bin/php-cgi--fpm
--fpm-config/usr/local/php/etc/php-fpm.conf
root35833524017:09pts/100:00:00grepphp-cgi
1.7.5配置Nginx来支持PHP
Nginx的安装特别简单,前面已经对此进行了详细介绍,这里不再进行讲述。下面重点
介绍Nginx如何通过php-fpm的FastCGI进程对PHP进行解析处理。
由于Nginx本身不会对PHP进行解析,因此要实现Nginx对PHP的支持,其实是将对
PHP页面的请求交给fastCGI进程监听的IP地址及端口。如果把php-fpm当做动态应用服
务器,那么Nginx其实就是一个反向代理服务器。Nginx通过反向代理功能实现对PHP的
解析,这就是Nginx实现PHP动态解析的原理。
这里假定Nginx的安装目录为/usr/local,则Nginx配置文件的路径为
/usr/local/nginx/conf/nginx.conf。下面是在Nginx下支持PHP解析的一个虚拟主机配置实例。
server{
includeport.conf;
server_namewww.ixdba.netixdba.net;
location/{
indexindex.htmlindex.php;
root/web/www/www.ixdba.net;
}
location~\.php${
roothtml;
fastcgi_pass127.0.0.1:9000;
fastcgi_indexindex.php;
fastcgi_paramSCRIPT_FILENAMEhtml$fastcgi_script_name;
includefastcgi_params;
}
}
通过location指令,将所有以php为后缀的文件都交给127.0.0.1:9000来处理,而这里
的IP地址和端口就是FastCGI进程监听的IP地址和端口。
fastcgi_param指令指定放置PHP动态程序的主目录,也就是$fastcgi_script_name前面指
定的路径,这里是/usr/local/nginx/html目录,建议将这个目录与Nginx虚拟主机指定的根目
录保持一致,当然也可以不一致。
fastcgi_params文件是FastCGI进程的一个参数配置文件,在安装Nginx后,会默认生
《高性能Linux服务器构建实战:运维监控、性能调优与集群应用》
机械工业出版社出版发行30
成一个这样的文件,这里通过include指令将FastCGI参数配置文件包含了进来。
接下来,启动nginx服务。
/usr/local/nginx/sbin/nginx
到此为止,Nginx+PHP已经配置完成。
1.7.6测试Nginx对PHP的解析功能
这里在/usr/local/nginx/html目录下创建一个phpinfo.php文件,内容如下:
然后通过浏览器访问http://www.ixdba.net/index.html,默认会在浏览器显示“Welcometo
Nginx!”表示Nginx正常运行。
接着在浏览器中访问http://www.ixdba.net/phpinfo.php,如果PHP能够正常解析,会出
现PHP安装配置以及功能列表统计信息。
1.7.7实例讲解Nginx中FastCGI参数的优化
在配置完成Nginx+FastCGI之后,为了保证Nginx下PHP环境的高速稳定运行,需要
添加一些FastCGI优化指令。下面给出一个优化实例,将下面代码添加到Nginx主配置文件
中的HTTP层级。
fastcgi_cache_path/usr/local/nginx/fastcgi_cachelevels=1:2keys_zone=TEST:10minactive=5m;
fastcgi_connect_timeout300;
fastcgi_send_timeout300;
fastcgi_read_timeout300;
fastcgi_buffer_size64k;
fastcgi_buffers464k;
fastcgi_busy_buffers_size128k;
fastcgi_temp_file_write_size128k;
fastcgi_cacheTEST;
fastcgi_cache_valid2003021h;
fastcgi_cache_valid3011d;
fastcgi_cache_validany1m;
下面是对上述代码的含义进行介绍。
第一行代码是为FastCGI缓存指定一个文件路径、目录结构等级、关键字区域存储时间
和非活动删除时间。
fastcgi_connect_timeout指定连接到后端FastCGI的超时时间。
fastcgi_send_timeout指定向FastCGI传送请求的超时时间,这个值是已经完成两次握手
《高性能Linux服务器构建实战:运维监控、性能调优与集群应用》
机械工业出版社出版发行31
后向FastCGI传送请求的超时时间。
fastcgi_read_timeout指定接收FastCGI应答的超时时间,这个值是已经完成两次握手后
接收FastCGI应答的超时时间。
fastcgi_buffer_size用于指定读取FastCGI应答第一部分需要用多大的缓冲区,这个值表
示将使用1个64KB的缓冲区读取应答的第一部分(应答头),可以设置为fastcgi_buffers选
项指定的缓冲区大小。
fastcgi_buffers指定本地需要用多少和多大的缓冲区来缓冲FastCGI的应答请求。如果
一个PHP脚本所产生的页面大小为256KB,那么会为其分配4个64KB的缓冲区来缓存;
如果页面大小大于256KB,那么大于256KB的部分会缓存到fastcgi_temp指定的路径中,
但是这并不是好方法,因为内存中的数据处理速度要快于硬盘。一般这个值应该为站点中
PHP脚本所产生的页面大小的中间值,如果站点大部分脚本所产生的页面大小为256KB,
那么可以把这个值设置为“1616k”、“464k”等。
fastcgi_busy_buffers_size的默认值是fastcgi_buffers的两倍。
fastcgi_temp_file_write_size表示在写入缓存文件时使用多大的数据块,默认值是
fastcgi_buffers的两倍。
fastcgi_cache表示开启FastCGI缓存并为其指定一个名称。开启缓存非常有用,可以有
效降低CPU的负载,并且防止502错误的发生,但是开启缓存也会引起很多问题,要视具
体情况而定。
fastcgi_cache_valid、fastcgi用来指定应答代码的缓存时间,实例中的值表示将200和302
应答缓存一个小时,将301应答缓存1天,其他应答均缓存1分钟。
1.8实战Nginx与Perl、Java的安装与配置
通过前面的介绍,可以对Nginx有了一个比较全面的认识:Nginx本身是一个静态的
HTTP服务器和反向代理服务器,它不支持动态页面,所谓的Nginx对动态程序的支持都是
通过反向代理功能实现的。下面要讲述的Nginx对Perl和JSP的支持,就是通过Nginx的
反向代理功能完成的。Nginx对Perl和JSP的支持在实现细节上可能有一定差别,但是实现
原理是完全一样的。
《高性能Linux服务器构建实战:运维监控、性能调优与集群应用》
机械工业出版社出版发行32
Nginx的安装这里不再讲述,这假定Nginx的安装路径为/usr/local/nginx。
1.8.1Perl(FastCGI)的安装
1.获取wrapper程序
读者可以从http://www.nginx.eu/nginx-fcgi/上下载nginx-fcgi.txt文件,然后将其命名为
nginx-fcgi.pl并放到/usr/local/nginx目录下。nginx-fcgi.pl是一个用Perl脚本写的wrapper实
例,所以,操作系统必须要安装Perl程序以及相关模块。
2.安装相关的系统支持模块
可以从http://search.cpan.org下载所需的相应模块,然后进行安装。
(1)安装FCGI模块
[root@localhostopt]#tarzxvfFCGI-0.71.tar.gz
[root@localhostopt]#cdFCGI-0.71
[root@localhostFCGI-0.71]#perlMakefile.PL
[root@localhostFCGI-0.71]#make
[root@localhostFCGI-0.71]#makeinstall
(2)安装IO模块
[root@localhostopt]#tar-xvzfIO-1.25.tar.gz
[root@localhostopt]#cdIO-1.25
[root@localhostIO-1.25]#perlMakefile.PL
[root@localhostIO-1.25]#make
[root@localhostIO-1.25]#makeinstall
(3)安装IO::ALL模块
[root@localhostopt]#tar-xvzfIO-All-0.39.tar.gz
[root@localhostopt]#cdIO-ALL-0.39
[root@localhostIO-ALL-0.39]#perlMakefile.PL
[root@localhostIO-ALL-0.39]#make
[root@localhostIO-ALL-0.39]#makeinstall
3.编写nginx-fcgi启动脚本
仅仅有wrapper文件是不够的,还需要一个脚本来创建socket、启动wrapper以及将
wrapper和socket绑定,下面通过一个shell脚本来完成这一系列工作。
[root@localhostroot]#morenginx-fcgi
《高性能Linux服务器构建实战:运维监控、性能调优与集群应用》
机械工业出版社出版发行33
#!/bin/bash
nginxroot=/usr/local/nginx
start()
{
chownnobody.root$nginxroot/logs
echo"$nginxroot/nginx-fcgi.pl-l$nginxroot/logs/nginx-fcgi.log-pid
$nginxroot/logs/nginx-fcgi.pid-S
$nginxroot/logs/nginx-fcgi.sock">>$nginxroot/nginx_fcgi.sh
chownnobody.nobody$nginxroot/nginx_fcgi.sh
chmod755$nginxroot/nginx_fcgi.sh
sudo-unobody$nginxroot/nginx_fcgi.sh
echo"startnginx-fcgidone"
}
stop()
{
kill$(cat$nginxroot/logs/nginx-fcgi.pid)
rm$nginxroot/logs/nginx-fcgi.pid2>/dev/null
rm$nginxroot/logs/nginx-fcgi.sock2>/dev/null
rm$nginxroot/nginx_fcgi.sh2>/dev/null
echo"stopnginx-fcgidone"
}
case$1in
stop)
stop
;;
start)
start
;;
restart)
stop
start
;;
)
echo$"Usage:perl-cgi{start|stop|restart}"
exit1
esac
在nginx-fcgi中,变量nginxroot指定Nginx的安装目录,nginx-fcgi.sock是生成的文件
sock,nobody为运行nginx_fcgi进程的用户,这个用户要和运行Nginx的用户一致。
《高性能Linux服务器构建实战:运维监控、性能调优与集群应用》
机械工业出版社出版发行34
配置完脚本后,将此文件放到/usr/local/nginx目录下,接着通过如下方式管理nginx-fcgi
进程。
[root@localhostroot]#chmod755/usr/local/nginx/nginx-fcgi.pl
[root@localhostroot]#chmod755/usr/local/nginx/nginx-fcgi
[root@localhostroot]#/usr/local/nginx/nginx-fcgistart|stop|restart
1.8.2为Nginx添加FCGI支持
修改Nginx配置文件,在server虚拟主机中添加如下配置:
location~\.cgi${
roothtml;
fastcgi_passunix:/usr/local/nginx/logs/nginx-fcgi.sock;
fastcgi_indexindex.cgi;
fastcgi_paramSCRIPT_FILENAME$document_root$fastcgi_script_name;
includefastcgi_params;
}
在这个location配置中,Nginx与FastCGI的通信方式为UnixSocket。根据经验,IPSocket
在高并发访问下比UnixSocket稳定,但UnixSocket速度要比IPSocket快。“$document_root”
是虚拟主机的根目录,在这里是/usr/local/nginx/html目录。
1.8.3测试Nginx+Perl(FastCGI)
所有配置工作完成后,即可启动服务了。首选启动nginx-fcgi进程,操作如下:
/usr/local/nginx/nginx-fcgistart
然后启动nginx服务。
/usr/local/nginx/sbin/nginx
下面在/usr/local/nginx/html目录下创建一个test.cgi的文件。
#disablefilenameglobbing
set-f
echo"Content-type:text/plain;charset=iso-8859-1"
echo
echoCGI/1.0testscriptreport:
echo
echoargcis$#.argvis"$".
echo
《高性能Linux服务器构建实战:运维监控、性能调优与集群应用》
机械工业出版社出版发行35
echoSERVER_SOFTWARE=$SERVER_SOFTWARE
echoSERVER_NAME=$SERVER_NAME
echoGATEWAY_INTERFACE=$GATEWAY_INTERFACE
echoSERVER_PROTOCOL=$SERVER_PROTOCOL
echoSERVER_PORT=$SERVER_PORT
echoREQUEST_METHOD=$REQUEST_METHOD
echoREMOTE_ADDR=$REMOTE_ADDR
接着通过浏览器访问test.cgi文件,如果显示与下面类似的信息,表明Nginx+Perl环境
搭建成功。:
CGI/1.0testscriptreport:
argcis1.argvis.
SERVER_SOFTWARE=nginx/0.7.65
SERVER_NAME=localhost
GATEWAY_INTERFACE=CGI/1.1
SERVER_PROTOCOL=HTTP/1.1
SERVER_PORT=8000
REQUEST_METHOD=GET
REMOTE_ADDR=125.76.159.197
1.8.4搭建Nginx+Java环境
Apache对Java的支持很灵活,他们的结合度也很高,例如Apache+Tomcat和
Apache+resin等都可以实现对Java应用的支持。Apache一般采用一个内置模块来和Java应
用服务器打交道。与Apache相比,Nginx在配合Java应用服务器方面,耦合度很低,它只
能通过自身的反向代理功能来实现与Java应用服务器的支持,这恰恰是Nginx的一个优点,
耦合度的降低,可以使Nginx与Java服务器的相互影响降到最低。
接下来通过Nginx+Tomcat的实例来讲解Nginx对Java的支持。Tomcat在高并发环境
下处理动态请求时性能很低,而在处理静态页面更加脆弱。虽然Tmcat的最新版本支持epoll,
但是通过Nginx来处理静态页面要比通过Tomcat处理在性能方面好很多。
Nginx可以通过两种方式来实现与Tomcat的耦合。
?将静态页面请求交给Nginx,动态请求交给后端Tomcat处理。
?将所有请求都交给后端的Tomcat服务器处理,同时利用Nginx自身的负载均衡功
能,进行多台Tomcat服务器的负载均衡。
下面通过两个配置实例分别讲述这两种实现Nginx与Tomcat耦合的方式。
《高性能Linux服务器构建实战:运维监控、性能调优与集群应用》
机械工业出版社出版发行36
1.动态页面与静态页面分离实例
这里假定Tomcat服务器的IP地址为192.168.12.130,同时tomcat服务器开放的服务端
口为8080,Nginx相关配置代码如下:
server{
listen80;
server_namewww.ixdba.net;
root/web/www/html;
location/img/{
alias/web/www/html/img/;
}
location~(\.jsp)|(\.do)${
proxy_passhttp://192.168.12.130:8080;
proxy_redirectoff;
proxy_set_headerHost$host;
proxy_set_headerX-Real-IP$remote_addr;
proxy_set_headerX-Forwarded-For$proxy_add_x_forwarded_for;
client_max_body_size10m;
client_body_buffer_size128k;
proxy_connect_timeout90;
proxy_send_timeout90;
proxy_read_timeout90;
proxy_buffer_size4k;
proxy_buffers432k;
proxy_busy_buffers_size64k;
proxy_temp_file_write_size64k;
}
}
在这个实例中,首先定义了一个虚拟主机www.ixdba.net,然后通过location指令将
/web/www/html/img/目录下的静态文件交给Nginx来完成,最后一个location指令将所有
以.jsp、.do结尾的文件都交给Tomcat服务器的8080端口来处理,即http://192.168.12.130:8080。
需要特别注意的是,在location指令中使用正则表达式后,proxy_pass后面的代理路径
不能含有地址链接,也就是不能写成http://192.168.12.130:8080/,或者类似
http://192.168.12.130:8080/jsp的形式。在location指令不使用正则表达式时,没有此限制。
《高性能Linux服务器构建实战:运维监控、性能调优与集群应用》
机械工业出版社出版发行37
2.多个Tomcat负载均衡实例
这里假定有三台Tomcat服务器,分别开放不同的端口,地址分别是:
192.168.12.131:8000
192.168.12.132:8080
192.168.12.133:8090
Nginx的相关配置代码如下:
upstreammytomcats{
server192.168.12.131:8000;
server192.168.12.132:8080;
server192.168.12.133:8090;
}
server{
listen80;
server_namewww.ixdba.net;
location~\.(jpg|gif|png|swf|flv|wma|wmv|asf|mp3|mmf|zip|rar)${
root/web/www/html/;
}
location/{
proxy_passhttp://mytomcats;
proxy_redirectoff;
proxy_set_headerHost$host;
proxy_set_headerX-Real-IP$remote_addr;
proxy_set_headerX-Forwarded-For$proxy_add_x_forwarded_for;
client_max_body_size10m;
client_body_buffer_size128k;
proxy_connect_timeout90;
proxy_send_timeout90;
proxy_read_timeout90;
proxy_buffer_size4k;
proxy_buffers432k;
proxy_busy_buffers_size64k;
proxy_temp_file_write_size64k;
}
}
在这个实例中,首先通过upstream定义一个负载均衡组,组名为mytomcats,组的成员
就是上面指定的三台Tomcat服务器;接着通过server指令定义一个www.ixdba.net的虚拟主
《高性能Linux服务器构建实战:运维监控、性能调优与集群应用》
机械工业出版社出版发行38
机;然后通过location指令以正则表达式的方式将指定类型的文件全部交给Nginx去处理;
最后将其它所有请求全部交给负载均衡组来处理。
这里还有一点需要注意,如果在location指令使用正则表达式后再用alias指令,nginx
是不支持的。
1.9本章小结
本章主要介绍了对高性能HTTP服务器Nginx的安装、配置、管理和使用,以及Nginx
在性能优化方面的一些经验和技巧,并通过实例分别演示了Nginx与PHP整合,Nginx和java、
perl整合的过程。通过本章的学习,读者能够对Nginx有一个清晰的认识,并且可以熟练地
配置和管理Nginx服务器。
作为一个轻量级的HTTP服务器,Nginx与Apache相比,小巧而精致:在性能上,它
占用的系统资源少,能支持更多的并发连接,可实现更高的访问效率;在功能上,Nginx是
优秀的代理服务器和负载均衡服务器;在安装配置上,Nginx安装简单、配置灵活。
随着Nginx知识的普及,相信Nginx会越来越受欢迎,如果你还没有使用Nginx来搭建
Web应用系统,不妨现在尝试一下。
关于本书
由51CTO、ITPUB联合推荐的2012年IT技术力作:《高性能Linux服务器构建实战:运维
监控、性能调优与集群应用》已经上架发行,此书从Web应用、数据备份与恢复、网络存
储应用、运维监控与性能优化、集群高级应用等多个方面深入讲解了如何构建高性能的Linux
服务器。其中蕴含了丰富的运维经验。更为重要的是,本书的内容不受硬件环境的限制,而
且包含大量实用性极强的案例。对于广大Linux运维人员和系统管理人员来说,具有非常实
用的指导意义。
如果你对本书感兴趣,可以在网上书店进行订购,地址如下:
互动网:http://product.china-pub.com/194681
当当网:http://product.dangdang.com/product.aspx?product_id=22577563
卓越亚马逊:http://www.amazon.cn/dp/B006P7V7U4
京东商城:http://book.360buy.com/10898510.html
如果你对本书有疑惑,可以通过如下方式进行交流:
作者博客:http://ixdba.blog.51cto.com
读者交流群:134896298或8864197
更多信息请访问:http://ixdba.blog.51cto.com/2895551/747538
《高性能Linux服务器构建实战:运维监控、性能调优与集群应用》
机械工业出版社出版发行39
作者简介
高俊峰(南非蚂蚁),资深系统管理员、系统架构师、DBA和技术顾问,从事Linux+Oracle
服务器系统的运维和管理多年,在系统管理、故障诊断与排除、性能调优、集群和虚拟化等
方面积累了大量的实战经验。国内知名IT技术社区51CTO的博客专家和IXPUB论坛Linux
版块的版主,同时还活跃于ChinaUnix和ITPUB等技术社区,在社区和论坛里发表了大量技
术文章,深受欢迎。此外,作者还著有畅销书《循序渐进Linux》,广获读者好评。
|
|