nginx学习笔记


      传统上基于进程或线程模型架构的web服务通过每进程或每线程处理并发连接请求,这势必会在网络和I/O操作时产生阻塞,其另一个必然结果则是对内存或CPU的利用率低下。生成一个新的进程/线程需要事先备好其运行时环境,这包括为其分配堆内存和栈内存,以及为其创建新的执行上下文等。这些操作都需要占用CPU,而且过多的进程/线程还会带来线程抖动或频繁的上下文切换,系统性能也会由此进一步下降。

      在设计的最初阶段,nginx的主要着眼点就是其高性能以及对物理计算资源的高密度利用,因此其采用了不同的架构模型。受启发于多种操作系统设计中基于“事件”的高级处理机制,nginx采用了模块化、事件驱动、异步、单线程及非阻塞的架构,并大量采用了多路复用及事件通知机制。在nginx中,连接请求由为数不多的几个仅包含一个线程的进程worker以高效的回环(run-loop)机制进行处理,而每个worker可以并行处理数千个的并发连接及请求。

      如果负载以CPU密集型应用为主,如SSL或压缩应用,则worker数应与CPU数相同;如果负载以IO密集型为主,如响应大量内容给客户端,则worker数应该为CPU个数的1.5或2倍。


一、nginx进程介绍:


       Nginx会按需同时运行多个进程:一个主进程(master)和几个工作进程(worker),配置了缓存时还会有缓存加载器进程(cache loader)和缓存管理器进程(cache manager)等。所有进程均是仅含有一个线程,并主要通过“共享内存”的机制实现进程间通信。主进程以root用户身份运行,而worker、cache loader和cache manager均应以非特权用户身份运行。

master主进程主要完成如下工作:
1. 读取并验正配置信息;
2. 创建、绑定及关闭套接字;
3. 启动、终止及维护worker进程的个数;
4. 无须中止服务而重新加载配置;
5. 程序平滑升级,启用新的二进制程序并在需要时回滚至老版本;
6. 重新打开日志文件,实现日志滚动;
7. 编译嵌入式perl脚本;

worker进程主要完成的任务包括:
1、解析http协议
2. 提供反向代理及过滤功能;
3. nginx任何能完成的其它任务;

cache loader进程主要完成的任务包括:
1. 检查缓存存储中的缓存对象;
2. 使用缓存元数据建立内存数据库;
接收、传入并处理来自客户端的连接;

cache manager进程的主要任务:
1. 缓存的失效及过期检验;


二、nginx特性:


在安装部署Nginx服务器时,一定要遵循:需要某个模块则安装,不需要则不要安装,每一个安装的模块都会影响Nginx的性能和占用系统资源。

    Nginx的特性:
        模块化设计、较好扩展性
        高可靠性
            master-->worker
        低内存消耗
            10000个keep-alive连接在Nginx仅消耗2.5MB
        支持热部署
            不停机而更新配置文件、更换日志文件、更新服务器程序版本
        
    基本功能:
        静态资源的web服务器,能缓存打开的文件 描述符
        http, smtp, pop3协议的反向代理服务器,缓存、负载均衡;
        支持FastCGI (fpm)
        模块化,非DSO机制,过滤器zip,SSI及图像大小调整;
        支持SSL
        
    扩展功能:
        基于名称和IP的虚拟主机;
        支持keepalive
        支持平滑升级
        定制访问日志 ,支持使用日志缓冲区提高日志存储性能
        支持url rewrite
        支持路径别名
        支持基于IP及用户的访问控制
        支持速率限制,支持并发数限制
        
    Nginx的基本架构:
        一个master进程,生成一个或多个worker
        事件驱动: epoll, kqueue, /dev/poll (event ports)
            消息通知:select, poll, rt signals
        支持sendfile, sendfile64
        支持AIO
        支持mmap
        
    nginx: 非阻塞、事件驱动、一个master生成一个或多个worker, 每个worker响应n个请求;


三、源码包安装:


        # ./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=/var/run/nginx/nginx.pid --lock-path=/var/lock/nginx.lock --with-http_ssl_module --with-http_stub_status_module --with-http_gzip_static_module --with-http_flv_module --with-http_mp4_module --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
        # make && make install


--prefix=/usr/local/nginx                                   指定nginx的编译安装目录
--conf-path=/etc/nginx/nginx.conf                  指定nginx的配置文件路径
--user=nginx                                                        指定运行nginx程序的用户
--group=nginx                                                     指定运行nginx程序的组
--error-log-path=/var/log/nginx/error.log       指定错误日志的位置
--http-log-path=/var/log/nginx/access.log      指定nginx访问日志的位置
--pid-path=/var/run/nginx/nginx.pid               指定nginx的pid文件的位置
--lock-path=/var/lock/nginx.lock                      指定nginx的lock文件的位置
--with-http_ssl_module                                       将ssl模块编译进Nginx
--with-http_stub_status_module                        将status模块编译进Nginx
--with-http_gzip_static_module                          将gzip模块(压缩)编译进Nginx
--with-http_flv_module                                       将flv模块编译仅Nginx
--with-http_mp4_module                                    将mp4模块编译仅Nginx
--http-client-body-temp-path=/var/tmp/nagix/client    指定http客户端请求缓存文件存放的路径
--http-proxy-temp-path=/var/tmp/nginx/proxy             指定http反向代理缓存文件存放目录的路径
--http-fastcgi-temp-path=/var/tmp/nginx/fastcgi          指定http  FastCGI缓存文件存放目录的路径

        
当预编译安装完成后:
Nginx的安装目录为:/usr/local/nginx
Nginx的配置文件目录为:/etc/nginx/nginx.conf
Nginx的错误日志存放的位置为:/var/log/nginx/error.log
Nginx的访问日志存放的位置为:/var/log/nginx/access.log
Nginx运行时生成的pid文件存放位置:/var/run/nginx/nginx.pid
Nginx的lock文件的存放位置:/var/lock/nginx.lock
http客户端请求缓存文件存放的路径:/var/tmp/nagix/client       这个目录系统不会创建,要自己手动创建
http反向代理缓存文件存放目录的路径:/var/tmp/nginx/proxy   这个目录系统不会创建,要自己手动创建       
http  FastCGI缓存文件存放目录的路:/var/tmp/nginx/fastcgi    这个目录系统不会创建,要自己手动创建


