说明:本文中的内容全部来自《实战nginx系统卷一书》,将自己感觉实用的部分整理出来,与大家分享。


1.优化写磁盘操作

nginx每访问完一个文件之后,linux系统将会对它的“Access”,即访问时间进行修改


[yunwei@moniter tmp]$ stat index.html

 File: “index.html”

 Size: 0               Blocks: 0          IO Block: 4096   一般空文件

Device: 6802h/26626d    Inode: 300777505   Links: 1

Access: (0664/-rw-rw-r--)  Uid: (  506/  yunwei)   Gid: (  506/  yunwei)

Access: 2014-02-12 15:28:23.000000000 +0800

Modify: 2014-02-12 15:28:23.000000000 +0800

Change: 2014-02-12 15:28:23.000000000 +0800


访问一次access时间就发生变化

[yunwei@moniter tmp]$ cat index.html

查看

[yunwei@moniter tmp]$ stat index.html

 File: “index.html”

 Size: 0               Blocks: 0          IO Block: 4096   一般空文件

Device: 6802h/26626d    Inode: 300777505   Links: 1

Access: (0664/-rw-rw-r--)  Uid: (  506/  yunwei)   Gid: (  506/  yunwei)

Access: 2014-02-12 15:28:45.000000000 +0800

Modify: 2014-02-12 15:28:23.000000000 +0800

Change: 2014-02-12 15:28:23.000000000 +0800


在一个高并发的访问中,这对磁盘读写操作影响很大,因此,关闭此功能


/dev/sdb1   /dataext3   defaults    0   0

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

重启系统,或者remount重新挂载


2.修改系统文件句柄数

vim /etc/security/limits.conf

*               soft    nofile       65535

*               hard   nofile        65535

*               soft    nproc        65535

*               hard   nproc         65535


重启生效

ulimit -n  

ulimit -a查看


3.优化内核TCP选项

修改以下内核参数:

net.ipv4.tcp_max_tw_buckets = 6000          

#默认值180000 设置timewait的值

net.ipv4.ip_local_port_range = 1024 65000  

#默认值32768 61000 设置允许系统打开的端口范围

net.ipv4.tcp_tw_recycle = 1                        

#默认值0 设置是否启用timewait

net.ipv4.tcp_tw_reuse = 1                          

#默认值0 设置是否开启重新使用,允许将TIME-WAIT sockets 重新用于新的TCP连接

net.ipv4.tcp_syncookies = 1                        

#默认值0 设置是否开启SYN Cookies,如果启用该功能,那么当出现SYN等待排队溢出时,则使用Cookies来处理

net.core.somaxconn = 262144                    

#默认值32768 Web应用中listen函数的backlog默认会将内核参数的net.core.somaxconn限制到128,而Nginx定义的NGX_LISTEN_BACKLOG默认为511,所以有必要调整这个值

net.core.netdev_max_backlog = 262144      

#默认值300 设置被输送到队列数据包的最大数目,在网卡接收数据包的速率比内核处理数据包的速率快时,那么会出现排队现象,这个参数就是用于设置该队列的大小

net.ipv4.tcp_max_orphans = 262144          

#默认值32768 设置Linux能够处理不属于任何进程的套接字数量,所谓不属于任何进程的进程就是“孤儿”(orphan)进程,在快速、大量的连接中这种进程会很多,因此要适当地设置该参数,如果这种“孤儿”进程套接字数量大于这个指定的值,那么在使用dmesg查看时会出现“too many of orphaned sockets”的警告

net.ipv4.tcp_max_syn_backlog = 262144    

#默认值1024 记录尚未收到客户端确认信息的连接请求的最大值

net.ipv4.tcp_timestamps = 0                      

#默认值1 设置使用时间戳作为序列号,通过这样的设置可以避免序列号倍重复使用。在高速、高并发的环境中,这种情况是存在的,因此通过时间戳能够让这些被看做是异常的数据包被内核接收。0表示关闭

net.ipv4.tcp_synack_retries = 1                  

#默认值5 设置SYN重试的次数,在TCP的3次握手中的第二次握手,内核需要发送一个回应前面一个SYN的ACK的SYN,就是说为了打开对方的连接,内核发出的SYN的次数。减小该参数的值有利于避免DDoS***。

net.ipv4.tcp_syn_retries = 1                      

#默认值5 设置在内核放弃建立连接之前发送SYN包的数量

net.ipv4.tcp_fin_timeout = 1                        

#默认值60 表示如果套接字由本端要求关闭,这个参数决定了它保持在FIN-WAIT-2状态的时间。对端可以出错并永远不关闭连接,甚至意外宕机。可以按此设置,但是要记住的是,即使是一个轻载的Web服务器,也有因为大量的死套接字而内存溢出的风险,FIN-WAIT-2的危险性比FIN-WAIT-1要小,因为它最多只能消耗1.5KB的内存,但是他的生存期要长些。

net.ipv4.tcp_keepalive_time = 30                

#默认值7200 当启用keepalive的时候,设置TCP发送keepalive消息的频度。


4.优化nginx服务器

4.1 关闭访问日志(必须要记录的时候可以有选择的记录)

4.2 使用epon

   这是在Linux下必选的模型,但是epoll只能使用于Linux内核2.6版本及以后的系统,对于我们现在使用的Linux系统这不是问题,从RedHat4 以后的系统都是2.6内核了。

4.3 Nginx服务器配置优化

   worker_connections 65535

   keepalived_timeout 60

   client_header_buffer_size 8k (通过“getconf PAGESIZE”命令来获取页面的大小)

   worker_rlimit_nofile 65535