PHP面试/笔试题杂记 V

一份来自同事大哥的笔试题.

对于大流量的网站, 采用什么样的方法来解决网站打开速度过慢的问题 ?

  • 硬件方面

普通的一个 p4 的服务器每天最多能支持大约 10 万左右的 IP,主要影响服务器的速度有:
网络 - 硬盘读写速度 - 内存大小 - cpu 处理速度。

  • 软件方面
  • 静态页面 前台实现完全的静态化当然最好,可以完全不用访问数据库
  • 数据库优化
  • 表字段优化
  • 语句优化
  • 索引优化
  • 分库分表
  • 读写分离
  • 禁止外部的盗链
  • 外部盗链往往会加大服务器的请求和流量的负载压力,因此应该严格限制外部对于自身的图片或者文件盗链,
  • 好在目前可以简单地通过 refer 来控制盗链,
  • Apache 自己就可以通过配置来禁止盗链
  • IIS 也有一些第三方的 ISAPI 可以实现同样的功能。
  • 或者使用非技术手段来解决,比如在图片上增加水印
  • 控制大文件的下载。
  • 大文件的下载会占用很大的流量,并且对于非 SCSI 硬盘来说,大量文件下载会消耗
  • CPU,使得网站响应能力下降。因此,尽量不要提供超过 2M 的大文件下载,如果需要提供,建议将大文件放在另外一台服务器上
  • 使用不同主机分流主要流量
  • 将文件放在不同的主机上,提供不同的镜像供用户下载。比如如果觉得 RSS 文件占用
  • 流量大,那么使用 FeedBurner 或者 FeedSky 等服务将 RSS 输出放在其他主机上,这样别人访问的流量压力就大多集中在 FeedBurner 的主机上,RSS 就不占用太多资源了
  • 使用流量分析统计软件。

在网站上安装一个流量分析统计软件,可以即时知道哪些地方耗费了大量流量,哪些页面需要再进行优化,因此,解决流量问题还需要进行精确的统计分析才可以。比如:Google Analytics(Google 分析)。

网站被劫持, 有什么解决办法 ?

    1. 网站域名被泛解析

关闭域名的泛解析,进入了域名解析后台以后点击我们的域名找到带*号的域名解析,删除去就可以了。

    1. 黑客劫持

建议不定期对你正常运行的网站进行备份

    1. 浏览器被劫持

直接卸载掉,去官网在从新下载一个浏览器程序安装即可。

    1. 运营商劫持
  • 运用https加密

网站被DDOS攻击, 有什么解决办法 ?

 分布式拒绝服务攻击(DDOS)是目前常见的网络攻击方法,它的英文全称为Distributed Denial of Service

    1. 备份网站

防范 DDOS 的第一步,就是你要有一个备份网站,或者最低限度有一个临时主页。生产服务器万一下线了,可以立刻切换到备份网站,不至于毫无办法。

    1. 保证服务器系统的安全

首先要确保服务器软件没有任何漏洞,防止攻击者入侵。确保服务器采用最新系统,并打上安全补丁。在服务器上删除未使用的服务,关闭未使用的端口。对于服务器上运行的网站,确保其打了最新的补丁,没有安全漏洞。

    1. 隐藏服务器的真实IP地址

不要把域名直接解析到服务器的真实IP地址,不能让服务器真实IP泄漏,服务器前端加CDN中转(免费的CDN一般能防止5G左右的DDOS),如果资金充裕的话,可以购买高防的盾机,用于隐藏服务器真实IP,域名解析使用CDN的IP,所有解析的子域名都使用CDN的IP地址。此外,服务器上部署的其他域名也不能使用真实IP解析,全部都使用CDN来解析。

    1. HTTP 请求的拦截

HTTP 请求的特征一般有两种:IP 地址和 User Agent 字段。比如,恶意请求都是从某个 IP 段发出的,那么把这个 IP 段封掉就行了。或者,它们的 User Agent 字段有特征(包含某个特定的词语),那就把带有这个词语的请求拦截。

拦截可以在三个层次做。

  1. 专用硬件

Web 服务器的前面可以架设硬件防火墙,专门过滤请求。这种效果最好,但是价格也最贵。

  1. 本机防火墙

操作系统都带有软件防火墙,Linux 服务器一般使用 iptables。比如,拦截 IP 地址1.2.3.4的请求,可以执行下面的命令。

1
iptables -A INPUT -s 1.2.3.4 -j DROP
  1. Web 服务器

