1.Nginx服务应用

Nginx服务应用

Nginx的优点和作用

    Nginx是一款高性能的HTTP和反向代理的服务器软件,还是一个IMAP/POP3/SMTP(邮件)代理服务器!

    Nginx在功能实现上都采用模块化结构设计,都支持通用的语言接口,如PHP,Perl,python等,同时还支持正向和反向代理,虚拟主机,URL重写,压缩传输,SSL加密传输等。

    Nginx和Apache的区别:最大的差别是Apache的处理速度很慢,而且占用很多内存资源,而Nginx正好相反。在功能实现上,Apache的所有模块都支持动,静态编译的,而Nginx都是静态编译的,Nginx对Fcgi的支持非常好;在处理连接方式上,Nginx支持epoll,Nginx的安装包非常小,只有几百KM。

    Nginx采用分阶段资源分配技术,使得CPU和内存的占用率非常低,Nginx保持10000个没有活动的连接,只占用2.5MB内存,所一,类似DOS这样的攻击对Nginx没有任何作用。

    Nginx采用内核poll模型,可以支持更多的并发连接,最大可以支持50000个并发连接数的响应,而且只占用很低的内存资源!

    在高可用方面,Nginx支持热部署,启动速度特别迅速,因此可以不间断服务的情况下,对软件版本或配置进行升级,即使运行数月也无需重新启动,几乎可以做到7X24小时不间断的运行。

Nginx的工作模块和原理

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

     Nginx的模块从结构上分为核心模块,基础模块和第三方模块,

核心模块:HTTP模块,ECENT模块和MAIL模块等。

基础模块:HTTP Access模块,HTTP FastCGI模块,HTTP Proxy模块和HTTP Rewrite模块。

第三方模块:HTTP Upstream Request Hash模块,Notice模块和HTTP Access模块,用户根据自己的需要开发的模块都属于第三方模块。

 

Nginx的模块从功能上分为三类

Handlers(处理器模块)。此类模块直接处理请求,并进行输出内容和修改headers信息等操作。handres处理器模块一般只能有一个。

Filters(过滤器模块)。此类模块主要对其他处理器模块输出的内容进行修改操作,最后又Nginx输出。

Proxies(代理类模块)。此类模块式Nginx的HTTP Upstream之类的模块,这些模块主要与后端一些服务比如FastCGI等进行交互,实现服务代理和负载均衡等功能。

 

Nginx的工作原理

HTTP发出请---Nginx内核-----选择一个Handlers处理器模块-----handlers(处理器模块)---生成内容---Filters(过滤器模块1)---处理内容---Filters(过滤器模块2)---Filters(过滤器模块N)---HTTP响应请求

工作方式:单工作进程和多工程进程两种模式。在单工作进程模式下,处主进程外,还有一个工作进程,工作进程是单线程的;在多工作进程模式下,每个工作进程包含多个线程。Nginx默认为单工作进程模式。

Nginx的模块是直接编译进去Nginx,因此属于静态编译方式。启动Nginx后,模块被自动加载!在解析配置文件时,Nginx的每个模块都有可能去处理某个请求,但是同一个处理请求只能由一个模块来完成。

 

Nginx的安装

Nginx只能通过源码包编译安装,在安装Nginx之间,我们需要安装Nginx依赖的软件:gccopenssl-devel,pcre,zlib-devel。

         在默认情况下,通过编译安装的Nginx包含大部分可用模块,Nginx支持哪些模块,我们可以通过./configure –help查看nginx支持的所有模块

         [root@localhost nginx-1.2.1]# ./configure --help

       --prefix=PATH                      set installation prefix                                          #指定nginx的安装路径

       --user=USER                        set non-privileged user for                              #指定用来运行nginx的用户

                                     worker processes

       --group=GROUP                      set non-privileged group for                         #指定运行nginx的组

                                     worker processes

         在安装时候,我们推荐开启NginxStatus和HTTPGzip模块,在编译安装的时候加上--with-http_stub_status_module和--with-http_gzip_static_module。

 

Nginx配置文件结构

         Nginx的配置文件是一个纯文本文件,它一般位于Nginx安装目录的conf目录下,整个配置文件是以block的形式组织的。每个block以“{}”来表示。block可以分为几次层次,整个配置文件中Main位于最高层,在Main下面有Events(项目),HTTP等层级,而在HTTP层中又包括Server层,即server block,server block又可以分为location(位置)层,并且一个server block中可以包含多个location block。

         一个完整的Nginx服务的配置文件结构如图:

