准备工作

  由于Linux具有免费、使用广泛、商业支持越来越完善等特点,一般的互联网公司都会采用Linux操作系统作为提供互联网服务的服务器(特殊业务可能会采用Windows或其他操作系统)。

1、Linux操作系统

  要安装Nginx,我们首先需要一个内核版本在2.6及以上的操作系统,因为Linux 2.6及以上版本内核才支持epoll,而在Linux上使用select或poll来解决事件的多路复用,是无法解决高并发压力问题的。

  可以通过uname -a命令查看当前Linux系统内核版本:

[root@control ~]# uname -a
Linux control 3.10.0-327.el7.x86_64 #1 SMP Thu Nov 19 22:10:57 UTC 2015 x86_64 x86_64 x86_64 GNU/Linux
[root@control ~]#

2、使用Nginx的必备软件

  如果要使用Nginx的常用功能,那么首先要确保该操作系统上至少安装了如下软件:

  1.GCC编译器

  GCC(GNU Compiler Collection)可以用来编译C语言程序。Nginx不会直接提供二进制可执行程序(1.2.x版本中已经开始提供某些操作系统上的二进制安装包了,不过直接提供的二进制安装包不一定适合自己公司的业务场景),所以我们要根据自己的业务特性和使用场景来自己编译安装Nginx,又因为Nginx是C语言开发的,所以我们编译安装Nginx少不了C语言编译器GCC。

  提供rpm -qa gcc命令可以查看当前操作系统是否安装了GCC:

[root@control ~]# rpm -qa gcc
gcc-4.8.5-4.el7.x86_64
[root@control ~]#

  如果没有安装,可以使用yum安装(这里使用的是CentOS 7.2 1511):

[root@control ~]# yum install -y gcc

  2.PCRE库

  PCRE(Perl Compatible Regular Expressions,Perl兼容正则表达式)是由Philip Hazel开发的函数库,目前为很多软件所使用,该库支持正则表达式。它由RegEx演化而来,实际上,Perl正则表达式也是源自于Hennry Spencer写的RegEx。

  如果我们在配置Nginx配置文件nginx.conf里使用了正则表达式,那么在编译Nginx的时候就必须把PCRE库编译进Nginx,因为Nginx的HTTP模块要靠它来解析正则表达式。

  PCRE库的安装方法:

[root@control ~]# yum install -y pcre pcre-devel

  pcre-devel是使用PCRE做二次开发时所需要的库,包括头文件等,这也是编译Nginx所必须使用的。

  3.zlib库

  zlib库用于对HTTP包的内容做gzip格式的压缩,如果我们在nginx.conf里配置了gzip on,并指定对于某些类型(content-type)的HTTP响应使用gzip来进行压缩以减少网络传输量(不要什么文件都使用gzip压缩,因为有些情况下,比如小文件,gzip压缩之后文件大小反而会变大,得不偿失),那么,在编译时就必须把zlib库编译进Nginx。

  zlib库的安装方法:

[root@control ~]# yum install -y zlib zlib-devel

  4.OpenSSL开发库

  如果我么服务器不止是要支持HTTP,还要在更安全的SSL协议上传输HTTP,那么就需要拥有OpenSSL了。另外,如果想要使用MD5、SHA1等散列函数,那么也需要安装它。

  openssl安装方法:

[root@control ~]# yum install -y openssl openssl-devel

  

  以上四个库只是完成Web服务器最基本功能所需要的。

  Nginx是高度自由化的Web服务器,它的功能是由许多模块来支持的。而这些模块可根据我们的使用需求来定制,如果某些模块不需要使用则完全不必理会它。同样,如果使用了某个模块,而这个模块使用了一些类似zlib或者openssl等第三方库,那么就必须先安装这些第三方软件。

3、磁盘目录

  要使用Nginx,还需要在Linux文件系统上准备一下目录。

  1.Nginx源代码存放目录

  该目录用于存放从官网上下载的Nginx源代码文件,以及第三方或我们自己缩写的模块源代码文件。

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

  该目录用户存放在configure命令执行后产生的源文件及目录,以及make命令执行后生成的目标文件和最终连接成功的二进制文件。默认情况下,configure命令会将该目录命名为objs,并放在Nginx源代码目录下。

  3.部署目录

  该目录存放实际Nginx服务运行期间所需的二进制文件、配置文件等。默认情况下,该目录为/usr/local/nginx(实际上,一台服务器上不可能只运行某一个单一的软件或者服务,作为一个运维人员,我们不能让服务器上的软件安装目录不统一,导致后期维护成本增加,最好在一台服务器装完系统之后就要规划统一目录,比如源代码目录统一,安装目录统一、日志目录统一等)

  4.日志文件存放目录

  日志文件通常会比较大,当研究Nginx的底层架构时,需要打开debug级别的日志,这个级别的日志非常详细,会导致日志文件的大小增长的极快,需要预先分配一个拥有更大磁盘空间的目录。(Nginx会自动对访问日志按日期分割轮询,我们要定时删除一些时间比较长的日志文件)

4、Linux内核参数的优化

  由于默认的Linux内核参数考虑的是最通用的场景,这明显不符合用于支持高并发访问的Web服务器的定义,所以需要修改Linux的内核参数,使得Nginx可以拥有更高的性能。

  在优化内核时,可以做的事情很多,通常会根据业务特点来进行调整,当Nginx作为静态Web内容服务器、反向代理服务器或者是提供图片缩略图功能(实时压缩图片)的服务器时,其内核参数的调整都是不同的。一下内容时针对最通用的、是Nginx支持更多并发请求的TCP网络参数的简单说明。

  首先,需要修改/etc/sysctl.conf来更改内核参数(CentOS 7的默认内核参数在/usr/lib/sysctl.d/00-system.conf也可以修改)。例如,最常见的配置:

