戏说Nginx(一)

1. Nginx介绍:

     Nginx是一个高性能的HTTP和反向代理服务器软件,由俄罗斯程序设计师Igor Sysoev开发,可以运行在UNIX、GNU/Linux、BSD、Mac OS X 等操作系统。

2.Nginx的组成与工作原理:
戏说Nginx(一)
Nginx的模块从功能上分为三类:

Handlers(处理器模块):此类模块直接处理请求,并进行输出内容和修改headers信息等操作。注意:handler处理模块一般只能有一个。
Filters(过滤器模块):此类模块主要对其他处理器模块输出的内容进行修改操作,最后由Nginx输出。
Proxies(代理类模块):就是Nginx的HTTP Upstream之类的模块,这些模块主要与后端一下服务比如fastcgi等操作交互,实现服务代理和负载均衡等功能。

Nginx的HTTP模块请求和响应模式:
戏说Nginx(一)

Nginx的工作模式:

单工作进程:
在单工作进程模式下,除主进程外,还有一个单线程的工作进程,nginx默认为单工作进程模式。
多工作进程:
在多工作进程模式下,每个工作进程包含多个线程。

3.Nginx的性能优势:

        ★作为web服务器,Nginx处理静态文件、索引文件以及自动索引效率非常高。
        ☆作为代理服务器,Nginx可以实现快速、高效的反向代理,提升网站性能。
        ★作为负载均衡服务器,Nginx即可以在内部直接支持Rails和PHP,也可以支持HTTP代理服务器,对外进行服务。同时支持简单的容错和利用算法进行负载均衡。
        ☆在性能方面,Nginx是专门为性能优化而开发的,在实现上非常注重效率。它采用内核Poll模型,可以支持更多的并发连接,并在大并发时占用很低的内存资源。
        ★在稳定性方面,Nginx采取了分阶段资源分配技术,使得对CPU与内存的占用率非常低。
        ☆在高可用性方面,Nginx支持热部署,启动速度迅速,因此可以在不间断服务的情况下,对软件版本或者配置进行升级,即使运行数月也无需重新启动,几乎可以做到7×24小时不间断运行。

4.Nginx的安装:

 Nginx的官方网站:http://nginx.org

     Nginx有三个版本:
            稳定版:
                 稳定版本更新较慢,但是bug较少,可以作为生产环境的首选,因此通常建议使用稳定版。
          历史版:
                历史稳定版本为以往稳定版本的汇总,不包含最新的功能。
            开发版:
                 开发版更新较快,包含最新功能和bug修复,但同时也可能会遇到新的bug,开发版一旦更新稳定下来,就会被加入稳定版分支中。

    安装:
          依赖关系:
                    gcc、openssl-devel、pcre、zlib-devel       
              命令:
                    yum install -y gcc openssl-devel zlib-devel
              pcre安装:
                    pcre下载地址:https://sourceforge.net/p/pcre/activity/?page=0&limit=100#5344411d34309d678fa871f2
                    安装pcre库是为了使Nginx支持HTTP Rewrite模块。
                            [root@nginx01 ~]# tar zxvf pcre-8.35.tar.gz
                            [root@nginx01 ~]# cd pcre-8.35
                            [root@nginx01 ~]# ./configure
                            [root@nginx01 ~]#  make
                            [root@nginx01 ~]#  make install
                    Nginx安装:
                            [root@nginx01 ~]# tar zxvf nginx-1.4.7.tar.gz
                                [root@nginx01 ~]# cd nginx-1.4.7
                                [root@nginx01 ~]# ./configure --prefix=/usr/local/nginx --with-http_stub_status_module --with-http_gzip_static_module
                                [root@nginx01 ~]# make && make install
                                说明:
                                        查看模块  ./configure --help
                                        关闭模块  --without-http_ssi_module
                                        开启模块  --with-http_perl_module

5.Nginx的配置和调试:

    1.Nginx配置文件结构:
            Nginx的配置文件是一纯文本文件,它一般位于Nginx安装目录的conf目录下,整个配置文件是以block的形式组织的。每个block一般以一个大括号“{}”来表示。

