nginx学习笔记(1)

nginx学习笔记(1)

前言:本着带着问题学习的思路,重新学习nginx,重新认识nginx,将自己所学到知识点,慢慢融合到一起,达到温故知新的效果。

一、简介

​ Nginx("engine x")是一个开源的,支持高性能,高并发的www服务和代理服务软件。它是由俄罗斯人Igor Sysoev开发的,最初被应用在俄罗斯的大型网站www.rambler.ru上。后来作者将源代码以类BSD许可证的形式开源出来供全球使用。

​ Nginx因具有高并发(特别是静态资源)、占用系统资源少等特性,且功能丰富而逐渐流行起来。

​ 从软件大的功能应用方面,Nginx不但是一个优秀的Web服务软件,还可以具有反向代理负载均衡功能。在反向代理负载均衡功能方面,它类似于大名鼎鼎的LVS负载均衡以及Haproxy专业代理软件,但是Nginx部署起来更为简单、方便;在缓存服务方面,它又类似于squid等专业的缓存服务软件。

二、对比

1、 nginx相对于apache的优点
  • 轻量级,同样起web 服务,比apache占用更少的内存及资源
  • 抗并发,nginx 处理请求是异步非阻塞的,而apache 则是阻塞型的,在高并发下nginx 能保持低资源低消耗高性能
  • 高度模块化的设计,编写模块相对简单
  • 提供负载均衡
  • 社区活跃,各种高性能模块出品迅速
2、 apache 相对于nginx 的优点
  • apache的 rewrite 比nginx 的强大 ;
  • 支持动态页面;
  • 支持的模块多,基本涵盖所有应用;
  • 性能稳定,而nginx相对bug较多。
3、两者优缺点比较
  • Nginx 配置简洁, Apache 复杂 ;

  • Nginx 静态处理性能比 Apache 高 3倍以上 ;

  • Apache 对 PHP 支持比较简单,Nginx 需要配合其他后端用;

  • Apache 的组件比 Nginx 多 ;

  • apache是同步多进程模型,一个连接对应一个进程;nginx是异步的,多个连接(万级别)可以对应一个进程;

  • nginx处理静态文件好,耗费内存少;

  • 动态请求由apache去做,nginx只适合静态和反向;

  • Nginx适合做前端服务器,负载性能很好;

  • Nginx本身就是一个反向代理服务器 ,且支持负载均衡

三、准备

1、内核优化
1)、修改Linux系统对用户的关于打开文件数的软限制和硬限制。
第一步,修改limits.conf文件,并添加:
[root@nginx ~]# vim /etc/security/limits.conf
* soft nofile 65535
* hard nofile 65535
其中'*'号表示修改所有用户的限制;soft或hard指定要修改软限制还是硬限制;65536则指定了想要修改的新的限制值,即最大打开文件数(请注意软限制值要小于或等于硬限制)。修改完后保存文件。
第二步,修改/etc/pam.d/login文件,在文件中添加如下行:
[root@nginx ~]# vim /etc/pam.d/login
sessionrequired /lib/security/pam_limits.so
这是告诉Linux在用户完成系统登录后,应该调用pam_limits.so模块来设置系统对该用户可使用的各种资源数量的最大限制(包括用户可打开的最大文件数限制),而pam_limits.so模块就会从/etc/security/limits.conf文件中读取配置来设置这些限制值。修改完后保存此文件。
第三步,查看Linux系统级的最大打开文件数限制,使用如下命令:
[root@nginx ~]# cat/proc/sys/fs/file-max
32568
	这表明这台Linux系统最多允许同时打开(即包含所有用户打开文件数总和)32568个文件,是Linux系统级硬限制,所有用户级的打开文件数限制都不应超过这个数值。通常这个系统级硬限制是Linux系统在启动时根据系统硬件资源状况计算出来的最佳的最大同时打开文件数限制,如果没有特殊需要,不应该修改此限制,除非想为用户级打开文件数限制设置超过此限制的值。修改此硬限制的方法是修改/etc/sysctl.conf文件内fs.file-max= 131072
	这是让Linux在启动完成后强行将系统级打开文件数硬限制设置为131072。修改完后保存此文件。
完成上述步骤后重启系统,一般情况下就可以将Linux系统对指定用户的单一进程允许同时打开的最大文件数限制设为指定的数值。如果重启后用ulimit-n命令查看用户可打开文件数限制仍然低于上述步骤中设置的最大值,这可能是因为在用户登录脚本/etc/profile中使用ulimit-n命令已经将用户可同时打开的文件数做了限制。由于通过ulimit-n修改系统对用户可同时打开文件的最大数限制时,新修改的值只能小于或等于上次ulimit-n设置的值,因此想用此命令增大这个限制值是不可能的。
	所以,如果有上述问题存在,就只能去打开/etc/profile脚本文件,在文件中查找是否使用了ulimit-n限制了用户可同时打开的最大文件数量,如果找到,则删除这行命令,或者将其设置的值改为合适的值,然后保存文件,用户退出并重新登录系统即可。
	通过上述步骤,就为支持高并发TCP连接处理的通讯处理程序解除关于打开文件数量方面的系统限制。