四、配置nginx配置文件使用vim打开是具备语法高亮功能

1、下载nginx.vim

下载页面:http://www.vim.org/scripts/script.php?script_id=1886

wget http://www.vim.org/scripts/download_script.php?src_id=14376 -O nginx.vim

2、安装nginx.vim

将nginx.vim放置于~/.vim/syntax/目录,

3、配置 nginx.vim

而后在~/.vim/filetype.vim中添加如下行:
au BufRead,BufNewFile /etc/nginx/*,/usr/local/nginx/conf/* if &ft == '' | setfiletype nginx | endif

其中“/etc/nginx”为nginx配置文件的目录。

五、配置文件:

主配置段的指令的类别:
            用于调试、定位问题
            正常运行必备的配置
            优化性能的配置
            事件相关的配置           

1、正常运行的必备配置:
            1、user USERNAME [GROUPNAME];
                指定运行worker进程的用户 和组,例如:
                user nginx nginx;                
            2、pid /path/to/pid_file;
                指定nginx的pid文件;                
            3、worker_rlimit_nofile #;  (就是指明一个进程能够打开的最大文件数)
                指定一个worker进程所能够打开的最大文件句柄数;                
            4、worker_rlimit_sigpending #;
                指定每个用户能够发往worker的信号的数量;

2、 优化性能相关的配置:
            1、worker_processes #:
                worker线程的个数;通常应该为物理CPU核心个数减1;
                
            2、worker_cpu_affinity cpumask ...;
                绑定worker进程至指定的CPU上;
                    CPUMASK
                        0001
                        0010
                        0100
                        1000
                    例如:
                        worker_cpu_affinity 00000001 00000010 00000100;
                
            3、worker_priority nice;
                -20, 19

3、事件相关的配置:
            1、accept_mutex [on|off]
                表示是否打开nginx的负载均衡锁;打开时表示能让多个worker轮流地、序列化地与响应新请求;               
            2、lock_file /path/to/lock_file;
            3、use [epoll|rgsig|select|poll];
                定义使用的事件模型;建议让Nginx自动选择;
            4、worker_connections #;
                每个worker进程所能够响应的最大并发请求数;


4、用于调试、定位问题:
            1、daemon [off|on]
                是否以守护进程方式启动nginx;
            2、master_process on|off;
                是否以master/worker模型来运行nginx;
            3、error_log /path/to/error_log level;
                错误日志文件及其级别;出于调试的目的,可以使用debug级别,但此级别只有在编译nginx时使用了--with-debug选项才有效;

                

5、网络连接相关的配置:
            1、keepalive_timeout time;
                保持连接的超时时长,默认为75s;
            2、keepalive_requests #;
                在一次保持连接上允许承载最大资源请求数;
            3、keepalive_disable [msie6|safari|none]
                为指定类型的浏览器禁用长连接;
            4、client_header_timeout time;
                读取http请求报文首部的超时时长;
            5、client_body_timeout time;
                读取http请求报文body部分的超时时长;
            6、send_timeout time;
                发送响应报文的超时时长;

6、对客户端请求进行限制:
            1、limit_except METHOD {...}
                指定对范围之外的其它方法的访问控制;
                
                limit_except GET {
                    allow 172.16.0.0/16;
                    deny all;
                }
            2、client_body_max_size SIZE;
                限制请求报文中body部分的上限;通过检测请求报文首部中的"Content_Length"来判定;
            3、limit_rate speed;    
                限制客户端每秒种传输的字节数,默认为0,表示无限制;


7、对内存或磁盘资源进行分配
            1、client_body_in_file_only on|clean|off;
                请求报文的body部分是否可暂存于磁盘;on表示允许,并且即使请求结束,也不会删除暂存的内容;clean表示会删除;off不允许暂存;

8、MIME类型相关的配置:
           1、types {}
                定义MIME types至文件的扩展名;
                    types {
                        text/html .html;
                        image/jpeg  .jpg;
                    }
                    
            2、default_type text/html;
            

9、基于IP的访问控制:
        http, server, location
            allow, deny

10、文件操作优化相关的配置:
            1、aio on|off;
            2、open_file_cache_errors on|off;
                是否缓存  在文件缓存中   缓存打开文件时  出现找不到路径,没有权限等的   错误信息;
            3、open_file_cache_min_uses time;
                每隔多久检查一次缓存中缓存条目的有效性;默认60s;


你可能感兴趣的:(nginx)