Nginx高性能web服务器详解书中概要

一、Nginx功能

1、Nginx服务器以其功能丰富著称于世.它既可以作为HTTP服务器,也可以作为反向代理服务器或者邮件服务器;能够快速响应静态页面(HTML)的请求;支持FastCGI、SSL、Virtual Host、URL Rewrite、HTTP Basic Auth、Gzip等大量使用功能,并且支持更多的第三方功能模块的扩展.

2、Nginx作为反向代理服务器时,它在解决网络负载、性能方面的一个出色功能就是负载均衡.负载均衡对大量前端访问和流量进行分流,以保证前端用户的访问效率.nginx服务器的负载均衡策略可以划分为两大类:内置策略和扩展策略,如下:

轮询

按前端请求顺序逐一分配到不同的后端节点,对于出现问题的节点自动排除

加权轮询

在基本轮询的基础上考虑后端节点接收请求的权重,指定个后端节点被轮询的几率

IP hash

对前端的请求操作进行hash操作,根据hash结果将请求分配到不同的后端节点,这样实际每个前端请求ip会固定访问一个后端节点,解决了session共享问题(不推荐)

url hash(扩展)

如果后端有缓存服务器,它能提高缓存效率,也解决了session共享问题,缺点不能排除异常节点

fair(扩展)

转发后后台最近负载最轻节点,通过后端节点对请求的响应时间来判断负载情况

3、Nginx的web缓存功能,作为网页服务器的前置缓存服务器,它被用来缓存前端请求,从而提高web服务器性能.基本可以取代Squid.

二、Nginx服务器的安装部署

1、为了编译Nginx源代码,需要安装GCC编译器;还需要Automake工具,完成自动创建Makefile的工作;由于Nginx的一些模块需要依赖其他第三方库,通常有pcre库(支持rewrite模块)、zlib库(支持gzip模块)和openssl库(支持ssl模块)等,在线安装上述工具命令如下:

yum -y install gcc gcc-c++ automake pcre pcre-devel zlib zlib-devel open openssl-devel

2、Nginx官网下载nginx-1.2.9.tar.gz,解压、编译、安装:

[root@redis-sentinel webserver]# tar xf nginx-1.2..tar.gz
[root@redis-sentinel webserver]# ll
drwxr-xr-x. 6月 : auto //脚本文件,和configure脚本程序有关
-rw-r--r--. 5月 CHANGES
-rw-r--r--. 5月 CHANGES.ru
drwxr-xr-x. 6月 : conf
-rwxr-xr-x. 5月 configure //自动脚本程序,检查环境和生成Makefile文件
drwxr-xr-x. 6月 : contrib
drwxr-xr-x. 6月 : html //两个.html静态网页文件,和nginx运行有关
-rw-r--r--. 5月 LICENSE
drwxr-xr-x. 6月 : man //帮助文档
-rw-r--r--. 5月 README
drwxr-xr-x. 6月 : src //源码 [root@redis-sentinel nginx-1.2.]# ./configure --prefix=/Nginx //--prefix指定Nginx软件的安装路径,默认/usr/local/nginx,configure脚本支持的其它常用选项 略,都采用默认
[root@redis-sentinel nginx-1.2.]# make //命令工具,它解释Makefile中的指令(应该说是规则).在Makefile文件中描述了整个工程所有文件的编译顺序、编译规则
[root@redis-sentinel nginx-1.2.]# make install
[root@redis-sentinel nginx-1.2.]# cd /Nginx //安装目录
[root@redis-sentinel Nginx]# ll
drwxr-xr-x. root root 6月 : conf //所有配置文件
drwxr-xr-x. root root 6月 : html //nginx运行过程调用的一些html网页
drwxr-xr-x. root root 6月 : logs
drwxr-xr-x. root root 6月 : sbin //nginx服务器主程序

3、Nginx服务相关命令