2)、内核TCP参数方面
Linux系统下,TCP连接断开后,会以TIME_WAIT状态保留一定的时间,然后才会释放端口。当并发请求过多的时候,就会产生大量的TIME_WAIT状态的连接,无法及时断开的话,会占用大量的端口资源和服务器资源。这个时候我们可以优化TCP的内核参数,来及时将TIME_WAIT状态的端口清理掉。
下面介绍的方法只对拥有大量TIME_WAIT状态的连接导致系统资源消耗有效,如果不是这种情况下,效果可能不明显。可以使用netstat命令去查TIME_WAIT状态的连接状态,输入下面的组合命令,查看当前TCP连接的状态和对应的连接数量:
[root@nginx ~]# netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}'  
这个命令会输出类似下面的结果:
LAST_ACK16
SYN_RECV348
ESTABLISHED70
FIN_WAIT1229
FIN_WAIT230
CLOSING33
TIME_WAIT18098
我们只用关心TIME_WAIT的个数,在这里可以看到,有18000多个TIME_WAIT,这样就占用了18000多个端口。要知道端口的数量只有65535个,占用一个少一个,会严重的影响到后继的新连接。这种情况下,我们就有必要调整下Linux的TCP内核参数,让系统更快的释放TIME_WAIT连接。
编辑配置文件:/etc/sysctl.conf,在这个文件中,加入下面的几行内容:
[root@nginx ~]# vim /etc/sysctl.conf
net.ipv4.tcp_syncookies= 1
net.ipv4.tcp_tw_reuse= 1
net.ipv4.tcp_tw_recycle= 1
net.ipv4.tcp_fin_timeout= 30
输入下面的命令,让内核参数生效:
[root@nginx ~]# sysctl-p
简单的说明上面的参数的含义:
net.ipv4.tcp_syncookies= 1
表示开启SYNCookies。当出现SYN等待队列溢出时,启用cookies来处理,可防范少量SYN攻击,默认为0,表示关闭;
net.ipv4.tcp_tw_reuse= 1
表示开启重用。允许将TIME-WAITsockets重新用于新的TCP连接,默认为0,表示关闭;
net.ipv4.tcp_tw_recycle= 1
表示开启TCP连接中TIME-WAITsockets的快速回收,默认为0,表示关闭;
net.ipv4.tcp_fin_timeout
修改系統默认的TIMEOUT 时间。
# 总结:time_wait数量控制方法可以总结为八个字:“增数、扩列、重回收,重利用”。
2、dns优化

​ NSCD是服务缓存守护进程,主旨在于提高客户端访问速度。它以服务的形式存在系统中

​ NSCD(Name Service Cache Daemon)缓存passwd、hosts、group三类信息。DNS服务器在针对大流量解析时在没有缓存机制的情况下会一直等待,直到收到结果的返回,这样往往会显的“措手不及”(延时高,甚至有可能被限制访问)。因此在DNS服务其中设立一个缓存机制,以此达到两点效果:

​ a、优化DNS相应速度

​ b、减少DNS服务器对公网的依赖

1)、yum安装
[root@nginx ~]# yum -y install epel-release
[root@nginx ~]# yum -y install wget nscd 
[root@nginx ~]# systemctl start nscd.service 
[root@nginx ~]# systemctl enable nscd.service 
2)、配置文件

​ nscd缓存服务的配置文件是/etc/nscd.conf

[root@nginx ~]# cat /etc/nscd.conf | grep -v “#”
	enable-cache		   passwd		yes
	positive-time-to-live	passwd		600
	negative-time-to-live	passwd		20
	suggested-size		passwd		211
	check-files		    passwd		yes
	persistent		    passwd		yes
	shared			   passwd		yes
	max-db-size		    passwd		33554432
	auto-propagate		passwd		yes

	enable-cache		   group		yes
	positive-time-to-live	group		3600
	negative-time-to-live	group		60
	suggested-size		group		211
	check-files		    group		yes
	persistent	        group		yes
	shared			   group		yes
	max-db-size		    group		33554432
	auto-propagate		group		yes

	enable-cache		   hosts		yes
	positive-time-to-live	hosts		3600
	negative-time-to-live	hosts		20
	suggested-size		    hosts		211
	check-files		hosts		yes
	persistent		hosts		yes
	shared			hosts		yes
	max-db-size		hosts		33554432

	enable-cache		    services	yes
	positive-time-to-live	services	28800
	negative-time-to-live	services	20
	suggested-size		    services	211
	check-files		services	yes
	persistent		services	yes
	shared			services	yes
	max-db-size		services	33554432

	enable-cache		   netgroup	    yes
	positive-time-to-live	netgroup	28800
	negative-time-to-live	netgroup	20
	suggested-size		    netgroup	211
	check-files		netgroup	yes
	persistent		netgroup	yes
	shared			netgroup	yes
	max-db-size		netgroup	33554432

​ 其中所提到的三个组件(passwd、group、hosts),会分别记录三个库,对应/etc/passwd,/etc/hosts,/etc/resolv.conf。每个库保存两份文件,一份是找到记录的,一份是没有找到记录的。每一种缓存都保存有生存时间(TTL)

​ 参数解释

# enable-cache 指定对DNS解析进行缓存
# positive-time-to-live 对解析成功的DNS结果进行缓存时间
# negative-time-to-live 指对解析成功的DNS结果进行缓存的时间,例如网络故障导致DNS解析失败或者请求的DNS条目没有配置等
# suggested-size 是NSCD内部哈希表的大小,如果缓存条目数量大于默认的211,如大于10倍,那么修改此值。
# check-files 指是否检查/etc/hosts文件的变化
# persistent 重启NSCD进程时是否保留已缓存的条目
# shared 是否允许客户端直接查询NSCD的内存镜像以获得结果
# max-db-size 是指DNS的缓存大小,以字节为单位
3)、简单命令
[root@nginx ~]# nscd  -g:可以看到当前nscd服务的配置信息
清空各个组件的缓存条目:
[root@nginx ~]# nscd -i passwd
[root@nginx ~]# nscd -i group
[root@nginx ~]# nscd -i hosts
上一篇:python安装


下一篇:HBASE 高可用