一、什么是Nginx

在nginx官方站点是这样描述它的(nginx.org):

NGINX is a free, open-source, high-performance HTTP server and reverse proxy, as well as an IMAP/POP3 proxy server. NGINX is known for its high performance, stability, rich feature set, simple configuration, and low resource consumption.


NGINX is one of a handful of servers written to address the C10K problem. Unlike traditional servers, NGINX doesn’t rely on threads to handle requests. Instead it uses a much more scalable event-driven (asynchronous) architecture. This architecture uses small, but more importantly, predictable amounts of memory under load. Even if you don’t expect to handle thousands of simultaneous requests, you can still benefit from NGINX’s high-performance and small memory footprint. NGINX scales in all directions: from the smallest VPS all the way up to large clusters of servers.


NGINX powers several high-visibility sites, such as Netflix, Hulu, Pinterest, CloudFlare, Airbnb, WordPress.com, GitHub, SoundCloud, Zynga, Eventbrite, Zappos, Media Temple, Heroku, RightScale, Engine Yard, MaxCDN and many others.


Getting StartedCommunity3rd Party ModulesContributing


    总结:nginx其功能丰富,既可以作为web服务器,也可以作为反向代理服务,imap/pop3反向代理服务器;能够快速响应静态页面的请求,且支持FastCGI,ssl,URL rewrite ,Gzip等大量功能,并且支持大量的第三方模块扩展。


二、Nginx的特性

 

1.采用模块化设计,较好的扩展性;
2.高可靠性,nginx基于master/worker;
3.支持热部署,可平滑升级到新版本;
4.低内存消耗,10000个keep-alive连接模式下的非活动连接仅消耗2.5M内存;
5.支持异步非阻塞模式及事件驱动模型,每个进程处理多个请求;
6.内存映射:由进程内存直接映射磁盘上的内容至内存

三、Nginx模块化结构

nginx的模块化结构包括核心模块,标准模块,第三方模块

    核心模块:核心模块是nginx正常运行不可缺少的模块,主要为nginx提供最基本的核心模块,包括进程管理,权限管理等

    标准模块:在编译安装后所包含的模快,包括可选http模块,邮件服务模块等

    第三方模块:第三方模块由各程序人员或公司开源出来的自研模块;nginx站点第三方模块地址:https://www.nginx.com/resources/wiki/modules/

四、Nginx服务器进程

nginx服务进程分为三大类:

1:Master主进程:主进程主要功能用于管理内部其他进程及平滑升级功能

2:Worker工作进程:由主进程生成,生成数量可有配置文件进行指定,其主要功能用于响应其请求

3:缓存相关进程主要分为两类:1)cache loader :载入缓存对象;2)cache manager 管理缓存对象


五、Nginx服务器的web请求处理机制

Nginx在处理请求时采用了异步非阻塞及事件驱动模型方式;

 具体过程

    当某个工作进程接收到客户端发送的请求以后,调用IO进行处理,如果不能立即得到结果,将请求放入一个待处理的事件列表,使用非阻塞IO方式调用“事件处理器”来处理该请求,事件驱动模型让工作进程可以同时处理多个请求,也不必关心IO具体状态,IO的具体调用完全是由事件驱动模型来管理。待IO调用完毕后再通知工作进程事件准备就绪,当该工作进程收到通知后会暂时挂起当前处理事务,去响应客户端的请求。

    

事件处理库又被成为多路复用,最常见的就包括以下三种;select;poll;epoll

    epoll库是被公认为最优秀的事件驱动模型,epoll库通过调用通知内核创建一个有N个描述符的事件列表,然后给这些描述符设置所关注事件,并将其添加到内核事件列表中去。其他事件处理模型请查看本文附件‘事件驱动模型种类’;

    使用异步非阻塞及时间驱动模型方式减少了对工作进程在IO调用上的阻塞延迟及进程占用的压力。大大加速了Nginx的响应和处理能力

六、安装使用Nginx


1、安装开发包

yum install -y "Development Tools"

2、解决依赖

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

  • pcre-devel用于URL rewrite ,需要使用到正则表达式

  • zlib-devel用于提供数据传送送可以支持压缩

  • openssl-devel用于支持https

3、创建用户

创建系统用户nginx

useradd -r nginx


4、准备源码包:

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

5、安装

1)解压

tar -xf nginx-1.8.0.tar.gz

2)检查安装环境及自定义安装模块并生成Makefile

./configure --prefix=/usr/local/nginx --conf-path=/etc/nginx/nginx.conf --error-log-path=/var/log/nginx/error.log --http-log-path=/var/log/nginx/access.log --pid-path=/var/run/nginx.pid --lock-path=/var/run/nginx.lock --user=nginx --group=nginx --with-http_ssl_module --with-http_v2_module --with-http_dav_module --with-http_stub_status_module --with-threads --with-file-aio

注:centos 6不支持http_v2

3)编译依赖的源码,生成所有相关的目标文件

make

4)将可执行程序安装

make install

5)创建执行环境

/etc/profile

export PATH=/usr/local/nginx/sbin:$PATH



6、nginx服务的启动(注意:在这之前一定要关掉其他占用同端口80程序)

[root@localhost sbin]# nginx -h

nginx version: nginx/1.8.0

Usage: nginx [-?hvVtq] [-s signal] [-c filename] [-p prefix] [-g directives]


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: /usr/local/nginx/)指定服务器路径前缀至文件路径

  -c filename   : set configuration file (default: /etc/nginx/nginx.conf)指定配置文件路径

  -g directives : set global directives out of configuration file附加配置文件路径指定


nginx服务启动可直接执行二进制文件./nginx

重载服务:nginx -s reload



7、Nginx的信号机制:

 

TERM, INT

快速关闭

QUIT

从容关闭

HUP

重新加载,用新的配置开始新的工作进程

USER1

重新打开日志文件

USER2

平滑升级可执行程序

WINCH

从容关闭工作进程

 

[root@localhost ~]# ps -aux|grep nginx

Warning: bad syntax, perhaps a bogus '-'? See /usr/share/doc/procps-3.2.8/FAQ

root      3457  0.0  0.0  44628  1756 ?        Ss   Oct15   0:00 nginx: master process ./nginx

nginx    11157  0.0  0.0  45072  1792 ?        S    16:58   0:00 nginx: worker process

root     11221  0.0  0.0 103332   860 pts/2    S+   17:17   0:00 grep nginx

[root@localhost ~]# kill -quit 3457

[root@localhost ~]# ps -aux|grep nginx

Warning: bad syntax, perhaps a bogus '-'? See /usr/share/doc/procps-3.2.8/FAQ

root     11225  2.0  0.0 103328   856 pts/2    S+   17:17   0:00 grep nginx