Nginx配置文件详解

         nginx配置文件主要分成四个部分:main(全局配置),server(主机配置),upstream(负载均衡服务器设置)和location(URL匹配特定位置的设置)。main部分设置的命令将影响到其他所有设置;server部分的命令主要用于指定主机和端口;upstream命令主要用于负载均衡,设置一系列的后端服务器;location部分用于匹配网页位置。这四者之间的关系是:server继承main,location继承server,upstream既不会继承也不会被继承。

         在这四个部分中,每个部分都包含若干命令,这些命令主要包含Nginx的主模块命令,事件模块命令,HTTP核心模块命令,同时每个部分还可以使用其他HTTP模块命令,例于:Http SSL模块,HttpGzip Static模块和Http Addition模块等。

user nobody nobody;

worker_processes  4;

error_log logs/error.log notice;

pid logs/nginx.pid;

worker_rlimit_nofile 65535;

events{

         use epoll;

         worker_connections 65535;

}

解释:

user是个主模块指令,指定Nginx worker进程运行用户以及用户组,默认的用户和用户组都是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以上可用。

events:设定Nginx的工作模式及连接数上限。其中参数“use”用来指定nginx的工作模式,nginx支持的工作模式有select,poll(选举),kqueue(队列),epoll,rtsig和/dev/poll。其中select和poll都是标准的工作模式,kqueue和epoll是高效的工作模式,对于Linux系统,epoll工作模式是首选。而参数”worker_connections”用于定义每个进程的最大连接数,默认是1024。所以,一个nginx服务的的最大客户端的连接数为:worker_processes*worker_connections.进程的最大连接数受linux系统进程的最大打开文件数限制,在执行操作系统命令“ulimit –n 65535”更改可以打开的最大文件的数量(临时有效,所以我们需要将命令加入到启动nginx用户的启动脚本中),worker_connections才会生效。

#对于root用户而言,我们直接修改ulimit=65535是没有一点问题的,但是普通用户就会报错Socket/File: Can’t open so many files,普通用户无权限修改这个值:所以我们应该最正确的修改方法是:

# vim /etc/security/limits.conf

#<domain>      <type>  <item>         <value>

*               soft    nofile  32768

*               hard    nofile  65536

在配置文件中将文件句柄限制修改为软:32768,硬:65536,配置在前面的domain,*号是代表所有,当然你也可以对单个用户进行设置。在这个当中,硬限制才是实际的显示,而软限制,只是warnning限制,只会做出警告,ulimit命令本身也有软硬之分,加-H就是硬,-S就是软。

   

