Nginx (web server web reverse proxy)

I/O类型:

        同步和异步:synchronous,sayncronous,关注的是消息通知机制。同步请求:请求后等待一段时间返回最终需要的结果。异步请求:发送请求立即得到返回,等到处理结果出来后会通过回调函数来处理处理结果。

        阻塞和非阻塞:block,nonblock,观察角度是调用者。阻塞:在等到结果出来之前是被挂起的,得到结果后才能继续。非阻塞:调用者在结果返回之前不会被挂起。


I/O模型:取数据分为两断,从硬盘到内核内存和从内核内存复制进程内存。从内核内存复制数据到进程内存的过程称之为IO。

        blocking IO:阻塞式IO,调用者被挂起,如下图:

12230408-c8b30331f20a41dcb224d20719ffa1da.png

        nonblocking IO:非阻塞型IO,如下图:

12231306-35dca310d92e4184bd4c0b3f42bee2c1.png

        IO multiplexing:复用型IO,把请求扔给助理,请求者依然被挂起。prefork模式,请求发给master,master把请求分给线程,master继续接受请求。

                select(),poll()

        signal driven IO:事件驱动型IO,从磁盘取数据到内存空间这个过程是阻塞的,取完数据通过事件驱动,调用者通过回调函数取数据。从内核空间复制到进程空间这部分是非阻塞的,进程可以接受多个请求。event模型。

        asynchronous IO:异步IO,得到请求数据后,进程将这取数据的两部分都做好后再通知调用者来取数据,进程是解放的,可以接受多个请求。event也支持异步请求。性能真正的得到提升。

        prefork和worker用的都是复用型机制。event是事件驱动型IO,一个进程响应多个请求。

五种IO的比较:

QQ截图20180204222232.png

Nginx特性:

        模块化设计,较好的扩展性,高可靠,低内存消耗,支持热部署,主控进程master进程生成多个worker子进程,master负责解析配置等。低内存消耗体现在10000个keep-alive模式下的connection,仅需要2.5M内存。热部署体现在,不停机而更新配置文件,日志文件滚动,升级程序版本等。

        支持事件驱动,支持AIO,支持内存映射mmap机制,支持异步IO,支持event。

基本功能:

        静态资源的web服务器,能缓存打开的文件描述符。支持http、smtp、pop3协议的反向代理。缓存加速,负载均衡,支持FsatCGI(fpm,LAMP),uWSGI(Python)等。模块化(非DSO机制),过滤zip,SSI及图像的大小调整,支持SSL。

扩展功能:

        基于名称和IP的虚拟主机,支持keepalive,支持平滑升级,定制访问日志,支持使用日志缓冲区提供日志存储性能,支持url rewrite,支持路径别名,支持基于IP及拥挤的访问控制,支持速率限制,支持并发限制。

Nginx的基本架构:

        一个master进程,生成一个或多个worker进程。sendfile:将数据直接从内核内存发送给请求端。事件驱动:kqueue, epoll, /dev/poll,消息通知:select, poll, rt signals,支持sendfile, sendfile64,文件AIO,支持mmap。

Nginx工作模式:

        非阻塞,事件驱动,由一个master进程生成多个worker线程,每个worker线程响应n个请求,worker * n

模块类型:

        核心模块,Standard HTTP moudules,Optional HTTP modules,Mail modules,3rd part modules。


编译安装


安装环境:

要使用编译安装先安装开发环境。

yum groupinstall "Development Tools" "Server Platform Development"

然后安装 pcre-devel 用来扩展正则表达式实现Rewrite重写功能:

yum install pcre-devel

再安装SSL需要的包:

yum install openssl openssl-devel

