nginx指令中的优化(配置文件)

worker_processes 8;

  nginx进程数,建议依照cpu数目来指定。一般为它的倍数。

worker_cpu_affinity 00000001 00000010 00000100 00001000 00010000 00100000 01000000 10000000;

  为每一个进程分配cpu,上例中将8个进程分配到8个cpu,当然能够写多个,或者将一个进程分配到多个cpu。

worker_rlimit_nofile 102400;

  这个指令是指当一个nginx进程打开的最多文件描写叙述符数目,理论值应该是最多打开文件数(ulimit -n)与nginx进程数相除,可是nginx分配请求并非那么均匀,所以最好与ulimit -n的值保持一致。

use epoll;

  使用epoll的I/O模型,这个不用说了吧。

worker_connections 102400;

  每一个进程同意的最多连接数,理论上每台nginxserver的最大连接数为worker_processes*worker_connections。

keepalive_timeout 60;

  keepalive超时时间。

client_header_buffer_size 4k;

  client请求头部的缓冲区大小,这个能够依据你的系统分页大小来设置,一般一个请求的头部大小不会超过1k,只是因为一般系统分页都要大于1k。所以这里设置为分页大小。分页大小能够用命令getconf PAGESIZE取得。

open_file_cache max=102400 inactive=20s;

  这个将为打开文件指定缓存。默认是没有启用的,max指定缓存数量。建议和打开文件数一致,inactive是指经过多长时间文件没被请求后删除缓存。

open_file_cache_valid 30s;

  这个是指多长时间检查一次缓存的有效信息。

open_file_cache_min_uses 1;

  open_file_cache指令中的inactive參数时间内文件的最少使用次数。假设超过这个数字,文件描写叙述符一直是在缓存中打开的。如上例,假设有一个文件在inactive时间内一次没被使用。它将被移除。

内核參数的优化

net.ipv4.tcp_max_tw_buckets = 6000

  timewait的数量,默认是180000。

net.ipv4.ip_local_port_range = 1024    65000

  同意系统打开的port范围。

net.ipv4.tcp_tw_recycle = 1

  启用timewait高速回收。

net.ipv4.tcp_tw_reuse = 1

  开启重用。

同意将TIME-WAIT sockets又一次用于新的TCP连接。

net.ipv4.tcp_syncookies = 1

  开启SYN Cookies,当出现SYN等待队列溢出时,启用cookies来处理。

net.core.somaxconn = 262144

  web应用中listen函数的backlog默认会给我们内核參数的net.core.somaxconn限制到128。而nginx定义的NGX_LISTEN_BACKLOG默觉得511。所以有必要调整这个值。

net.core.netdev_max_backlog = 262144

  每一个网络接口接收数据包的速率比内核处理这些包的速率快时,同意送到队列的数据包的最大数目。

net.ipv4.tcp_max_orphans = 262144

  系统中最多有多少个TCP套接字不被关联到不论什么一个用户文件句柄上。

假设超过这个数字,孤儿连接将即刻被复位并打印出警告信息。这个限制不过为了防止简单的DoS攻击,不能过分依靠它或者人为地减小这个值。更应该添加这个值(假设添加了内存之后)。

net.ipv4.tcp_max_syn_backlog = 262144

  记录的那些尚未收到client确认信息的连接请求的最大值。对于有128M内存的系统而言,缺省值是1024,小内存的系统则是128。

net.ipv4.tcp_timestamps = 0

  时间戳可以避免序列号的卷绕。一个1Gbps的链路肯定会遇到曾经用过的序列号。时间戳可以让内核接受这样的"异常"的数据包。

这里须要将其关掉。

net.ipv4.tcp_synack_retries = 1

  为了打开对端的连接,内核须要发送一个SYN并附带一个回应前面一个SYN的ACK。也就是所谓三次握手中的第二次握手。

这个设置决定了内核放弃连接之前发送SYN+ACK包的数量。

net.ipv4.tcp_syn_retries = 1

  在内核放弃建立连接之前发送SYN包的数量。

net.ipv4.tcp_fin_timeout = 1

  假设套接字由本端要求关闭,这个參数决定了它保持在FIN-WAIT-2状态的时间。对端能够出错并永远不关闭连接。甚至意外当机。缺省值是60秒。2.2 内核的通常值是180秒。你能够按这个设置。但要记住的是。即使你的机器是一个轻载的WEBserver,也有由于大量的死套接字而内存溢出的风险,FIN- WAIT-2的危急性比FIN-WAIT-1要小,由于它最多仅仅能吃掉1.5K内存,可是它们的生存期长些。

