优化的措施涉及以下方面:
- 工作进程优化,控制大并发。
- 长连接,优化三次握手、四次断开。
- 压缩优化,降低带宽压力。
- 客户端缓存优化,带宽压力减小,加载速度更快。
工作进程优化
对于工作进程,启动数量和服务器的核数相等或者倍之,具体可以观察内存消耗来进行判断。
服务器4核
cat /proc/cpuinfo | grep "processor"| wc -l
=>4
nginx.conf的配置,配置worker_processes为4
user zhangxiaofei;
# 启动工作进程数量
worker_processes 4;
假设我不具体干涉nginx的分配,可以看到nginx确实启动了4个工作进程(下图一),但是其分配到cpu上并非设想的一核一N,下图二,4个nginx进程挂在了0和2的cpu上(从左到右分别为PSR-显示运行此进程的cpu,PID-进程pid,ARGS-显示进程的名字(该进程执行时传入的命令行参数))
ps -eo psr,pid,args | grep nginx
再次修改nginx.conf配置文件,增加以下代码,并重启测试,分配的妥妥帖帖,下图
#指定运行的核的编号,采用掩码的方式设置编号
worker_cpu_affinity 0001 0010 0100 1000;
至于worker_connections该设置多少,自己可以先设置大一点,然后根据cpu的使用率来进行增改
events {
#单个工作进程维护的请求队列长度
worker_connections 1024;
}
如何查看nginx的连接数
netstat -antpl | grep nginx
观察cpu的使用率,命令top 1
长连接
http协议属于tcp协议,那么每次建立连接都需要三次握手和四次断开。
#长连接时间
# keepalive_timeout 5;
keepalive_timeout 0;
#每个长连接接受的最大请求数
keepalive_requests 8192;
keepalive_timeout设置为0,谷歌浏览器开发者工具中可以看见response headers(非request headers)中的connection为close,注意状态码非304!下图
在服务器中,可以使用netstat命令查看连接情况。
数据压缩
开启gzip,访问时间不一定能缩短,但是压缩数据可以节省带宽
gzip on;
#更多优化
#无条件压缩所有结果数据
gzip_proxied any;
#启用gzip压缩的最小文件,小于设置值的文件将不会压缩
gzip_min_length 1k;
#设置压缩所需要的缓冲区大小
gzip_buffers 4 8k;
#gzip 压缩级别,1-9,数字越大压缩的越好,也越占用CPU时间
gzip_comp_level 4;
# 进行压缩的文件类型。javascript有多种形式。其中的值可以在 mime.types 文件中找到。
gzip_types text/plain text/css application/x-javascript application/javascript application/xml;
前端页面响应头中可以看见压缩标志
客户端缓存
将一些图片等资源缓存到客户端的磁盘上。
未配置时,调试工具响应头的图片如下
nginx.conf配置文件中,增加以下代码
location ~* \.(png|gif|jpg)$ {
expires 1h;
}
再次查看响应头,多了Expires字段