web开发经验分享
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
too many connnections
1,增加thread_cache_size等参数 2, 客户端使用连接池 php-cp
分布式session存储
使用memcache集群来保存session数据,配置简单,只需要修改php.ini 几个参数,代码层不需修改: session.save_handler = memcache memcache.hash_strategy = consistent session.save_path = tcp://127.0.0.1:11211, tcp://192.168.0.10:11211 即使是memcache的一致性哈希算法,当单台memcache服务器挂掉以 后,它上面的session数据会丢失,如果session数据在业务逻辑中比 较重要,可以使用redis存储session数据,redis支持数据同步,并可 数据持久化。
http缓存
1,登陆状态,购物车等信息不能被缓存,可再页面中发请求获取这些信 息 2,文件有更改,想刷新浏览器缓存,使用版本号控制app.js?v=3w2875
接入层如何并发请求后端服务?
1,php使用curl_multi系列函数 2,php接口异步化,拆为2个接口,一个负责发送请求,一个负责接收 响应。 3, golang 使用goroutine
缓存使用问题
3,缓存空对象,数据库查询结果为空时,缓存一特殊字符串标识. 4,缓存穿透 public function get(key) { value = redis.get(key); if (value == null) { //代表缓存值过期 //设置3min的超时,防止del操作失败的时候,下次缓存过期一直不能load db if (redis.setnx(key_mutex, 1, 3 * 60) == 1) { //代表设置成功 value = db.get(key); redis.set(key, value, expire_secs); redis.del(key_mutex); } else { //这个时候代表同时候的其他线程已经load db并回设到缓存了,这时候重试获取 缓存值即可 sleep(50); get(key); //重试 } } else { return value; } }
缓存使用问题
先操作数据库 vs 先操作缓存 1,先写数据库,再淘汰缓存:第一步写数据库操作成功,第二步淘汰缓 存失败,则会出现DB中是新数据,Cache中是旧数据,数据不一致。 2,先淘汰缓存,再写数据库:第一步淘汰缓存成功,第二步写数据库失 败,则只会引发一次Cache miss。 但是两个并发操作,一个是更新操作,另一个是查询操作,更新操作 删除缓存后,查询操作没有命中缓存,先把老数据读出来后放到缓存中, 然后更新操作更新了数据库,如何破? 缓存双淘汰机制 异步读binlog日志淘汰 写完数据库后更新缓存? 两个并发的写操作导致脏数据。(还是看具体场景,确定没并发也是 可以用的) 结论:为缓存设置上过期时间。
开启SYN Cookies。当出现SYN等待队列溢出时,启用cookies来处理,可防范少量SYN攻击 net.ipv4.tcp_syncookies = 1 设置TIME_WAIT重用,可以让处于TIME_WAIT的连接用于新的tcp连接 net.ipv4.tcp_timestamps = 1 net.ipv4.tcp_tw_reuse = 1 该参数设置tcp连接中TIME_WAIT的快速回收,默认60s变为RTT net.ipv4.tcp_tw_recycle = 1 tcp_fin_timeout 限定了成为孤儿的 FIN_WAIT2 所能存活的时间,也就是从TIME_WAIT2进入CLOSED的等待时间。 net.ipv4.tcp_fin_timeout = 30 每一个连接请求(SYN报文)都需要排队,直至本地服务器接收,该变量就是控制每个端口的 TCP SYN队列长度的。如果 连接请求多余该值,则请求会被丢弃。 net.ipv4.tcp_max_syn_backlog = 2048 该参数设置系统的TIME_WAIT的数量,如果超过默认值则会被立即清除。 /proc/sys/net/ipv4/tcp_max_tw_buckets 对应net.ipv4.tcp_max_tw_buckets 当接口收到包的速率大于内核处理包的速率时,设备的输入队列中的最大报文数。 net.core.netdev_max_backlog = 2000 通过listen系统调用可以指定的最大accept队列backlog,当排队的请求连接大于该值时,后续进来的 请求连接会被丢弃。 net.core.somaxconn = 2048 tcp_orphan_retries 和tcp_max_orphans
proxy_connect_timeout 300s; proxy_send_timeout 300s;
proxy_read_timeout 300s;
nginx 其他配置
fastcgi_buffers系列指令 gzip系列指令
proxy_cache的作用是缓存后端服务器的内容,可能是任何内容,包括静态的和动态(proxy_cache指令 集)。 fastcgi_cache的作用是缓存fastcgi生成的内容,很多情况是php生成的动态的内容(fastcgi_cache指令集) ngx_cache_purge模板清除指定url缓存(proxy_cache_purge/fastcgi_cache_purge)
ຫໍສະໝຸດ Baidu
linux参数配置:
对于一个新建连接,内核要发送多少个 SYN 连接请求才决定放弃 net.ipv4.tcp_syn_retries = 2 对于远端的连接请求SYN,内核会发送SYN + ACK数据报,以确认收到上一个 SYN连接请求包 net.ipv4.tcp_synack_retries = 2 在连接建立过程中(未激活的sock),放弃回应一个TCP连接请求前﹐需要进行多少次重试才放弃连接 net.ipv4.tcp_retries1 = 3 在通讯过程中(已激活的sock),数据包发送失败后,内核要重试发送多少次后才决定放弃连接。 net.ipv4.tcp_retries2 = 3
http部分
缓存文件存放目录,levels缓存层次, keys_zone 缓存空间名和共享内存大小(热点内容放在内存),inactive 失效时间,max_size最大缓存空间(硬盘占用) fastcgi_temp_path /data0/cache_dir; fastcgi_cache_path /data0/cache_dir levels=1:2 keys_zone=cgi_one:10m inactive=2h max_size=2g;
分表后如果后台有查询聚合需求,怎么做?
每页10条,取前10页数据 1,常规解法 2,业务折中,禁止跳页
常规解法
常见架构:
web技术栈软件配置:
1,linux 2,nginx 3,php 4,redis 5,mysql
linux参数配置:
各种类型socket的默认读写缓冲区大小,然而对于特定类型的socket则可以设置独立的值覆盖默认值 大小。例如tcp类型的socket就可以用/proc/sys/net/ipv4/tcp_rmem和tcp_wmem来覆盖。 net.core.rmem_default = 256960(单位字节) net.core.wmem_default = 256960 最大socket读写buffer net.core.rmem_max = 513920 net.core.wmem_max = 513920 TCP能够使用的内存:这三个值就是TCP使用内存的大小,单位是页,每个页是4K的大小 net.ipv4.tcp_mem = 8388608 12582912 16777216 tcp_rmem数组表示任何一个TCP连接上的读缓存上限 net.ipv4.tcp_rmem = 8760 256960 4088000 net.ipv4.tcp_wmem = 8760 256960 4088000 TCP连接在idle 1800s后,内核才发起probe.如果probe 3次(每次30秒)不成功,内核才彻底放弃,认为该连 接已失效 net.ipv4.tcp_keepalive_time = 1800 net.ipv4.tcp_keepalive_intvl = 30 net.ipv4.tcp_keepalive_probes = 3 开启TCP的选择性应答 net.ipv4.tcp_sack = 1 net.ipv4.tcp_fack = 1 打开窗口缩放 net.ipv4.tcp_window_scaling = 1 规定了tcp/udp可用的本地端口的范围。 net.ipv4.ip_local_port_range = 1024 65000
web开发
2017-03-30
前端
后端
DB
运维(1)
运维(2)
运维(2)
计算机基础
架构
辅助工具
跨域
1, CORS 浏览器先发送options请求,再发送实际请求 nginx配置:
server { ...... add_header Access-Control-Allow-Origin *; add_header Access-Control-Allow-Headers X-Requested-With; add_header Access-Control-Allow-Methods GET,POST,OPTIONS; ...... }
2, nginx反向代理
location /one/ { ...... proxy_pass http://xxx.com/two/; proxy_redirect http://xxx.com/two/ /one/; }
http缓存
1,Expires,缓存过期时间 2,Etag头,文档版本标识符,通常是内容md5值 If-None-Match检查Etag内容是否改变 3,If-Modified-Since,文件是否更改过 响应头中Last-Modified对应 4, Cache-Control头,控制本地缓存和共享缓存(cdn) Cache-Control: public max-age=3600 本地缓存和CDN缓存均缓存· 小时 Cache-control:private immutable 缓存在本地,不能更改 Cache-control:no-cache 不能缓存,确保2次验证
nginx参数配置:
worker_processes 8; worker_cpu_affinity 00000001 00000010 00000100 00001000 00010000 00100000 01000000 10000000; 这个指令是指当一个nginx进程打开的最多文件描述符数目 worker_rlimit_nofile 102400; events { use epoll; 表示每个worker进程所能建立连接的最大值 worker_connections 204800; } 指定了与client的keep-alive连接空闲超时时间。服务器将会在这个时间后关闭连接。 keepalive_timeout 600; 指定连接到后端FastCGI的超时时间,这个超时不能超过75秒 fastcgi_connect_timeout 300; 后端服务器数据回传时间(代理发送超时).超时设置不是为了整个发送期间,而是在两次write操作期间。 如果超时后,upstream没有收到新的数据,nginx会关闭连接 fastcgi_send_timeout 300; 连接成功后,后端服务器响应时间(代理接收超时) fastcgi_read_timeout 300;