[root@redis-sentinel sbin]# ./nginx -h  //显示帮助
Options:
-?,-h : this help
-v : show version and exit
-V : show version and configure options then exit
-t : test configuration and exit
-q : suppress non-error messages during configuration testing
-s signal : send signal to a master process: stop, quit, reopen, reload //发送信号
-p prefix : set prefix path (default: /Nginx/) //改变Nginx安装路径
-c filename : set configuration file (default: conf/nginx.conf) //指定启动Nginx使用的配置文件
-g directives : set global directives out of configuration file //补充配置文件 [root@redis-sentinel sbin]# ./nginx -v //显示版本号
nginx version: nginx/1.2.
[root@redis-sentinel sbin]# ./nginx -V //显示版本号和编译情况
nginx version: nginx/1.2.
built by gcc 4.4. (Red Hat 4.4.-) (GCC)
configure arguments: --prefix=/Nginx [root@redis-sentinel sbin]# ./nginx -t //检查配置文件是否有语法错误,-q一样
nginx: the configuration file /Nginx/conf/nginx.conf syntax is ok
nginx: configuration file /Nginx/conf/nginx.conf test is successful [root@redis-sentinel sbin]# ./nginx //直接启动nginx,采用默认配置
[root@redis-sentinel sbin]# ps -ef|grep nginx
root : ? :: nginx: master process ./nginx
nobody : ? :: nginx: worker process
root : pts/ :: grep nginx [root@redis-sentinel sbin]# ./nginx -s stop //发送信号 停掉nginx,也可以直接kill -9 (logs目录下的nginx.pid)
[root@redis-sentinel sbin]# ps -ef|grep nginx
root : pts/ :: grep nginx

三、Nginx服务器的基础配置指令

1>全局块配置,从开始到events块之间的内容,主要影响Nginx服务器整体运行的指令:

配置运行Nginx服务器的用户(组)  

格式:user user [group];只有被设置的用户或者用户组成员才能启动nginx进程,如果希望所有用户都能启动(默认值),一是将此行注掉,二是user nobody nobody;指令必须以分号接收.

配置允许生成的worker process数

格式:work_processes number|auto; 默认number=1.worker process是Nginx服务器实现并发处理服务的关键所在.理论上worker process值越大,支持的并发量越多,但实际受软件本身、操作系统资源、硬件设备等制约.

配置Nginx进程的PID存放路径 略

配置错误日志的存放路径

格式:error_log file|stderr [debug|info|notice|warn|error|crit|alert|emerg];输出到固定文件file或输出到标准错误输出stderr.Nginx默认设置为:error_log logs/error.log error;在全局块、http块、server块中都可以对Nginx服务器的日志进行相关配置,后两种配置基本相同,只是作用域不同.

配置文件的引入

格式:include file;在一些情况下,需要将其它的Nginx配置或者第三方模块的配置引入到当前的主配置文件中,此include指令可以放在配置文件的任意地方.

2>events块配置,涉及的指令主要影响Nginx服务器与用户的网络连接,这部分对性能的影响较大,实际中灵活配置:

设置网络连接的序列化

格式:accept_mutex on|off; 默认开启,将会对多个Nginx进程接收连接进行序列化,防止多个进程对连接的争抢,解决惊群现象.

设置是否允许同时接收多个网络连接

格式:multi_accept on|off;默认off,每个Nginx服务器的worker process 都有能力同时接收多个新到达的网络连接,off的话每个worker process 一次只能接收一个新到达的网络连接.

事件驱动模型的选择

格式:use mothod;method可选select、poll、kqueue、epoll、rtsig、/dev/poll以及 eventport,Nginx提供多种事件驱动模型来处理网络消息.

配置最大连接数

格式:worker_connections number;用来设置运行每一个worker process 同时开启的最大连接数,这里的number不仅仅包括和前端用户建立的连接数,而是包括所有可能的连接数,另外number不能大于操作系统支持的最大文件句柄数量. 高级配置详解.

3>http块是Nginx服务器配置的重要部分,代理,缓存和日志定义等绝大多数功能和第三方模块配置都在这个模块中.

定义MIME-Type

浏览器中,可以显示的那日用有HTML、XML、GIF及Flash等文本和媒体资源,浏览器为区分这些资源,需要使用MIME Type,MIME Type是网络资源的媒体类型,Nginx作为web服务器,必须能识别前端请求的资源类型.默认的Nginx配置中有以下两行:

include       mime.types;  //引入外部文件
default_type application/octet-stream; //配置前端请求的MIME类型

mime.types部分内容:

type{
text/html html htm shtml;
image/gif gif;
application/x-javascript js;
video/3gpp 3gpp 3gp;
...
}

mime_types文件内定义了一个types结构,结构中包含浏览器能识别的MIME类型以及对应于相关类型的文件后缀名.

自定义服务日志

1、在全局块中,我们介绍过error_log指令,其用于配置Nginx进程运行时的日志存放和级别,此处所指的日志与常规的不同,它是指Nginx提供服务过程应答前端请求的日志,我们将其称为服务日志.Nginx支持对服务日志的格式、大小、输出等进行配置,需要使用access_log和log_format指令.格式:access_log path[format[buffer=size]];path配置服务日志的文件存放路径和名称,format可选项,自定义服务日志的格式字符串,也可以通过log_format指令定义好的格式.size配置临时存放日志的内存缓存区大小.默认配置是access_log logs/access.log combined;combined为log_format指令默认定义的日志格式字符串的名称.取消使用:access_log off;

