优化nginx包括两方面: css
1.是本身重写nginx代码(好比tengine)、自己nginx的代码已经足够优秀,若是不是每秒几千的请求,就忽略这个部分吧。 node
2.另外一个就是和优化nginx的配置,这是中小型网站能够重点优化的部分。 linux
nginx的配置文件是一种声明式定义,控制nginx的每个细节。 nginx
所谓负载调优,就是提升单台机器处理效率,下降单台机器的负载。 chrome
为了提升单台机器的处理效率,cpu的处理速度是足够快的,咱们能解决的就是下降磁盘I/O、网络I/O,减小内存使用。 后端
下降单台机器的负载咱们能作的就是负载均衡,把流量打到多台机器处理。 浏览器
nginx推荐优化内容: 缓存
1.open files数量优化
ulimit -a查看系统参数
其中
open files (-n) 1024
表示系统同时最多能打开的文件数,linux下的全部设备均可以认为是文件,包括网络链接,若是同时超过1024个链接,那么nginx的日志就会报“24: Too many open files” 网络
多以优化的第一步就是设置open files为ulimit 负载均衡
修改/etc/profile,增长
ulimit -n 65535
2.Worker Processes数量优化
一般来讲设置一个cpu核心对应一个worker processer,最多不超过4个,提升worker process的值是为了提升计算能力,但通常在越到cpu瓶颈前,你会遇到别的瓶颈(如网络问题)。
只有当你要处理大量静态文件的磁盘I/O时,worker进程是单线程的,因此这个读取文件的阻塞IO会下降CPU的处理速度,这是能够增长worker进程数量,其它状况是不须要的。
3.worker进程链接数优化(Worker Connections)
默认状况下这个值是worker_connections 1024,也就是说考虑到keep-alive超时65秒,每一个浏览器平均消耗两个连接(chrome会同时打开多个链接来提到加载速度)。
那么默认状况下nginx平均每秒能处理1024/65/2=8,那么8*86440=64w,差很少至关于天天有60万ip。
多以普通网站默认值就能够了,若是你的流量一直提高,能够考虑增长这个值为2048或者更高。
3. CPU Affinity
用来设置worker进程使用哪一个cpu核心处理请求而且一直使用这个cpu核心。若是你不知道cpu调度,最好别碰这个,操做系统比你更懂如何调度。
4. Keep Alive
Keep alive 没有数据传输的状况下保持客户端和服务端的链接,也就是保持空链接一段时间,避免重现创建连接的时间消耗。nginx处理空链接的效率很是高,1万个空链接大约消耗2.5M内存。若是流量很是大的网站,减小创建链接的时间开销是很是客观的。keep alive的值设置在10-20s之间比较合理。
5. tcp_nodelay 和 tcp_nopush优化
这两个指令影响nginx的底层网络,它们决定操做系统如何处理网络层buffer和何时把buffer内容刷新给终端用户。若是你不懂,就能够保持这两个指令默认不变,对nginx性能影响不明显。
6. access日志优化
默认状况下,access日志会记录全部请求到日志文件,写操做会增长IO操做,若是不须要统计信息,可使用百度统计或者cnzz统计,彻底能够关闭日志,来减小磁盘写,或者写入内存文件,提升IO效率。
7. Error日志优化
错误日志会记录运行中的错误,若是设置的过低,会记录的信息太多,会产生大量IO,推荐设置为warn,这样能够记录大部分信息,而不会有太多IO
8. Open File Cache
nginx会读文件系统的许多文件,若是这些文件的描述符可以缓存起来,那么会提升处理效率。详见http://wiki.nginx.org/HttpCoreModule#open_file_cache
9. Buffers size优化
buffer的大小是你须要调优最重要参数。若是buffer size过小就会到致使nginx使用临时文件存储response,这会引发磁盘读写IO,流量越大问题越明显。
client_body_buffer_size 处理客户端请求体buffer大小。用来处理POST提交数据,上传文件等。client_body_buffer_size 须要足够大以容纳若是须要上传POST数据。
fastcgi_buffers,proxy_buffers 处理后端(PHP,Apache)响应。若是这个buffer不够大,一样会引发磁盘都系IO。须要注意的是它们有一个上限值,这个上限值受 fastcgi_max_temp_file_size 、 proxy_max_temp_file_size控制。
10.磁盘IO
若是能把数据全放到内存,不使用磁盘就能够彻底去掉磁盘IO。 默认状况下操做系统也会缓存频繁访问的数据以下降IO。因此预算足够的状况加,加大内存。
11.网络IO
假设咱们没有了磁盘IO,全部数据都在内存,那么咱们的读IO大概有3-6gbps。这种状况下,若是你网络差,同样会很慢。因此尽量提升网络带宽,压缩传输数据。
网络带宽买你能买的起的最大带宽,nginx的gzip模块能够用来压缩传输数据,一般gzip_comp_level 设为 4-5,再高就是浪费cpu了。同时也能够采用css,js压缩技术,固然这些技术就与nginx优化无关了。。
绝招
若是你还想提升nginx处理能力,只能祭出大杀器了。别优化了,加机器吧。一点点优化是没有用的,不如扩展机器来的快些。
ps 说道系统的扩展性一般有scale、和extension,区别是前者是数量上扩展,后者是功能上扩展。