nginx调优

运行环境
#uname -a
Linux localhost 2.6.32-358.6.2.el6.x86_64 #1 SMP Thu May 16 20:59:36 UTC 2013 x86_64 x86_64 x86_64 GNU/Linux
#cat /etc/redhat-release 
CentOS release 6.5 (Final)
#../sbin/nginx -v
nginx version: nginx/1.5.11
# free -m
             total 
Mem:          7869
linux系统调优
ulimit -n 65535
echo "* soft nofile 65535" >> /etc/security/limits.conf
echo "* hard nofile 65535" >> /etc/security/limits.conf

vi /etc/sysctl.conf
#net.core.netdev_max_backlog = 1000
net.core.netdev_max_backlog = 2000
#net.core.somaxconn = 128
net.core.somaxconn = 256

fs.file-max = 798592
#net.ipv4.ip_local_port_range=32768 61000
net.ipv4.ip_local_port_range=30000 61000
#net.ipv4.tcp_fin_timeout = 60
net.ipv4.tcp_fin_timeout = 30

sysctl -p
nginx的配置调优
#vi nginx.conf

#1.worder_processes 设置服务workder进程的数量
#worker_processes根据cpu内核多少确定,1个cpu内核一个worker
#grep processor /proc/cpuinfo | wc -l
#
worker_processes 4;

#2.workder_connections 设置每个workder可以服务的客户端数量
#根据可打开的文件数设置,获取打开的文件数配置 ulimit -n,如果open file太少则执行命令ulimit -n 65535
#可以将此指令放到/etc/rc.local自动执行;或在 /etc/security/limits.conf 里定义以下两行
#* soft nofile 65535
#* hard nofile 65535
#其能服务的客户端数量,还受其他因素影响,如内存,keepalive_timeout等;
#
worker_connections 15000;

#3.gzip 压缩输出的内容
#
gzip             on;
gzip_comp_level  2;
gzip_min_length  1000;
gzip_proxied     expired no-cache no-store private auth;
gzip_types       text/plain application/x-javascript text/xml text/css application/xml;
gzip_disable "MSIE [1-6]\.";

#4.timeout 定义各超时时间
#client_body_timeout和client_header_timeout 是在客户端发起连接后等待其发送header和body数据过来前的超时时间
#keepalive_timeout 指定keep-alive头及其等待关闭的时间,依据业务特点和处理时间决定关闭时间
#send_timeout 输出内容的超时时间,如果没有内容输出,则到达超时时间后将关闭连接
client_body_timeout 12;
client_header_timeout 12;
#尽早关闭活跃的连接
keepalive_timeout 15;
send_timeout 10;

#5.buffer 各缓冲的定义
#以下指令要先结合iostat、sar等工具看看是读多还是写多,nginx进程是否产生了较多的交换请求再使用
client_body_buffer_size 20K;
client_header_buffer_size 10k;
client_max_body_size 8m;
large_client_header_buffers 2 10k;

#6.缓存
location ~* .(jpg|jpeg|png|gif|ico|css|js)$ {
expires 365d;
}

#7.其他
server_tokens off;
worker_rlimit_nofile 20000;
#使用system call从硬盘复制文件到tcp socket
sendfile on;
#不缓存发送的数据
tcp_nodelay on;
#头信息一起发送
tcp_nopush on;
分析与诊断

Q1:在 /var/log/kern 有大量的以下信息

TCP: time wait bucket table overflow

首先查看下tcp bucket的大小

cat /proc/sys/net/ipv4/tcp_max_tw_buckets
5000

如果过低,可以尝试增加此值,如

vi /etc/sysctl.conf
net.ipv4.tcp_max_tw_buckets = 524288

另外,检查下是否有ddos攻击,查下ip连接的情况

netstat -nt | cut -c 40- | cut -d: -f1 | sort | uniq -c | sort -n
netstat -nt | cut -d: -f2 | sort | uniq -c | sort -n

将异常连接数的ip拦截掉,如

iptables -A INPUT -i eth1 -p tcp -s x.x.x.x -j DROP

另外就是诊断为何连接不释放,一般是后端数据库导致http连接不释放,要根据业务具体情况再分析,提升db的处理性能。

下面的诊断方法来自微信官方:

1、查看CPU的性能负载

a)uptime

用于观察服务器整体负载,系统负载指运行队列(1分钟、5分钟、15分钟前)的平均长度, 正常情况需要小于cpu个数。

b)vmstat

vmstat是Virtual Meomory Statistics(虚拟内存统计)的缩写,可对操作系统的虚拟内存、进程、CPU活动进行监控。他是对系统的整体情况进行统计,通常使用vmstat 5 5(表示每隔5秒生成一次数据,生成五次)命令测试。将得到一个数据汇总他能够反映真正的系统情况。

c)top top命令是最流行Unix/Linux的性能工具之一。系统管理员可用运行top命令监视进程和Linux整体性能。

2、查看内存的性能负载

a)free

Linux下的free命令,可以用于查看当前系统内存的使用情况,它显示系统中剩余及已用的物理内存和交换内存,以及共享内存和被核心使用的缓冲区。

3、查看网络的性能负载

b)netstat

Netstat是控制台命令,是一个监控TCP/IP网络的非常有用的工具,它可以显示路由表、实际的网络连接以及每一个网络接口设备的状态信息。Netstat用于显示与IP、TCP、UDP和ICMP协议相关的统计数据,一般用于检验本机各端口的网络连接情况。

c)sar

sar(System Activity Reporter系统活动情况报告)是目前 Linux 上最为全面的系统性能分析工具之一,可以从多方面对系统的活动进行报告,包括:文件的读写情况、系统调用的使用情况、磁盘I/O、CPU效率、内存使用状况、进程活动及IPC有关的活动等。本文主要以CentOS 6.3 x64系统为例,介绍sar命令。

4、查看磁盘的性能负载

a)iostat

Linux下的iostat命令,可用于报告中央处理器(CPU)统计信息和整个系统、适配器、tty 设备、磁盘和 CD-ROM 的输入/输出统计信息。

附录3:nginx配置和排查指引

nginx问题的排查方法

当出现直接超时、处理返回慢时的报警时,nigix侧的故障排查参考方法有如下: 1、检查请求日志情况, tail -f logs/access.log ,看upstream_status字段。

   200:表示正常;

   502/503/504:表示处理慢,或者后端down机;再看upstream_response_time返回的时间是否真的较慢,有没有上百毫秒,或更高的,有则说明是后端服务有问题。

   404:表示请求的路径不存在或不对,文件不在了。需要检查你配置在公众平台上的url路径是否正确; 服务器上的文件、程序是否存在。

   403:表示无权限访问。 检查一下nginx.conf 是否有特殊的访问配置。

   499: 则是客户端的问题,请联系微信团队。  此错误少见。

2、检查错误日志情况,tail -f logs/error_log ,查看是否有connect() failed、Connection refused、 Connection reset by peer等error错误日志,有则说明有可能nginx出现的连接数超负载等情况。

   (1)查看系统的网络连接数情况确认是否有较大的链接数

    # netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}' 

    解析: 

  CLOSED //无连接是活动的或正在进行 

  LISTEN //服务器在等待进入呼叫 

  SYN_RECV //一个连接请求已经到达,等待确认 

    SYN_SENT //应用已经开始,打开一个连接 

  ESTABLISHED //正常数据传输状态/当前并发连接数  

  FIN_WAIT1 //应用说它已经完成  

  FIN_WAIT2 //另一边已同意释放  

  ITMED_WAIT //等待所有分组死掉 

  CLOSING //两边同时尝试关闭 

  TIME_WAIT //另一边已初始化一个释放 

  LAST_ACK //等待所有分组死掉

   (2)查看系统的句柄配置情况,ulimit -n ,确认是否过小(小于请求数)

   (3)worker_rlimit_nofile、worker_connections配置项,是否过小(小于请求数)

参考

http://mp.weixin.qq.com/wiki/6/01405db0092f76bb96b12a9f954cd866.html?pass_ticket=QRKXX6ZlCcCi7LvM06Ao7ZckwoZN%2Fmv8PvOajr4AImUFbOzXq3%2BkGzN73H7%2FMZ7w

https://www.nginx.com/blog/tuning-nginx/




转载于:https://my.oschina.net/swingcoder/blog/543584

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值