Nginx性能优化技巧

内容来源(公众号:PHP版WEB项目)要充分发挥Nginx的高效性和稳定性,对Nginx的优化非常重要,下面将从编译安装、第三方插件、系统内核等三个方面介绍下如何优化nginx,最大限度地发挥Nginx的高效性。

1. 编译安装过程优化

1).减小Nginx编译后的文件大小

在编译Nginx时,默认以debug模式进行,而在debug模式下会插入很多跟踪和ASSERT之类的信息,编译完成后,一个Nginx要有好几兆字节。在编译前取消Nginx的debug模式,编译完成后Nginx只有几百千字节,因此,可以在编译之前,修改相关源码,取消debug模式,具体方法如下。

在解压Nginx源码文件后,找到源码目录下的auto/cc/gcc文件,打开然后在其中找到如下几行:

# debugCFLAGS=”$CFLAGS -g

注释掉或删掉这两行,即可取消debug模式。

.为特定的CPU指定CPU类型编译优化

在编译Nginx时,默认的GCC编译参数是“-O”,要优化GCC编译,可以使用以下两个参数:

--with-cc-opt='-O3'--with-cpu-opt=CPU  #

为特定的 CPU 

编译,有效的值包括:pentium

、pentiumpro、pentium3、# pentium4、athlon、opteron、amd64、sparc32、sparc64、ppc64

要确定CPU类型,可以通过如下命令实现:

[root@localhost home]# cat /proc/cpuinfo | grep "model name"

2. 利用TCMalloc优化Nginx的性能

TCMalloc(Thread-Caching Malloc)是谷歌开发的开源工具“google-perftools”中的一个成员。与标准的glibc库的malloc相比,TCMalloc库在内存分配效率和速度上要高很多,这在很大程度上提高了服务器在高并发情况下的性能,从而降低系统负载。下面简单介绍如何为Nginx添加TCMalloc库支持。

要安装TCMalloc库,需要安装libunwind(32位操作系统不需要安装)和google-perftools两个软件包,libunwind库为基于64位CPU和操作系统的程序提供了基本函数调用链和函数调用寄存器功能。下面介绍利用TCMalloc优化Nginx的具体操作过程。

1).安装libunwind库

可以从http://download.savannah.gnu.org/releases/libunwind下载相应的libunwind版本,这里下载的是libunwind-1.1.tar.gz,安装过程如下:

[root@localhost app]# tar zxvf libunwind-1.1.tar.gz[root@localhost app]# cd libunwind-1.1/[root@localhost libunwind-1.1]# CFLAGS=-fPIC ./configure[root@localhost libunwind-1.1]# make CFLAGS=-fPIC[root@localhost libunwind-1.1]# make CFLAGS=-fPIC install

2).安装google-perftools

可以从https://code.google.com/p/gperftools下载相应的google-perftools版本,这里下载的是gperftools-2.1.tar.gz,安装过程如下:

[root@localhost app]# tar zxvf gperftools-2.1.tar.gz[root@localhost app]# cd gperftools-2.1/[root@localhost gperftools-2.1]# ./configure[root@localhost gperftools-2.1]# make && make install[root@localhost gperftools-2.1]# echo "/usr/local/lib" > /etc/ld.so.conf.d/usr_local_lib.conf[root@localhost gperftools-2.1]# ldconfig

至此,google-perftools安装完成。

3).重新编译Nginx

为了使Nginx支持google-perftools,需要在安装过程中添加“--with-google_perftools_module”选项重新编译Nginx,安装代码如下:

[root@localhost nginx-1.4.7]# ./configure --prefix=/usr/local/nginx \> --with-google_perftools_module --with-http_stub_status_module[root@localhost nginx-1.4.7]# make[root@localhost nginx-1.4.7]# make install

到这里Nginx安装完成。

4).为google-perftools添加线程目录

创建一个线程目录,这里将文件放在/tmp/tcmalloc下,操作如下:

[root@localhost app]# mkdir /tmp/tcmalloc[root@localhost app]# chmod 0777 /tmp/tcmalloc

5).修改Nginx主配置文件

修改nginx.conf文件,在pid这行的下面添加如下代码:

#pid        logs/nginx.pid;google_perftools_profiles/tmp/tcmalloc;

接着,重启Nginx,完成google-perftools的加载。

6).验证运行状态

为了验证google-perftools已经正常加载,通过如下命令查看:

[root@localhost app]# lsof -n | grep  tcmallocnginx2395 nobody  9w  REG  8,8  0    1599440  /tmp/tcmalloc.2395nginx2396 nobody  11w  REG  8,8  0    1599443  /tmp/tcmalloc.2396nginx2397 nobody  13w  REG  8,8  0    1599441  /tmp/tcmalloc.2397nginx2398 nobody  15w  REG  8,8  0    1599442  /tmp/tcmalloc.2398

由于在Nginx配置文件中,设置worker_processes的值为4,因此开启了4个Nginx线程,每个线程会有一行记录。每个线程文件后面的

数字值就是启动的Nginx的PID值。

至此,利用TCMalloc优化Nginx的操作完成。

3 Nginx内核参数优化

Nginx内核参数的优化主要是在Linux系统中针对Nginx应用而进行的系统内核参数优化,常见的优化参数值如下。

下面给出一个优化实例以供参考:

net.ipv4.tcp_max_tw_buckets = 6000net.ipv4.ip_local_port_range = 1024 65000net.ipv4.tcp_tw_recycle = 1net.ipv4.tcp_tw_reuse = 1net.ipv4.tcp_syncookies = 1net.core.somaxconn = 262144net.core.netdev_max_backlog = 262144net.ipv4.tcp_max_orphans = 262144net.ipv4.tcp_max_syn_backlog = 262144net.ipv4.tcp_synack_retries = 1net.ipv4.tcp_syn_retries = 1net.ipv4.tcp_fin_timeout = 1net.ipv4.tcp_keepalive_time = 30

将上面的内核参数值加入/etc/sysctl.conf文件中,然后执行如下命令使之生效:

[root@ localhost home]# /sbin/sysctl -p

实例中选项的含义如下:

·net.ipv4.tcp_max_tw_buckets参数用来设定timewait的数量,默认是180000,这里设为6000。

·net.ipv4.ip_local_port_range选项用来设定允许系统打开的端口范围。

·net.ipv4.tcp_tw_recycle选项用于设置启用timewait快速回收。

·net.ipv4.tcp_tw_reuse选项用于设置开启重用,允许将TIME-WAIT sockets重新用于新的TCP连接。

·net.ipv4.tcp_syncookies选项用于设置开启SYN cookies,当出现SYN等待队列溢出时,启用cookies进行处理。

·net.core.somaxconn选项默认值是128,这个参数用于调节系统同时发起的TCP连接数,在高并发的请求中,默认的值可能会导致链接超时或者重传,因此,需要结合并发请求数来调节此值。

·net.core.netdev_max_backlog选项表示当每个网络接口接收数据包的速率比内核处理这些包的速率快时,允许发送到队列的数据包的最大数目。

·net.ipv4.tcp_max_orphans选项用于设定系统中最多有多少个TCP套接字不被关联到任何一个用户文件句柄上。如果超过这个数字,孤立连接将立即被复位并输出警告信息。这个限制只是为了防止简单的DoS攻击。不能过分依靠这个限制甚至人为减小这个值,更多的情况是增加这个值。

·net.ipv4.tcp_max_syn_backlog选项用于记录那些尚未收到客户端确认信息的连接请求的最大值。对于有128MB内存的系统而言,此参数的默认值是1024,对小内存的系统则是128。

·net.ipv4.tcp_synack_retries参数的值决定了内核放弃连接之前发送SYN+ACK包的数量。

·net.ipv4.tcp_syn_retries选项表示在内核放弃建立连接之前发送SYN包的数量。

·net.ipv4.tcp_fin_timeout选项决定了套接字保持在FIN-WAIT-2状态的时间。默认值是60秒。正确设置这个值非常重要,有时候即使一台负载很小的Web服务器,也会出现因为大量的死套接字而产生内存溢出的风险。

·net.ipv4.tcp_keepalive_time选项表示当keepalive启用的时候,TCP发送keepalive消息的频度。默认值是2(单位是小时)。

你可能感兴趣的:(Nginx性能优化技巧)