2、和access_log联合使用的另一个指令是log_format,它专门定义服务日志的格式,格式:log_format name string;name是格式字符串的名称,string是服务日志的格式字符串,其中可以使用Nginx配置预设的一些变量获取相关内容,变量使用双引号,string整体使用单引号括起来.Nginx默认配置文件中用法如下:

#log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
# '$status $body_bytes_sent "$http_referer" '
# '"$http_user_agent" "$http_x_forwarded_for"'; #access_log logs/access.log main;

3、access_log指令可以在http块、server块、location块中配置,log_format只能再http块中配置.

配置运行sendfile方式传输文件

配置连接超时时间

与用户建立会话连接后,Nginx服务器可以保持这些连接打开一段时间,ngxin默认配置文件中:keepalive_timeout  65;可在http块、server块和location块中配置.

单连接请求数上限

Nginx和用户端建立会话连接后,用户通过此连接发送请求,指令keepalive_requests用于限制用户通过该连接向Nginx发送请求的次数,格式:keepalive_requests number;可在server和location中出现.

4>server块和虚拟主机概念有密切联系,虚拟主机主要应用于HTTP、FTP和EMAIL等多项服务,将一台服务器的某项或者全部服务内容逻辑划分为多个服务单位,对外表现为多个服务器,从而充分利用服务器硬件资源,从用户角度看,一台虚拟主机和和一*立的硬件主机是完全一样的.在使用Nginx服务器提供web服务时,利用虚拟主机的技术就可以避免为每一个运行的网站提供单独的Nginx服务器,也无需为每个网站对应一组Nginx进程.虚拟主机技术使得Nginx服务器可以在同一台服务器上只运行一组Nginx进程,就可以运行多个网站.server块就是为了完成这个功能.每个http块包含多个server块,每个server块就相当于一台虚拟主机,它内部可以有多台主机联合提供服务,一起对外提供在逻辑上关系密切的一组服务(ku6支付两个项目是否可以用一个Nginx提供服务?).

server块包含自己的全局块和多个location块,server全局块中最常见的两个配置就是本虚拟主机的监听配置和本虚拟主机的名称或IP配置.

配置网络监听

listen *:|*:; //监听80和8000端口
listen 192.168.1.10; //监听具体IP的所有端口上的连接
listen 192.168.1.10:; //监听具体IP和具体端口上的连接
listen ; //监听具体端口上的所有IP连接 等同于listen *:8000;

Nginx默认配置文件中:listen  80;

基于名称的虚拟主机的配置

这里的主机指server块对外提供的虚拟主机,设置了主机的名称并配好DNS,用户就可以使用这个名称向此虚拟主机发送请求了.格式:server_name name name ...;可以有多个名称,name中可以使用通配符,Nginx默认配置文件中:server_name localhost;可以使用正则表达式例:server_name ~^www\d+\.myserver\.com$.已~开头,特殊字符转意.

基于IP的虚拟主机配置

为Nginx服务器提供的每台虚拟主机配置一个不同的IP,因此需要将网卡设置为同时能监听多个IP地址.在linux中可以使用ifconifg为同一块网卡添加多个IP别名.eth1为使用中的网卡,为eth1添加两个IP别名192.168.1.31和192.168.1.32,分别用于Nginx服务器提供的两个虚拟主机,执行以下操作:

ifconfig eth1: 192.168.1.31 netmash 255.255.255.0 up
ifconfig eth1: 192.168.1.32 netmash 255.255.255.0 up

上述设置在系统重启后将不会保存,需要从新设置,为了一劳永逸将以上两条命令添加到linux启动脚本rc.local中,运行如下命令:

echo "ifconfig eth1:0 192.168.1.31 netmash 255.255.255.0 up" >>/etc/rc.local
echo "ifconfig eth1:1 192.168.1.32 netmash 255.255.255.0 up" >>/etc/rc.local

为网卡设置好别名后,就可以为Nginx配置基于IP的虚拟主机了,使用的指令和基于名称的配置是相同的.配置两台基于IP的虚拟主机部分代码如下:

http
{
server
{
listen ;
server_name 192.168.1.31;
...
}
server
{
listen ;
server_name 192.168.1.32;
...
}
}

配置好后,来自192.168.1.31的请求将由第一台虚拟主机接收和处理,来自192.168.1.32的请求将由第二台虚拟主机接收和处理.

