云服务器促销,免费安装宝塔面板!
开启左侧

[服务器环境] 小巧web服务器引擎Nginx性能优化技巧

[复制链接]
当流科技 发表于 2017-9-1 00:01:08 | 显示全部楼层 |阅读模式

本站会员必须 邮箱验证成功后 才能发帖。马上注册查阅更多教程,下载海量资源,让你轻松玩做站

您需要 登录 才可以下载或查看,没有帐号?立即注册

x

* E& Z5 [9 q4 p) {& c一、编译安装过程优化
4 W4 M/ p' p, e& n- T. H; `1.减小Nginx编译后的文件大小
' X3 M* R3 v# P: j在编译Nginx时,默认以debug模式进行,而在debug模式下会插入很多跟踪和ASSERT之类的信息,编译完成后,一个Nginx要有好几兆字节。在编译前取消Nginx的debug模式,编译完成后Nginx只有几百千字节,因此可以在编译之前,修改相关源码,取消debug模式,具体方法如下:6 f$ G+ f* \9 ^2 k  b& D% R0 p$ K  g2 K8 g
在Nginx源码文件被解压后,找到源码目录下的auto/cc/gcc文件,在其中找到如下几行:' r. F2 u. w+ o2 v5 c9 m6 `
  1. # debug  . T7 a4 ^1 v1 `/ d2 b
  2. CFLAGS=”$CFLAGS -g”  
复制代码

5 \( t5 j+ m7 f, Q8 `: o5 ~& \注释掉或删掉这两行,即可取消debug模式。7 H7 L1 h$ H2 o2 x* Z  I
2.为特定的CPU指定CPU类型编译优化
; H3 R) R6 A  I* f' F在编译Nginx时,默认的GCC编译参数是“-O”,要优化GCC编译,可以使用以下两个参数:. J- w7 C0 w, k) Z& @
  1. --with-cc-opt='-O3'
复制代码
! M. d; ~" S9 Y9 d+ i( [) l0 ~
--with-cpu-opt=CPU  #为特定的 CPU 编译,有效的值包括:pentium, pentiumpro, pentium3, pentium4, athlon, opteron, amd64, sparc32, sparc64, ppc64
5 M  Q5 }+ C* C9 H- d- {/ i1 J要确定CPU类型,可以通过如下命令:- o! T: R( v3 V# Z1 h
  1. [root@localhost home]#cat /proc/cpuinfo | grep "model name"
复制代码
: H# {1 k: \# ?0 x! K- k. x. s
二、利用TCMalloc优化Nginx的性能
, m: V9 D7 S) ^9 |TCMalloc的全称为Thread-Caching Malloc,是谷歌开发的开源工具“google-perftools”中的一个成员。与标准的glibc库的malloc相比,TCMalloc库在内存分配效率和速度上要高很多,这在很大程度上提高了服务器在高并发情况下的性能,从而降低系统负载。下面简单介绍如何为Nginx添加TCMalloc库支持。8 M: \0 b/ M0 [; u. X9 L* z
要安装TCMalloc库,需要安装libunwind(32位操作系统不需要安装)和google-perftools两个软件包,libunwind库为基于64位CPU和操作系统的程序提供了基本函数调用链和函数调用寄存器功能。下面介绍利用TCMalloc优化Nginx的具体操作过程:  Y" R/ |0 ]. c6 v1 _2 g' e
1.安装libunwind库( B$ q1 y( v* D# b
可以从http://download.savannah.gnu.org/releases/libunwind下载相应的libunwind版本,这里下载的是libunwind-0.99-alpha.tar.gz,安装过程如下:1 [7 C7 u" V# i; _

  1. 3 Z4 b& @/ c. z) s; f* s& |
  2. [root@localhost home]#tar zxvf libunwind-0.99-alpha.tar.gz  - B$ l. T0 H/ M
  3. [root@localhost home]# cd libunwind-0.99-alpha/  $ l( u$ ?9 ~( I8 z. ]
  4. [root@localhost libunwind-0.99-alpha]#CFLAGS=-fPIC ./configure  2 p. _' I1 H1 M1 E- X
  5. [root@localhost libunwind-0.99-alpha]#make CFLAGS=-fPIC  , S% X8 E9 i& G
  6. [root@localhost libunwind-0.99-alpha]#make CFLAGS=-fPIC install  
复制代码

$ O# _; }2 `9 g+ @/ |* q/ W2.安装google-perftools) Z# q) m( f2 S" S8 }
可以从http://google-perftools.googlecode.com下载相应的google-perftools版本,这里下载的是google-perftools-1.8.tar.gz,安装过程如下:
' y+ L& C; y% Z
  1. 9 Z) i# u, b/ ]! N8 h' {0 r$ L2 M# D
  2. [root@localhost home]#tar zxvf google-perftools-1.8.tar.gz  / I( ?& J7 A; x' O. P; @5 J' q
  3. [root@localhost home]#cd google-perftools-1.8/  
    ! G( K, g0 M/ E7 O  s( }
  4. [root@localhost google-perftools-1.8]# ./configure  
    2 [6 n3 z& p0 q- k6 K; d% a8 Z
  5. [root@localhost google-perftools-1.8]#make && make install  . O' a3 x1 U# ]+ e* P) \( Y
  6. [root@localhost google-perftools-1.8]#echo "/usr/local/lib" > /etc/ld.so.conf.d/usr_local_lib.conf  1 n" M" c$ V% y5 l
  7. [root@localhost google-perftools-1.8]# ldconfig  
复制代码
- b0 D! W1 `! o: M3 m
至此,google-perftools安装完成。
8 O. {9 h0 `. g) h# Q* w0 D3.重新编译Nginx3 ], z  E, @2 B+ M/ s7 i
为了使Nginx支持google-perftools,需要在安装过程中添加“–with-google_perftools_module”选项重新编译Nginx,安装代码如下:/ p+ s) q* p: l/ l, b1 f
  W" C: n+ d" Q$ W
