Nginx


Nginx性能优化可分为对操作系统的优化和队Nginx本身的优化两部分。

针对Nginx对Linux系统的优化

1、关闭不必要的服务
根据自己Linux服务器部署的项目需求,进行相应的关闭不必要的服务或进程。

2、优化写磁盘操作
我们指导,Nginx每次访问一个文件的时候,Linux系统将会对他的“Access”,即访问时间进行修改对于查看一个文件被修改的时间,可以使用stat 文件名 的方式进行查看,例如:

[root@iZ94sni08orZ conf]# stat nginx.conf 
  File: "nginx.conf"
  Size: 2656        Blocks: 8          IO Block: 4096   普通文件
Device: ca01h/51713d    Inode: 660555      Links: 1
Access: (0644/-rw-r--r--)  Uid: ( 1001/ UNKNOWN)   Gid: ( 1001/ UNKNOWN)
Access: 2015-11-18 16:31:05.221629056 +0800
Modify: 2015-04-21 22:11:59.000000000 +0800
Change: 2015-11-18 10:30:10.421498579 +0800
[root@iZ94sni08orZ conf]# 

列出了访问的时间,所以对于一个高并发的访问系统中,这些磁盘写操作对系统的影响还是挺大的,因此要关闭该功能。

/dev/sdb1  /dataext3  defaults 0  0 

修改为如下配置:

/dev/sdb1  /dataext3  defaults,noatime,nodiratime  0  0 

然后重新启动系统,使之生效。

或者不重启系统的话可以使用remount选项来重新挂载:

-->mount  -o  defaults,noatime,nodiratime  -o  remount  /dev/sdb1  /sdb
-->mount  |  grep  sdb1

/dev/sdb1  on  /sdb   type  ext3 (rw,noatime,nodiratime)

如果是单独挂载的分区或者磁盘,可以直接执行命令:

-->mount  -o  defaults,noatime,nodiratime  /dev/sdb1  /sdb
-->mount  |  grep  sdb1

/dev/sdb1  on  /sdb   type  ext3 (rw,noatime,nodiratime)

3、优化资源限制
Linux有一条命令为ulimit:用于控制shell程序的资源,用于shell启动进程所占用的资源,其语法为:

ulimit [-aHS][-c ][-d <数据节区大小>][-f <文件大小>][-m <内存大小>][-n <文件数目>][-p <缓冲区大小>][-s <堆叠大小>][-t ][-u <程序数目>][-v <虚拟内存大小>]

参数为:

   -a  显示目前资源限制的设定。 
   -c   设定core文件的最大值,单位为区块。 
   -d <数据节区大小>  程序数据节区的最大值,单位为KB。 
   -f <文件大小>  shell所能建立的最大文件,单位为区块。 
   -H  设定资源的硬性限制,也就是管理员所设下的限制。 
   -m <内存大小>  指定可使用内存的上限,单位为KB。 
   -n <文件数目>  指定同一时间最多可开启的文件数。 
   -p <缓冲区大小>  指定管道缓冲区的大小,单位512字节。 
   -s <堆叠大小>  指定堆叠的上限,单位为KB。 
   -S  设定资源的弹性限制。 
   -t   指定CPU使用时间的上限,单位为秒。 
   -u <程序数目>  用户最多可开启的程序数目。 
   -v <虚拟内存大小>  指定可使用的虚拟内存上限,单位为KB。

根据参数的功能,可以使用ulimit -a 来列举资源的限制信息:

[root@iZ94sni08orZ ~]# ulimit -a
core file size          (blocks, -c) 0
data seg size           (kbytes, -d) unlimited
scheduling priority             (-e) 0
file size               (blocks, -f) unlimited
pending signals                 (-i) 3870
max locked memory       (kbytes, -l) 64
max memory size         (kbytes, -m) unlimited
open files                      (-n) 65535
pipe size            (512 bytes, -p) 8
POSIX message queues     (bytes, -q) 819200
real-time priority              (-r) 0
stack size              (kbytes, -s) 10240
cpu time               (seconds, -t) unlimited
max user processes              (-u) 3870
virtual memory          (kbytes, -v) unlimited
file locks                      (-x) unlimited
[root@iZ94sni08orZ ~]# 

上图是我的CentOS7.0的信息,然后使用命令,对系统针对Nginx进行优化,可以使用下边的命令对-n所对应的资源进行无限制,也就是系统所支持最大的值:ulimit -n unlimited 或者ulimit -n 数目 来修改。

也可以通过修改配置文件的方式进行修改:

vim /etc/security/limits.conf

