web優化

前端優化

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.優化首屏顯示速度

  資源的按需加載,延時加載

  圖片的懶加載

Nginx優化  

  • 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 ,時間複雜度低,查詢效率高

相關文章
相關標籤/搜索