net.ipv4.tcp_keepalive_time = 30

  当keepalive起用的时候,TCP发送keepalive消息的频度。

缺省是2小时。

一个完整的内核优化配置

net.ipv4.ip_forward = 0
net.ipv4.conf.default.rp_filter = 1
net.ipv4.conf.default.accept_source_route = 0
kernel.sysrq = 0
kernel.core_uses_pid = 1
net.ipv4.tcp_syncookies = 1
kernel.msgmnb = 65536
kernel.msgmax = 65536
kernel.shmmax = 68719476736
kernel.shmall = 4294967296
net.ipv4.tcp_max_tw_buckets = 6000
net.ipv4.tcp_sack = 1
net.ipv4.tcp_window_scaling = 1
net.ipv4.tcp_rmem = 4096 87380 4194304
net.ipv4.tcp_wmem = 4096 16384 4194304
net.core.wmem_default = 8388608
net.core.rmem_default = 8388608
net.core.rmem_max = 16777216
net.core.wmem_max = 16777216
net.core.netdev_max_backlog = 262144
net.core.somaxconn = 262144
net.ipv4.tcp_max_orphans = 3276800
net.ipv4.tcp_max_syn_backlog = 262144
net.ipv4.tcp_timestamps = 0
net.ipv4.tcp_synack_retries = 1
net.ipv4.tcp_syn_retries = 1
net.ipv4.tcp_tw_recycle = 1
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_mem = 94500000 915000000 927000000
net.ipv4.tcp_fin_timeout = 1
net.ipv4.tcp_keepalive_time = 30
net.ipv4.ip_local_port_range = 1024 65000

一个简单的nginx优化配置文件

user  www www;
worker_processes 8;
worker_cpu_affinity 00000001 00000010 00000100 00001000 00010000 00100000 01000000;
error_log /www/log/nginx_error.log crit;
pid /usr/local/nginx/nginx.pid;
worker_rlimit_nofile 204800; events
{
use epoll;
worker_connections 204800;
} http
{
include mime.types;
default_type application/octet-stream; charset utf-8; server_names_hash_bucket_size 128;
client_header_buffer_size 2k;
large_client_header_buffers 4 4k;
client_max_body_size 8m; sendfile on;
tcp_nopush on; keepalive_timeout 60; fastcgi_cache_path /usr/local/nginx/fastcgi_cache levels=1:2
keys_zone=TEST:10m
inactive=5m;
fastcgi_connect_timeout 300;
fastcgi_send_timeout 300;
fastcgi_read_timeout 300;
fastcgi_buffer_size 16k;
fastcgi_buffers 16 16k;
fastcgi_busy_buffers_size 16k;
fastcgi_temp_file_write_size 16k;
fastcgi_cache TEST;
fastcgi_cache_valid 200 302 1h;
fastcgi_cache_valid 301 1d;
fastcgi_cache_valid any 1m;
fastcgi_cache_min_uses 1;
fastcgi_cache_use_stale error timeout invalid_header http_500; open_file_cache max=204800 inactive=20s;
open_file_cache_min_uses 1;
open_file_cache_valid 30s; tcp_nodelay on; gzip on;
gzip_min_length 1k;
gzip_buffers 4 16k;
gzip_http_version 1.0;
gzip_comp_level 2;
gzip_types text/plain application/x-javascript text/css application/xml;
gzip_vary on; server
{
listen 8080;
server_name ad.test.com;
index index.php index.htm;
root /www/html/; location /status
{
stub_status on;
} location ~ .*\.(php|php5)?$
{
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
include fcgi.conf;
} location ~ .*\.(gif|jpg|jpeg|png|bmp|swf|js|css)$
{
expires 30d;
} log_format access '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" $http_x_forwarded_for';
access_log /www/log/access.log access;
}
}

关于FastCGI的几个指令

fastcgi_cache_path /usr/local/nginx/fastcgi_cache levels=1:2 keys_zone=TEST:10m inactive=5m;

  这个指令为FastCGI缓存指定一个路径。文件夹结构等级,keyword区域存储时间和非活动删除时间。

fastcgi_connect_timeout 300;

  指定连接到后端FastCGI的超时时间。

fastcgi_send_timeout 300;

  向FastCGI传送请求的超时时间,这个值是指已经完毕两次握手后向FastCGI传送请求的超时时间。

fastcgi_read_timeout 300;

  接收FastCGI应答的超时时间,这个值是指已经完毕两次握手后接收FastCGI应答的超时时间。

