1、Nginx

介绍Nginx

       NGINX写入解决服务器的少数之一C10K问题。不同于传统的服务器,NGINX不依靠线程来处理请求。相反,它使用一个更可扩展的事件驱动的(异步)架构。这种结构采用小,但更重要的是,可预测的量的负荷下存储器。即使你不希望处理成千上万的并发请求,你仍然可以从NGINX的高性能和小内存占用受益。NGINX扩展在所有方向:从最小的VPS一路攀升到服务器的大型集群

[扩展]

C10k

       指的是服务器同时支持成千上万个客户端的问题,也就是conncurrent10 000     connection;而Nginx就是能解决这样的一个问题

Nginx的应用

       Netflix, Hulu,Pinterest, CloudFlare, Airbnb, WordPress.com, GitHub, SoundCloud, Zynga,Eventbrite, Zappos, Media Temple, Heroku, RightScale, Engine Yard, MaxCDN

官方站点

       http://nginx.org/

选择一个新的程序包注意的问题

       1.序包的新功能是否是我们需要的

       2.新的程序包之前必须做测试

作用

       一个自由的,开放源码的,高性能的http和反向、代理服务器,以及一个IMAP/POP3代理服务器

Nginx的特点

高性能,高稳定性,功能丰富,配置简单,资源消耗低

二次开发版:tengine, openresty

Nginx的特性:

       模块化设计,较好的扩展性;

       高可靠性

              master/worker

       支持热部署

              不停机更新配置文件、更换日志文件、更新服务器程序版本;

       低内存消耗

              10000个keep-alive连接模式下的非活动连接仅消耗2.5M内存;

       Nginx支持事件驱动机制,支持异步,支持内存映射

【扩展】

什么是代理:

       即代表处理,代表处理已授权的事情;

       wKiom1csrOKhGxxUAAA7F5ykAdU536.png

       上图知,对于客户端来说,中间的服务器是一个代理服务器,而对于服务器来说,中间的那个服务器称之为反向代理

基本功能

       静态资源的web服务器;

       http协议反向代理服务器;

       pop3/imap4协议反向代理服务器;

       支持fastCGI(lnmp), uWSGI等协议

       模块化(非DSO),著名模块支持的有zip, SSL等等;        

web服务器相关的功能:

       虚拟主机、keepalive机制、访问日志、错误日志、url 重写、路径别名、基于ip及用户的访问控制、支持速率限制及并发数限制,...;

Nginx的程序架构:

wKiom1csrPazfj7VAAM2vkKm4BY484.jpg

解释:

       两个补充的管理缓存的组件      

              Cache loader:负责加载/装载缓存

              Cache Manager:管理缓存的

       中间的proxycache是需要开启才能使用的,基于本地磁盘上与本地磁盘打交道时,支持高级I/O机制,支持sendfile机制,支持异步IO机制,支持mmap,支持

       实现并发请求响应上可以基于kevent,epoll(需要系统调用),.select机制,使用的方式都是不一样的

架构:

       master/worker

              一个master进程,可生成一个或多个worker进程;

                     master:加载配置文件、管理worker进程(创建和销毁)、平滑升级、...

                     worker:http服务、http代理、fastcgi代理                 

模块类型:

       核心模块:core module

       标准模块:自己代理的核心模块

              标准http模块

              可选的http木块

              邮件模块

       第三方模块(3rd party modules):           

模块

       配置模块即配置模块中的指令,没有配置指令就没有相对应的有效的模块;

       模块中存在一些相关的变量;(内建变量)随着模块的不同而变化

Nginx能作什么

       静态资源的web服务器

       http协议反向代理

nginx如何作为web服务器

安装nginx:(nginx不再iso中,可以使用epel源安装)

       推荐epel源:http://mirrors.aliyun.com/epel/7Server/x86_64/n/

配置yum源:

       [root@bogon yum.repos.d]#cat epel.repo

       [epel]

       name=centos epel

       baseurl=http://mirrors.aliyun.com/epel/7Server/x86_64/c/

       gpgcheck=0

配置nginx的yum源

       [nginx]

       name=nginx repo

       baseurl=http://nginx.org/packages/mainline/OS/OSRELEASE/$basearch/

       gpgcheck=0

       enabled=1

下载nginx

       wget http://nginx.org/download/nginx-1.10.0.tar.gz

编译安装:按需安装

配置安装开发环境:

       准备支持的模块

       yum install –y pcre-devel openssl-devel zlib-devel

       安装开发包组

第一步:tar xfnginx-1.8.1.tar.gz

第二部:cdnginx-1.8.1