该文件只有两行,其他的都为注释内容:

* soft nofile 65535
* hard nofile 65535

将其修改为:

* soft nofile 65535
* hard nofile 65535
* soft nproc 65535
* hard nproc 65535

上述修改之后需后需要重新启动菜而已生效。

4、优化内核TCP选项

修改一下内核参数,该文件在/etc/sysctl.conf,包含内容注释,都可以看懂,默认内容为:

# Kernel sysctl configuration file for Red Hat Linux
#
# For binary values, 0 is disabled, 1 is enabled.  See sysctl(8) and
# sysctl.conf(5) for more details.

# Controls IP packet forwarding
net.ipv4.ip_forward = 0

# Controls source route verification

# Do not accept source routing
net.ipv4.conf.default.accept_source_route = 0

# Controls the System Request debugging functionality of the kernel
kernel.sysrq = 0

# Controls whether core dumps will append the PID to the core filename.
# Useful for debugging multi-threaded applications.
kernel.core_uses_pid = 1

# Controls the use of TCP syncookies

# Disable netfilter on bridges.
net.bridge.bridge-nf-call-ip6tables = 0
net.bridge.bridge-nf-call-iptables = 0
net.bridge.bridge-nf-call-arptables = 0

# Controls the default maxmimum size of a mesage queue
kernel.msgmnb = 65536
# Controls the maximum size of a message, in bytes
kernel.msgmax = 65536

# Controls the maximum shared segment size, in bytes
kernel.shmmax = 68719476736

# Controls the maximum number of shared memory segments, in pages
kernel.shmall = 4294967296

vm.swappiness = 0
net.ipv4.neigh.default.gc_stale_time=120
net.ipv4.conf.all.rp_filter=0
net.ipv4.conf.default.rp_filter=0
net.ipv4.conf.default.arp_announce = 2
net.ipv4.conf.all.arp_announce=2
net.ipv4.tcp_max_tw_buckets = 5000
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_max_syn_backlog = 1024
net.ipv4.tcp_synack_retries = 2
net.ipv4.conf.lo.arp_announce=2

将对应的属性设置下列值,有的修改,没有的加上去:

net.ipv4.tcp_max_tw_buckets = 6000 #设置timewait的值,默认为180000
net.ipv4.ip_local_port_range = 1024 65000 #设置允许洗头膏打开的端口范围,默认为32768-61000
net.ipv4.tcp_tw_recycle = 1 #设置是否启用timewait快速回收,默认为0
net.ipv4.tcp_tw_reuse = 1 #设置是否开启重新使用,即允许TIME-WAIT sockets重新用于新的TCP连接
net.ipv4.tcp_syncookies = 1 #设置是否开启SYN Cookies,如果启用,那么SYN等待队列一处是,则使用Cookies处理,默认为0

net.core_somaxconn = 262144 #
net.core_netdev_max_backlog = 262144 #用于设置被传送到队列数据包的最大数目,在网卡接受数据包的速率比内核处理数据包的速率快时,那么会出现排队现象,这个参数就是用来设置该队列的大小

net.ipv4.tcp_max_orphans = 262144 #设置Linux能够处理不属于任何进程的套接字数量,即处理孤儿进程
net.ipv4.tcp_max_syn_backlog = 262144 #用于记录尚未收到客户端确认信息的链接请求的最大值
net.ipv4.tcp_timestamps = 0 #设置时间戳作为序列号,设置为0表示关闭该功能
net.ipv4.tcp_synack_retries = 1 #设置SYN重试的次数,默认为5,在TCP的三次握手中的第二次握手,内核需要发送一个回应前面一个SYN的ACK的SYN,就是说wile打开对方的链接,内核发出的SYN的次数。减少该参数的值有利于避免DDos攻击

net.ipv4.tcp_syn_retries = 1 #设置内核放弃建立链接之前发送SYN包的数量
net.ipv4.tcp_fin_timeout = 1 #决定它包吃FIN-WAIT-2状态的时间
net.ipv4.tcp_keepalive_time = 30 #当启用该功能是,该参数用于设置TCP发送keepalive消息的频率

优化Nginx服务器

1、关闭访问日志
根据相应的需要,进行相应模块的日志记录,如在http、server、location这些单独的区段中配置日志记录。

2、Nginx服务器配置优化

在server模块的配置文件中设置:

worker_connections 65535
keepalive_timeout 60
client_header_buffer_size 8k
worker_rlimit_nofile 65535

当然还有很多对Nginx的优化,上边简单的学习记录,希望对大家有帮助。

相关内容