《深⼊理解Nginx-模块开发与架构解析》⼀、研究Nginx前的准备⼯作
1、常见负载均衡
1)Apache:被设计成了⼀个重量级的、不⽀持⾼并发的Web服务器
2)Lighttpd和Nginx都是轻量级、⾼性能的Web服务器;欧美前者⽤的多,国内Nginx⽤的多
2、Nginx特点:
1)快
2)⾼扩展性
3)⾼可靠性
4)低内存消耗
5)单机⽀持10w+并发连接
6)热部署
7)⾃由的BSD许可协议
3、使⽤Nginx的必备软件:
1)GCC编译器
2)PCRE库
3)zlib库
4)OpenSSL开发库
4、修改内核参数:
1)/f
2)使修改⽣效:sysctl–p
5、安装Nginx
./configure
make
makeinstall
6、Nginx平滑升级步骤
1)通知正在运⾏的旧版本Nginx准备升级:Nginx会将pid⽂件重命名
2)启动新版本的Nginx
3)向旧版本master发送信号,使其优雅关闭
⼆、Nginx的配置
1、⼀个master进程来管理多个worker进程,work进程提供互联⽹服务,master只负责监控管理work。
注:work进程的数量与服务器上的CPU核⼼数相等,最好绑定CPU,从⽽避免进程切换开销。
2、块配置项由⼀个块配置项名和⼀对⼤括号组成,块配置项可以嵌套,内层块直接继承外层块,内层屏蔽外层相同配置项值。
注:所有的事件类配置都要在events块中
3、配置项的语法格式:配置项名 配置值1 配置值2;
注:配置项值可以是数字或字符串(包括正则表达式)
4、变量使⽤的时候要在前⾯加上$符号,只有少数模块⽀持,并不通⽤。
5、⽤于调试进程和定位问题的配置项
1)是否以守护进程⽅式运⾏Nginx
a、语法:daemonon|off
b、默认:daemon on
注:守护进程是脱离终端并且在后台运⾏的进程
2)是否以master/worker⽅式⼯作
a、语法:master_processon | off
b、master_processon
3)error⽇志的设置
a、语法:error_log/path/file level
b、默认:error_loglogs/error.log error
注:a、/path/file是/dev/null,则不会输出任何⽇志,即关闭error⽇志
b、/path/file是stderr,则会输出到标准错误⽂件中
c、level是输出级别,有:debug、info、notice、warn、error、crit、alert、emerg
d、若设置debug,必须在configure时加⼊ –with-debug配置项
4)是否处理⼏个特殊的调试点,语法:debug_points[stop|abort]
5)仅对指定的客户端输出debug级别的⽇志:debug_connection[IP| CIDR]
6)限制coredump核⼼转储⽂件的⼤⼩:worker_rlimit_coresize
注:核⼼转储:在Linux系统中,当进程发⽣错误或⼿袋信号⽽终⽌时,系统会将进程执⾏时的内存内容(核⼼映像)写⼊⼀个我⽂件(core⽂件),以作为调试之⽤
7)指定coredump⽂件⽣成⽬录:working_directorypath
6、正常运⾏的配置项
1)定义环境变量
a、语法:env VAR |VAR=VALUE
2)嵌⼊其他配置⽂件
a、语法:include/path/file
3)pid⽂件的路径
a、语法:pidpath/file
b、默认:pidlogs/nginx.pid
注:pid⽂件保存master进程ID
4)Nginx worker进程运⾏的⽤户及⽤户组
a、语法:userusername[groupname];
b、默认:usernobody nobody;
注:user⽤于work进程运⾏在哪个⽤户和⽤户组下
5)指定Nginx worker进程可以打开的最⼤句柄描述符个数
a、语法:work_rlimit_nofilelimit;
6)限制信号队列
a、语法:work_rlimit_sigpendinglimit;
7、优化性能的配置
1)Nginx worker进程个数
a、语法:worker_processesnumber;
b、默认:1
注:⾮阻塞式调⽤个数=CPU数,阻塞式调⽤>CPU数
2)绑定Nginx worker进程到指定的CPU内核
a、语法:worker_cpu_affinitycpumask[cpumask…] 3)SSL硬件加速
a、语法:ssl_enginedevice;
4)系统调⽤gettimeofday的执⾏频率
a、语法:timer_resolutiont;
5)Nginx worker进程优先级设置
a、语法:worker_prioritynice;
b、默认 0
注:nice值是进程的静态优先级,取值范围是-20~+19,-20是最⾼优先级,不建议⽐内核进程的nice值(通常-5)还要⼩
8、事件类配置项
1)是否打开accept锁(负载均衡锁)
a、语法:accept_mutex[on | off]
b、默认 on
注:这把锁可以让多个worker进程轮流地、序列化地与新的客户端建⽴TCP连接
2)lock⽂件的路径
a、语法:lock_filepath/file
b、默认:logs/nginx.lock
3)使⽤accept锁后到真正建⽴连接之间的延迟时间
a、语法:accept_mutex_delayNms
b、默认:500ms
注:worker进程取accept锁没取到的话,⾄少要等accept_mutex_delay定义的时间间隔后才能再次试图取锁
4)批量建⽴新连接
a、语法:multi_accept[on | off]
b、默认:off
5)选择事件模型
a、语法:user[kqueue| rtsig | epoll | /dev/poll | select | poll |eventport];
b、默认:Nginx会⾃动使⽤最合适的事件类型
6)每个worker的最⼤连接数
a、语法:worker_connectionsnumber;
9、静态Web服务器的主要功能由ngx_http_core_module模块实现,并包含多个server块和location块。
注:所有的HTTP配置项都必须直属于http块、server块、location块、upstream块或if块等
10、虚拟主机与请求的分发
server_name:对应⽤户请求中的主机域名,通过server块来定义虚拟主机,每个server块就是⼀个虚拟主机,只处理与之相对应的主机域名请求。
1)监听端⼝
a、语法:listenaddress:port
b、默认:80
nginx和apache区别c、配置块:server
注:listen参数
a、default:将所在的server块作为整个Web服务的默认server块。若不设置,则配置中第⼀个server块作为默认server块。(当⼀个请求⽆法匹配配置⽂件中的所有主机域名时,就会选⽤默认的虚拟主机)
b、default_server:同上
c、backlog=num:TCP中backlog队列的⼤⼩
d、rcvbuf=size:监听句柄的SO_RCVBUF参数
e、sndbuf=size:监听句柄的SO_SNDBUF参数
f、accept_filter:accept过滤器
g、deferred:⽤户真的发送请求数据时,内核才会唤醒worker进程处理这个连接
h、bind:绑定当前端⼝/地址对
i、ssl:在当前监听的端⼝上建⽴的连接必须基于SSL协议
2)主机名称
a、语法:server_namename
b、默认:””
c、配置块:server
注:server_name后可以跟多个主机名称,与Host的匹配优先级为:
a、⾸先选择所有字符串完全匹配的
b、其次在选择通配符在前⾯的
c、再次选择通配符在后⾯的
d、最后选择使⽤正则表达式才匹配的
3)每个散列桶占⽤的内存⼤⼩
a、语法:server_names_hash_bucket_sizesize
b、默认:32|64|128
c、配置块:http、server、location
4)每个散列桶占⽤内存的最⼤值
a、语法:server_names_hash_max_size
b、默认:512
c、配置块:http、server、location
注:该值越⼤,消耗内存越多,key的冲突率越低。
5)重定向主机名称的处理
a、语法:server_name_in_redirecton | off
b、默认:on
c、配置块:http、server、location
注:on,重定向请求时会使⽤server_name⾥配置的第⼀个主机名代替原先请求中的Host头部;off,重定向请求时使⽤请求本⾝的Host 头部
6)location

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。