[root@control ~]# cat /etc/sysctl.conf|grep -v "^#"
fs.file-max = 999999
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_keepalive_time = 600
net.ipv4.tcp_fin_timeout = 30
net.ipv4.tcp_max_tw_buckets = 5000
net.ipv4.ip_local_port_range = 1024 65535
net.ipv4.tcp_rmem = 4096 32768 262142
net.ipv4.tcp_wmem = 4096 32768 262142
net.core.netdev_max_backlog = 8096
net.core.rmem.default = 262144
net.core.wmem.default = 262144
net.core.rmem_max = 2097152
net.core.wmem_max = 2097152
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_max_syn.backlog = 1024
[root@control ~]#

  然后执行sysctl -p命令,使上述修改生效。

[root@control ~]# sysctl -p
fs.file-max = 999999
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_keepalive_time = 600
net.ipv4.tcp_fin_timeout = 30
net.ipv4.tcp_max_tw_buckets = 5000
net.ipv4.ip_local_port_range = 1024 65535
net.ipv4.tcp_rmem = 4096 32768 262142
net.ipv4.tcp_wmem = 4096 32768 262142
net.core.netdev_max_backlog = 8096
net.core.rmem.default = 262144
net.core.wmem.default = 262144
net.core.rmem_max = 2097152
net.core.wmem_max = 2097152
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_max_syn.backlog = 1024
[root@control ~]#

  上述参数意义解释如下:

  • file-max:这个参数表示进程(比如一个worker进程)可以同时打开的最大句柄数,这个参数直接限制最大并发连接数,需根据实际情况进行配置。
  • tcp_tw_reuse:这个参数设置为1,表示允许将TIME-WAIT状态的socket重新用于新的TCP连接,这对服务器来说很有意义,因为服务器上总会有大量的TIME-WAIT状态的连接。
  • tcp_keepalive_time:这个参数表示当当keepalive启用时,TCP发送keepalive消息的频度。默认是两小时,若将其设置的小一些,可以更快地清理无效的连接。
  • tcp_fin_timeout:这个参数表示当服务器主动关闭连接时,socket保持在FIN-WAIT2状态的最大时间。
  • tcp_max_tw_buckets:这个参数表示操作系统允许TIME-WAIT套接字数量的最大值,如果超过这个数值,TIME-WAIT套接字将立刻被清除并打印告警信息。该参数默认为180000,过多的TIME-WAIT套接字会是Web服务器变慢。
  • tcp_max_syn_backlog:这个参数表示TCP三次握手建立阶段接收SYN请求队列的最大长度,默认1024,将其设置的大一些可以使出现Nginx繁忙来不及accept新连接的情况时,Linux不至于丢失客户端发起的连接请求。
  • ip_local_ports_range:这个参数定义了在UDP和TCP连接中本地(不包括连接的远端)端口取值范围。
  • net.ipv4.tcp.rmem:这个参数定义了TCP接收缓存(用于TCP接收滑动窗口)的最小值、默认值、最大值。
  • net.ipv4.tcp.wmem:这个参数定义了TCP发送缓存(用于TCP接收滑动窗口)的最小值、默认值、最大值。
  • netdev_max_blacklog:当网卡接收数据包的速度大于内核处理速度时,会有一个队列保存这些数据包。这个参数表示该队列的最大值。
  • rmem_default:这个参数表示内核套接字接收缓存区默认的大小。
  • wmem_default:这个参数表示内核套接字发送缓存区默认大小。
  • reme_max:这个参数表示内核套接字接收缓存区的最大大小。
  • wmem_max:这个参数表示内核套接字发送缓存区最大大小。
    注意:滑动窗口的大小与套接字缓存区会在一定程度上影响并发连接数目。每个TCP连接都会为维护TCP滑动窗口而消耗内存,这个窗口会根据服务器的处理速度收缩或扩张。
        参数wmem_max的设置,需要平衡物理内存的总大小、Nginx并发处理的最大连接数量(由nginx.conf中的worker_processes和worker_connections参数决定 )而确定。
         当然,如果仅仅为了提高并发连接量使服务器不出现Out Of Memory问题而去降低晃动窗口的大小并不合适,因为滑动窗口过小会影响大数据量的传输速度。
         rmem_default、wmem_default、rmem_max、wmem_max这个4个参数的设置需要根据我们的业务特性以及实际的硬件成本来综合考虑。
  • tcp_syncookies:该参数与性能无关,用于解决TCP的SYN攻击。

5、获取Nginx源码

  可以在Nginx官方网站(http://nginx.org/en/downlod.html)获取Nginx源码包。将下载的Nginx源码包放在准备好的Nginx源代码目录中,然后解压。例如:

[root@control ~]# cd /tools/nginx/ && wget http://nginx.org/download/nginx-1.10.2.tar.gz
[root@control nginx]# ll
total 892
-rw-r--r-- 1 root root 910812 Oct 18  2016 nginx-1.10.2.tar.gz
[root@control nginx]# tar xf nginx-1.10.2.tar.gz 
[root@control nginx]# ll
total 892
drwxr-xr-x 8 1001 1001    147 Oct 18  2016 nginx-1.10.2
-rw-r--r-- 1 root root 910812 Oct 18  2016 nginx-1.10.2.tar.gz
[root@control nginx]#

posted @ 2017-12-19 16:55  StaryJie  阅读(90)  评论(0)    收藏  举报