1.减小http请求次数javascript
图片、css、script等等这些都会增长http请求数,减小这些元素的数量就能减小响应时间php
把多个JS、CSS在可能的状况下写进一个文件,页面里直接写入图片也是很差的作法,应该写进CSS里,小图拼合后利用 background 来定位 css
2.充分利用浏览器缓存html
expires
,cache-control
,last-modified
,etag
前端
3.分布式存储前端资源java
利用cdn存储前端资源node
4.多域名访问资源mysql
浏览器对同一域名的并行请求数有上限,多个域名则支持更多并行请求nginx
使用同一域名的时候无用的 cookie 简直是噩梦web
5.资源数据压缩
开启gzip
前端资源自己的压缩,js/css 打包编译(去掉空格,语意简化)图片资源的压缩等
6.优化首屏显示速度
资源的按需加载,延时加载
图片的懒加载
user www-data; pid /var/run/nginx.pid; worker_processes auto; worker_rlimit_nofile 100000;
说明:
(1)worker_processes auto;
设置多少子进程
(2)worker_rlimit_nofile 65535;
worker进程的最大打开文件数限制,设置后你的操做系统和Nginx能够处理比“ulimit -a”更多的文件,因此把这个值设高,就不会有“too many open files”问题了
2.event
全部处理链接的设置
events { worker_connections 2048; multi_accept on; use epoll; }
说明:
(1)worker_connections 65535; 子进程最多处理的链接数
(2)multi_accept on ; 告诉nginx收到一个新链接通知后接受尽量多的链接
(3)use epoll ; 多路复用(use 设置用于复用客户端线程的轮询方法。若是你使用Linux 2.6+,你应该使用epoll)
3.http模块
http { server_tokens off; sendfile on; tcp_nopush on; tcp_nodelay on; access_log off; error_log /var/log/nginx/error.log crit; keepalive_timeout 10; client_header_timeout 10; client_body_timeout 10; reset_timedout_connection on; send_timeout 10; limit_conn_zone $binary_remote_addr zone=addr:5m; limit_conn addr 100; include /etc/nginx/mime.types; default_type text/html; charset UTF-8; gzip on; gzip_disable "msie6"; gzip_proxied any; gzip_min_length 1000; gzip_comp_level 6; gzip_types text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript; open_file_cache max=100000 inactive=20s; open_file_cache_valid 30s; open_file_cache_min_uses 2; open_file_cache_errors on; include /etc/nginx/conf.d/*.conf; include /etc/nginx/sites-enabled/*; }
说明:
(1)server_tokens off ; 关闭在错误页面中的nginx版本数字,这样对于安全性是有好处的
(2)sendfile on; 是对文件I/O的系统调用的一个优化,系统api
(3)tcp_nodelay on; (Nginx 仅在将链接转变为长链接的时候才被启用)
(4)tcp_nopush on; (Nginx 仅在使用sendfile的时候才开启)
(5)access_log off; 设置nginx是否将存储访问日志。关闭这个选项可让读取磁盘IO操做更快
(6)error_log /var/log/nginx/error.log crit; 只记录严重的错误
(7)keepalive_timeout 10; 给客户端分配keep-alive连接超时时间。服务器将在这个超时时间事后关闭连接
(8)client_header_timeout,client_body_timeout 设置请求头和请求体(各自)的超时时间
(9)reset_timeout_connection ,告诉nginx关闭不响应的客户端链接
(10)send_timeout ,指定客户端的响应超时时间
(11)imit_conn_zone ,设置用于保存各类key(好比当前链接数)的共享内存的参数。5m就是5兆字节,这个值应该被设置的足够大以存储(32K*5)32byte状态或者(16K*5)64byte状态。
(12)limit_conn ,为给定的key设置最大链接数。这里key是addr,咱们设置的值是100,也就是说咱们容许每个IP地址最多同时打开有100个链接
(13)include 只是一个在当前文件中包含另外一个文件内容的指令。这里咱们使用它来加载稍后会用到的一系列的MIME类型。
(14)default_type 设置文件使用的默认的MIME-type
(15)charset 默认字符集
(16)数据返回开启gzip压缩
gzip_disable 为指定的客户端禁用gzip功能
gzip_static 告诉nginx在压缩资源以前,先查找是否有预先gzip处理过的资源
gzip_proxied 容许或者禁止压缩基于请求和响应的响应流
gzip_min_length 设置对数据启用压缩的最少字节数
gzip_comp_level 设置数据的压缩等级
gzip_type 设置须要压缩的数据格式
gzip on;
gzip_min_length 1k;
gzip_buffers 4 16k; gzip_http_version 1.0; gzip_comp_level 4; gzip_types text/plain application/x-javascript text/css application/xml text/javascript application/json; gzip_vary on; gzip_proxied expired no-cache no-store private auth; gzip_disable "MSIE [1-6]\.";
(17)open_file_cache 打开缓存的同时也指定了缓存最大数目,以及缓存的时间
open_file_cache_valid 在open_file_cache中指定检测正确信息的间隔时间。
open_file_cache_min_uses 定义了open_file_cache中指令参数不活动时间期间里最小的文件数。
open_file_cache_errors 指定了当搜索一个文件时是否缓存错误信息,也包括再次给配置中添加文件。
(18)静态资源使用 http 缓存协议
location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$
{
expires 30d;
}
(19)若是是反向代理web服务器,须要配置fastcgi相关的参数
fastcgi_connect_timeout 300; fastcgi_send_timeout 300; fastcgi_read_timeout 300; fastcgi_buffer_size 64k; fastcgi_buffers 4 64k; fastcgi_busy_buffers_size 128k; fastcgi_temp_file_write_size 256k;
time wait bucket table overflow
1.升级到php7
2.opcode优化
php 5.5 以后好像就内置了,修改配置
opcache.revalidate_freq=60 opcache.validate_timestamps=1 opcache.max_accelerated_files=1000 opcache.memory_consumption=512 opcache.interned_strings_buffer=16 opcache.fast_shutdown=1
说明:
opcache.revalidate_freq ,设置缓存的过时时间
opcache.max_accelerated_files,控制内存中最多能够缓存多少个PHP文件
opcache.memory_consumption 获取opcache使用的内存的总量
3.php7hugepage使用
Hugepage 的做用:间接提升虚拟地址和内存地址转换过程当中查表的TLB缓存命中率
4.代码伪编译
5.模板编译
6.xhprof
XHProf是facebook 开发的一个测试php性能的扩展
1.非侵入式扩展开发
原来有一个model,叫问答,如今须要开发一个有奖问答,须要支持话题打赏,里面多了不少功能。这个时候应该利用面向对象的继承的特性
2.异步
能分步走就分步走,能不能请求的就不请求
3.静态化
专题页面,好比秒杀页面,为了应对更大的流量、并发
4.业务解耦
1.选择innodb
2.主键索引
innodb 须要一个主键,主键不要有业务用途,不要修改主键。
主键最好保持顺序递增,随机主键会致使聚簇索引树频繁分裂,随机I/O增多,数据离散,性能降低
3.字段
(1)能选短整型,不选长整型
(2)能选 char 就避免 varchar
(3)当使用 varchar 的时候,长度够用就行
(4)大文本单独分离,好比文章的详情,单独出一张表。其余基本信息放在一张表里,而后关联起来。
(5)冗余字段的使用,好比文章的详情字段,增长一个文章markdown解析以后的字段
4.索引
(1)没有索引的更新,可能会致使全表数据都被锁住。因此更新的时候要根据索引来作。
(2)联合索引的使用,联合索引“最左前缀”
system > const > eq_ref > ref > fulltext > ref_or_null > index_merge > unique_subquery > index_subquery > range > index > ALL
值 | 说明 |
---|---|
const | 经过索引直接找到一个匹配行,通常主键索引的时候 |
ref | 没有主键索引或者惟一索引的条件索引,查询结果多行,在联合查询中很常见 |
index | 利用到了索引,有可能有其它排序,where 或者 group by 等 |
all | 全表扫描,没有使用到索引 |
有Using filesort
或者Using temporary
的话,就必需要优化了
5.收集慢索引
my.ini 配置里增长
long_query_time=2 log-slow-queries=/data/var/mysql_slow.log
6.使用nosql
一个很是复杂的查询列表能够将其插入zset 作排序列表,而后具体的信息,经过zset里面的纸去mysql 里面去查询
redis优化
(1)多实例化,更高效地利用服务器 cpu
(2)内存优化
redis.conf
hash-max-zipmap-entries 512 (hash-max-ziplist-entries for Redis >= 2.6) hash-max-zipmap-value 64 (hash-max-ziplist-value for Redis >= 2.6) list-max-ziplist-entries 512 list-max-ziplist-value 64 zset-max-ziplist-entries 128 zset-max-ziplist-value 64 set-max-intset-entries 512
(3)尽量使用使用 hashes ,时间复杂度低,查询效率高