Nginx optimized configuration and kernel optimization

Nginx is a high-performance HTTP and reverse proxy server, as well as an IMAP/POP3/SMTP proxy server. This article introduces some Nginx optimization code parameters, etc.
 
Optimizations in nginx directives (config files)
copy code code show as below:
worker_processes 8;

  The number of nginx processes is recommended to be specified according to the number of cpus, generally a multiple of it.

copy code code show as below:
worker_cpu_affinity 00000001 00000010 00000100 00001000 00010000 00100000 01000000 10000000;

  Allocate CPUs to each process. In the above example, 8 processes are allocated to 8 CPUs. Of course, you can write more than one, or allocate one process to multiple CPUs.

copy code code show as below:
worker_rlimit_nofile 102400;

  This instruction refers to the maximum number of file descriptors opened by an nginx process. The theoretical value should be the maximum number of open files (ulimit -n) divided by the number of nginx processes, but nginx distribution requests are not so uniform, so it is best to use ulimit The value of -n remains the same.

copy code code show as below:
use epoll;

  Using epoll's I/O model, needless to say.

copy code code show as below:
worker_connections 102400;

  The maximum number of connections allowed per process, theoretically the maximum number of connections per nginx server is worker_processes*worker_connections.

copy code code show as below:
keepalive_timeout 60;

  keepalive timeout.

copy code code show as below:
client_header_buffer_size 4k;

  The buffer size of the client request header. This can be set according to your system paging size. Generally, the header size of a request will not exceed 1k. However, since the general system paging is larger than 1k, the paging size is set here. The page size can be obtained with the command getconf PAGESIZE.

copy code code show as below:
open_file_cache max=102400 inactive=20s;

  This will specify the cache for open files. It is not enabled by default. Max specifies the number of caches. It is recommended to be consistent with the number of open files. Inactive refers to how long the file has not been requested to delete the cache.

copy code code show as below:
open_file_cache_valid 30s;

  This is how often to check the cache for valid information.

copy code code show as below:
open_file_cache_min_uses 1;

  The minimum number of times the file is used during the inactive parameter time in the open_file_cache directive. If it exceeds this number, the file descriptor will always be opened in the cache. As in the above example, if a file is not used once during the inactive time, it will be moved. remove.

Optimization of kernel parameters
copy code code show as below:
net.ipv4.tcp_max_tw_buckets = 6000

  The number of timewaits, the default is 180000.

copy code code show as below:
net.ipv4.ip_local_port_range = 1024 65000

  The range of ports that the system is allowed to open.

copy code code show as below:
net.ipv4.tcp_tw_recycle = 1

  Enable timewait fast recycling.

copy code code show as below:
net.ipv4.tcp_tw_reuse = 1

  Enable reuse. Allow TIME-WAIT sockets to be reused for new TCP connections.

copy code code show as below:
net.ipv4.tcp_syncookies = 1

  Enable SYN Cookies. When the SYN waiting queue overflows, enable cookies to process.

copy code code show as below:
net.core.somaxconn = 262144

  The backlog of the listen function in the web application will limit the net.core.somaxconn of the kernel parameter to 128 by default, and the NGX_LISTEN_BACKLOG defined by nginx defaults to 511, so it is necessary to adjust this value.

copy code code show as below:
net.core.netdev_max_backlog = 262144

  The maximum number of packets allowed to be sent to the queue when each network interface is receiving packets faster than the kernel can process them.

copy code code show as below:
net.ipv4.tcp_max_orphans = 262144

  系统中最多有多少个TCP套接字不被关联到任何一个用户文件句柄上。如果超过这个数字,孤儿连接将即刻被复位并打印出警告信息。这个限制仅仅是为了防止简单的DoS攻击,不能过分依靠它或者人为地减小这个值,更应该增加这个值(如果增加了内存之后)。

复制代码代码如下:
net.ipv4.tcp_max_syn_backlog = 262144

  记录的那些尚未收到客户端确认信息的连接请求的最大值。对于有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秒,你可以按这个设置,但要记住的是,即使你的机器是一个轻载的WEB服务器,也有因为大量的死套接字而内存溢出的风险,FIN- WAIT-2的危险性比FIN-WAIT-1要小,因为它最多只能吃掉1.5K内存,但是它们的生存期长些。

复制代码代码如下:
net.ipv4.tcp_keepalive_time = 30

  How often TCP sends keepalive messages when keepalive is enabled. The default is 2 hours.

A complete kernel optimization configuration
copy code code show as below:
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
A simple nginx optimization configuration file
copy code code show as below:
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;
}
}
A few instructions about FastCGI
copy code code show as below:
fastcgi_cache_path /usr/local/nginx/fastcgi_cache levels=1:2 keys_zone=TEST:10m inactive=5m;

  This directive specifies a path, directory structure level, key area storage time and inactivity deletion time for the FastCGI cache.

copy code code show as below:
fastcgi_connect_timeout 300;

  Specifies the timeout for connecting to the backend FastCGI.

copy code code show as below:
fastcgi_send_timeout 300;

  The timeout period for sending requests to FastCGI. This value refers to the timeout period for sending requests to FastCGI after two handshakes have been completed.

copy code code show as below:
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指定的路径中,当然这对服务器负载来说是不明智的方案,因为内存中处理数据速度要快于硬盘,通常这个值的设置应该选择一个你的站点中的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缓存之前的服务器负载:

  此时打开php页面已经有些困难,需要进行多次刷新才能打开。上图中cpu0负载偏低是因为测试时将网卡中断请求全部分配到cpu0上,并且在nginx中开启7个进程分别制定到cpu1-7。

  使用FastCGI缓存之后:

  此时可以很轻松的打开php页面。

  这个测试并没有连接到任何数据库,所以并没有什么参考价值,不过不知道上述测试是否已经到达极限,根据内存和cpu的使用情况来看似乎没有,但是已经没有多余的机子来让我运行webbench了。

Guess you like

Origin http://43.154.161.224:23101/article/api/json?id=326533761&siteId=291194637