nginx性能优化
- nginx性能优化
- 当前系统结构瓶颈
- 了解业务模式
- 性能与安全
- 系统与nginx性能优化
- 文件句柄
- 系统全局性修改
- 进程局部性修改
- cpu的亲和配置
- 配置worker_processes
- nginx通用配置优化
- cpu绑定
- nginx 隐藏版本
- nginx 修改上传文件大小
- nginx 启用压缩传输
nginx性能优化
当前系统结构瓶颈
可以通过查看当前cpu负荷,内存使用率,进程使用率来做简单判断。还可以通过操作系统的一些工具来判断当前系统性能瓶颈,如分析对应的日志,查看请求数量。也可以通过nginx的http_stub_status_module模块来查看对应的连接数,总握手次数,总请求数。也可以对线上进行压力测试,来了解当前的系统能性能,并发数,做好性能评估。
了解业务模式
了解每一个接口业务类型是什么样的业务,了解系统层级结构,每一层在中间层做的是代理还是动静分离,还是后台进行直接服务。需要对业务接入层和系统层次要有一个梳理
性能与安全
性能与安全也是一个需要考虑的因素,经常注重性能忽略安全或注重安全又忽略性能。要评估好两者的关系,把握好两者的孰重孰轻,以及整体的相关性。权衡好对应的点。
系统与nginx性能优化
根据影响性能方面做一个全体的评估和优化。
网络(网络流量、是否有丢包,网络的稳定性都会影响用户请求)
系统(系统负载、饱和、内存使用率、系统的稳定性、硬件磁盘是否有损坏)
服务(连接优化、内核性能优化、http服务请求优化都可以在nginx中根据业务来进行设置)
程序(接口性能、处理请求速度、每个程序的执行效率)
数据库、底层服务
文件句柄
在linux/unix操作系统中一切皆文件,设备是文件,文件是文件,文件夹也是文件。当用户每发起一次请求,就会产生一个文件句柄。文件句柄可以简单的理解为文件句柄就是一个索引。文件句柄就会随着请求量的增多,进程调用频繁增加,那么产生的文件句柄也就会越多。系统默认对文件句柄是有限制的,不可能会让一个进程无限制的调用句柄。因为系统资源是有限的,所以需要限制每一个服务能够使用多大的文件句柄。操作系统默认使用的文件句柄是1024个句柄。
系统全局性修改
vim /etc/security/limits.conf #* soft core 0
#* hard rss 10000
#@student hard nproc 20
#@faculty soft nproc 20
#@faculty hard nproc 50
#ftp hard nproc 0
#@student - maxlogins 4#root只是针对root这个用户来限制,soft只是发提醒,操作系统不会强制限制,一般的站点设置为一万左右就ok了
root soft nofile 65535
root hard nofile 65535
# *代表通配符 所有的用户
* soft nofile 25535
* hard nofile 25535可以看到root和*,root代表是root用户,*代表的是所有用户,后面的数字就是文件句柄大小。可以根据个人业务来进行设置。
进程局部性修改
vim /etc/nginx/nginx.confuser nginx;
worker_processes 1;
error_log /var/log/nginx/error.log warn;
pid /var/run/nginx.pid;worker_rlimit_nofile 65535; #进程限制
events {worker_connections 1024;
}http {include /etc/nginx/mime.types;default_type application/octet-stream;log_format main '$http_user_agent' '$remote_addr - $remote_user [$time_local] "$request" ''$status $body_bytes_sent "$http_referer" ''"$http_user_agent" "$http_x_forwarded_for" ''"$args" "$request_uri"';access_log /var/log/nginx/access.log main;sendfile on; #tcp_nopush on; keepalive_timeout 65; #gzip on; include /etc/nginx/conf.d/*.conf;
}worker_rlimit_nofile是在进程上面进行限制。
cpu的亲和配置
cpu的亲和能够使nginx对于不同的work工作进程绑定到不同的cpu上面去。就能够减少在work间不断切换cpu,把进程通常不会在处理器之间频繁迁移,进程迁移的频率小,来减少性能损耗
查看物理cpu
[root@nginx-server ~]# cat /proc/cpuinfo | grep "physical id" | sort|uniq | wc -l
查看cpu核心数
[root@nginx-server ~]# cat /proc/cpuinfo|grep "cpu cores"|uniq
查看cpu使用率
[root@nginx-server ~]#top 回车后按 1
配置worker_processes
vim /etc/nginx/nginx.conf
将刚才查看到自己cpu * cpu核心就是worker_processesworker_processes auto; #根据自己cpu核心数配置,这里也可以设置为auto
nginx通用配置优化
cpu绑定
#将nginx进程设置为普通用户,为了安全考虑
user nginx; #当前启动的worker进程,官方建议是与系统核心数一致
worker_processes 2;
#方式一, 第一个work进程绑定第一个cpu核心,第二个work进程绑定到第二个cpu核心,依次内推 直到第16个
#worker_cpu_affinity 0000000000000000 0000000000000001 0000000000000010 0000000000000100 ... 1000000000000000#方式二,当 worker_processes 2 时,表明 第一work进程可以绑定第 2 4 6 8 10 12 14 16 核心,那么第二work进程就绑定 奇数核心
#worker_cpu_affinity 1010101010101010 0101010101010101;#方式三,就是自动分配绑定
worker_cpu_affinity auto;#日志配置成warn
error_log /var/log/nginx/error.log warn;
pid /var/run/nginx.pid;#针对 nginx 句柄的文件限制
worker_rlimit_nofile 35535;
#事件模型
events {#使用epoll内核模型use epoll;#每一个进程可以处理多少个连接,如果是多核可以将连接数调高 worker_processes * 1024worker_connections 10240;
}http {include /etc/nginx/mime.types;default_type application/octet-stream;charset utf-8; #设置字符集#设置日志输出格式,根据自己的情况设置log_format main '$http_user_agent' '$remote_addr - $remote_user [$time_local] "$request" ''$status $body_bytes_sent "$http_referer" ''"$http_user_agent" "$http_x_forwarded_for" ''"$args" "$request_uri"';access_log /var/log/nginx/access.log main;sendfile on; #对静态资源的处理比较有效#tcp_nopush on; #如果做静态资源服务器可以打开#tcp_nodelay on; #当nginx做动态的服务时可以选择打开keepalive_timeout 65; #########Gzip modulegzip on; #文件压缩默认可以打开gzip_disable "MSIE [1-6]\."; #对于有些浏览器不能识别压缩,需要过滤如ie6gzip_http_version 1.1;include /etc/nginx/conf.d/*.conf;
}
nginx 隐藏版本
http {server_tokens off;
}
nginx 修改上传文件大小
http {client_max_body_size 10m;
}
nginx 启用压缩传输
http {#开启gzipgzip on; #低于1kb的资源不压缩 gzip_min_length 1k;#压缩级别1-9,越大压缩率越高,同时消耗cpu资源也越多,建议设置在5左右。 gzip_comp_level 5; #需要压缩哪些响应类型的资源,多个空格隔开。不建议压缩图片.gzip_types text/plain application/javascript application/x-javascript text/javascript text/xml text/css; #配置禁用gzip条件,支持正则。此处表示ie6及以下不启用gzip(因为ie低版本不支持)gzip_disable "MSIE [1-6]\."; #是否添加“Vary: Accept-Encoding”响应头gzip_vary on;
}