4>配置location块,客户端请求时,Nginx服务器会在server块中搜索并使用location块的uri和请求字符串进行匹配(正则匹配略),格式: location uri;.web服务器接收到网络请求之后,首先要在服务器指定的目录中寻找请求资源,指令root就是用来配置这个跟目录的,格式root: path;这个指令通常在location中设置.location指令和root指令例:

location /data/
{
root /locationtest1
}

当location块接收到/data/index.html请求时,将在 /locationtest1/data目录下找到index.html响应请求.

更改location的URI

location ~^/data/(.+\.(htm|html))${
alias /locationtest1/other/$;//$1代表()中的内容
}

通过alias指令,根路径已经从/data更改为/locationtest1/other

设置网站默认首页

指令index设置网站默认首页,格式:index file ...; Nginx服务器默认配置文件中:

location / {
root html;
index index.html index.htm;
}

设置网站的错误页面

1、格式:error_page code ... [=[response]] uri,code 要处理的http错误代码,response可选(没用),uri是错误页面的路径或者网站地址,如果设置为路径,则是以Nginx服务器安装路径下的html目录为根目录的相对路径;如果设置为网址,则Nginx服务器会直接访问该网址获取错误的页面,并返回给用户端.看如下几个实例:

error_page  /.html //设置Ngin使用"Nginx安装路径/html/404.html"页面响应404错误
error_page http://somewebsite.com/forbidden.html;

2、如果不想将错误页面放到Nginx安装路径下管理,则使用location指令定向错误页面到新的路径下面就可以了.如希望Nginx使用"/myserver/errorpages/404.html"页面响应404错误,那么进行如下设置:

error_page  /.html
location /.html
{
root /myserver/errorpages/
}

3、error_page指令可以在http块、server块和location块中配置,Nginx默认配置文件中配置如下:

#error_page    /.html;

# redirect server error pages to the static page /50x.html
#
error_page /50x.html;
location = /50x.html {
root html;
}

基于IP配置Nginx的访问权限,allow指令,deny指令,

location / {
deny 192.168.1.1;
allow 192.168.1.2;
deny all;
}

上例中192.168.1.1是可以访问的,因为匹配到后就停止往下走.

基于密码配置Nginx的访问权限 略.

四、nginx服务器架构

nginx服务器结构大致分为主进程、工作进程、后端服务器和缓存服务器.在客户端请求动态站点的过程中,还涉及到nginx和后端服务器的通信,nginx将接收到的web请求通过代理转发到后台服务器,由后端服务器进行数据处理和页面组织,然后将结果返回.另外nginx为了提高对请求的响应效率,进一步降低网络压力,采用了缓存机制,将历史应答数据缓存到本地,在每次启动nginx服务器后的一段时间,会启动专门的进程对本地缓存的内容进行重建索引,保证对缓存文件的快速访问.

nginx gzip 对响应数据进行在线实时压缩 略.

五、ngxin后端服务器组指令

默认服务器组收到请求后,按照轮叫调度策略顺序选择组内服务器处理请求.如果一个服务器请求出错,则顺序掉下一个服务器处理,直至返回正常响应.

upstream指令server指令

upstream backend
{
server backend.example.com weight=;
server 127.0.0.1: max fails= fail_timeout=30s;
}

上例中设置一个名为backend的服务器组,包含两台服务器,分别基于域名和ip,域名的服务器权重最大(默认权重1),优先接收和处理请求,ip的服务器如果30秒内连续3次请求失败,则该服务器在接下来30秒被认为是无效的.

iphash指令

该指令用于实现会话保持,将某个客户端的多次请求定向到组内同一台服务器上,保证客户端与服务器之间建立稳定的会话.iphash不能与weight一起使用.

upstream backend
{
ip_hash;
server myback1.proxy.com;
server myback2.proxy.com;
}

我们使用同一个客户端向nginx服务器发送请求,看到一直是myback1服务器响应;如果注释掉ip_hash指令后进行相同操作,发现组内两台服务器轮流响应请求.

least_conn指令  实现了最少连接负载均衡算法.

rewrite功能是大多数web服务器支持的功能,其在提供重定向服务时起到主要作用.用法略,程序中也可以实现.

六、nginx服务器的代理服务

1、正向代理服务用来让局域网客户机接入外网访问外网资源,反向代理服务器用户让外网的客户端接入局域网中的站点以访问站点资源.

2、反向代理基本设置

proxy_pass指令

该指令用来设置被代理服务器的地址,可以是主机名称、ip地址加端口号.如果被代理服务器是一组服务器的话,可以使用upstream指令配置后端服务器组,例:

