Nginx优化实例(突破十万并发)
nginx指令中的优化(配置文件)
worker_processes 8;
nginx进程数🔐,建议按🕺照【zhào】🚟cpu数目来【shù mù lái】指定【zhǐ dìng】,一般为它的倍数。
worker_cpu_affinity 00000001 00000010 00000100 00001000 00010000 00100000 01000000 10000000;
为每个【gè】🚩进程分【jìn chéng fèn】配🙀cpu,上例中【shàng lì zhōng】🌨将【jiāng】8个【gè】🚩进程分【jìn chéng fèn】配到👣8个【gè】🚩cpu,当然可以写多个【gè】🚩,或者将【jiāng】🌲一个【gè】🚩进程分【jìn chéng fèn】配到👣多个【gè】🚩cpu。
worker_rlimit_nofile 102400;
这个指令是指当一个🎩nginx进程打开的最多文件【duō wén jiàn】描述符数【shù】😜目,理论值🥁应该是最多打【zuì duō dǎ】开文件🏐数【shù】😜(ulimit -n)与nginx进程数【jìn chéng shù】😜相除,但是【dàn shì】🌋nginx分配请【fèn pèi qǐng】求并不🈸是那么【shì nà me】均匀🐄,所以最🐧好与ulimit -n的值保持一致【chí yī zhì】。
use epoll;
使用epoll的【de】I/O模型🚛,这个不用说了♿吧【ba】。
worker_connections 102400;
每个进【měi gè jìn】程允许的最多💂连接数【lián jiē shù】,理论上☝每台nginx服务器的最大连接数【lián jiē shù】为🛫worker_processes*worker_connections。
keepalive_timeout 60;
keepalive超时时【chāo shí shí】间😼。
client_header_buffer_size 4k;
客户端请求头🔐部的缓🧛冲区大😌小,这个可【zhè gè kě】以根据【yǐ gēn jù】你的系【nǐ de xì】统分页【tǒng fèn yè】💒大小【dà xiǎo】来🌹设置【shè zhì】,一般一个请求的头部大小不【dà xiǎo bú】💭会超过1k,不过由👆于一般系统分页【tǒng fèn yè】💒都要大于🕙1k,所以这【suǒ yǐ zhè】里设置【shè zhì】📇为分页大小【dà xiǎo】。分页大小【dà xiǎo】可以用命令getconf PAGESIZE取得【qǔ dé】。
open_file_cache max=102400 inactive=20s;
这个将📻为打开文【wén】📊件指定【jiàn zhǐ dìng】缓🤴存,默认是没有启用的【yòng de】,max指定缓🤴存数量🖇,建议和打开文【wén】📊件数一【jiàn shù yī】致,inactive是指经过多长【guò duō zhǎng】时间文【wén】🐂件没被【jiàn méi bèi】请求后【qǐng qiú hòu】删除缓⏺存。
open_file_cache_valid 30s;
这个是【zhè gè shì】指多长时间检查一次【chá yī cì】缓存的【huǎn cún de】🚘有效信🌷息🤧。
open_file_cache_min_uses 1;
open_file_cache指令中【zhǐ lìng zhōng】的🌽inactive参数时【cān shù shí】间内文👅件的🌽最少使用次数❣,如果超【rú guǒ chāo】🎨过这个【guò zhè gè】数字🕢,文件描述符一【shù fú yī】直是在【zhí shì zài】🌁缓存中【huǎn cún zhōng】打开的🌽,如上例,如果有一个文件在【jiàn zài】inactive时间内一次没被使用🗞,它将被移除😀。
内核参数的优化
net.ipv4.tcp_max_tw_buckets = 6000
timewait的数量【de shù liàng】🏸,默认是180000。
net.ipv4.ip_local_port_range = 1024 65000
允许系统⏰打开的【dǎ kāi de】🗽端口范【duān kǒu fàn】围。
net.ipv4.tcp_tw_recycle = 1
启用timewait快速回【kuài sù huí】💹收。
net.ipv4.tcp_tw_reuse = 1
开启重用🐓。允许将【yǔn xǔ jiāng】😴TIME-WAIT sockets重新用🐓于新的【yú xīn de】TCP连接。
net.ipv4.tcp_syncookies = 1
开启【kāi qǐ】🚜SYN Cookies,当出现SYN等待队【děng dài duì】📈列溢出时【shí】🙈,启用cookies来处理。
net.core.somaxconn = 262144
web应用中listen函数的🏉backlog默认会【mò rèn huì】🔓给我们【gěi wǒ men】内核参数的🏉net.core.somaxconn限制到128,而nginx定义的NGX_LISTEN_BACKLOG默认为【mò rèn wéi】💆511,所以有【suǒ yǐ yǒu】必要调【bì yào diào】🔥整这个值🔘。
net.core.netdev_max_backlog = 262144
每个网【měi gè wǎng】🏕络接口【luò jiē kǒu】接收数据包的速率比内核处理这些【lǐ zhè xiē】🐀包的速率快时【lǜ kuài shí】👶,允许送🕕到队列的数据【de shù jù】🐜包的最大数目。
net.ipv4.tcp_max_orphans = 262144
系统中最多【zhōng zuì duō】🌽有多少🚻个TCP套接字【tào jiē zì】不被关🕟联到任【lián dào rèn】🦀何一个【hé yī gè】用户文【yòng hù wén】件句柄上。如果超【rú guǒ chāo】过这个数字,孤儿连⬅接将即刻被复【kè bèi fù】位并打印出警告信息。这个限制仅仅是为了🔹防止简㊙单的DoS攻击,不能过【bú néng guò】分依靠🕕它或者【tā huò zhě】人为地减小这【jiǎn xiǎo zhè】个值【gè zhí】,更应该📩增加这【zēng jiā zhè】🤚个值【gè zhí】(如果增✖加了内存之后🗞)。
net.ipv4.tcp_max_syn_backlog = 262144
记录的那些尚未收到【wèi shōu dào】😵客户端【kè hù duān】确认信息的连🧦接请求【jiē qǐng qiú】🐔的最大值【zhí】。对于有【duì yú yǒu】🖌128M内存的🍮系统而言【ér yán】,缺省值【zhí】是😔1024,小内存的🍮系统则是😔128。
net.ipv4.tcp_timestamps = 0
时间戳🐙可以避免序列号【hào】🆓的卷绕。一个1Gbps的链路【de liàn lù】⬜肯定会【kěn dìng huì】遇到以【yù dào yǐ】🗣前用过的序列【de xù liè】号【hào】🆓。时间戳🐙能够让内核接受这种【shòu zhè zhǒng】“异常”的数据【de shù jù】🤵包。这里需📘要将其关掉🖌。
net.ipv4.tcp_synack_retries = 1
为了打【wéi le dǎ】🏧开对端的🐏连接【lián jiē】,内核需【nèi hé xū】要发送一个【yī gè】💵SYN并附带一个【yī gè】💵回应前【huí yīng qián】面🐩一个【yī gè】💵SYN的🐏ACK。也就是【yě jiù shì】所谓三【suǒ wèi sān】次握手😣中的第🐦二次握手😣。这个设置决定💑了内核【le nèi hé】放弃连👠接之前发送SYN+ACK包的🐏数量。
net.ipv4.tcp_syn_retries = 1
在内核【zài nèi hé】👤放弃建立连接【lì lián jiē】之前发【zhī qián fā】送🎐SYN包的数量🧣。
net.ipv4.tcp_fin_timeout = 1
如果套【rú guǒ tào】接字由【jiē zì yóu】本端要【běn duān yào】求关闭🏋,这个参数决定【shù jué dìng】👀了它保💙持在🙌FIN-WAIT-2状态的时间。对端可【duì duān kě】以出错【yǐ chū cuò】并永远不关闭连接🆙,甚至意外当机【wài dāng jī】🚗。缺省值【quē shěng zhí】是60秒【miǎo】🤨。2.2 内核的通常值是180秒【miǎo】🤨,你可以【nǐ kě yǐ】按这个【àn zhè gè】设置【shè zhì】,但要记🕔住的是,即使你的机器是一个🐞轻载的🦕WEB服务器,也有因【yě yǒu yīn】为大量的死套接字而🎾内存⚓溢出的风险【fēng xiǎn】,FIN- WAIT-2的危险性比FIN-WAIT-1要小,因为它🥣最多只🏎能吃掉👹1.5K内存⚓,但是它🈷们的生存期长【cún qī zhǎng】些。
net.ipv4.tcp_keepalive_time = 30
当🍍keepalive起用的时候🎽,TCP发送【fā sòng】keepalive消息的【xiāo xī de】🥇频度。缺省是【quē shěng shì】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
一个简单的【dān de】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的几个指令【zhǐ lìng】👴
fastcgi_cache_path /usr/local/nginx/fastcgi_cache levels=1:2 keys_zone=TEST:10m inactive=5m;
这个指🐸令为【lìng wéi】FastCGI缓存指定一个【dìng yī gè】😘路径,目录结【mù lù jié】🍌构等级🌕,关键字区域存储时间【shí jiān】🐫和非活动删除时间【shí jiān】。
fastcgi_connect_timeout 300;
指定连【zhǐ dìng lián】接到后端🖇FastCGI的超时【de chāo shí】💈时间。
fastcgi_send_timeout 300;
向FastCGI传送请求的超⏱时时间【shí shí jiān】🤪,这个值🛷是指已【shì zhǐ yǐ】经完成两次握【liǎng cì wò】🍂手后向FastCGI传送请求的超⏱时时间【shí shí jiān】🤪。
fastcgi_read_timeout 300;
接收【jiē shōu】FastCGI应答的🐍超时时间【jiān】🦂,这个值
关键词:Nginx
阅读本文后您有什么感想? 已有 人给出评价!
- 0
- 0
- 0
- 0
- 0
- 0