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服务器的优势所在了。

选择Nginx的优势所在
   通过上面的简单介绍,可以看出Nginx作为HTTP服务器的优势是显而易见,它有很多其他web服务器无法比拟的性能和优势;
   作为web服务器,nginx处理静态文件、索引文件、自动索引的效率非常高。
   作为代理服务器,nginx可以实现无缓存的反向代理加速,提高网站运行的速度。
   作为负载均衡服务器,nginx即可以在内部直接支持rails和php,也可以支持HTTP代理服务器对外进行服务,同时还支持简单的容错和利用算法进行负载均衡。
   在性能方面,nginx是专门为性能优化而开发的,在实现上非常注重效率。它采用内核poll模型,可以支持更多的并发连接,最大可以支持对50000个并发连接数的响应,而且只占用很低的内存资源。
   在稳定性方面,Nginx采用了分段资源分配技术,使得CPU与内存的占用率非常低。Nginx官方表示,nginx保持10000个没有活动的连接,而这些连接只占2.5MB内存,因此,类似DOS这样的***队Nginx来说基本上是没有任何作用的。
   在高可用型方面,Nginx支持热部署,启动速度特别迅速,因此可以在不间断服务器的情况下,对软件版本或者配置进行升级,即使运行数月也无需重新启动,几乎可以做到7X24小时不间断地运行。

nginx的模块与工作原理
nginx由内核和模块组成,其中,内核的设计非常微小和简洁,完成的工作也非常简单,仅仅通过查找配置文件将客户端请求映射到一个location block (location 是Nginx配置中的一个指令,用于URL匹配),而这个location中所匹配的每一个指令将会启动不同的模块去完成相应的工作

   nginx的模块从结构上分为核心模块,基础模块,和第三方模块,HTTP模块、event模块和mail模块等属于核心模块,HTTP access 模块、HTTP fastCGI模块、HTTP proxy模块和HTTP rewrite 模块属于基础模块,而http upstream reques hash 模块、notice 模块和HTTP access key 模块属于第三方模块,用户根据自己的需要开发的模块都属于第三方模块。正是有了这么多模块的支撑,nginx的功能才会如此强大。

   nginx 的模块从功能上分为如下三类。
handlers(处理器模块)。此类模块直接处理请求,并进行输出内容和修改headers信息等操作。handlers处理器模块一般只能有一个。
filters(过滤器模块)。此类模块主要对其他处理器模块输出的内容进行修改操作,最后由Nginx输出。
proxies(代理类模块)。此类模块是nginx的http upstream 之类的模块,这些模块主要与后端一些服务,比如fastCGI等进行交互,实现服务代理和负载均衡等功能。如下图所示:展示了Nginx模块的HTTP请求和响应过程。

Nginx ~模块详解~_第1张图片

   在工作方式上,nginx分为单工作进程和多工作进程两种模式,在单工作进程模式下,除主进程外,还有一个工作进程,工作进程是单线程的;在多工作进程模式下,每个工作包含多个线程。nginx默认为单工作进程模式。nginx的模块直接被编译进nginx,因此属于静态编译方式。启动nginx后,nginx的模块被自动加载,不像Apache,首先将模块编译为一个so文件,然后再配置文件中指定是否进行加载。在解析配置文件时,nginx的每个模块都可能去处理某个请求,但是同一个处理请求只能由一个模块来完成。


2、nginx的安装及配置
安装nginx所需的pcre-devel库是为了使Nginx支持HTTP Rewriter

unzip pcre-8.35.zip
cd pcre-8.35
./configure
make && make install

开始安装nginx
nginx的安装非常简单。在默认情况下,经过编译安装nginx包含了大部分可用模块。可以通过"./configure --help 选项设置各个模块的使用情况,例如对不需要的http_ssi模块,可以通过"--without-http_ssi_module"方式关闭此。同理,如果需呀"http_perl"模块,那么可以通过"--with-http_perl_module"方式进行安装。

# tar  xvf nginx-1.4.7.tar.gz
# cd nginx-1.4.7
# ./configure  --with-http_stub_status_module  --prefix=/usr/local/nginx   --with-http_gzip_static_module
# make && make install