fastcgi_buffer_size 16k;

  指定读取FastCGI应答第一部分须要用多大的缓冲区,这里能够设置为fastcgi_buffers指令指定的缓冲区大小,上面的指令指定它将使用1个16k的缓冲区去读取应答的第一部分,即应答头。事实上这个应答头普通情况下都非常小(不会超过1k),可是你假设在fastcgi_buffers指令中指定了缓冲区的大小,那么它也会分配一个fastcgi_buffers指定的缓冲区大小去缓存。

fastcgi_buffers 16 16k;

  指定本地须要用多少和多大的缓冲区来缓冲FastCGI的应答。如上所看到的,假设一个php脚本所产生的页面大小为256k,则会为其分配16个16k的缓冲区来缓存,假设大于256k,增大于256k的部分会缓存到fastcgi_temp指定的路径中,当然这对server负载来说是不明智的方案,由于内存中处理数据速度要快于硬盘,通常这个值的设置应该选择一个你的网站中的php脚本所产生的页面大小的中间值,比方你的网站大部分脚本所产生的页面大小为256k就能够把这个值设置为16
16k。或者4 64k 或者64 4k。但非常显然。后两种并非好的设置方法。由于假设产生的页面仅仅有32k。假设用4 64k它会分配1个64k的缓冲区去缓存。而假设使用64 4k它会分配8个4k的缓冲区去缓存,而假设使用16 16k则它会分配2个16k去缓存页面。这样看起来似乎更加合理。

fastcgi_busy_buffers_size 32k;

  这个指令我也不知道是做什么用。仅仅知道默认值是fastcgi_buffers的两倍。

fastcgi_temp_file_write_size 32k;

  在写入fastcgi_temp_path时将用多大的数据块,默认值是fastcgi_buffers的两倍。

fastcgi_cache TEST

  开启FastCGI缓存而且为其制定一个名称。

个人感觉开启缓存非常实用,能够有效减少CPU负载。而且防止502错误。可是这个缓存会引起非常多问题。由于它缓存的是动态页面。详细使用还需依据自己的需求。

fastcgi_cache_valid 200 302 1h;
fastcgi_cache_valid 301 1d;
fastcgi_cache_valid any 1m;

  为指定的应答代码指定缓存时间,如上例中将200,302应答缓存一小时,301应答缓存1天,其它为1分钟。

fastcgi_cache_min_uses 1;

  缓存在fastcgi_cache_path指令inactive參数值时间内的最少使用次数,如上例,假设在5分钟内某文件1次也没有被使用,那么这个文件将被移除。

fastcgi_cache_use_stale error timeout invalid_header http_500;

  不知道这个參数的作用。猜想应该是让nginx知道哪些类型的缓存是无用的。 以上为nginx中FastCGI相关參数,另外。FastCGI自身也有一些配置须要进行优化,假设你使用php-fpm来管理FastCGI,能够改动配置文件里的下面值:

<value name="max_children">60</value>

  同一时候处理的并发请求数,即它将开启最多60个子线程来处理并发连接。

<value name="rlimit_files">102400</value>

  最多打开文件数。

<value name="max_requests">204800</value>

  每一个进程在重置之前可以运行的最多请求数。

几张測试结果

  静态页面为我在squid配置4W并发那篇文章中提到的測试文件,下图为同一时候在6台机器执行webbench -c 30000 -t 600 http://ad.test.com:8080/index.html命令后的測试结果:

  使用netstat过滤后的连接数:

  php页面在status中的结果(php页面为调用phpinfo):

  php页面在netstat过滤后的连接数:

  未使用FastCGI缓存之前的server负载:

  此时打开php页面已经有些困难,须要进行多次刷新才干打开。上图中cpu0负载偏低是由于測试时将网卡中断请求所有分配到cpu0上。而且在nginx中开启7个进程分别制定到cpu1-7。

  使用FastCGI缓存之后:

  此时能够非常轻松的打开php页面。

  这个測试并没有连接到不论什么数据库。所以并没有什么參考价值,只是不知道上述測试是否已经到达极限,依据内存和cpu的使用情况来看似乎没有,可是已经没有多余的机子来让我执行webbench了。

以上为本人摘自网上。