upstream proxy_svrs
{
server http://192.168.1.1:8001/usi/;
server http://192.168.1.2:8001/usi/;
server http://192.168.1.3:8001/usi/;
}
server
{
listen ;
server_name www.myweb.name;
location /
{
proxy_pass proxy_svrs;
}
}

1>在上例中如果组内的各个服务器中都声明了传输协议"http://",那么在proxy_pass指令中就不需要指明了,如果组内改为server 192.168.1.1:8001/usi/;那么proxy_pass要改为http://proxy_svrs;

2>使用该指令时,如果URL中不含URI,nginx不会改变原地址的URI;如果含有URI,nginx将会使用新的URI替代原来的URI,例:

server  #配置1
{
listen ;
server_name www.myweb.name;
location /server/
{
proxy_pass http://192.168.1.1;
}
}
server  #配置2
{
listen 80;
server_name www.myweb.name;
location /server/
{
proxy_pass http://192.168.1.1/loc/;
}
}

如果客户端使用http://www.myweb.name/server请求配置1,该请求被配置1中显示的location块进行处理,由于proxy_pass指令的URL变量不含有URI,所以转发的地址为"http://192.168.1.1/server".如果请求配置2,转发的地址会变为"http://192.168.1.1/loc/";所以如果不想改变原地址中的URI,就不要在URL变量中配置URI.

3>再看proxy_pass指令的URL变量末尾是否加斜杠的问题.

server  #配置1
{
listen ;
server_name www.myweb.name;
location /
{
proxy_pass http://192.168.1.1/;
proxy_pass http://192.168.1.1;
}
} server #配置2
{
listen ;
server_name www.myweb.name;
location /server/
{
proxy_pass http://192.168.1.1/;
proxy_pass http://192.168.1.1;
}
}

客户端请求"http://www.myweb.name/index.htm"对于配置1来说,有没有斜杠都会被转向http://192.168.1.1/index.htm.若果客户端请求"http://www.myweb.name/server/index.htm"对于配置2来说,不带斜杠的转发到http://192.168.1.1/server/index.htm,带斜杠转发到http://192.168.1.1/index.htm,这里要注意.

ps:其它反向代理基本设置的指令、proxy buffer指令和proxy cache指令用到时查.

3、nginx服务器的负载均衡,提供如下几个使用案例:

#对所有请求实现一般轮询规则的负载均衡
upstream backend
{
server 192.168.1.2:;
server 192.168.1.3:;
server 192.168.1.4:; #默认weight=
}
server
{
listen ;
server_name www.myweb.name;
index index.html index.htm;
location /
{
proxy_pass http://backend;
proxy_set_header Host $host;
}
} #对所有请求实现加权轮询规则的负载均衡
只需在backend中server后加weight即可 #对特定资源实现负载均衡
upstream videobackend
{
server 192.168.1.2:;
server 192.168.1.3:;
server 192.168.1.4:;
}
upstream filebackend
{
server 192.168.1.5:;
server 192.168.1.6:;
server 192.168.1.7:;
}
server
{
listen ;
server_name www.myweb.name;
index index.html index.htm;
location /video/
{
proxy_pass http://videobackend;
proxy_set_header Host $host;
}
location /file/
{
proxy_pass http://filebackend;
proxy_set_header Host $host;
}
} #对不同域名实现负载均衡
upstream bbsbackend
{
server 192.168.1.2:;
server 192.168.1.3:;
server 192.168.1.4:;
}
upstream homebackend
{
server 192.168.1.5:;
server 192.168.1.6:;
server 192.168.1.7:;
}
server
{
listen ;
server_name home.myweb.name;
index index.html index.htm;
location /
{
proxy_pass http://homebackend;
proxy_set_header Host $host;
}
}
server
{
listen ;
server_name bbs.myweb.name;
index index.html index.htm;
location /
{
proxy_pass http://bbsbackend;
proxy_set_header Host $host;
}
}

ps:1.一分钟了解负载均衡

http://mp.weixin.qq.com/s?__biz=MjM5ODI5Njc2MA==&mid=2655807969&idx=1&sn=ca5fc07355e816a377fdf974d03bfd07&chksm=bd7424368a03ad20f4571251d238e5f42c9a2ed43b74b90d60856d54b25112466314a07c1c02&mpshare=1&scene=5&srcid=1011qf7qfbHLWMvT5Of7BzjA#rd

2.apache服务器安装部署配置

http://blog.csdn.net/wangjunjun2008/article/details/38314387
http://edu.cnzz.cn/s/201510/231594.shtml
官网:http://httpd.apache.org/docs/2.4/install.html

上一篇:nginx中configure脚本支持的常用选项,拍摄自《Nginx高性能Web服务器详解》


下一篇:了解HTML 元素分类