在上面的configure选项中,"--with-http_stub_status_module"可以用来启动nginx nginx status 功能,以监控Nginx的当前状态。
至此,nginx已经安装完成了

nginx 配置文件的结构

nginx的配置文件是一个纯文本文件,它一般位于nginx安装目录的conf目录下,整个配置文件是以block的形式组织的。每个block一般以一个大括号"{}"来表示,block可以分为几个层次,整个配置文件中main指令位于最高层,在main层下面可以有events、HTTP等层级,而在HTTP层中又包含有server层,即server block, server block中又可分为location 层,并且一个server block中可以包含多个location block。

   一个完整的配置文件结构如下图所示:

Nginx ~模块详解~_第2张图片


配置与调试nginx
nginx配置文件主要分为4部分: main(全局设置)、server(主机设置)、upstream(负载均衡服务器设置)和location(URL 匹配特定位置的设置)。main部分设置的指令影响其他所有设置;server部分的指令主要用于指定主机和端口;upstream指令主要用户负载均衡,设置一系列的后端服务器;location部分用于匹配网页位置.这四者之间的关系如下:server 继承main,location继承server,upstream即不会继承其他设置也不会被继承。

在这4个部分当中,每个部分都包含若干指令,这些指令主要包含nginx的主模块指令、事件模块指令、HTTP核心模块指令。同时每个部分还可以使用其他HTTP模块指令,例如HTTP SSL模块、HTTP gzip static 模块和http addition 模块等。

实例:
1、nginx 的全局配置

user              nginx;  # user是个主模块指令,指定nginxworker进程运行用户以及用户组
worker_processes  1;  # worker_process 是主模块指令,指定了nginx要开启的进程数。每个nginx进程平均耗费10MB~12MB内存。根据经验,一般指定一个进程足够了,如果是多核CPU,建议指定和CPU的数量一样多的进程数即可。
error_log  /var/log/nginx/error.log; # error 是个模块,用来定义全局错误日志文件。日志输出级别有debug、info、notice、warn、error、crit 可供选择,其中debug输出日志最为详细,而crit输出日志最少。
#error_log  /var/log/nginx/error.log  notice;
#error_log  /var/log/nginx/error.log  info;
pid        /var/run/nginx.pid; # pid 是个主模块指令,用来指定进程id的存储文件位置。
events {
    use epoll;
    worker_connections  1024;
}
# events 指令用来设定nginx的工作模式及连接数上限。
# 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_processes*worker_connections,在作反向代理时变为max:clients=worker_processes*worker_connections/4。


HTTP服务器配置
接下来开始对HTTP服务器进行配置