Web 服务器也可以过滤请求。拦截 IP 地址1.2.3.4,nginx 的写法如下。

1
2
3
location / {
deny 1.2.3.4;
}
    1. 带宽扩容

对于网站来说,就是在短时间内急剧扩容,提供几倍或几十倍的带宽,顶住大流量的请求。这就是为什么云服务商可以提供防护产品,因为他们有大量冗余带宽,可以用来消化 DDOS 攻击。

    1. CDN

CDN 指的是网站的静态内容分发到多个服务器,用户就近访问,提高速度。因此,CDN 也是带宽扩容的一种方法,可以用来防御 DDOS 攻击。

对千万级别数据库有哪些优化方法 ?

对于一个存储设计,必须考虑业务特点,收集的信息如下:

    1. 数据的容量:1-3年内会大概多少条数据,每条数据大概多少字节;
    1. 数据项:是否有大字段,那些字段的值是否经常被更新;
    1. 数据查询SQL条件:哪些数据项的列名称经常出现在WHERE、GROUP BY、ORDER BY子句中等;
    1. 数据更新类SQL条件:有多少列经常出现UPDATE或DELETE 的WHERE子句中;
    1. SQL量的统计比,如:SELECT:UPDATE+DELETE:INSERT=多少?
    1. 预计大表及相关联的SQL,每天总的执行量在何数量级?
    1. 表中的数据:更新为主的业务 还是 查询为主的业务
    1. 打算采用什么数据库物理服务器,以及数据库服务器架构?
    1. 并发如何?
    1. 存储引擎选择InnoDB还是MyISAM?
  • 防篡改签名

服务器为每个Cookie项生成签名。如果用户篡改Cookie,则与签名无法对应上。以此,来判断数据是否被篡改。

  • 服务端提供一个签名生成算法 secret
  • 根据方法生成签名 secret(wall)=34Yult8i
  • 将生成的签名放入对应的Cookie项 username=wall|34Yult8i。其中,内容和签名用|隔开。
  • 服务端根据接收到的内容和签名,校验内容是否被篡改

比如服务器接收到请求中的Cookie项 username=pony|34Yult8i,然后使用签名生成算法secret(pony)=666。 算法得到的签名666和请求中数据的签名不一致,则证明数据被篡改

对于网站并发或秒杀功能, 你是如何实现的 ?

一个秒杀系统的基本流程基本如下:

用户请求详情页系统时间请求秒杀接口执行秒杀操作返回结果

用户请求详情页系统时间请求秒杀接口执行秒杀操作都是位于服务端,都会被大量访问,那么我们优化系统高并发就是从这四点着手

    1. 请求详情页的优化

详情页是属于静态济源,例如css,js等,对于这些静态资源,如果全部放在服务端主机中,势必对服务主机造成很大的压力,并发量也得不到支持,我们可以使用CDN来进行优化

    1. 获取系统时间操作的优化

获取系统时间的操作不用优化

    1. 秒杀地址接口获取的优化

cdn适合存放不变的内容,例如css,js等静态内存,所以它不适合放在cdn中缓存,但是适合在服务端缓存,例如redis,甚至可以做redis集群。

    1. 优化秒杀操作
  • 首先,可以用NoSQL例如redis作为一个原子计数器,记录商品的库存,当用户秒杀该商品时,该计数器便减1,当计数器为0时,则隐藏秒杀接口,用户就不能秒杀操作了;
  • 然后记录哪个用户秒杀了该商品,作为一个消息,存储到分布式mq(例如: RabbitMQ)中,然后用户立即返回提示(例如:正在秒杀,请等待)
  • 最后由接着由消息队列的消费者进程异步取出数据,再让服务端的服务去执行数据库的update操作。
    1. 重启与过载保护

如果系统发生“雪崩”,贸然重启服务,是无法解决问题的。最常见的现象是,启动起来后,立刻挂掉。这个时候,最好在入口层将流量拒绝,然后再将重启。如果是redis/memcache这种服务也挂了,重启的时候需要注意“预热”,并且很可能需要比较长的时间。

假如一个大型项目给分配3台服务器, 如何分配服务器 ?

  • 集群结构

同一个业务,部署在多个服务器上

  • 分布式结构

一个业务分拆多个子业务,部署在不同的服务器上

Powered by Hexo and Hexo-theme-hiker

Copyright © 2017 - 2023 Keep It Simple And Stupid All Rights Reserved.

访客数 : | 访问量 :