http {

    include       mime.types;

    default_type  application/octet-stream;

 

    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;

 

    client_max_body_size        20m;

    client_header_buffer_size   32k;

    large_client_header_buffers 4       32k;

    sendfile        on;

    tcp_nopush     on;

    tcp_nodelay    on;

    keepalive_timeout  65;

    client_header_timeout 10;

    client_body_timeout 10;

send_timeout        10;

释:

include:主模块命令,实现对配置文件所包含文件的设定,可以减少主配置文件的复杂度,类似于Apache中的include方法。

default_type:属于HTTP核心模块命令,这里设定默认类型为二进制流,也就是当文件类型未定义时使用这种方式,例于,在没配置PHP环境时,Nginx是不会解析的,用浏览器访问PHP文件时会出现下载窗口。

log_format:用于指定nginx日志的输出格式。main为此日志输出格式的名称,可以在下面的access_log命令中引用。

client_max_body_size:用来设置允许客户端请求的最大的单个文件字节数。

client_header_buffer_size:用于指定来自客户端请求头的headerbuffer大小。对于大多数请求,1KB的缓冲区大小已经够了,如果自定义了消息头或有更大的cookie,可以增加缓冲区大小。这里设置为32KB。

large_client_header_buffer:用来指定客户端请求中较大的消息头的缓存最大数量和大小,“4”为个数,“128K”为大小,最大缓存量为4个128KB。

sendfile:用于开启高效文件传输模式。将tcp_nopush和tcp_nodelay两个命令设置为“on”用于防止网络阻塞。

keepalive_timeout:设置客户端连接保持活动的超时时间。在超过这个时间之后,服务器会关闭该连接。

client_header_tomeout:设置客户端请求头读取超时时间。如果超过这个时间,客户端还没有发送任何数据,Nginx将返回“Request time out(408)”错误。

client_body_timeout:设置客户端请求主体读取超时时间。如果超过这个时间,客户端还没有发送任何数据,Nginx将返回“Request time out(408)”错误,默认值是60。

send_timeout:设定响应客户端的超时时间。这个超时仅限于两个链接活动之间的时间,如果超过这个时间,客户端没有任何活动,Nginx将会关闭连接。

 

httpgzip模块相关属性设置:

    gzip  on;

    gzip_min_length 1k;

    gzip_buffers 4 16k;

    gzip_http_version 1.1;

    gzip_comp_level 2;

    gzip_types text/plain application/x-javascript text/css application/xml;

gzip_vary on;

释:

gzip:用于设置开启或者关闭gzip模块。开启gzip压缩,实时压缩输出的数据流。

gzip_min_length:设置允许压缩的页面最小字节数,页面字节数从header(数据头)头的Content-length(内容长度)中获取。默认值是0,不管页面多大都进行压缩。建议设置成大于1KB的字节数,小于1KB可能会越压越大。

gzip_buffers:表示申请4个单位为16kb的内存作为压缩结果流缓存。默认是申请与原始数据大小相同的内存空间来存储GZIP压缩结果。

gzip_http_version:用于设置识别HTTP协议版本,默认是1.1,目前大部分浏览器已经支持GZIP解压,使用默认即可。

gzip_comp_level:用于指定gzip压缩比,1表示压缩比最小,处理速度最快;9表示压缩比最大,传输速度快,但处理速度最慢,也比较消耗CPU资源。

gzip_types:用来指定压缩的类型,无论是否指定,“text/html”类型总是会被压缩。

gzip_vary:让前端的缓存服务器缓存经过gzip压缩的页面,例于用Squid(代理和缓存服务器)缓存经过Nginx压缩的数据。

 

虚拟主机的配置:

           server {

      listen       80;

      server_name  www.gxl.com;

      index   index.html index.htm index.jsp;

      root    html;

      charset gb2312;

      access_log  logs/host.access.log  main;

           释:

           建议将对虚拟主机进行配置的内容写进另外一个文件,然后通过include(包含)命令包含进来,这样更利于维护和管理。配置虚拟主机代码中每个参数的含义。

         server:定义虚拟主机开始的关键字。

         listen:用于指定虚拟主机的服务端口。

         server_name:用来指定ip地址和域名,多个域名之间用空格分开。

         index:用于设定访问的默认首页地址。

         root:用于指定虚拟主机的网页根目录,这个目录可以是相对路径,也可以是绝对路径。

         charset:用于设置网页的默认编码格式。

         assess_log:用来指定此虚拟主机的访问日志存放路径,最后的man用于指定访问日志的输出格式。

 

URL地址匹配设置:

         location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$ {                                                        #.*\.gif     就是匹配当前目录下所有*.gif文件。         .        当前目录         *       通配符     \.      转义符,使后面这个点没有特需含义  

    root    html;

    expires 30d;

}

释(文件):

         URL地址匹配是nginx配置中最灵活的部分。通过location关键字定义了地址匹配的开始。location支持正则表达式,也支持条件判断匹配。用户可以通过location命令实现nginx对动态,静态网页进行过滤处理。

在上面这段location代码中,所有以扩展名以.gif,.jpg…..等等结尾的静态文件都交给Nginx处理,而expires用来指定静态文件的过期时间,这里是30天。

 

location ~ ^/(upload|html)      {

root    html;

expires 30d;

}

释(目录):

这段代码是将upload和html目录下的所有文件都交给nginx处理,而这两个目录实在html目录下的。

 

location ~ .*.jsp$      {

index index.jsp;

proxy_pass      http://locahost:8080;

}

释:

这段代码中,通过location关键字将所有以.jsp关键字为后缀的文件都交给本机的8080端口处理。这样就可以实现nginx的动静态分离,而为什么是8080端口勒?因为一般我们都需要搭建tomcat服务,而8080端口就是tomcat服务的端口。

 

Nginx运行状态,StubStatus模块能够获取nginx自上次启动以来的工作状态:

 location        /NginxStatus {

 stub_status     on;

 access_log       logs/NginxStatus.log;

 auth_basic      "NginxStatus";

 auth_basic_user_file    ../htpsswd;

 }

释:

stub_status:是否启用StubStatus的工作状态统计功能

access_log:用来指定StubStatus模块的访问日志功能

auth_basic:是nginx的一种认证机制

auth_basic_user_file:用来指定认证的密码文件

 

由于nginx的auth_basic认证采用的是与Apache兼容的密码文件,因此需要用htpasswd命令来生成密码文件:

htpasswd -c /usr/local/nginx/conf/htpasswd admin

设置user成功以后,我们重启一下服务,然后在浏览器中http://IP/NginxStatus访问

Active connections:表示当前活跃连接数

第三行的上那个数字分别表示:当前总共处理连接的次数;成功创建握手次数;处理请求次数

reading:表示nginx读取到客户端header(信息头)信息数           writing:表示nginx返回给客户端header信息数     waiting:表示nginx已处理完,正在等候下一次请求命令时的驻留连接数。

 

error_page   500 502 503 504  /50x.html;

        location = /50x.html {

            root   html;

        }

释:

通过page命令可以定制各种错误信息的返回页面。在默认情况下,nginx会在主目录html目录中查找指定的返回页面。需要特别注意的是,这些错误信息的返回页面信息的大小一定要超过512KB,否则会被IE替换成自己默认的。

        

 

 

 

 

posted @ 2016-01-29 14:20  Goun  阅读(354)  评论(0编辑  收藏  举报