[root@localhostnginx-0.7.65]#./configure \  * ~) t. `. Y, }- q
>--with-google_perftools_module --with-http_stub_status_module  --prefix=/opt/nginx  9 Z- _" B6 E& ^. ^
[root@localhost nginx-0.7.65]#make  : \* `- C4 H! a% M# z0 g
[root@localhost nginx-0.7.65]#make install  7 e; @7 s8 G1 S+ R1 w3 v
到这里Nginx安装完成。! p  H8 A. C+ r. ?" j
4.为google-perftools添加线程目录: j  u# \+ E; {5 |) [% y/ i
创建一个线程目录,这里将文件放在/tmp/tcmalloc下,操作如下:
" x4 E; A3 u1 O- F- z* U- h   G  r0 f& q" d
[root@localhost home]#mkdir /tmp/tcmalloc  
& }- u: A7 h7 H4 o5 v6 @% N/ C[root@localhost home]#chmod 0777 /tmp/tcmalloc  2 O+ Y/ ?0 b) {+ p! L  ~7 L6 z, Z! l
5.修改Nginx主配置文件. U5 O$ w2 |& @) ^+ I3 M( z
修改nginx.conf文件,在pid这行的下面添加如下代码:0 x# o& y3 W3 R* O* w6 `
# I  n- [  f: c% R# t4 Q
#pid        logs/nginx.pid;  0 E% x& u3 U7 F  s: j
google_perftools_profiles /tmp/tcmalloc;  ! N: s- Z  |, y- ^
接着,重启Nginx,完成google-perftools的加载。
& V  _' K$ `; y- w- k6.验证运行状态( M: p7 y9 k- `! N$ z+ B/ K
为了验证google-perftools已经正常加载,通过如下命令查看:6 A- L% C( {6 `
: y" ~  n6 l4 I0 |5 x' T* p9 d
[root@ localhost home]# lsof -n | grep tcmalloc  0 i# P* Q$ \; _6 n# r; Q3 p; ?/ {
nginx      2395 nobody   9w  REG    8,8       0    1599440 /tmp/tcmalloc.2395  
: M6 ]8 f6 Y' k( U) Gnginx      2396 nobody   11w REG   8,8       0    1599443 /tmp/tcmalloc.2396  , {) f9 l; ~  m8 [3 e* Q& r" j
nginx      2397 nobody   13w REG  8,8        0    1599441  /tmp/tcmalloc.2397  
+ ?5 s2 |+ E* X  D9 `nginx     2398 nobody    15w REG  8,8     0    1599442 /tmp/tcmalloc.2398  ' Z4 K( L. ^1 o4 C
由于在Nginx配置文件中,设置worker_processes的值为4,因此开启了4个Nginx线程,每个线程会有一行记录。每个线程文件后面的数字值就是启动的Nginx的PID值。! U, h  o( B7 B6 \. [
至此,利用TCMalloc优化Nginx的操作完成。
/ b. x2 ]% J" `三、Nginx内核参数优化
6 \5 I9 o5 Z5 d3 h$ L6 M8 c内核参数的优化,主要是在Linux系统中针对Nginx应用而进行的系统内核参数优化,常见的优化参数值如下。' r: F. x9 M1 g& u0 o
下面给出一个优化实例以供参考:  {. P  X, i8 I% I$ S
n
  1. et.ipv4.tcp_max_tw_buckets = 6000
    : E' q3 [6 X6 i  V+ U& K
  2. net.ipv4.ip_local_port_range = 1024 65000  ) S" ]& |5 d% ?8 k
  3. net.ipv4.tcp_tw_recycle = 1
    / U' W* `, e+ J9 @, F  ]
  4. net.ipv4.tcp_tw_reuse = 1
    ) J; g% \1 q: @3 {
  5. net.ipv4.tcp_syncookies = 1
    * p) h: b  U# L. U1 s4 ~9 ~- R
  6. net.core.somaxconn = 262144
    7 n5 H% u( V6 U! M, X* }1 o2 K
  7. net.core.netdev_max_backlog = 262144
    " N5 I( n6 j. w' s/ m) c, n" b8 e
  8. net.ipv4.tcp_max_orphans = 262144
    & J  A9 L" [: F0 x
  9. net.ipv4.tcp_max_syn_backlog = 262144 3 I$ L! ~& l! R: j
  10. net.ipv4.tcp_synack_retries = 1
    " S; X2 L! O+ o( J  e  w5 `
  11. net.ipv4.tcp_syn_retries = 1 ( H0 O; P+ o# l+ v! D- J' U' W
  12. net.ipv4.tcp_fin_timeout = 1 : _" W  K" K" v3 u, _6 ?6 {
  13. net.ipv4.tcp_keepalive_time = 30
复制代码

/ h3 Q- b- z1 c7 }- P4 I- X将上面的内核参数值加入/etc/sysctl.conf文件中,然后执行如下命令使之生效:
# d. |: L: X8 c! T6 z[root@ localhost home]#/sbin/sysctl -p# X, j% T8 ^0 d. h- Q. e# e0 j, g
下面是对实例中选项的含义进行介绍:5 w% n! ]: u% Q- O8 K0 t
 net.ipv4.tcp_max_tw_buckets参数用来设定timewait的数量,默认是180000,这里设为6000。
, G! C4 C  J3 [% h net.ipv4.ip_local_port_range选项用来设定允许系统打开的端口范围。
! {# F. |: i" A! ? net.ipv4.tcp_tw_recycle选项用于设置启用timewait快速回收。, m4 m. V; L% n# c
 net.ipv4.tcp_tw_reuse选项用于设置开启重用,允许将TIME-WAIT sockets重新用于新的TCP连接。) r" ?  R* k% k
 net.ipv4.tcp_syncookies选项用于设置开启SYN Cookies,当出现SYN等待队列溢出时,启用cookies进行处理。
+ p6 g8 N9 ?, L net.core.somaxconn选项默认值是128, 这个参数用于调节系统同时发起的tcp连接数,在高并发的请求中,默认的值可能会导致链接超时或者重传,因此,需要结合并发请求数来调节此值。
0 d# z. D' r# F* Z net.core.netdev_max_backlog选项表示当每个网络接口接收数据包的速率比内核处理这些包的速率快时,允许发送到队列的数据包的最大数目。% q0 ^- _0 t# ?7 a
 net.ipv4.tcp_max_orphans选项用于设定系统中最多有多少个TCP套接字不被关联到任何一个用户文件句柄上。如果超过这个数字,孤立连接将立即被复位并打印出警告信息。这个限制只是为了防止简单的DoS攻击。不能过分依靠这个限制甚至人为减小这个值,更多的情况是增加这个值。
. w- D3 U) ]8 f' }' @# j" ? net.ipv4.tcp_max_syn_backlog选项用于记录那些尚未收到客户端确认信息的连接请求的最大值。对于有128MB内存的系统而言,此参数的默认值是1024,对小内存的系统则是128。
7 h/ V# D) @$ V" z, q7 ~ net.ipv4.tcp_synack_retries参数的值决定了内核放弃连接之前发送SYN+ACK包的数量。# \8 D: B- y2 d4 U' N7 u4 D
 net.ipv4.tcp_syn_retries选项表示在内核放弃建立连接之前发送SYN包的数量。( b, }7 j6 _# y/ ]+ |8 p
 net.ipv4.tcp_fin_timeout选项决定了套接字保持在FIN-WAIT-2状态的时间。默认值是60秒。正确设置这个值非常重要,有时候即使一个负载很小的Web服务器,也会出现因为大量的死套接字而产生内存溢出的风险。, u4 N* M- J! @6 o; ]& w! I
 net.ipv4.tcp_keepalive_time选项表示当keepalive启用的时候,TCP发送keepalive消息的频度。默认值是2(单位是小时)
当流科技-专业Discuz建站、仿站业务,专注处理discuz!论坛挂马,专注提供论坛托管维护服务! 提供Discuz论坛空间、VPS、云服务器!咨询QQ 569160956 778521512
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

精彩课程推荐

宝塔面板绑定域名无法访问后台怎么解决?

主讲:风雨兼程 服务器学院

Discuz!论坛网盘附件免跳转下载(手机版网

主讲:当流科技 Discuz插件

抱歉,当前存在网络问题或服务器繁忙,详细错

主讲:我心枫叶 Discuz!教程

discuz论坛搬家教程,如何搬迁到新服务器?

主讲:风雨兼程 Discuz!教程

宝塔面板phpmyadmin 数据库502 Bad Gateway

主讲:当流科技 服务器学院

Discuz!X3.3全新安装和升级后快速回复框丢

主讲:风雨兼程 Discuz!教程

宝塔面板mysql怎么用navicat 连接数据库呢

主讲:当流科技 服务器学院

宝塔面板如何添加和管理Mysql数据库?

主讲:xotexa372 服务器学院

商务合作

0551-66191059
service#dangliu.net
点击这里给我发消息
dz论坛/Discuz!论坛新手

关注微信公众号

QQ扫码 加 DZ技术群