场景题——LANMP
Question
如果短时间有10万个请求,都是数据库操作,但是数据库只能支持2000个连接,那么用什么方式,可以保证数据库不崩溃?
Answer
可以使用数据库连接池。数据库连接池中创建若干个连接,等候php使用。当请求到达的时候,如果连接池中还有空余的连接可用,那么就直接选择一个空余的连接与数据库建立连接后,再进行数据库操作,操作完毕后,将本次的数据库连接放回连接池。如果请求到达的时候,如果连接池中没有可用的连接了,那么就让本次请求阻塞(阻塞队列),等待有空余的数据库连接时,在选择队首的请求连接数据库进行操作。
Question
在开发的时候,测试自己开发的网站时,发现无法访问,那么,请详细说明排错的顺序?
Answer
0、根据访问网站时的错误码进行判断:如果是500(Internal server error),那么应该是服务器崩溃了;如果是502,那么表示bad gateway(可能是php-fpm没有启动,或者说php-fpm异常,或者说php程序代码错误);如果是503(unavailable service),可能是访问用户太多,Nginx或者Apache处理不过来;如果是504(gateway timeout),那么可能是php-fpm处理不过来,无法及时返回响应给服务器。
1、查看本地网络情况是否畅通,如果自己的网络畅通,那么应该不是客户端的问题,进入下一步
2、(此步可省,因为不能随时去询问别人)询问其他区域的用户是否能够访问网站,如果也不能访问网站,那么肯定是服务器出问题了。
3、查看nginx或者apache是否启动(或者查看80端口是否被占用),如果服务器正常,那么可以查看日志,看请求的日志记录。
Question
地址栏输入网址后,到内容显示,过程中发生了什么?
Answer
1、对于URL,先分析URL中使用到的协议、域名、端口,http(80),https(443),ftp(21)。
2、查看本机hosts文件,如果在hosts文件中找到域名和ip的对应的关系,那么就不用请求DNS去解析域名,否则,如果在hosts文件中没有该条记录,那么就会使用DNS去解析域名,找到对应的IP。这里涉及DNS的递归查询和迭代查询,形式与“递归函数和循环迭代”相似,注意DNS是应用层协议,下层使用UDP协议,53端口。
3、如果找到的ip是环回ip(127.0.0.1),那么就直接本地处理了(转发给本机对应的端口即可)。
4、和服务器建立TCP连接(3次握手)
5、如果URL中的协议是http协议,那么使用地址栏访问服务器,默认使用的get方式。
6、服务器在收到请求之前处于监听状态,所以收到请求之后,如果有权限、登录验证,那么就进行对应的验证。经过验证后,如果是静态文件,那么就会查看服务器的目录,看是否存在该文件是否存在,如果不存在,那么返回一个404;如果文件存在,但是不允许当前用户访问,那么就会返回403;如果有权限,那么那么就直接将静态文件返回给客户端。
7、如果是动态内容,比如.php,.asp,那么服务器在收到请求后,会将请求转发给对应的cgi程序,比如php的php-fpm或者加载到apache中的mod_php。
8、程序处理完毕后,将内容返回给服务器,服务器将内容在返回给客户端,并且断开客户端的连接(4次握手)。
9、客户端收到服务器的响应之后,如果是html文件,那么就会渲染一棵DOM树,然后将DOM内容显示;如果是文本文件,那么就会直接显示;如果响应内容的格式是浏览器不能识别的数据,那么就会被当做文件下载。
Question
怎么防止一个接口被频繁调用?
Answer
Question
Answer
Question
Answer
浙公网安备 33010602011771号