Nginx学习(1)

1Nginx安装需要的环境

(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服务器最基本功能所需要的

2Nginx安装所使用的目录

(1)Nginx源代码存放的目录

本目录用于放置Nginx源码文件,以及第三方或自己开发的模块的源码;

(2)Nginx编译阶段产生的中间文件存放目录

放置configure命令执行后所产生的源文件及目录,以及make命令执行后所生成的目标文件和最终连接成功的二进制文件。

默认情况下,configure命令会将该目录命名未objs,并放置在Nginx源码目录下。

(3)部署目录

该目录存放实际Nginx服务运行期间所需要的二进制文件、配置文件等。默认情况下,该目录为/usr/local/nginx

(4)日志文件存放目录

日志文件通常会比较大,当研究Nginx的底层框架时,需要打开debug级别的日志,这个级别的日志非常详细,会导致日志文件的大小增长的极快,所需要预先分配一个更大的磁盘空间目录。

3Linux内核参数的优化

默认情况下,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攻击。

4Nginx安装

./configure---包括检测操作系统内核和已经安装的软件,参数的解析,中间目录的生成以及根据各种参数生成一些C源码文件、Makefile文件等。

这里可以带很详细的参数,在配置的时候可以选择;

make---根据makefile文件编译Nginx工程,并生成目标文件、最终的二进制文件。

make install---根据configure执行时的参数,将Nginx部署到指定的安装目录,包括相关目录的建立和二进制文件、配置文件的复制。

5configure生成的文件

当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进程可以同时处理的最大连接数。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值