安装nginx之前先看下帮助,进入到安装目录后使用./configure --help来查看帮助。

        --prefix=PATH                         set installation prefix

        --sbin-path=PATH                  set nginx binary pathname

        --modules-path=PATH           set modules path

        --conf-path=PATH                  set nginx.conf pathname

        --error-log-path=PATH           set error log pathname

        --pid-path=PATH                    set nginx.pid pathname

        --lock-path=PATH                   set nginx.lock pathname

        --user=USER                            set non-privileged user for worker processes

        --group=GROUP                     set non-privileged group for worker processes

        --build=NAME                         set build name

        --builddir=DIR                         set build directory

        ......

编译安装:

./configure --prefix=/usr/local/nginx \
--conf-path=/etc/nginx/nginx.conf \
--user=nginx \
--group=nginx \
--error-log-path=/var/log/nginx/error.log \
--http-log-path=/var/log/nginx/access.log \
--pid-path=/varrun/nginx/nginx.pid \
--lock-path=/var/lock/nginx.lock \
--with-http_ssl_module \
--with-http_stub_status_module \
--without-http_gzip_module \
--with-http_flv_module \
--with-http_mp4_module \
--with-zlib=/usr/lib64/libz.so.1.2.7 \
--http-client-body-temp-path=/var/tmp/nginx/client \
--http-proxy-temp-path=/var/tmp/nginx/proxy \
--http-fastcgi-temp-path=/var/tmp/nginx/fastcgi \
--http-uwsgi-temp-path=/var/log/nginx/uwsgi

创建目录:

mkdir -pv /var/tmp/nginx/{client,proxy,fastcgi,uwsgi}

启动进程:

/usr/local/nginx/sbin/nginx

编辑配置文件:

vim /etc/nginx/nginx.conf

配置文件分为:

        main配置段,这是全局配置。

        event { } 配置段,定义event模型工作特性。

        http { } 配置段,定义http协议相关的配置。

配置指令:

分号结尾。支持使用变量,有内置变量和自定义变量,使用如下命令可以设置自定义变量:

set varaname value

正常运行的必备配置:

        1、user指定运行nginx的用户和组:user username groupname,默认为注释,使用编译时的用户。

        2、pid指定nginx守护进程的pid文件,默认为注释,使用编译时的值。

        3、worker_rlimit_nofile指定所有worker进程所能够打开的最大句柄数。

性能优化相关的配置:

        1、worker_processes 为进程的个数,通常少于核心数,核心数减一。

        2、worker_cpu_affinity cpumask,设定worker进程绑定在那些cpu上,cpumask为cpu掩码,0000 0001代表第一颗cpu,0000 0002代表第二颗cpu,等等。例:worker_cpu_affinity 00000001 00000010 00000100; 

        3、timer_resolution计时器解析度,建议降低此值,可以减少gettimeofday()系统调用的次数。

        4、worker_priority number;指明worker进程的优先级,基于nice值,-20到19,-20的优先级最高。

事件相关配置:

        1、accept_mutex off | on;为on时worker进程轮流响应请求。

        2、lock_file /path/to/lock_file; accept_mutex 用到的锁文件路径。

        3、use [epoll|rtsig|select|poll];指定使用的事件模型,建议自行选择。

        4、worker_connections number;单个worker进程所处理的最大并发连接数量,最终的并发连接量要乘以worker_processes。

用于调试、定位问题:

        编译时要打开--with-debug才能生效,

        1、daemon on|off;是否以守护进程方式运行nginx,调试时应该设置为off;

        2、master_process on|off 是否以master/worker模式运行nginx;默认为on;调试时可设置off以方便追踪。

        3、error_log /path/to/error_log level;错误日志文件及其级别;默认为error级别;调试时可以使用debug级别,但要求在编译时必须使用--with-debug启用debug功能;

查看帮助信息

/usr/local/nginx/sbin/nginx -h

        nginx version: nginx/1.13.8

        Usage: nginx [-?hvVtTq] [-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

          -T            : test configuration, dump it 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

重载配置:

        /usr/local/nginx/sbin/nginx -s reload    重新加载配置文件,其他的stop, quit, reopen, reload