http {
    include       /etc/nginx/mime.types;  # include 是个主模块指令,实现对配置文件所包含的文件的设定,可以减少配置文件的复杂度。类似于Apache中的include方法。
    default_type  application/octet-stream; # default_type 属于HTTP核心模块指令,这里设定默认类型为二进制流,也就是当文件类型未定义时使用这种方式,例如在没有配置PHP环境时,nginx是不予解析的,此时,用浏览器访问PHP文件就不会出现下载窗口.
    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';
     # log_format 是nginx的HttpLog模块指令,用于指定nginx日志的输出格式。main为此日志输出格式的名称,可以在下面的access_log指令引用。
    access_log  /var/log/nginx/access.log  main;
    sendfile        on; # sendfile 参数用于开启高效文件传输模式。将tcp_nopush和tcp_nodely两个指令设置为on,用户防止网络阻塞
    #tcp_nopush     on;
    #keepalive_timeout  0;
    keepalive_timeout  65;
# 用于设置客户端连接保持活动的超时时间。在超过这个时间之后,服务器会关闭该连接。



HttpGzip模块配置
   下面配置nginx的HttpGzip模块。这个模块支持在线实时压缩输出数据流。要查看是否安装了此模块,需要使用下面命令:

# /usr/local/nginx/sbin/nginx  -V
nginx version: nginx/1.4.7
built by gcc 4.4.7 20120313 (Red Hat 4.4.7-4) (GCC)
configure arguments: --with-http_stub_status_module --prefix=/usr/local/nginx --with-http_gzip_static_module
gzip  on;
# gzip 用于设置开启或者关闭gzip模块,"gzip on" 表示开启gzip压缩,实时压缩输出数据流
gzip_min_length   1k;
# gzip_min_length 用于设置允许压缩的页面最小字节数,页面字节数从header头的content-length中获取。默认值是0,不管页面多大都进行压缩。建议设置成大于1k的字节数,小于1K可能会越压越大。
gzip_buffers     4   16k;
# 表示申请4个单位为16K的内存作为压缩结果流缓存,默认值是申请与原始数据大小相同的内存空间来存储gzip压缩结果。
gzip_http_version 1.1;
# gzip_http_version 用户设置识别http协议版本,默认是1.1,目前大部分浏览器已经支持gzip压缩,使用默认即可。
gzip_comp_level   2;
# gzip_comp_level 用于指定gzip压缩比,1压缩比最小,处理速度最快;9压缩比最大,传输速度快,但处理最慢,也比较消耗CPU资源。
gzip_types      text/plain   application/x-javascript text/css appalachian/xml;
# gzip_type 用来指定压缩的类型,无论是否指定,"text/html" 类型总是会被压缩的。
gzip_vary on;
# gzip_vary 选项可以让前端的缓存服务器缓存经过gzip压缩的页面,例如,用squid 缓存经过nginx压缩的数据。


4、负载均衡配置
   下面设定负载均衡的服务器列表。

    upstream ixdba.net {
    ip_hash;
    server 192.168.10.1:80;
    server 192.168.10.1:80 down;
    server 192.168.10.1:8009 max_fails=3 fail_timeout=20s;
    server 192.168.10.1:8080;
}

   upstream 是Nginx的HTTP upstream模块,这个模块通过一个简单的调度算法来实现客户端IP到后端服务器的负载均衡。在上面的设定中,通过upstream指令指定了一个负载均衡器的名称indba.net。这个名称可以任意指定,在后面需要用到的地方直接调用即可。

   nginx的负载均衡模块目前支持4种调度算法,下面进行分别介绍,其中后两项属于第三方调度算法。
   轮询(默认)。每个请求安时间顺序逐一分配到不同的后端服务器,如果后端某台服务器挂掉了,故障系统呗自动剔除,使用户访问不受影响;

   weight。指定轮询权重,weight值越大,分配到的访问几率越高,主要用于后端每个服务器性能不均的情况下。

   ip_hash: 每个请求按访问IP的hash结构分配,这样来自同一个IP的访客固定访问一个后端服务器,有效解决了动态网页存在的session共享问题。

   fair。这是比上面更加智能的负载均衡算法。此种算法可以依据页面大小和加载时间长短地进行负载均衡,也就是根据后端服务器的响应时间来分配请求,响应时间短的优先分配。Nginx本身不支持fair的,如果需要使用这种调度算法,必须下载Nginx的upstream_fair模块。

   url_hash。此方法按访问irl的hash结果来分配请求,是每个url定向到同一个后端服务器,可以进一步提高后端缓存服务器的效率。nginx本省是不支持url_hash的,如果需要使用这种调度算法,必须安装nginx的hash软件包。


在HTTP Upstream模块中,可以通过server指令指定后端服务器的丨P地址和端口,同时还吋以设定毎个后端服务器在负栽均衡调度中的状态。常用的状态有:

□    down,表示当前的server暂时不参与负载均衡

□    backup.闻留的各份机器。当其他所有的非backup机器出观故障或者忙的时候,才会请求backup机器,因此这台机器的压力最轻。

□    max.fails,允许谙求失敗的次数默认为1.当超过最大次数时,返回proxy_next_ upstream模块定义的错误,

□    fail. timeout,在经历了 max—fails次失敗后,暂停股务的时间。max_failS可以和fail_ timeout 一起使用。


5.    server 虚拟主机配置


下面介绍对虚拟主机的配置。建议将对虚似主机进行配置的内容写进另外一个文件.然 后通过include指令包念进来.这样便维护和管理.

server {
    listen       80;
    server_name  localhost;
    #charset koi8-r;
    #access_log  logs/host.access.log  main;
    location / {
        root   html;
        index  index.html index.htm;
    }

server标志定义虚拟主机开始:listen用十指定虚拟主机的服务器端口 : server_name用 来指定IP地址或者域名,多个域名之间用空格分开:index用于设定访叫的默认首员地址: root指令用于指定虚拟主机的网页根目录,这个目录可以是相对格径.也可以是绝对路径: charset用于设置网页默认编码格式
access_log用来指定虚拟机的访问日志存放路抡,最后的main用于指定访日志的输出格式.


6.    URL匹配配費

URL地址匹配是Nginx匹配中最灵活的部分。location支持正则表达式匹配,也支持条件判断匹配,用户可以通过location指定实现nginx对动、静态的过滤处理。
以下这段设置是通过location指令来对网页URL进行分析处理,所有扩展名为.gif、. jpg、.jpeg、.png、.bmp, .swf的静态文件都交给Nginx处理,而expires用来指定静态文件 的过期时间,这甲.是30天,

  location ~.*\. (gi| jpg| jpeg|png|lq>| swf)$ {
                root /web/wwwroot/www. ixdba.net;
                expires 30d;
}

以下这段设资是将upload和html下的所有文阵都交拾Nginx来处通.当然,upload和 html目录包含在/web/wwwroot/www.ixdba.net目录中      

location ~ ^/(upload|hcal)/ {
                root /web/wwwroot/www.ixdba.net;
                expire* 30d;
}

在最后这段设霣中,location是对此虚拟主机下动态网页的过滤处理,也就是将所有 以jsp为后结的文件都交给本机的8080端口处理,          

Locacion  ~ .*.jsp$ {
                    index index.jsp;
                proxy_pass http://loc*lhost:8080;
}


7. StubStatus模块配置

StubStatuss模块能够获取Nginx自上次启动以来的工作状态,此模块非核心欖块,需要在Nginx编译安装时手工指定才能使用,
以下指令指定启用获取Nginx 工作状态的功能    

location /nginxstatus {
           stub_status              on;
           access_log               logs/nginxstatus。log;
           auth_basic               "nginxStatus"
           auth_basic_user_file       ../htpasswd; 
       }

stub—status为“ on ”表示启用StubStatus的工作状态统计功砣:acccss_log用来指定 StubStatuS模块的访问日志文件:auth_basic是Nginx的一种认证机制:auth」basic_user_file 用来指定认证的密码文件.由于Nginx的auih_basic认证采用的是与Apachc兼容的密码文件,因此需要用Apache的htpasswd命令来生成密码文件.例如要添加一个webadmin用户, 可以使用下面的方式生成密码文件:

/usr/local/apache/bin/htpasswd -c /usr/local/conf/htpasswd  webadmin

会得到以下提示信息:

New password:

输入密码之后.系统会要求再次输入密码.确认之后添加用户成功。
要查看Nginx的运行状态,吋以输人hwp://ip/NginxStatus,然后输人刚刚创建的用户名
和密码就可以看到如下信息

active connections:1
server accepts handled requests
393411 393411 393799
Reading:0 Writing:1 Waiting:0


Aciivc connections表当前活跃的连接数,第三行的3个数字表示Nginx与前总共处理了393411个连接.成功创建了393411次握手,总共处理了 393 799个请求,最后 一行的Reading表示Nginx读取到客户端Header信息数:Writing表示Nginx返回给客户端的Header信息数:Waiting表示Nginx已经处理完、正在等候下一次请求指令时的驻留连接数.

在最后这段设置中.设置了虚拟主机的错误信息总返回页面,通过error_page指令可以定制各种错误信息的返问页面-在默认情况下,Nginx会在主目录的html目录中査找指定的返回页面。特别需要注意的是,这些错误信息的返回页面大小一定要超过512KB,否则会被IE浏览器替换为IE默认的页面。

error_page 404    /404.html;
error_page 502 502 503 504 /50x.html;
    locatim = /50x.html {
        root   html;
        }
}
}