Nginx优化具体,应对高并发的更多相关文章

  1. 面试题:Nginx 是如何实现高并发?常见的优化手段有哪些?

    面试题: Nginx 是如何实现并发的?为什么 Nginx 不使用多线程?Nginx常见的优化手段有哪些?502错误可能原因有哪些? 面试官心理分析 主要是看应聘人员的对NGINX的基本原理是否熟悉, ...

  2. Memcached笔记——(四)应对高并发攻击【转】

    http://snowolf.iteye.com/blog/1677495 近半个月过得很痛苦,主要是产品上线后,引来无数机器用户恶意攻击,不停的刷新产品各个服务入口,制造垃圾数据,消耗资源.他们的最 ...

  3. SpringCloud应对高并发的思路

    一.Eureka的高可用性 Eureka下面的服务实例默认每隔30秒会发送一个HTTP心跳给Eureka,来告诉Eureka服务还活着,每个服务实例每隔30秒也会通过HTTP请求向Eureka获取服务 ...

  4. 《即时消息技术剖析与实战》学习笔记10——IM系统如何应对高并发

    一.IM 系统的高并发场景 IM 系统中,高并发多见于直播互动场景.比如直播间,在直播过程中,观众会给主播打赏.送礼.发送弹幕等,尤其是明星直播间,几十万.上百万人的规模一点也不稀奇.近期随着武汉新型 ...

  5. Nginx与Redis解决高并发问题

    原文链接:http://bbs.phpchina.com/forum.php?mod=viewthread&tid=229629 第一版产品采用的是Jquery,Nginx,PHP(CI框架) ...

  6. nginx+lua+redis构建高并发应用(转)

    nginx+lua+redis构建高并发应用 ngx_lua将lua嵌入到nginx,让nginx执行lua脚本,高并发,非阻塞的处理各种请求. url请求nginx服务器,然后lua查询redis, ...

  7. Memcached笔记——(四)应对高并发攻击

    近半个月过得很痛苦,主要是产品上线后,引来无数机器用户恶意攻击,不停的刷新产品各个服务入口,制造垃圾数据,消耗资源.他们的最好成绩,1秒钟可以并发6次,赶在Database入库前,Cache进行Mis ...

  8. Nginx优化配置,轻松应对高并发

    Nginx现在已经是最火的web服务器之一,尤其在静态分离和负载均衡方面,性能十分优越.接下来我们主要看下Nginx在高并发环境下的优化配置,主要是针对 nginx.conf 文件的属性设置.我们打开 ...

  9. Nginx和Tengine解决高并发和高可用,而非推荐Apache

    什么是Nginx  什么是Tengine 看看国内大公司在用Nginx和Tengine吗? 步骤一:进入 https://www.taobao.com/,按F12.可看到 有很多APP对淘宝进行请求. ...

随机推荐

  1. javascript——操作符(~、&、|、^、<<、>>)

    直接上代码吧! <script type="text/javascript"> //javascript操作符 //1.按位非~ var num1=25;// var ...

  2. Extjs 4学习2

    主要学习采自:http://www.ishowshao.com/blog/2012/06/19/extjs-4-getting-started/ 用的sdk为extjs4.2.1 根据其中的提示装了一 ...

  3. Idea中运行Testng时,报SAXParseException:parallel为none的问题原因及解决

    今天更新了testng的版本为6.9.10, 在idea中运行测试案例时,报错如下: org.testng.TestNGException: org.xml.sax.SAXParseException ...

  4. 最大乘积(Maximum Product,UVA 11059)

    Problem D - Maximum Product Time Limit: 1 second Given a sequence of integers S = {S1, S2, ..., Sn}, ...

  5. php foreach 使用&(与运算符)引用赋值要注意的问题

    首先了解一下“引用赋值”,看一个例子: <?php <?php $a=123; $a=123; $b=$a; $b=&$a; $a=321; $a=321; echo"$ ...

  6. Mysql访问 for橙子小海

    package com.mvc.model.dao; import com.mvc.model.daoutil.DBConn; import com.mvc.model.entity.Blog; 这是 ...

  7. Linux 使用yum install安装mysql登陆不上解决办法

    CentOS yum安装mysql后 Can’t connect to local MySQL server through socket ‘/var/lib/ CentOS Can’t connec ...

  8. outline属性

    outline(轮廓)用于设置元素周围的一条线,用于元素边框的外围,可起到突出元素的作用. outline属性所有浏览器都支持,如果规定了 !DOCTYPE,则 IE8 支持 outline 属性. ...

  9. Standard Numeric Format Strings

    The following table describes the standard numeric format specifiers and displays sample output prod ...

  10. Tautology

    WFF 'N PROOF is a logic game played with dice. Each die has six faces representing some subset of th ...