戏说Nginx(一)

    2.Nginx配置文件详解:
          nginx的配置文件路径为/usr/local/nginx/conf,其中nginx.conf为Nginx的主配置文件。
                Nginx配置文件主要分成四个部分:main(全局设置)、server(主机设置)、upstream(负载均衡服务器设置)、location(URL匹配特定位置的设置)。main部分设置命令将影响其他所有设置;server部分的命令主要用于指定主机和端口;upstream命令主要用于负载均衡,设置一系列的后端服务器;location部分用于匹配网页位置。
                Nginx实例配置:
                        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要开启的进程数。
                        error_log:  用来定义全局错误日志文件。日志输出级别有debug、info、notice、warn、error、crit可供选择,其中,debug输出日志最为详细,而crit输出日志最少。
                        pid: 用来指定进程ID的存储文件位置。
                        worker_rlimit_nofile: 用于绑定worker进程和CPU,Linux内核2.4以上可用。
                        events: 设定Nginxd的工作模式及连接数上限。其中参数"use" 用来指定Nginx的工作模式。Nginx支持的工作模式有select、poll、kqueue、epoll、rtsig和/dev/poll。其中select和poll都是标准的工作模式,kequeue和epoll是高效的工作模式,对于Linux系统,epoll工作模式是首选。而参数"worker_connections"用于定Nginx每个进程的最大连接数,默认是1024。最大客户端连接数由worker_processes和worker_connections决定,即max_client = worker_processes* worker_connections。进程的最大连接数受Linx系统进程的最大打开文件数限制,在执行操作系统命令"ulimit -n 65535" 后 worker_connections的设置才能生效。

                http的属性配置:
                    http {
                            include       mime.types;
                            default_type  application/octet-stream;

                            log_format  main  '$remote_addr - $remote_user [$time_local]'
                                        '"$request"  $status $bytes_sent '
                                        '"$http_referer" "$http_user_agent"'
                                        '"$gzip_ratio"';
                            log_format download ' $remote_addr - $remote_user [$time_local] '
                                        '"$request" $status $bytes_sent '
                                        '"$http_referer" "$http_user_agent" '
                                        '"$http_range" "$sent_http_content_range"';

                            access_log  logs/access.log  main;

                            client_max_body_size     20m;
                            client_header_buffer_size    32k;
                            large_client_header_buffers 4 128k;

                            sendfile        on;
                            tcp_nopush      on;
                        tcp_nodelay     on;
                            #keepalive_timeout  0;
                            keepalive_timeout  60;
                            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_buffers: 用来指定客户端请求中较大的消息头的缓存最大数量和大小,"4"为个数,"128K"为大小,最大缓存量为4个128KB。
                sendfile: 用于开启高效文件传输模式。将tcp_nopush和tcp_nodelay两个命令设置为"on"用于防止网络阻塞。
                keepalive_timeout: 设置客户端连接保持活动的超时时间。在超过这个时间之后,服务器会关闭该连接。
                client_header_timeout: 设置客户端请求头读取超时时间。如果超过这个时间,客户端还没有发送任何数据,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 on"表示开启GZIP压缩,实时压缩输出数据流。
                gzip_min_length: 设置允许压缩的页面最小字节数,页面字节数从header头的Content-Length中获取。默认值是0,不管页面多大都进行压缩。建议设置成大于1KB的字节数,小于KB可能会越压缩越大。
                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  10.0.0.35;
                                index index.html index.htm index.jsp;
                                root /web/wwwroot/www.ixdba.net;
                                charset utf-8;
                                access_log  logs/host.access.log  main;
                参数说明:
                    建议:将虚拟主机进行配置的内容写进另一个文件,然后通过include命令包含进来,这样更便于维护和管理。
                    server: 定义虚拟主机开始的关键字。
                    listen: 用于指定虚拟主机的服务端口。
                    server_name: 用来指定IP地址或域名,多个域名之间用空格分开。
                    index: 用于设定访问的默认首页地址。
                    root: 用于指定虚拟主机的网页根目录,这个目录可以是相对路径,也可以是绝对路径。
                    charset: 用于设置网页的默认编码格式。
                    access_log: 用来指定此虚拟主机的访问日志存放路径,最后的main用于指定访问日志的输出格式。

                URL地址配置:
                    location ~ .*\.(gif|jpg|jpeg|pen|bmp|swf)$ {
                                        root   /web/wwwroot/www.ixdba.net;
                                        expires  30d;
                                                }
                    说明:
                            URL地址匹配是Nginx配置中最灵活的部分。通过location关键字定义了地址匹配的开始。location支持正则表达式匹配,也支持条件判断匹配。用户可以通过location命令实现Nginx对动态、静态网页进行过滤处理。在上面这段location代码中,所有扩展名以.gif、.jpg、.jpeg、.png、.bmp、.swf结尾的静态文件都交给Nginx处理,而expires用来指定静态文件的过期时间,这里是30天。

                    location ~ ^/(upload|html)/  {
                                        root   /web/wwwroot/www.ixdba.net;
                                        expires 30d;
                                                }
                    说明: 
                        这段代码是将upload和html下所有文件都有交给Nginx来处理,当然,upload和html目录包含在/web/wwwroot/www.ixdba.net目录中。

                    location ~ .*.jsp$ {
                                                index index.jsp;
                                                proxy_pass http://10.0.0.35:8080;
                                }
                    说明:
                        这段代码中,通过location关键字实现了将所有以.jsp为后缀的文件都交给本机的8080端口处理。

                    location /NginxStatus {
                                                stub_status        on;
                                                access_log         logs/NginxStatus.log;
                                                auth_basic         "NginxStatus";
                                                auth_basic_user_file   /usr/local/nginx/conf/htpasswd;
                                }   
                    说明:
                        这段代码配置的是Nginx的运行状态,StubStatus模块能够获取Nginx上次启动以来的工作状态。
                        stub_status: 设置为"on"表示启用StubStatus的工作状态统计功能。
                        access_log: 用来指定StubStatus模块的访问日志文件。
                        auth_basic: 是Nginx的一种机制。
                        auth_basic_user_file: 用来指定认证的密码文件。
                        由于Nginx的auth_basic认证采用的是与Apache兼容的密码文件,因此需要用Apache的htpasswd命令来生成密码文件。
                        安装htpasswd命令:
                            我这里直接yum 安装httpd了。
                            yum install -y httpd 
                        生成密码文件:
                            这里添加了webadmin用户
                            htpasswd -c /usr/local/nginx/conf/htpasswd webadmin  
                            提示信息:
                                New password:
                                在输入密码之后,系统会要求再次输入密码。确认密码正确之后成功添加用户。
                        查看Nginx的运行状态:
                            输入:http://ip/NginxStatus,然后输入刚刚创建的用户和密码。
                            Active connections: 1 
                            server accepts handled requests
                             13 13 22 
                            Reading: 0 Writing: 1 Waiting: 0 
                            其中,"Active connections"表示当前活跃的连接数,第三行的三个数字表示Nginx当前总共处理了13个连接,成功创建13次握手,总共处理了22个请求。最后一行的"Reading" 表示Nginx读取到客户端Header信息数,"writing"表示Nginx返回给客户端的Header信息数,"Waiting"表示Nginx已经处理完,正在等候下一次请求命令时的驻留连接数。
                    虚拟主机的错误信息返回页面:
                            error_page  404              /404.html;

                                        # redirect server error pages to the static page /50x.html
                                        #
                                        error_page   500 502 503 504  /50x.html;
                                        location = /50x.html {
                                                root   html;
                                        }
                            }
                            }
                            说明:
                                通过error_page命令可以定制各种错误信息的返回页面。在默认情况下,Nginx会在主目录的html目录中查找指定的返回页面。

    3.Nginx日常维护:
            1.Nginx配置正确性检查:
                    命令:
                            /usr/local/nginx/sbin/nginx -t 
                        或:
                                /usr/local/nginx/sbin/nginx -t -c /usr/local/nginx/conf/nginx.conf
                    说明:
                            其中,"-t"参数用于检查配置文件是否正确,但并不执行。“-c”参数用于指定配置文件路径,如果不指定配置文件路径,Nginx默认在安装时指定的安装目录下查找conf/nginx.conf文件。
                    结果:
                            nginx: the configuration file  /usr/local/nginx/conf/nginx.conf syntax is ok
                            nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful
                2.查了ginx版本:
                   命令:
                             [root@nginx01 ~]# /usr/local/nginx/sbin/nginx -v
                             nginx version: nginx/1.4.7
                3.查看Nginx安装版本和相关编译信息:
                    命令:
                            [root@nginx01 ~]# /usr/local/nginx/sbin/nginx -V
                    nginx version: nginx/1.4.7
                            built by gcc 4.4.7 20120313 (Red Hat 4.4.7-18) (GCC) 
                            configure arguments: --prefix=/usr/local/nginx --with-http_stub_status_module --with-http_gzip_static_module
                4.Nginx的启动、关闭与重启:
                        Nginx对进程的控制能力非常强大,可以通过信号命令控制进程。常用信号:
                            QUIT,表示处理完关当前请求后关闭进程。
                            HUP,表示重新加载配置,即关闭原有进程并开启新的工作进程。此操作不会中断用户的访问请求,因此,可以通过此信号平滑地重启Nginx。
                            USR1,用于Nginx的日志切换,也就是重新打开一个日志文件,例如,每天要生成一个新的日志文件时,可以使用这个信号来控制。
                            USR2,用于平滑升级可执行程序。
                            WINCH,从容关闭工作进程。

                            启动:
                                    /usr/local/nginx/sbin/nginx 
                            查看:
                                    ps -ef | grep nginx
                            关闭:
                                    kill 14179
                            获取进程号:
                                    ps -ef | grep "nginx: master process" | grep -v "grep"| awk '{print $2}'
                                    或
                                    cat /usr/local/nginx/logs/nginx.pid
                            平滑重启:
                                    kill -HUP `cat /usr/local/nginx/logs/nginx.pid`

转载于:https://blog.51cto.com/6284444/2094298

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值