当前位置: 首页 > 科技观察

Nginx进阶应用--------性能优化,突破C100K

时间:2023-03-13 01:13:54 科技观察

【转自asd1123509133的博客】1.背景介绍:Nginx是一个高性能的HTTP和反向代理服务器,可以选择高效的epoll(linux2.6kernel)、kqueue(freebsd)、eventport(solaris10)都是网络I/O模型,可以支持响应高达50000个并发连接,同时对内存、CPU等系统资源的消耗非常低,运行非常稳定。选择理由:*支持高并发连接:nginx采用高效的多路复用模型(epoll/linux,kqueue/freebsd,eventport/solaris)*内存消耗少:服务器3W并发连接下,10个Nginx进程消耗150MB内存(15MB*10)*低成本:购买F5BIG-IP、NetScaler等负载均衡交换机需要几十万人民币,开源Nginx替代了这些商用设备。*其他原因:网络配置简单;支持rewrite重写规则,可以根据不同的域名和URL将HTTP请求分成不同的后端服务器组;内置健康检查功能;节省带宽,支持GZIP压缩,可以添加浏览器本地缓存的Header;支持热部署,可以在不中断服务的情况下升级软件版本2.环境[root@nginx~]$uname-r2.6.32-642.13.1.el6.x86_64[root@nginx~]$uname-mx86_64[root@nginx~]$cat/etc/redhat-releaseCentOSrelease6.8(Final)3.优化*nginx配置文件优化-nginx进程号,建议根据cpu个数指定,一般为倍数:-worker_processes4;-为每个进程绑定cpu:-worker_cpu_affinity00000001000000100000010000001000;-最大数量nginx进程打开的文件描述符:-worker_rlimit_nofile102400;-使用epoll的I/O多路复用模型:-使用epoll;-每个进程允许的最大连接数:-worker_connections102400;-keepalive超时:-keepalive_timeout60;-缓冲区clientrequestheader的大小:(页面大小可以通过命令getconfPAGESIZE获取):-client_header_buffer_size4k;-打开文件指定缓存,默认不开启,max指定缓存个数,推荐与打开文件数保持一致,inactive是指多久没有请求文件才删除缓存:-open_file_cachemax=102400inactive=20s;-指定多久检查缓存的有效信息:-open_file_cache_valid30s;-设置最小使用次数,如果超过这个次数,文件描述符一直在缓存中打开:-open_file_cache_min_uses1;*系统优化-timewait数量,默认是180000。(Deven:因此,如果要降低timewait,必须降低tcp_max_tw_buckets的值):-net.ipv4.tcp_max_tw_buckets=6000-允许系统开放的端口范围:-net.ipv4.ip_local_port_range=102465000-启用timewait快速恢复:-net.ipv4.tcp_tw_recycle=1-启用重用。允许TIME-WAITsockets被重新用于新的TCP连接:-net.ipv4.tcp_tw_reuse=1-启用SYNCookies,当SYN等待队列溢出时,启用cookies以处理:-net.ipv4.tcp_syncookies=1-web积压应用中的listen函数默认会将我们内核参数的net.core.somaxconn限制为128,而nginx定义的NGX_LISTEN_BACKLOG默认值为511:-net.core.somaxconn=262144-允许的数据包被发送到队列***数字:-net.core.netdev_max_backlog=262144-系统中不与任何用户文件句柄关联的TCP套接字的最大数量:-net.ipv4.tcp_max_orphans=262144-那些记录未收到客户端连接请求确认信息的最大值:-net.ipv4.tcp_max_syn_backlog=262144-时间戳以避免包装序列号:-net.ipv4.tcp_timestamps=0-发送SYN+ACK包之前内核放弃连接:-net.ipv4.tcp_synack_retries=1-内核放弃建立连接前发送的SYN包数:-net.ipv4.tcp_syn_retries=1-停留在FIN-WAIT-2状态的时间:-net.ipv4.tcp_fin_timeout=1-当keepalive启用时,TCP发送keepalive消息的频率。默认为2小时:-net.ipv4.tcp_keepalive_time=304总结来说,技术是需求驱动的。技术本身没有优势,只有业务。