后台开发 - noonecare/linux GitHub Wiki

建立可用的大型网站,horizontal scalable 是必须考虑的一个问题。

为了让网站具有伸缩性。常见的措施有:

缓存

大型网站背后一般都有一个很大的数据库,client 会请求数据库中的资源。数据库的查询还是很耗时。根据查询历史,把热门资源(经常查询的记录)保存到磁盘或者内存(不管存在哪里都叫做缓存)中,下次访问资源时,优先从缓存中查找。这样就能减小响应客户的时间。在缓存的设计中,有个关键的问题是命中率, 就是要确保 client 的查询的资源大多都能在缓存中找到。

  • 分布式缓存, 缓存一致性问题

分布式缓存,指的是作为缓存的服务器又多个。这里有个关键问题,对于一份资源,应该取那台缓存服务器中取出资源。简单来讲,可以把请求(一般就是资源的 key)做 hash, 然后对 hash 值取模,取模后的结果是几,就到第几台服务器去查询资源。但是这种简单的算法,不利用缓存集群实现 horizontal scalable, 比如新采购了服务器,要加入到缓存集群中。缓存集群中的数据,整个都要重新在集群中分配。

一致性 hash 算法 在向集群中增加服务器时,也需要重新分配数据,但是相比于之前的算法,需要重新分配的数据大大减小了。

  • redis

redis 是常用的键值对数据库,常常用来做大型网站的缓存。

  • memcached

memcached 和 redis 是常用的键值对数据库,常常用来做大型网站的缓存。

  • 反向代理缓存,CDN

感觉跟 cache proxy 很像。CDN 负责缓存 server 的静态资源,当用户请求 server 的模型资源时,会转而从离 client 最近的 CDN 获取资源。

反向代理

nginx 是常用的作为反向代理的工具

安全

XSS

举一个例子, django 中有模板,可以接受输入把数据保存到数据库中,并且显示给其他客户端。那么黑客就可以把一段 javascript 代码写到数据库中,呈现给其他用户。当其他用户访问这段 html 时,会自动触发 javascript , 完成黑客想让你完成的操作。这就是 XSS 攻击。

SQL Injection 所有大型的 Web 服务几乎都有查询后台数据库的功能。查询数据一定是通过输入 web 的某些参数拼接成 SQL 的。如果参数设计的精巧,就能窥探出后台数据的很多信息。这种攻击技术就成为 SQL Injection。

CSRF

你访问了银行,银行给了你的浏览器一个 cookies, 有这个 cookies 你就可以访问银行而无需认证。在 cookies 过期之前,你访问了黑客的恶意网站。黑客的页面会悄悄的访问你的银行账户,因为浏览器已经有 cookies, 所以无需认证。这时,黑客就不经过你的同意,窃取了你的信息。这个就是 CSRF attack。

具体来说,CSRF 攻击源于WEB的隐式身份验证机制,web的身份验证机制虽然可以保证一个请求来自于某个用户的浏览器,但是无法保证该请求是用户批准发送的。

Click jacking

是一种视觉欺骗,就是用 iframe 覆盖 button, 然后你一不小心,就会点到 button, 这样就会发送请求。

OAuth 认证原理是什么,跟通常的返回 401 返回码的那个认证有什么不同?