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