您的位置:首页 > 运维架构 > Nginx

nginx学习笔记

2015-08-23 20:45 447 查看
传统上基于进程或线程模型架构的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;
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: