web优化详解编程语言

前端优化

1.减少http请求次数

  图片、css、script等等这些都会增加http请求数,减少这些元素的数量就能减少响应时间

  把多个JS、CSS在可能的情况下写进一个文件,页面里直接写入图片也是不好的做法,应该写进CSS里,小图拼合后利用 background 来定位 

2.充分利用浏览器缓存

  expires,cache-control,last-modified,etag

3.分布式存储前端资源

  利用cdn存储前端资源

4.多域名访问资源

  浏览器对同一域名的并行请求数有上限,多个域名则支持更多并行请求

  使用同一域名的时候无用的 cookie 简直是噩梦

5.资源数据压缩

  开启gzip

  前端资源本身的压缩,js/css 打包编译(去掉空格,语意简化)图片资源的压缩等

6.优化首屏显示速度

  资源的按需加载,延时加载

  图片的懒加载

Nginx优化  

web优化详解编程语言

  • Nginx本身
  1. 高层
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;   
  • tcp/ip 网络协议配置
  1. /proc/sys/net/ipv4/tcp_tw_recycle 1                             开启TCP连接中TIME-WAIT sockets的快速回收,保证tcp_timestamps = 1
  2. /proc/sys/net/ipv4/tcp_tw_reuse 1                               允许将TIME-WAIT sockets重新用于新的TCP连接
  3. /proc/sys/net/ipv4/tcp_syncookies 0                            是否需要关闭洪水抵御 看自己业务,比如秒杀,肯定需要关闭了
  4. /proc/sys/net/ipv4/tcp_max_tw_buckets 180000         否则经常出现 time wait bucket table overflow
  • Linux
  1. /proc/sys/net/core/somaxconn 65535
  2. ulimit -a 65535

php优化

  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.业务解耦

mysql优化

  1.选择innodb

  2.主键索引

    innodb 需要一个主键,主键不要有业务用途,不要修改主键。

    主键最好保持顺序递增,随机主键会导致聚簇索引树频繁分裂,随机I/O增多,数据离散,性能下降

    3.字段  

    (1)能选短整型,不选长整型
    (2)能选 char 就避免 varchar
    (3)当使用 varchar 的时候,长度够用就行
    (4)大文本单独分离,比如文章的详情,单独出一张表。其他基本信息放在一张表里,然后关联起来。
    (5)冗余字段的使用,比如文章的详情字段,增加一个文章markdown解析之后的字段

  4.索引

    (1)没有索引的更新,可能会导致全表数据都被锁住。所以更新的时候要根据索引来做。

    (2)联合索引的使用,联合索引“最左前缀”

    (3)explain 的使用

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 ,时间复杂度低,查询效率高

原创文章,作者:ItWorker,如若转载,请注明出处:https://blog.ytso.com/20380.html

(0)
上一篇 2021年7月19日
下一篇 2021年7月19日

相关推荐

发表回复

登录后才能评论