1、Nginx安装需要的环境
(1)GCC编译器
yum install -y gcc
yum install -y gcc-c++
(2)PCRE(Perl Compatible Regular Expressions)库,Perl兼容的正则表达式库
yum install -y pcre pcre-devel
(3)zlib库
zib库用于对HTTP的内容做gzib格式的压缩
yum install -y zlib zlib-devel
(4)OpenSSL开发库
如果服务器不仅要支持HTTP,还要支持更安全的SSL协议上传输的HTTP,则要使用OpenSSL。另外如果想要使用MD5、SHAI等散列函数,也要使用它。
yum install -y openssl openssl-devel
以上所列的4个库只是完成Web服务器最基本功能所需要的
2、Nginx安装所使用的目录
(1)Nginx源代码存放的目录
本目录用于放置Nginx源码文件,以及第三方或自己开发的模块的源码;
(2)Nginx编译阶段产生的中间文件存放目录
放置configure命令执行后所产生的源文件及目录,以及make命令执行后所生成的目标文件和最终连接成功的二进制文件。
默认情况下,configure命令会将该目录命名未objs,并放置在Nginx源码目录下。
(3)部署目录
该目录存放实际Nginx服务运行期间所需要的二进制文件、配置文件等。默认情况下,该目录为/usr/local/nginx
(4)日志文件存放目录
日志文件通常会比较大,当研究Nginx的底层框架时,需要打开debug级别的日志,这个级别的日志非常详细,会导致日志文件的大小增长的极快,所需要预先分配一个更大的磁盘空间目录。
3、Linux内核参数的优化
默认情况下,Linux内核参数考虑的是最通常的情景,但针对支持高并发访问的Web服务器的定义,需要修改Linux内核参数,使得Nginx可以拥有更高的性能。
调整依据业务特点来进行,包括Web静态内容服务器、反向代理服务器或者提供图片缩略图功能(压缩图片)的服务器时,内核参数的调整都是不同的。
例子:针对高TCP网络参数做简单说明
首先需要修改/etc/sysctl.conf来更改内核参数。最常用的配置是:、
然后执行sysctl -p命令,使上述修改生效。
File-max---此参数表示进程可以同时打开的最大句柄数,这个参数直接限制了最大并发连接数,需根据实际情况配置。
Tcp_tw_reuse---此参数设置为1,表示允许将TIME-WAIT状态的SOCKET重新用于新的TCP连接,这对于服务器来说很有意义,因为服务器上总会有大量TIME-WAIT状态的连接。
Tcp_keepalive_time---这个参数表示keepalive启动时,tcp发送keepalive消息的频度。默认是2个小时,若将其设置得小一些,可以更快地清理无效得连接。
Tcp_fin_timeout---这个参数表示当服务器主动关闭连接时,socket保持在FIN-WAIT-2状态得最大时间。
Tcp_max_tw_buckets---这个参数表示操作系统允许TIME_WAIT套接字数量得最大值,如果超过这个数字,TIME_WAIT套接字将立刻被清除并打印告警信息。该参数默认时18000,过多得TIME_WAIT套接字会使得Web服务器变慢。
Tcp_max_syn_backlog---这个参数表示TCP三次握手建立阶段接收SYN请求队列得最大长度,默认为1024,将其设置得大一些可以使出现得Nginx繁忙来不及accept新连接的情况时,linux不至于丢失客户端发起的连接请求。
Ip_local_port_range---这个参数定义了UDP和TCP连接中本地端口的取值范围;
Net.ipv4.tcp_rmem---这个参数定义了TCP接收缓冲区(用于TCP接收滑动窗口)的最小值,默认值,最大值。
Net.ipv4.tcp_wmem---这个参数定义了TCP发送缓存(用于TCP发送滑动窗口)的最小值,默认值,最大值
Netdev_max_backlog---当网卡接收数据包的速度大于内核处理的速度时,会有一个队列保存这些数据包。这个参数表示该队列的最大值。
Rmem_default---这个参数表示内核套接字接收缓冲区默认的大小。
Wmem_default---这个参数表示内核套接字发送缓冲区默认的大小。
rmem_max---这个参数表示内核套接字接收缓冲区的最大大小。
Wmem_max---这个参数表示内核套接字发送缓存区的最大大小。
Tcp_syncookies---该参数与性能无关,用于解决TCP的SYN攻击。
4、Nginx安装
./configure---包括检测操作系统内核和已经安装的软件,参数的解析,中间目录的生成以及根据各种参数生成一些C源码文件、Makefile文件等。
这里可以带很详细的参数,在配置的时候可以选择;
make---根据makefile文件编译Nginx工程,并生成目标文件、最终的二进制文件。
make install---根据configure执行时的参数,将Nginx部署到指定的安装目录,包括相关目录的建立和二进制文件、配置文件的复制。
5、configure生成的文件
当configure执行成功时会生成objs目录,并在该目录下产生以下目录和文件:
(1)src---用于存放编译时产生的目标文件;
(2)Makefile---用于编译Nginx功能以及在加入install参数后安装Nginx。
(3)autoconf.err---保存configure执行过程中产生的结果。
(4)ngx_auto_headers.h 和ngx_auto_config.h保存一些宏。
(5)ngx_modules.c---关键文件,指明了每个模块咋Nginx中的优先级,当一个请求同时符合多个模块的处理规则时,将按照他们在ngx_modules数组中的顺序选择最靠前的模块处理。
6、Nginx的命令行控制
默认情况下,Nginx被安装的目录是/usr/local/nginx/
二进制文件的目录是/usr/local/nginx/sbin/nginx
配置文件路径为/usr/local/nginx/conf/nginx.conf
这些参数在练习的时候使用!
7、Nginx进程间的关系
在正式提供服务的产品环境下,部署Nginx时都会使用一个master进程来管理多个worker进程,一般情况下,worker进程的数量与服务器上的cup核数相等。每个worker进程都是繁忙的,而master进程很清闲,只负责监控管理worker进程。
worker进程之间通过共享内存、原子操作等一些进程间通信机制来实现负载均衡等功能。
- Nginx是支持单进程(master进程)提供服务的,那么为什么一定要配置成master-worker方式来启动呢?
(1)由于master进程不会对用户请求提供服务,只用于管理真正的worker进程,所以master进程可以是唯一的,仅专注于管理工作,为管理员提供命令服务,包括启动服务、停止服务、重载配置文件、平滑升级程序等。
master进程需要拥有较大的权限,worker进程的权限要小于或等于master进程,这样master进程才可以完全地管理worker进程。当任意地一个worker进程出现错误从而导致coredump时,master进程会立即启动新地worker进程继续服务。
(2)多个worker进程提供互联网请求时不但可以提高服务地健壮性,总要地是,可以充分利用常见地SMP多核架构,从而实现微观上地真正地多核并发处理。
- 为什么worker进程数量设置要和CPU核心数一致呢?
此为Nginx和Apache服务器的不同之处。
在Apache上,每个进程在一个时刻只处理一个请求,因此,如果希望Web服务器拥有并发处理的请求数更多,就要把Apache的进程或线程数设置的更多,通常会达到一台服务器几百个工作进程,这样大量的进程间切换会消耗大量的系统资源。
在Nginx上,一个worker进程可以同时处理的请求数只受限于内存的大小,而在在架构设计上,不同的wokrer进程之间处理并发请求时几乎没有同步锁的限制,wokrer进程通常不会进入睡眠状态,因此当Nginx上的进程数与CPU核心数相等时(最好每个worker进程绑定特定的CPU核),进程间切换的代价是最小的。
8、Nginx服务的基本配置
至少必须加载的几个核心模块和一个事件类模块,这些模块锁支持的配置项称为基本配置---所有的其它模块运行时都依赖的配置项。
- 用于调试、定位问题的配置项;
- 正常运行的必备配置项;
- 优化性能的配置项;
- 事件类配置项
(1)用于调试、定位问题的配置项
<1>是否以守护进程的方式运行Nginx
语法:daemon on | off
默认:daemon on
守护进程是脱离终端并且在后台进行的进程。它脱离终端是为了避免进程执行过程中的信息在任何终端上显示,这样进程也不会被任何终端所产生的信息所打断。
<2>是否已master/worker方式工作
语法:master_process on | off
默认:master_process on;
如果off,则不会fork出worker子进程来处理请求,而是用master进程自身来处理请求。
<3>error日志的设置
语法:error_log /path/file level
默认:error_log logs/error.log error
默认是logs/error.log文件,最好把它放到一个磁盘空间足够大的位置;
Path/file也可以是/dev/null,这样就不会输入任何日志了,这也是关闭error日志的唯一手段;/path/file也可以是stderr,这样日志会输出到标准错误文件中。
<4>是否处理几个特殊的调试点
语法:debug_points [stop | abort]
这两个配置项是用来帮助用户跟踪调试Nginx的。接收stop和abort两个参数。如果设置了stop没那么Nginx的代码执行到这些调试点的时候会发出SIGSTOP信号以用于调试;如果设置的abort,则会产生一个coredump文件,可以用于gdb来查看Nginx当时的各种信息。
<5>仅对指定的客户端输出debug级别的日志
语法:debug_connection【IP | CIDR】
这个配置属于事件类配置,必须放在events中才有效;
events{//对于定位高并发下的问题很有用;
Debug_connection 10.1.1.1;
Debug_connection 10.1.1.0/24;
}
<6>限制coredump核心存储文件的大小
语法:worker_rlimit_core_size;
在内存泄漏或非法操作的时候,会出现core文件,此变量的设置可以限制core文件的大小,从而有效定位问题。
<7>指定coredump文件生成目录
语法:working_directory path;
worker进程的工作目录。这个配置项的唯一目标就是设置coredump文件放置的目录,协助定位问题。
(2)正常运行配置项
<1>定义环境变量
语法:env VAR| VAR=VALUE
这个配置可以使用户直接在操作系统上设置环境变量
<2>嵌入其它配置文件
语法:include /path/file;
include配置项可以将其它配置文件嵌入到当前的nginx.conf文件中,它的参数即可以是绝对路径,也可以是相对路径。如 include vhost/*.conf; *---通配符
<3>pid文件路径
语法:pid path/file
默认:pid logs/nginx.pid;
保存master进程ID的pid文件存放路径,默认与configure执行时的参数“--pid-path”所指定的路径是相同的,也可以随时修改。
<4>Nginx worker进程运行的用户及用户组
语法:user username [groupname]
默认:user nobody nobody
<5>指定Nginx worker进程可以打开的最大句柄描述符个数
语法:worker_rlimit_nofile limit;
设置一个worker进程可以打开的最大文件句柄数。
<6>限制信号队列
语法:worker_rlimit_sigpending limit;
设置每个用户发往Nginx的信号队列的大小,当某个用户的队列满了,这个用户再发送的信号量会被丢掉。
(3)优化性能的配置项
<1>Nginx worker进程个数
语法:worker_process number
默认:worker_process 1;
在master/worker运行方式下,定义worker进程的个数。
原因:每个worker进程都是单线程的进程,它们会调用各个模块以实现多种多样的功能。如果,这些模块确认不会出现阻塞式的调用,那么,由多少CPU就应该哟多少个进程;反之,如果可能出现阻塞方式的调用,就需要多配置一些worker进程。
<2>绑定Nginx worker进程到指定的CPU内核
语法:worker_cpu_affinity cputask [cputask…]
原因:如果每个worker进程都是非常繁忙的,如果多个worker进程都在抢同一个cpu,这就会出现同步问题。反之,如果每个worker进程都独享一个CPU,就在内核的调度上完全实现了并发。
<3>SSL硬件加速
语法:ssl_engine device;
如果服务器上由SSL硬件加速设备,那么就可以进行配置以快SSL协议的处理速度。用户可以使用OpenSSL提供的命令来查看是否由SSL硬件加速设备;
<4>系统调用gettimeofday的执行频率
语法:timter_resolution t;
默认情况下,每次内核的事件调用(如epoll、select、poll、kqueue等)返回时,都会执行依次gettimeofday,实现内核的时钟来更新Nginx中的缓存时钟。
<5>Nginx worker进程优先级设置
语法:worker_priority nice;
默认:worker_priority 0;
该配置用于设置Nginx worker进程的nice优先级。
(4)事件类配置项
<1>是否打开accept锁
语法:accept_mutex on | off
默认:accept_mutex on
读者仅需要知道accept_mutex这把锁可以让多个worker进程轮流地、序列化地与新地客户端建立TCP连接。当某一个worker进程建立地连接数量达到worker_connections配置地最大连接数地7/8时,会大大地减小该worker进程试图建立新地TCP连接的机会,以此实现所有worker进程之上处理的客户端请求书尽量接近。
<2>lock文件的路径
语法:lock_file path/file;
默认:lock_file logs/nginx.lock;
accept锁可能需要这个lock文件,如果accept锁关闭,lock_file配置完全不生效。如果打开了accept锁,并且由于编译程序、操作系统架构等因素导致Nginx不支持原子锁,这是才会用文件锁实现accept锁,这样lock_file指定的lock文件才会生效。
<3>使用accept锁后到真正建立连接之间的延迟时间
语法:accept_mutex_deley Nms;
默认:accept_mutex_deley 500ms;
在使用accept锁后,同一时间只有一个worker进程能够取到accept锁。这个accept锁不是阻塞锁,如果取不到会立刻返回。如果由一个worker进程试图取accept锁而没有取到,它至少要等accept_mutex_deley定义的时间间隔后才能再次试图取锁。
<4>批量建立新连接
语法:multi_accept on | off
默认:multi-accept off
当事件模型通知所有新连接时,尽量对本次调度中客户端发起的所有TCP请求都建立连接。
<5>选择事件模型
语法:use [kqueue | rtsig | epoll | /dev/poll | poll |eventport]
默认:Nginx会自动使用最适合的事件模型
对于linux操作系统来说,可供选择的事件驱动模型由poll、select、epoll三种。epoll当然时性能最高的一种。
<6>每个worker的最大连接数
语法:worker_connections number;
定义每个worker进程可以同时处理的最大连接数。