一份来自同事大哥的笔试题.
对于大流量的网站, 采用什么样的方法来解决网站打开速度过慢的问题 ?
- 硬件方面
普通的一个 p4 的服务器每天最多能支持大约 10 万左右的 IP,主要影响服务器的速度有:
网络 - 硬盘读写速度 - 内存大小 - cpu 处理速度。
- 软件方面
- 静态页面 前台实现完全的静态化当然最好,可以完全不用访问数据库
- 数据库优化
- 表字段优化
- 语句优化
- 索引优化
- 分库分表
- 读写分离
- 禁止外部的盗链
- 外部盗链往往会加大服务器的请求和流量的负载压力,因此应该严格限制外部对于自身的图片或者文件盗链,
- 好在目前可以简单地通过 refer 来控制盗链,
- Apache 自己就可以通过配置来禁止盗链
- IIS 也有一些第三方的 ISAPI 可以实现同样的功能。
- 或者使用非技术手段来解决,比如在图片上增加水印
- 控制大文件的下载。
- 大文件的下载会占用很大的流量,并且对于非 SCSI 硬盘来说,大量文件下载会消耗
- CPU,使得网站响应能力下降。因此,尽量不要提供超过 2M 的大文件下载,如果需要提供,建议将大文件放在另外一台服务器上
- 使用不同主机分流主要流量
- 将文件放在不同的主机上,提供不同的镜像供用户下载。比如如果觉得 RSS 文件占用
- 流量大,那么使用 FeedBurner 或者 FeedSky 等服务将 RSS 输出放在其他主机上,这样别人访问的流量压力就大多集中在 FeedBurner 的主机上,RSS 就不占用太多资源了
- 使用流量分析统计软件。
在网站上安装一个流量分析统计软件,可以即时知道哪些地方耗费了大量流量,哪些页面需要再进行优化,因此,解决流量问题还需要进行精确的统计分析才可以。比如:Google Analytics(Google 分析)。
网站被劫持, 有什么解决办法 ?
- 网站域名被泛解析
关闭域名的泛解析,进入了域名解析后台以后点击我们的域名找到带
*
号的域名解析,删除去就可以了。
- 黑客劫持
建议不定期对你正常运行的网站进行备份
- 浏览器被劫持
直接卸载掉,去官网在从新下载一个浏览器程序安装即可。
- 运营商劫持
- 运用https加密
网站被DDOS攻击, 有什么解决办法 ?
分布式拒绝服务攻击(DDOS)是目前常见的网络攻击方法,它的英文全称为Distributed Denial of Service
- 备份网站
防范 DDOS 的第一步,就是你要有一个备份网站,或者最低限度有一个临时主页。生产服务器万一下线了,可以立刻切换到备份网站,不至于毫无办法。
- 保证服务器系统的安全
首先要确保服务器软件没有任何漏洞,防止攻击者入侵。确保服务器采用最新系统,并打上安全补丁。在服务器上删除未使用的服务,关闭未使用的端口。对于服务器上运行的网站,确保其打了最新的补丁,没有安全漏洞。
- 隐藏服务器的真实IP地址
不要把域名直接解析到服务器的真实IP地址,不能让服务器真实IP泄漏,服务器前端加CDN中转(免费的CDN一般能防止5G左右的DDOS),如果资金充裕的话,可以购买高防的盾机,用于隐藏服务器真实IP,域名解析使用CDN的IP,所有解析的子域名都使用CDN的IP地址。此外,服务器上部署的其他域名也不能使用真实IP解析,全部都使用CDN来解析。
- HTTP 请求的拦截
HTTP 请求的特征一般有两种:IP 地址和 User Agent 字段。比如,恶意请求都是从某个 IP 段发出的,那么把这个 IP 段封掉就行了。或者,它们的 User Agent 字段有特征(包含某个特定的词语),那就把带有这个词语的请求拦截。
拦截可以在三个层次做。
- 专用硬件
Web 服务器的前面可以架设硬件防火墙,专门过滤请求。这种效果最好,但是价格也最贵。
- 本机防火墙
操作系统都带有软件防火墙,Linux 服务器一般使用 iptables。比如,拦截 IP 地址1.2.3.4的请求,可以执行下面的命令。
1 | iptables -A INPUT -s 1.2.3.4 -j DROP |
- Web 服务器
Web 服务器也可以过滤请求。拦截 IP 地址1.2.3.4,nginx 的写法如下。
1 | location / { |
- 带宽扩容
对于网站来说,就是在短时间内急剧扩容,提供几倍或几十倍的带宽,顶住大流量的请求。这就是为什么云服务商可以提供防护产品,因为他们有大量冗余带宽,可以用来消化 DDOS 攻击。
- CDN
CDN 指的是网站的静态内容分发到多个服务器,用户就近访问,提高速度。因此,CDN 也是带宽扩容的一种方法,可以用来防御 DDOS 攻击。
对千万级别数据库有哪些优化方法 ?
对于一个存储设计,必须考虑业务特点,收集的信息如下:
- 数据的容量:1-3年内会大概多少条数据,每条数据大概多少字节;
- 数据项:是否有大字段,那些字段的值是否经常被更新;
- 数据查询SQL条件:哪些数据项的列名称经常出现在WHERE、GROUP BY、ORDER BY子句中等;
- 数据更新类SQL条件:有多少列经常出现UPDATE或DELETE 的WHERE子句中;
- SQL量的统计比,如:SELECT:UPDATE+DELETE:INSERT=多少?
- 预计大表及相关联的SQL,每天总的执行量在何数量级?
- 表中的数据:更新为主的业务 还是 查询为主的业务
- 打算采用什么数据库物理服务器,以及数据库服务器架构?
- 并发如何?
- 存储引擎选择InnoDB还是MyISAM?
假如网站用 cookie
保存用户信息, 怎么样防止串号的问题及 cookie
被篡改 ?
- 防篡改签名
服务器为每个Cookie项生成签名。如果用户篡改Cookie,则与签名无法对应上。以此,来判断数据是否被篡改。
- 服务端提供一个签名生成算法
secret
- 根据方法生成签名
secret(wall)=34Yult8i
- 将生成的签名放入对应的Cookie项
username=wall|34Yult8i
。其中,内容和签名用|隔开。- 服务端根据接收到的内容和签名,校验内容是否被篡改
比如服务器接收到请求中的Cookie项
username=pony|34Yult8i
,然后使用签名生成算法secret(pony)=666
。 算法得到的签名666
和请求中数据的签名不一致,则证明数据被篡改
对于网站并发或秒杀功能, 你是如何实现的 ?
一个秒杀系统的基本流程基本如下:
用户请求详情页、系统时间、请求秒杀接口、执行秒杀操作、返回结果
用户请求详情页,系统时间,请求秒杀接口,执行秒杀操作都是位于服务端,都会被大量访问,那么我们优化系统高并发就是从这四点着手
- 请求详情页的优化
详情页是属于静态济源,例如css,js等,对于这些静态资源,如果全部放在服务端主机中,势必对服务主机造成很大的压力,并发量也得不到支持,我们可以使用CDN来进行优化
- 获取系统时间操作的优化
获取系统时间的操作不用优化
- 秒杀地址接口获取的优化
cdn适合存放不变的内容,例如css,js等静态内存,所以它不适合放在cdn中缓存,但是适合在服务端缓存,例如redis,甚至可以做redis集群。
- 优化秒杀操作
- 首先,可以用NoSQL例如redis作为一个原子计数器,记录商品的库存,当用户秒杀该商品时,该计数器便减1,当计数器为0时,则隐藏秒杀接口,用户就不能秒杀操作了;
- 然后记录哪个用户秒杀了该商品,作为一个消息,存储到分布式mq(例如: RabbitMQ)中,然后用户立即返回提示(例如:正在秒杀,请等待)
- 最后由接着由消息队列的消费者进程异步取出数据,再让服务端的服务去执行数据库的update操作。
- 重启与过载保护
如果系统发生“雪崩”,贸然重启服务,是无法解决问题的。最常见的现象是,启动起来后,立刻挂掉。这个时候,最好在入口层将流量拒绝,然后再将重启。如果是redis/memcache这种服务也挂了,重启的时候需要注意“预热”,并且很可能需要比较长的时间。
假如一个大型项目给分配3台服务器, 如何分配服务器 ?
- 集群结构
同一个业务,部署在多个服务器上
- 分布式结构
一个业务分拆多个子业务,部署在不同的服务器上