第三步:./configure\

       --prefix=/etc/nginx     nginx安装的位置

       --sbin-path=/usr/sbin/nginx     nginx程序文件的安装路径

       --conf-path=/etc/nginx/nginx.conf   nginx的主配置文件路径

       --error-log-path=/var/log/nginx/error.log     错误日志文件路径

       --http-log-path=/var/log/nginx/access.log    http访问日志路径

       --pid-path=/var/run/nginx.pid  nginx的pid配置文件的路径

       --lock-path=/var/run/nginx.lock      锁文件

       --http-client-body-temp-path=/var/cache/nginx/client_temp    

       --http-proxy-temp-path=/var/cache/nginx/proxy_temp

       --http-fastcgi-temp-path=/var/cache/nginx/fastcgi_temp

       --http-uwsgi-temp-path=/var/cache/nginx/uwsgi_temp

       --http-scgi-temp-path=/var/cache/nginx/scgi_temp

       以上是临时文件路径,如果服务器允许使用put机制的话,客户端可能会向服务器端请求大量的数据,服务器端收到的请求报文中的body中可能会有很多的数据,而这些数据都会存放内存中,倘若有很多的用户并发发出请求,服务器端内存无法存放,因此就会把数据临时存放在磁盘上的这些临时文件内,上述都是代理服务器时缓存文件的存放路径

       --user=nginx       指明那个用户来运行nginx的work进程

       --group=nginx    

       --with-http_ssl_module      支持ssl认证

       --with-http_realip_module  记录用户的真实ip

       --with-http_addition_module

       --with-http_sub_module

       --with-http_dav_module

       --with-http_flv_module

       --with-http_mp4_module

       --with-http_gunzip_module

       --with-http_gzip_static_module

       --with-http_random_index_module

       --with-http_secure_link_module

       --with-http_stub_status_module

       --with-http_auth_request_module

       --with-threads

       --with-stream

       --with-stream_ssl_module

       --with-http_slice_module

       --with-mail

       --with-mail_ssl_module

       --with-file-aio      文件的异步IO机制

       --with-http_v2_module

       --with-ipv6

--with-* 指明编译哪些功能

第四部:make&& make install

直接安装:

       yum install –y nginx

nginx命令

       -?或者h:显示帮助信息

       -v:显示版本信息和退出

       -V:显示版本信息和配置选项以及退出

       -t:测试配置文件是否存在错误

       -q:在配置测试过程中抑制错误消息

       -s:发送信号给主进程(stop(平滑停止),quit(及时有人正在使用,也会立即终止),reopen,reload)

       -p:设置前缀路径

       -c:设置主置文件

       -g:设置全局指令的配置文件

启动nginx

       前提是关闭占用80端口的应用程序,比如http

       [root@www ~]# nginx

 

Nginx配置

       配置文件的组成部分:

       主配置文件:nginx.conf

       片段化配置文件实现:(相对于主配置文件的路径,参照httpd)

1)创建一个conf.d目录

2)在主配置文件中键入指令:include conf.d/*.conf

            Fastcgi,scgi,uwscgi的相关配置以及mime.types

配置指令

注意:必须以分号结尾

指令格式:directive  value1 [value2...];

支持使用变量:

内置变量:由模块引入,可直接引用;

自定义变量:set  variable_name value;

            引用变量:$variable_name

整体配置文件结构:

     main block:全局配置;对http及mail模块都有效;

            event{ ... }:事件驱动的相关配置;

            http { ...}:http协议的相关配置

            mail{ ... }:mail相关的配置;

       http相关的配置:

            http{ ...   ...

                   server{ ...       #一个sever一个虚拟主机

                          server_name  #当前主机名

                          root        #跟文档的路径

                          alias      #别名映射

                          location/url/ { ...   #这里的url可以使用正则表达式做通配

                                 }    #定义访问特定url目录时的一些配置:

                          ...}

                   server { ... ...

                                 }

                          }

细化配置文件结构                           

       main block:配置指令的类别:

正常运行必备的配置;

优化性能的配置;

用于调试、定位问题的配置;

正常运行必备的配置

            1、user USERNAME [GROUPNAME];指定用于运行worker进程的用户和组;

                   usernginx nginx;

            2、pid /PATH/TO/PID_FILE;指定nginx进程的pid文件路径;

              pid /var/run/nginx.pid;

            3、worker_rlimit_nofile number;单个worker进程所能够打开的最大文件数;


性能优化相关的配置

            1、worker_processes number | auto;

                   worker的进程数;通常应该为CPU的核心数减1;

            2、worker_cpu_affinity cpumask ...;#指定worker进程运行在那颗cpu上

                worker_cpu_affinity auto [cpumask]; 1.8版本不支持auto

                               CPUMASK:cpu掩码

                                        00000001      第0颗

                                        00000010      第1颗CPU

                                        00000100

                                        ...

范例:编辑配置文件添加:

                     worker_processes 2;#指定运行两个worker_processes

                     Worker_cpu_affinity 0010 0100;

                     重新加载:nginx –s reload

                     查看worker运行在那颗cpu上:显示命令,进程号,cpu,优先级

                          psaxo command,pid,psr,ni

            3、worker_priority nice;指明进程的优先级

                   [-20,19]对应的是100-139

调试、定位问题

1、daemon on | off;是否以守护进程方式启动nginx进程;

守护进程:启动在后台运行

非守护进程:启动在前台消耗资源运行

            2、master_process on | off; 是否以master/worker模型启动nignx进程;

            3、error_log file | stderr |syslog:server=address[,parameter=value] | memory:size [debug | info | notice |warn | error | crit | alert | emerg];#错误日志文件的记录方式,及其日志级别:

            方式:

                   file /PATH/TO/SOME_LOG_FILE;      #日志文件的路径

                   stderr:                                            #发送到错误输出;                                           syslog:server=address[,parameter=value]:#发送给syslog服务器;

                   memory:size                                     #记录在内存中

            日志级别:

                   debug依赖于configure时的--with-debug选项;

nginx.conf

main block;

event{

…}

     1、worker_connections number;每个worker进程所能够并发打开的最大连接数;默认是512个

当前系统能响应的最大并发连接数:worker_processes *worker_connections

     2、use method;指明并发连接请求处理时使用的方法;

            use  epoll;

2、accept_mutex on | off;启用时,表示用于让多个worker轮流地、序列化地响应新请求;

http{

         }       

         定义套接字相关功能

     1、server { ... }

配置一个虚拟主机;

                   server {

                   listen PORT;

                   server_name  HOSTNAME;

                   root /PATH/TO/DOCUMENTROOT;

                   …}

注意:

            (1) 基于port的虚拟主机:

            listen指令要使用不同的端口;

            (2) 基于Hostname的虚拟主机;

            server_name指令指向不同的主机名;

            (3) 基于ip的虚拟主机:

            listen IP:PORT;

     2、listen address[:port] [default_server][ssl] [backlog=number] [rcvbuf=size] [sndbuf=size];

            listenport [default_server] [ssl];

            listenunix:path [default_server] [ssl] ;

            default_server:默认虚拟主机;

            ssl:限制只能通过ssl连接提供服务;

            backlog:后缓队列的长度;

            rcvbuf:接收缓冲大小;

            sndbuf:发送缓冲区大小;

     3、server_name name ...;

            指明当前server的主机名;后可跟一个或空白字符分隔的多个主机;

支持使用*任意长度的任意字符;

支持~起始的正则表达式模式字符串;

应用策略:

             (1) 首先精确匹配;

             (2) 左则*通配符匹配;

             (3) 右侧*通配符匹配;

             (4) 正则表达式模式匹配;

                   server_name  www.magedu.com;

                   server_name*.magedu.com;

                   server_name  www.magedu.*;

                   server_name~^.*\.magedu\..*$;

                   mail.magedu.com,www.magedu.com

     4、tcp_nodelay  on|off;

            对keepalived模式下的连接是否启用TCP_NODELAY选项;


     5、sendfile on | off;

            是否启用sendfile功能;

定义路径相关配置

     6、root path;

            设置web资源路径映射;用于指明用户请求的url所对应的本地文件系统上的文档所在目录路径;

可用上下文:http, server, location, if

     7、location [ = | ~ | ~* | ^~ ] uri { ...}

          location @name { ... }

          根据用户请求的URI来匹配定义的location,匹配到时,此请求将被相应的location块中的指令所处理;

     server {

            ...

            location {

            }

            location {

            ...

            }

            }

     =:URI精确匹配;

     ~:做正则表达式模式匹配,区分字符大小写;

     ~*:做正则表达式模式匹配,不区分字符大小写;

     ^~:对URI的左半部分做匹配检查,不区分字符大小写;

            匹配优先级:=、^~、~/~*、不带符号;

     8、alias path;

            定义路径别名,文档映射的一种机制;仅能用于location上下文;


                          alias  /bbs/ /web/forum/


                          http://www.magedu.com/bbs/a.jpg          


                                 location  /bbs/ {

                                        alias  /web/forum/;

                                 }


                                 /web/forum/a.jpg


                                 location  /bbs/ {

                                        root  /web/forum/;

                                 }


                                 /web/forum/bbs/a.jpg



注意:

                                 root指令:给定的路径对应于location中的/uri/左侧的/;

                                 alias指令:给定的路径对应于location中的/uri/右侧的/;


9、index file ...;

可用位置:http, server, location


默认主面;


10、error_page code ... [=[response]] uri;

根据用户请求的资源的http响应的状态码实现错误页重定向;


                          http://www.magedu.com/hello.html--> 因为资源不存在而被改为对

                                 http://www.magedu.com/404.html


定义客户端请求的相关配置


12、keepalive_timeout timeout[header_timeout];

设定保持连接的超时时长,0表示禁止长连接 ;默认为75s;


13、keepalive_requests number;

在一次长连接上所允许请求的资源的最大数量,默认为100;


14、keepalive_disable none | browser ...;

对哪种浏览器禁用长连接;


15、send_timeout time;

向客户端发送响应报文的超时时长; 特别地,是指两次写操作之间的间隔时长;


16、client_body_buffer_size size;

用于接收客户端请求报文的body部分的缓冲区大小;默认为16k;超时此大小时,其将被暂存到磁盘上;


17、client_body_temp_path path [level1[level2 [level3]]];

设定用于存储客户端请求报文的body部分的临时存储路径及子目录结构和数量;


                          /var/tmp/body  2 1 2

                                 00-ff



对客户的请求进行限制的相关配置

18、limit_rate rate;

限制响应给客户端的传输速率,单位是bytes/second,0表示无限制;


19、limit_except method ... { ... };

限制对指定的请求方法之外的其它方法的使用客户端;


                          limit_exceptGET POST {

                                 allow  172.18.0.0/16;

                                 denyall;

                          }


表示除了GET和POST之外的其它方法仅允许172.18.0.0/16中的主机使用;


文件操作优化的配置:

20、aio on | off | threads[=pool];

是否启用aio功能;


21、directio size | off;


22、open_file_cache off;

                          open_file_cachemax=N [inactive=time];

                                 nginx可以缓存以下三种信息:

                                        (1)文件的描述符、文件大小和最近一次的修改时间;

                                        (2)打开的目录的结构;

                                        (3)没有找到的或者没有权限访问的文件的相关信息;


                                 max=N:可缓存的缓存项上限;达到上限后会使用LRU算法实现缓存管理;


                                 inactive=time:缓存项的超时时长,在此处指定的时长内未被命中的缓存项即为非活动项;


23、open_file_cache_errors on | off;

是否缓存查找时发生错误的文件一类的信息;


24、open_file_cache_min_uses number;

在open_file_cache指令的inactive参数指定的时长内,至少命中此处指定的次数方可不被归类到非活动项;


25、open_file_cache_valid time;

缓存项有效性的检查频率;默认是60s;


            ngx_http_access_module模块:

实现基于ip的访问控制功能;


26、allow address | CIDR | unix: | all;

27、deny address | CIDR | unix: | all;


可用上下文:http, server, location,limit_except


            ngx_http_auth_basic_module模块:

28、auth_basic string | off;

使用basic机制进行用户认证;


29、auth_basic_user_file file;

认证用的账号密码文件;


文件格式:

                                 name:password:commet


                          密码格式:

                                 htpasswd命令;


                                 location/admin/ {

                                 auth_basic"Admin Area";

                                 auth_basic_user_file/etc/nginx/.ngxpasswd;

                                 }


            ngx_http_stub_status_module模块:

用于输出nginx的基本状态信息;


                   Activeconnections: 1

                   serveraccepts handled requests

                   155155 298

                   Reading:0 Writing: 1 Waiting: 0              


                   Activeconnections:  处于活动状态的客户端连接的数量;

                   accepts:已经接受的客户端请求的总数;

                   handled:已经处理完成的客户端请求的总数;

                   requests:客户端发来的总的请求数;

                   Reading:处于读取客户端请求报文首部的连接数;

                   Writing:处于向客户端发送响应报文过程中的连接数;

                   Waiting:处于等待客户端发出请求的空闲连接数;


            ngx_http_referer_module模块:

                   Thengx_http_referer_module module is used to block access to a site for requestswith invalid values in the “Referer” header field.


 30、valid_referers none | blocked |server_names | string ...;

定义合法的referer数据;


         none:请求报文首部没有referer首部;

         blocked:请求报文的referer首部没有值;

         server_names:其值是主机名;

        arbitrarystring:直接字符串,可以使用*作为通配符;

        regularexpression:被指定的正则表达式模式匹配到的字符串;要使用~起始;


        valid_referersnone blocked server_names *.magedu.com magedu.* ~\.magedu\.;


                          if($invalid_referer) {

                                 return403;

                          }