精华内容
下载资源
问答
  • WEB服务器的实现包含哪些内容

    千次阅读 2018-03-16 10:18:42
    WEB服务器的实现包含哪些内容 本文根据自己的经验,整理实现一个WEB服务器可能包含内容,每一项都点到为止,不做过多展开。以下顺序无重要程度区分,皆按实际场景考虑是否需要。 路由 WEB服务器的路由,本质...

    WEB服务器的实现包含哪些内容

    本文根据自己的经验,整理实现一个WEB服务器可能包含的内容,每一项都点到为止,不做过多展开。以下顺序无重要程度区分,皆按实际场景考虑是否需要。

    路由

    WEB服务器的路由,本质上是根据HTTP请求携带信息,决定执行何种逻辑。

    最简单的if-else语句,也是一种路由方式:

    // 路由依据通常使用请求method和url
    if (method === 'GET' && url === '/robots.txt') {
        // do something
    }
    else {
        // do other things
    }

    不同平台不同框架,路由定义的方式会有差异,但本质相同:通过HTTP请求所携带的信息,决定不同的执行逻辑。拿Node.js下Express举例:

    const express = require('express');
    const app = express();
    
    // GET:/home will match funcA
    app.get('/home', funcA);
    
    // POST:/home will match funcB
    app.post('/home', funcB);
    
    // GET:/params/a or GET:/params/b will be match funcC
    app.get('/params/:id', funcC); 
    
    // GET:/regexp/list-1.html or GET:/regexp/list-2.html will be match funcD
    app.get('/regexp/list-[0-9].html', funcD); 

    以上代码就是Node.js + Express的一种简单路由定义方式,但在真实场景下不推荐这样一行一行添加路由的写法,尽量做到按类型、业务拆分定义,也可以抽成独立于语言框架的一种配置项。

    日志

    日志用来记录跟请求相关的信息,经常作为数据统计,问题定位等用途,可分为以下几种:

    • 访问日志

    访问日志是最常见的基础日志,记录每一个request的部分请求信息和响应信息,通常会记录的信息有请求者IP、请求方式、请求URL、请求主体大小、请求Host、请求处理时长、响应状态码、响应主体大小等,这些日志信息可用做访问统计、问题定位等

    • 业务日志

    业务日志的内容,根据业务需要输出,可用于业务统计、追踪、问题定位等

    • 错误日志

    请求处理过程中发生错误、异常,只要能被捕捉,都应该输出到错误日志中,并且包含尽量多的上下文信息,方便开发人员定位BUG

    会话保持

    HTTP是一种无状态协议,但在某些业务场景下,需要保持会话信息,即请求需要跟踪并唯一标识请求者。

    现代WEB服务器都能实现会话保持功能,实现原理并不难,保证每一个请求都包含本次处理所需要的所有信息上下文即可。实现原理:

    • 初次请求时,服务器为本次请求分配一个唯一ID(SessionId)以及与之对应的会话信息(Session),然后在响应中包含该ID
    • 客户端收到响应时,存储所获得的ID(Cookie),以后每一个请求都带上该ID
    • 后续请求时,服务器取出请求所携带的ID以及根据ID获取对应的会话信息,即完成了会话追踪

    这个ID的承载体通常是一个HTTP头部,在浏览器中分别为Set-Cookie、Cookie,前者在响应时使用,后者在请求时使用。同时浏览器针对Set-Cookie还有很多其它特性,如:过期时间,作用范围(域名、路径),协议(HTTP、HTTPS)等

    有一个常见的面试题:Cookie与Session的区别。以下是我的理解:

    • Cookie是网站在浏览器中存储数据的一种方式,服务器通过Set-Cookie头部在浏览器中存储信息,浏览器通过Cookie请求头部携带所存储的信息给服务器,被存储的这份信息称为Cookie
    • Session可以指一次请求所对应的会话,是一种抽象概念,也可以指会话所对应的信息上下文本身,存储在服务器端

    Session通常是与SessionId一一对应,SessionId的传输依靠Set-Cookie/Cookie头部,SessionId对应的数据可以存放在内存或数据库中,前者难以跨进程共享故不推荐,后者因为读写高频经常选用Redis。

    缓存

    系统不同的部分或层级,获取数据的资源开销和速度经常会有显著差异,为追求更高的性能与更快的速度,于是就有了缓存这个概念,在很多应用场景下,使用缓存都可以显著提升系统整体性能。

    跟HTTP相关的缓存,常出现的地方有:

    • 客户端

    客户端,通常也就是浏览器,会根据一系列HTTP缓存规则去进行资源缓存,当资源命中缓存时,其获取速度是最快的,具体缓存策略参考HTTP缓存策略

    • 中间代理

    请求在客户端没有命中缓存时,会向服务器发送请求,但有可能经过不同的HTTP代理,有些HTTP代理实现了缓存功能,甚至有些专门用作缓存的HTTP代理。缓存代理在缓存未过期的情况下,不会去真实请求服务器资源,而是使用本地命中的缓存响应客户端,用于提升资源获取速度,同时减少网络负载

    • 反向代理

    反向代理,是现代WEB服务器架构中常见的一个名词,代理真实服务器与客户端进行通信。在反向代理服务器上通常会有缓存功能,减少真实服务器的负载,提供更高性能、更快速的资源访问能力

    版本控制

    版本控制,在这是指API的版本控制,一旦生产环境投入使用,在后续的版本迭代过程中,相同接口如果要修改,改变输入或输出。由于依赖服务器的客户端难以保持同步更新,新接口部署时还需同时保持旧接口可用,可以有两种方式:

    • 在同一接口中支持新、旧两种使用场景

    如果接口的性质、输入、输出都没有变化,只是内部实现的更新,则此方式可取。但如果因输入、输出变化,也在原有的老接口中揉合进新接口的功能代码,会导致代码难以阅读和维护,不推荐

    • 重新定义一个接口,用以支持新场景

    重新定义接口,支持新场景,原有接口不改变,此方式即接口的版本控制,在约束和规范下定义并实现新的接口,旧接口确认不再使用或不再兼容之后,从系统中移除。

    接口的版本控制虽非必需,但不表示不重要的,能够在系统设计之初考虑进去最好不过,具体如何实现版本控制,即如何确定约束和规范则因人而异,没有必然正确的标准。

    访问控制

    如果某些敏感资源,只有特定的访问者可以访问,就需要做访问控制,比如:内部系统不允许外部调用,用户资源需要登陆后才可以获取,管理系统需要管理员登陆才可访问,屏蔽某些已知的恶意IP访问等

    针对以上场景,可能采用的方式有:

    • 黑白名单

    允许或屏蔽特定用户访问,该方式比较僵硬,但在某些情况下却非常高效和便捷

    • 验证码

    有各种各样的验证码形式,但主要目的都是为了区别对待机器与人

    • 用户登陆

    依靠用户登陆,识别用户身份,控制访问权限

    单点调用频率限制

    单点调用频率限制也是访问控制的一部分,有特殊性,也经常被忽视。单点调用频率限制,最终常会转变成识别机器与人,因为真人的正常操作往往难以达到调用频率限制门槛。

    需要考虑单点调用频率限制的因素:

    • 资源成本较高

    需要消耗过多计算机资源(CPU、IO、磁盘等)、过多带宽、额外成本(短信验证码,其它收费服务等)等,API如果具有以上特性,那么为避免因非法使用而导致系统成本浪费,在技术上就需要尽可能的去防范

    • 维持公平性

    在某些特定业务场景下,如限量抢购、投票等场景,为了维持公平性,可能需要加以限制单点调用频率

    统一响应格式

    统一响应格式主要指业务API的返回值,HTTP的标准状态码是一种方式,但并不推荐在业务场景中直接使用。现代服务器API大多使用JSON作为数据交换格式,如果再套用HTTP标准状态码,会使得前端逻辑处理异常繁琐。

    例如根据文章ID获取文章,当文章ID对应的文章不存在,如果采用HTTP标准状态码,此时响应码应为404, 原因短语为Not Found,因为接口本身设计成JSON的返回值,返回404状态码会导致前端无法进入正常处理逻辑,需要额外逻辑去理解响应,并友好提示用户。

    统一API的响应格式,可使用以下简单结构:

    response = {
        code: number, // 0 表示成功,其它表示失败
        msg: string,  // 描述信息,code非0时表示错误描述
        result: var    // 成功时的响应数据,用于业务处理
    };

    所有能捕捉的异常,都可以包装成上面的结构返回,Content-Type: application/json。

    对等

    服务器实例部署需要保持对等,便于水平扩展,可分为两种:单机多进程、多机多进程。单机多进程,解决对单机的依赖(本地文件、本机网络资源、本机独有服务等),就可以转为多机多进程部署。

    负载均衡

    如果服务器实例实现了对等部署,也就是同一个服务,有多个实例在运行,通常在前面会存在一个负载均衡服务器,它会考虑到多个不同服务实例的负载情况,给它们带去不同数量的请求。可把负载均衡理解成另一个层次的路由。

    反向代理

    反向代理服务器是隐藏真实服务器相关信息,代理真实服务器与客户端打交道,同时可以集成其它功能的角色。出色代表:Nginx,性能稳定可靠,包含大部分非业务相关特性,如缓存、访问日志、负载均衡、路由转发等。

    总结

    一个现代WEB服务器,不一定包含上述所有内容,同时也不限于上述内容。上述每一项,都是根据自己的理解,简单描述一遍,不涉及具体实现与技术细节,因为每一项内容展开,都有太多太多内容。后续针对其中某些内容,再单独写文章进行更详细和深入的介绍。

    博客原文

    展开全文
  • 代理服务器

    千次阅读 2019-06-17 10:25:23
    Web 代理服务器是网络的中间实体。代理位于客户端和服务器之间,在各端点之间来回传送HTTP 报文。 HTTP 的代理服务器即是Web 服务器又是Web 客户端。HTTP 客户端会向代理发送请求报文,代理服务器必须像Web 服务器...
    • Web 代理服务器是网络的中间实体。代理位于客户端和服务器之间,在各端点之间来回传送HTTP 报文。
    • HTTP 的代理服务器即是Web 服务器又是Web 客户端。HTTP 客户端会向代理发送请求报文,代理服务器必须像Web 服务器一样,正确的处理请求与连接,然后返回响应。同时,代理自身向服务器发送请求,这样,其行为就必须像正确的HTTP 客户端一样,要发送请求并接收响应。如果要创建自己的HTTP代理,就要认真地遵循为HTTP 客户端和HTTP 服务器制定的规则。
    • 公共代理:大多数代理都是公共的共享代理。集中式代理更容易管理。某些代理应用,比如高速缓存代理服务器,会利用用户间共同的请求,这样的话,汇入同一个代理服务器的用户越多,它就越有用。
    • 私有代理:专用的私有代理并不常见,但他们确实存在,尤其是直接运行在客户端计算机上的时候,有些浏览器辅助产品,以及一些ISP服务,会在用户的PC 上直接运行一些小型的代理。
    代理与网关的对比
    • 严格来说,代理连接的是两个或多个使用相同协议的应用程序,而网关连接的则是两个或多个使用不同协议的端点。
    • 网关扮演的是 “ 协议转换器 ” 的角色,即使客户端和服务器使用的是不同的协议,客户端也可以通过它完成与服务器之间的事务处理。

    为什么使用代理

    • 代理服务器可以实现各种有用的功能。他们可以改善安全性,提高性能,节省费用。代理服务器可以看到并接触到所有流过的HTTP 流量,所以代理可以监视流量并对其修改,以实现很多有用的增值Web 服务。
    • 儿童过滤器:可以利用过滤代理来阻止学生访问成人内容。代理应该允许学生无限制地访问教育性内容,但对不适合儿童的站点要强行禁止访问。
    • 文档访问控制:可以用代理服务器在大量Web 服务器和Web 资源之间实现统一的访问控制策略,创建审核跟踪机制。比如:允许客户端1无限制的访问服务器A的页面,但要求客户端2访问的时候输入口令。为了防止一些经验丰富的用户蓄意绕过控制代理,可以静态地配置Web 服务器,使其仅接受来自代理服务器的请求。
    • 反向代理:代理可以假扮Web 服务器。这些被称为替代物或者反向代理的代理接收发给Web 服务器的真实请求,但与Web 服务器不同的是,他们可以发起与其他服务器的通行,以便按需定位所请求的内容。可以用这些反向代理来提高访问慢速Web 服务器上公共内容时的性能。在这种配置中,通常将这些反向代理称为服务器加速器。还可以将替代物与内容路由功能配合使用,以创建按需复制内容的分布式网络。
    • 内容路由器:代理服务器可以作为 “ 内容路由器 ” 使用,根据因特网流量状况以及内容类型将请求导向特定的Web 服务器。内容服务器可以用来实现各种服务级的请求。比如:如果用户或内容提供者付费要求提供更高的性能,内容路由器可以将请求转发到附近的复制缓存,或者如果用户申请了过滤服务,还可以通过过滤代理来转发HTTP请求。可以用自适应内容路由代理来构建很多有趣的服务。
    • 转码器:代理服务器在将内容发送给客户端之前,可以修改内容的主体格式。在这些数据表示法之间进行的透明转换被称为转码。转码代理可以在传输GIF 图片时,将其转换成JPEG 图片,以减少尺寸。也可以对图片进行压缩,或降低颜色的色彩饱和度以便在电视上观看。
    • 匿名者代理:会主动从HTTP 报文中删除身份特性(比如客户端IP地址、From 首部、Referer首部、cookie、URI 的会话ID),从而提高高度的私密性和匿名性。
      • 匿名代理会对用户报文进行下列修改以增加私密性
      • 从User-Agent 首部删除用户的计算机与OS 类型
      • 删除From 首部以保护用户的E-mail 地址
      • 删除Referer 首部来掩盖用户访问过的其他站点
      • 删除Cookie 首部以剔除概要信息和身份的数据

    代理服务器的部署

    • 出口代理:将代理固定在本地网络的出口点,以便控制本地网络与大型因特网之间的流量。可以在公司网络中使用出口代理,提供针对公司外部恶意黑客的防火墙保护,或降低带宽费用,提高因特网流量的性能。
    • 访问(入口)代理:代理被放在ISP 访问点上,用以处理来自客户的聚合请求。ISP 使用缓存代理来存储常用文档的副本,以提高用户(尤其是高速连接用户)的下载速度,降低因特网带宽耗费。
    • 反向代理:代理通常被部署在网络边缘,在Web 服务器之前,作为替代物使用,在哪里他们可以处理所有传送给Web 服务器的请求,并只在必要时向Web 服务器请求资源。替代物可以提高Web 服务器的安全特性,或者将快速的Web 服务器缓存放在较慢的服务器之前,以提高性能。反向代理通常会直接冒用Web 服务器的名字和IP 地址,这样所有的请求就会被发送给代理而不是服务器了。
    • 网络交换代理:可以将具有足够能力的代理放在网络之间的因特网对等交换点上,通过缓存来减轻因特网节点的拥塞,并对流量进行监视。
    代理层次结构的内容路由
    • 层次不一定非得是静态的,代理服务器可以根据众多因素,将报文转发给一个不断变化的代理服务器和原始服务器集。
    • 如果请求的对象属于一个付费试用内容分发服务的Web 服务器,代理就会将请求发送给附近的一个缓存服务器,这个服务器会返回已缓存对象,或者如果它哪儿没有的话,它会去取回内容
    • 如果请求的是特定类型的图片,访问代理会将请求转发给一个特定的压缩代理,这个代理会获取图片,然后对其进行压缩,这样通过到客户端的慢速下载时,速度会更快一些。
    代理是如何获取流量的
    • 修改客户端:很多Web 客户端,都支持手工和自动的代理配置。如果将客户端配置为使用代理服务器,客户端就会将HTTP 请求有意地直接发送给代理,而不是原始服务器。
    • 修改网络:网络基础设施可以通过若干种技术手段,在客户端不知道,或没有参与的情况下,拦截网络流量并将其导入代理。这种拦截通常依赖于监视HTTP 流量的交换设备及路由设备,在客户端毫不知情的情况下,对其进行拦截,并将流量导入一个代理。这种代理被称为拦截代理。
    • 修改DNS 的命名空间:放在DNS 服务器之前的代理服务器----替代物,会直接假扮Web 服务器的名字和IP地址,这样,所有的请求就会发送给这些替代物,而不是服务器了。要实现这一点,可以手工编辑DNS 名称列表,或者用特殊的动态DNS 服务器根据需要来确定适当的代理或服务器。有时在安装过程中,真实服务器的IP地址和名称被修改了,替代物得到的会是之前的地址和名称。
    • 修改Web 服务器:也可以将某些Web 服务器配置为向客户端发送一条HTTP 重定向命令(响应吗305),将客户端请求重定向到一个代理上去。收到重定向命令后,客户端会与代理进行通信。
    代理URI 和服务器URI 的不同
    • Web 服务器报文和Web 代理报文的语法是一样的。客户端向服务器而不是代理发送请求时,HTTP 请求报文中的URI 会有所不同。
    • 客户端向Web 服务器发送请求时,请求行只包含部分URI(没有方案、主机和端口)。但当客户端向代理发送请求时,请求行中则包含完整的URI。在原始的HTTP 设计中,客户端会直接与单个服务器进行对话。不存在虚拟主机,也没有为代理制定规则。单个的服务器都知道自己的主机名和端口,所以为了避免发送过多信息,客户端只需发送部分的URI 即可,无需发送方案和主机。
    • 代理出现之后,使用部分的URI 就有问题了。代理需要知道目标服务器的名称,这样他们才能建立自己与服务器的连接。基于代理的网关要知道URI 的方案才能连接到FTP 资源和其他方案上去。
    • 没有设置客户端使用代理时,它会发送部分URI
    • 设置客户端使用代理时,它会发送完整URI
    展开全文
  • Squid代理服务器

    千次阅读 2019-08-11 09:31:20
    目录 一、Squid代理服务器概念 二、Squid代理的作用 ...1、Squid是基于Unix的代理服务器(proxy server),它缓存比起点源点更接近请求者的互联网内容。Squid支持缓存多种不同的网络对象,包括那...

    一、Squid代理服务器概念

    1、Squid是基于Unix的代理服务器(proxy server),它缓存比起点源点更接近请求者的互联网内容。Squid支持缓存多种不同的网络对象,包括那些通过HTTP和FTP访问的人。缓存频繁要求网页、媒体文件和其它加速回答时间并减少带宽堵塞的内容。
    2、Squid代理服务器(Squid proxy server)一般和原始文件一起安装在单独服务器而不是网络服务器上。Squid通过追踪网络中的对象运用起作用。Squid最初担当中介,仅仅是把客户要求传递到服务器并存储要求对象的拷贝。如果同一个客户或同一批客户在要求还在Squid缓存(cache)时要求相同的对象,Squid就可以立刻服务,加速下载并保存带宽。
    3、squid是一种用来缓存Internet数据的软件。接受来自人们需要下载的目标(object)的请求并适当的处理这些请求。也就是说,如果一个人想下载一web界面,他请求squid为他取得这个页面。squid随之连接到远程服务器并向这个页面发出请求。然后,squid显式地聚集数据到客户端机器,而且同时复制一份。当下一次有人需要同一页面时, squid可以简单的从磁盘中读到它,那样数据会立即传输到客户机子
    上。

    二、Squid代理的作用

    通过缓存的方式为用户提供Web访问加速
    对用户的Web访问进行过滤控制

    三、Squid的工作流程

    当代理服务器中有客户端需要的数据时:
    a. 客户端向代理服务器发送数据请求;
    b. 代理服务器检查自己的数据缓存;
    c. 代理服务器在缓存中找到了用户想要的数据,取出数据;
    d. 代理服务器将从缓存中取得的数据返回给客户端。
    当代理服务器中没有客户端需要的数据时:
    a. 客户端向代理服务器发送数据请求;
    b. 代理服务器检查自己的数据缓存;
    c. 代理服务器在缓存中没有找到用户想要的数据;
    d. 代理服务器向Internet 上的远端服务器发送数据请求;
    f. 远端服务器响应,返回相应的数据;
    g. 代理服务器取得远端服务器的数据,返回给客户端,并保留一份到自己的数据缓存中。
    在这里插入图片描述

    四、Squid主要组成部分

    服务名 squid
    主程序 /usr/sbin/squid
    配置目录 /etc/squid
    主配置文件 /etc/squid/squid.conf
    监听tcp端口号 3128
    默认访问日志文件 /var/log/squid/access.log

    五、Squid各种代理的定义

    1、正向代理

    客户自己主动设定代理服务器的信息

    ( 在做此实验之前,需要搭建实验环境:重置两台虚拟机,保证实验环境的纯净,同时配置一台虚拟机,使虚拟机可以上网,将这一台可以上网的虚拟机作为squid代理服务器,另一台作为客户端,自己的真机相当于服务器。)

    实验步骤:
    在可以上网的虚拟机上进行:
    步骤一:
    yum install squid -y ##安装squid服务
    systemctl start squid ##开启squid服务
    systemctl enable squid ##设置squid服务是开机启动
    步骤二:
    netstat -antlupe | grep squid ##查看squid服务使用的端口号
    vim /etc/squid/squid.conf ##编辑squid配置文件
    (允许别人把我当作代理服务器,缓存100M,要定期自动清理,16个一级目录,256个二级目录)
    systemctl restart squid ##重启服务
    在这里插入图片描述
    步骤三:
    关闭火墙
    在这里插入图片描述
    在不可以上网的虚拟机上进行:
    步骤一:
    在此虚拟机这个客户端进行测试:此时依然ping不通百度,依旧不能上网。
    在这里插入图片描述
    步骤二:
    在此虚拟机的浏览器里面设置代理主机的信息,使它在依然ping不通百度的情况下,但是可以神奇的上网,
    在浏览器里面加入代理服务器的信息,浏览器上明确指名代理服务器的IP地址和端口号(3128端口)
    客户端上网时,每次都把请求发送给代理服务器处理,代理服务器根据请求确定是否连接到远程web服务器获取数据。如果在本地缓冲区有目标文件,则直接将文件传给用户即可。如果没有的话则先取回文件,先在本地保存一份缓冲,然后将文件发送给客户端浏览器。
    在这里插入图片描述在这里插入图片描述 在这里插入图片描述

    2、反向代理

    企业服务器自己主动设定代理服务器的信息

    squid反向代理也叫做cdn加速,利用squid代理服务器,此时属于反向代理
    (此实验需要三台主机,自己的真机作为客户端,desktop虚拟机作为代理服务器,server虚拟机作为服务器(有apache服务))
    实验步骤:
    在代理服务器上:
    步骤一:
    设置squid反向代理服务器
    直接查看有没有apache服务:rpm -qa | grep httpd 它没有apache,有squid服务
    netstat -antlupe | grep 80这个代理服务器没有apache服务
    在这里插入图片描述
    在火墙中开启http
    在这里插入图片描述
    步骤二:
    vim /ect/squid/squid.conf ## 编辑squid代理文件
    cd /usr/share/doc/squid-3.3.8/ ##查看ls内容
    less squid.conf.documentd ##在这个里面查看编写要求 写入
    ( http_port 80 vhost vport ##利用80端口访问apache的资源,写入apache的虚拟主机和虚拟端口
    cache_peer 服务器ip parent(父级) 80(apache服务端口) 0(此台代理服务器没有合作伙伴) proxy-only)
    systemctl restart squid
    在这里插入图片描述
    在这里插入图片描述

    在服务器上:
    步骤一:
    yum install httpd ##安装apache服务
    systemctl start httpd ##开启apache
    systemctl stop firewalld ##关闭防火墙

    步骤二:
    cd /var/www/html
    vim index.html
    编辑发布文件

    (自己填写内容)


    systemctl restart httpd ##重启apache服务
    在这里插入图片描述
    在客户端上:测试
    (1)添加本地解析:
    vim /etc/hosts
    172.25.254.x(写入代理服务器的ip)域名
    (2)我在客户端ping www.westos.com(显示解析是由172.25.254.x给的)
    或者在浏览器里面输入172.25.254.x直接可以看到服务器apache下面的东西,相当于客户端去访问代理服务器
    或者在浏览器直接输入www.westos.com也可以,看到的也是服务器的东西
    因为www.westos.com对应172.25.254.x,代理服务器没有资源,代理服务器去问服务器要东西,因此直接显示服务器下面共享出来的东西
    在这里插入图片描述

    六、Squid调度器的实现(负载均衡)

    为了缓解服务器压力
    (搭建实验环境,利用上面实验拥有apache服务的虚拟机,再配置一台有apache服务的主机。)
    在代理虚拟机上进行操作
    步骤一:
    编辑squid配置文件:
    http_access allow all
    http_port 80 vhost vport
    cache_peer 172.25.254.200 parent 80 0 proxy-only no-query round-robin originserver name=web1weight=2
    cache_peer 172.25.254.11 parent 80 0 proxy-only no-query round-robin originserver name=web2
    cache_peer_domain web1 web2 www.westos.com
    systemctl restart squid
    在这里插入图片描述
    步骤二:
    vim /etc/hosts
    代理服务器的ip www.westos.com
    firefox 输入www.westos.com
    调度只能使用域名,ip不可以
    注意:这里的用户访问只能是通过域名访问,如果通过ip访问的话就没有通过调度器而是直接访问,没有起到负载均衡的作用
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    展开全文
  • 代理服务器中的内容防拷贝技术

    千次阅读 2013-08-08 22:45:48
    代理服务器,广义上包括正向反向代理,httpcache等等,他们都要处理一个问题,就是从上游取得数据让后发往下游。这块有许多细节要处理,特别是如何避免内容的多次拷贝。nginx在这方面做得很不错,我们拿它来分析下,...
    代理服务器,广义上包括正向反向代理,httpcache等等,他们都要处理一个问题,就是从上游取得数据让后发往下游。这块有许多细节要处理,特别是如何避免内容的多次拷贝。ngixn在这方面做得很不错,我们拿它来分析下,希望能学到一些东西。
    nginx的这块处理主要发生在两个函数,或者说一对函数:ngx_event_pipe_read_upstream和ngx_event_pipe_write_downstream。这里不讨论他们在upstream扮演的角色,我们只看他们是如何漂亮的操作这些复杂的流程,协调各种buffer和chain。

    在读取后端数据时,nginx使用的是recv_chain,这种接口使用的是chain,所以在调用之前毫无疑问需要准备相应的chain来作为接收道具,其中一个便是p->free_raw_bufs(p类型为ngx_event_pipe_t)。这些chain对于recv_chain来说并不一定能完全用完,nginx在这么一个循环里面处理:

            cl = chain;
            p->free_raw_bufs = NULL;
    
            while (cl && n > 0) {
    
                ngx_event_pipe_remove_shadow_links(cl->buf);
    
                size = cl->buf->end - cl->buf->last;
    
                if (n >= size) {
                    cl->buf->last = cl->buf->end;
                    if (p->input_filter(p, cl->buf) == NGX_ERROR) {
                        return NGX_ABORT;
                    }
    
                    n -= size;
                    ln = cl;
                    cl = cl->next;
                    ngx_free_chain(p->pool, ln);
    
                } else {
                    cl->buf->last += n;
                    n = 0;
                }
            }
    
            if (cl) {
                for (ln = cl; ln->next; ln = ln->next) { /* void */ }
    
                ln->next = p->free_raw_bufs;
                p->free_raw_bufs = cl;
            }
    

    上面这块代码里面,将当前recv_chain用完的chain回收到pool里去,剩下的重新放回p->free_raw_bufs(即代码中的ngx_free_chain(p->pool, ln))。这里有个问题就是,recv_chain用的那些chain,不是还没有进一步处理嘛,怎么就回收了?其实回收的是chain而不是buffer,两者的身份不一样,chain相当于火车皮,buffer才是实际运输的原料。所以这里火车皮确实是用完了,我们还到回收器中备用。那么buffer呢?看这句p->input_filter(p, cl->buf),这里面就是处理的实际buffer,我们以ngx_http_proxy_copy_filter为例来看看里面到底发生了什么,当然含有其他input_filter。
    static ngx_int_t
    ngx_http_proxy_copy_filter(ngx_event_pipe_t *p, ngx_buf_t *buf)
    {
        ngx_buf_t           *b;
        ngx_chain_t         *cl;
        ngx_http_request_t  *r;
    
        if (buf->pos == buf->last) {
            return NGX_OK;
        }
    
        if (p->free) {
            cl = p->free;
            b = cl->buf;
            p->free = cl->next;
            ngx_free_chain(p->pool, cl);
    
        } else {
            b = ngx_alloc_buf(p->pool);
            if (b == NULL) {
                return NGX_ERROR;
            }
        }
    
        ngx_memcpy(b, buf, sizeof(ngx_buf_t));
        b->shadow = buf;
        b->tag = p->tag;
        b->last_shadow = 1;
        b->recycled = 1;
        buf->shadow = b;
    
        cl = ngx_alloc_chain_link(p->pool);
        if (cl == NULL) {
            return NGX_ERROR;
        }
    
        cl->buf = b;
        cl->next = NULL;
    
        if (p->in) {
            *p->last_in = cl;
        } else {
            p->in = cl;
        }
        p->last_in = &cl->next;
    
        if (p->length == -1) {
            return NGX_OK;
        }
    
        ...
        return NGX_OK;
    }
    
    这里面实际上是为每个buffer生成了一个所谓的影子(即shadow buffer),然后将这个shadow挂到p->in上面。当然开始的时候,这个shadow buffer需要我们alloc空间,后面p->free中会有很多现成的buffer给我们用。这里注意shadow buffer的设置:
        ngx_memcpy(b, buf, sizeof(ngx_buf_t)); 
        b->shadow = buf;
        b->tag = p->tag;
        b->last_shadow = 1;
        b->recycled = 1;
        buf->shadow = b;
    
    原始buffer,我们称为raw buffer,整体赋值给影子buffer(成员也被一并拷贝),即shadow buffer。然后两者通过shadow成员进行了相互关联。那么怎么区分谁是raw buffer,谁才是“真正”的影子呢?答案是last_shadow,这个诡异的东西下面会进一步讨论。
     
    到这里我们看到,从后端读取的原始数据,还在原来的buffer里面。现在又多了出来一串影子,他们搬上新火车皮,搭上了p->in这趟列车。在继续讨论之前,先把这个p的几个成员贴出来:
    struct ngx_event_pipe_s {
        ...
        ngx_chain_t       *free_raw_bufs;
        ngx_chain_t       *in;
        ngx_chain_t      **last_in;
    
        ngx_chain_t       *out;
        ngx_chain_t       *free;
        ngx_chain_t       *busy;
        ...
    }
    
    在后续接收内容,申请更多raw buffer受阻时,会将p->in中的数据写到临时文件中,这些曾经的shadow(指p->in),也会被搁到p->free中,这个东西可以看做是shadow buffer的回收站(当然在回收的时候,shadow之间需要断绝关系,因为那都是些往事了),当你需要一个buffer做shadow时,可以先来这里瞧瞧有没有货,没有再去求助于pool_alloc。还有那些原先保存数据的raw buffer也应该还到free_raw_bufs中,内存得到了重用。而写到磁盘文件中的数据,也会抽象成buffer(in_file标记),只不过它会挂到p->out上去。结构中的last_in不用说了,就是指向p->in中的最后一个chain。
     
    通过上面的分析,我们得知待处理的buffer可能在p->in或者p->out中,接下来就是将它们发送出去了,你会看到ngx_event_pipe_write_to_downstream就是专业干这活的。这里主要描述大体的轮廓和个别细节,而不去注释代码。不是我懒,而且当你对一个过程的轮廓有所了解之后,读代码会变得异常容易,这样我省去了指头儿的磨损,你也能学到更多的东西,而不只是“hi honey, open your mouth!”。
     
    先发p->out。为什么?本来数据在p->in中,后面不是由于特殊状况都写到临时文件中(即p->out管理的)嘛。会不会p->out有数据,p->in里面也有呢?当然会,正是由于p->out解围,才腾出了数量可观的buffer来给后续的处理使用。实际的发送动作,则是通过p->output_filter(p->output_ctx, out)来完成。这个就不说了,说起来没完,不懂的可以google。
     
    当然了我们想发的数据可能不会一次发完,也就是说p->in或者p->out的数据可能一部分发出去一部分却没有。已经发出去的,相关的chain会放到p->free中,被憋住的那些放到p->busy中(busy!着急啊。。)。这些事都发生在ngx_chain_update_chains中,可以去仔细读读代码。很明显,这些p->free里面都是些shadow buffer,马甲而已。既然数据已经发去出了,实际的raw buffer也应该被回收到p->free_raw_bufs。
    总之这两块差不多就这些大的流程,如果还有人对这块流程有些迷糊,希望我画画图来进一步描述一下的话,说明你可能在某些地方给暂时绊住了,再读读代码或者留言讨论下,反正有一个事实就是我很懒,不想画图(说实话这块画画图好理解一些!)。
    剩下的就是细节了,比如buf结构体中的各种标记,这里将它们列出(引自http://tengine.taobao.org/book/chapter_4.html):
            unsigned         recycled:1; /* 内存可以被输出并回收 */
            unsigned         in_file:1;  /* buffer的内容在文件中 */
            /* 马上全部输出buffer的内容, gzip模块里面用得比较多 */
            unsigned         flush:1;
            /* 
             * 基本上是一段输出链的最后一个buffer带的标志,标示可以输出,
             * 有些零长度的buffer也可以置该标志
             */
            unsigned         sync:1;
            /* 所有请求里面最后一块buffer,包含子请求 */
            unsigned         last_buf:1;
            /* 当前请求输出链的最后一块buffer         */
            unsigned         last_in_chain:1;
            /* shadow链里面的最后buffer,可以释放buffer了 */
            unsigned         last_shadow:1;
            /* 是否是暂存文件 */
            unsigned         temp_file:1;
    
    对于这些标记,怎么确定它们的用处和含义呢?没什么别的办法,第一,找到哪些地方对他们进行了设置(置位与清零)。第二,找到哪些地方对他们进行了判断处理,当然还需要对这些标记在这两个地方的上下文有所了解,总之挺麻烦的。依我看里面那个sync标记最含糊,字面上是同步,但是在使用的时候,却丝毫没发现跟同步有什么关系,****(脏话)。
     
    还有一个函数ngx_event_pipe_remove_shadow_links,它里面有个处理:
    ngx_event_pipe_remove_shadow_links(ngx_buf_t *buf)
    {
        ...
        while (!b->last_shadow) {
            next = b->shadow;
    
            b->temporary = 0;
            b->recycled = 0;
    
            b->shadow = NULL;
            b = next;
        }
        ...
    }
    
    看起来这些buf似乎通过shadow构成了一个链,这怎么解释?前面的分析里面完全没有相关的过程。哈哈,看这里:ngx_http_proxy_chunked_filter
    在这个函数里面,每个含有原始数据的raw buf(即ngx_http_proxy_chunked_filter第二个参数buf)中,可能包含多个chunk块,他们每一个都用一个新的buf来管理,彼此之间通过shadow连在一起,而最后一个buf(被设置了last_shadow)会跟这个raw buf建立shadow关系。为啥这个buf才是真正的raw buf的shadow呢?因为真正的shadow buf的成员跟raw buf是完全镜像的,而这些管理中间chunk的那些buf虽然也自称是“shadow”,但是他们的却只是映射了raw buf的一部分,半成品而已。换句话说真正的shadow都是last_shadow。
    由于chunk造成的这种内部关系对外界是透明的(是一种input_filter),所以我们在拿到一些free buf来用处理的时候,要去除这种潜在的shadow关联,因为那都是些过去的事,账一直没有算清罢了。而ngx_event_pipe_remove_shadow_links就是担当这种清理工的角色。
     
    nginx的这套对接方式只是使用在将上游的响应转发到下游的阶段,对于含有请求体的请求,如post请求,却没用使用这套机制,我在想为什么?应该是这样子吧,nginx将上游数据往下游分发是无条件的,拿到请求以后要尽可能快的给下游吐数据。而对于post请求,可能需要得到上游的批准("100-continue"响应),又需要尽快将下游提交的数据接受完。一般情况下不需要第一时间去跟上游沟通,nginx就选择先将请求体给接收完,然后再做后面的事。不过也有很多需求是希望将读到的内容第一个时间交给上游,那怎么办?
    tengine在他们1.5.0版本里实现了no buffered request body sent,即收到部分请求体即可以转发给后端服务器,作者是姚伟斌。
    Tengine-1.5.0 [2013-07-31]
    ...
    Feature: 增加了请求体不缓存到磁盘的机制,HTTP代理和FastCGI模块收到部分请求体即可以转发给后端服务器 [yaoweibin]
    ...
    
    我粗略看了下实现,大概的样子是在request里引入了free,busy,out等chain成员,然后模仿了一些前面我们讨论的关于上游往下游转发的一些逻辑。更多细节可以到http://tengine.taobao.org/changelog_cn.html#1_5_0查看。
     
    在我们的cache系统中,没有去参考nginx这套逻辑。为什么呢,难道你们有货?还真有!我们用了系统调用splice,所谓的零拷贝技术。这东西最开始出现在linux 2.6.17版本中,这个版本是在2006年release的,而我们cache项目刚好也是在那个时候开始搞,刚好排上用场!何必再去用nginx那套复杂机制,自找没趣。反观nginx,最早开源出来大概是在2002年,那个时候还是linux 2.6.0x的时代,实在没有多少牛B的东西可用。我认为Igor也是去搜寻过的,估计两手空空,所以才决定自己搞起。nginx的这套逻辑,淘宝给起了一个名字叫buffer防拷贝技术,刚开始听说的时候瞬间被唬住了。后来才知道就是上面说的那套东西。。。
     
    扯远了。这里稍微说一下splice的用法:
    splice() moves data between two file descriptors without copying between kernel address space and user address space. It transfers up to len bytes of data from the file descriptor fd_in to the file descriptor fd_out, where one of the descriptors must refer to a pipe.
    /* splice必须用到pipe,所以开始的时候你要初始化一个pipe */
    int pdf[2];
    pipe(pfd);
    
    /* 假设rfd接收数据的socket fd, wfd是输出数据的socket fd */
    
    /* 将rfd的数据读到pfd[1]中,当然数据转移的过程发生在内核 */
    splice(rfd, NULL, pfd[1], NULL, size, flags);
    
    /* 从pfd[0]中,可以将rfd写入的数据发送到wfd */
    splice(pfd[0], NULL, wfd, NULL, size, flags);
    
    其他的参数请查阅man手册,网上也有很多示例代码,大家可以学习下。哎,技术的进步让码农干活越来越轻松了。此刻要是没有内核支持的那些零拷贝技术,你有信心写出igro那套逻辑吗?反正我没有,如果你有那个能力,请麻烦留言告诉我,我们做个朋友。

    展开全文
  • 代理服务器的作用包括什么?

    千次阅读 2021-02-05 14:31:05
    他们对因特网站点所有的要求都会经由这台代理服务器,当有人访问过某一 站点后,所访问站点上的内容便会被保存在代理服务器的硬盘上, 如果下一次再有人访问这个站点, 这些内容便会直接从代理服务器中获取,而不必...
  • nginx代理服务器

    千次阅读 2016-07-05 10:39:51
    Nginx是一个轻量级高性能的服务器和反向代理,其特点是资源占用少,并发能力高。   一 概述   反向代理(Reverse Proxy)方式是指以代理服务器来接受Internet上的连接请求,然后将请求转发给内部网络上的...
  • 代理服务器基本知识

    万次阅读 2018-01-12 17:21:21
    代理服务器系列(一):基础知识 2005 年 9 月 10 日 世界网络教研组 编 一、什么是代理服务器? 代理服务器英文全称是 Proxy Server,其功能就是代理网络用户去取得网络信息。 形象的说:它是网络信息的中转站...
  • 反向代理服务器

    千次阅读 2011-06-30 10:50:00
    反向代理及Nginx示例1 反向代理的概念反向代理(Reverse Proxy)方式是指以代理服务器来接受internet上的连接请求,然后将请求转发给内部网络上的服务器,并将从服务器上得到的结果返回给internet上请求连接的客户端...
  • 代理服务器的工作原理

    千次阅读 2017-04-20 09:29:11
    一、代理服务器的概念及工作原理 (一)代理服务器的概念  随着Internet技术的迅速发展,越来越多的计算机连入了Internet。很多公司也将自己公司的局域网接入了Internet。如何快速地访问Internet站点,提高网络的...
  • 代理服务器基本认识

    千次阅读 2017-07-15 17:07:43
    一、代理服务器 代理服务器(Proxy Server)是一种重要的服务器安全功能,它的工作...提供代理服务的电脑系统或其它类型的网络终端称为代理服务器(英文:Proxy Server)。一个完整的代理请求过程为:客户端首先与代
  • HTTP代理服务器的实现

    万次阅读 2018-04-21 20:18:04
    接下来都是我对HTTP代理服务器的理解。 HTTP代理服务(proxy server) 器就是客户端也是服务端,是一个事务处理的中间人,就像下图所展示的一样, 图片来源于《HTTP权威...
  • linux下设置代理服务器

    万次阅读 2015-09-21 12:30:06
    代理服务器,顾名思义就是局域上不能直接上网的机器将上网请求(比如说,浏览某个主页)发给能够直接上网的代理服务器,然后代理服务器代理完成这个上网请求,将它所要浏览的主页调入代理服务器的缓存;然后将这个...
  • Squid代理服务

    万次阅读 2018-07-02 19:17:16
    Squid代理服务 一、squid概述 1、squid简介 ​ Squid cache(简称为Squid)是流行最广的,使用最普遍的开源缓存代理服务器。squid的主要作用和应用场景有: 用来做前置的Web缓存,加快用户访问Web的速度 ...
  • 计算机网络之HTTP代理服务器

    千次阅读 2016-05-22 22:22:43
    实验的内容: 1.实现基本的HTTP代理服务器,可以在指定端口接收客户端http的请求并且根据其中个URL地址访问该地址所指向的HTTP服务器,接收服务器的响应报文,并将响应报文转发给对应的客户进行浏览。 2.设计并实现...
  • 代理ip,代理服务器等相关

    万次阅读 2012-08-22 12:08:10
    在计算机词汇中,代理的全称为代理服务器(Proxy Server),其功能就是代理网络用户去取得网络信息。  形象的说,它是网络信息的中转站。在一般情况下,我们使用网络浏览器直接去连接其它Internet站点取得网络...
  • Nginx搭建反向代理服务器过程详解

    千次阅读 2016-09-08 13:55:52
    一、反向代理:Web服务器的“经纪人” 1.1 反向代理初印象 反向代理(Reverse Proxy)方式是指以代理服务器来接受internet上的连接请求,然后将请求转发给内部网络上的服务器,并将从服务器上得到的结果返回给...
  • 主要内容包括 Nginx 安装和简单使用、Nginx的简单原理、Nginx 配置文件的结构、如何使用 Nginx 来提供静态文件服务、如何使用 Nginx 来搭建简单的代理服务器等知识。 一、Nginx 的安装和简单使用 关于 Nginx ...
  • 常见的国内最新代理ip有哪些

    千次阅读 2021-03-02 17:13:37
    其中包括HTTP(s)代理ip,socks5代理ip,动态代理ip,静态代理ip,独占ip池和共享ip池。很难确定哪个更好,因为每个人的业务场景不同,对代理ip的需求也不同。让我们一起看看不同的代理ip有什么不同,以及我们如何选择...
  • 什么是代理服务器列表?

    千次阅读 2021-02-05 14:36:36
    服务器地址列表的使用,一直都是网名津津热道的话题,能有充足的代理服务器列表,是对想用代理上internet的最好方式了,很多人只是模糊的认识代理列表的使用,但是不是很清楚如果要使用代理服务器列表,如果对此感...
  • PROXY SERVER 代理服务器

    万次阅读 2019-07-28 08:01:25
    Proxy是什么呢,是代理。...而Proxy处于客户机与服务器之间,对于服务器来说,Proxy是客户机,Proxy提出请求,服务器响应;对于客户机来说,Proxy是服务器,它接受客户机的请求,...它的作用很象现实生活中的代理服务商...
  • Linux下架设代理服务器

    万次阅读 2011-10-12 11:11:40
    再次感谢,本文的作者bye2000。  Linux下架设代理服务器  作者:bye2000  ...在引入了代理服务器以后,这一过程变成了这样:客户端向服务器发起请求,该请求被送到代理服务器;代理服务器分析该请求,先查
  • 代理服务器anyproxy的安装/HTTPS/规则

    万次阅读 2017-07-02 22:41:49
    简介anyproxy是一款可以高度定制的代理服务器,基于nodejs。特征 支持https明文代理 支持低网速模拟 支持二次开发,可以用javascript控制代理的全部流程,搭建前端个性化调试环境 提供web版界面,观测请求情况 设计...
  • ubuntu 使用代理服务器 squid

    千次阅读 2018-10-17 09:32:37
    代理服务器是目前网络中常见的服务器之一,它可以提供文件 缓存、复制和地址过滤等服务,充分利用有限的出口带宽,加快 内部主机的访问速度,也可以解决多用户需要同时访问外网但公 有IP地址不足的问题。同时可以...
  • 用户A始终认为它访问的是原始服务器B而不是代理服务器Z,但实用际上反向代理服务器接受用户A的应答,从原始资源服务器B中取得用户A的需求资源,然后发送给用户A。由于防火墙的作用,只允许代理服务器Z访问原始资源...
  • 用Java开发代理服务器

    千次阅读 2018-06-29 09:55:14
    请求的第一行包含了目标URL。步骤二:代理服务器读取该URL,并把请求转发给合适的目标服务器。步骤三:代理服务器接收来自Internet目标机器的应答,把应答转发给合适的内部浏览器。例如,假设有一个企业的雇员试图...
  • 代理服务实际上也将内部网络隔离起来,满足局域网多个用户同时通过代理上网的需求。 代理服务器作为连接Internet与Intranet的桥梁,在实际应用中发挥着极其重要的作用。它可用于多个目的,最基本的功能是连接...
  • nginx apache 配置反向代理服务器

    千次阅读 2016-10-25 09:39:00
    nginx 由于其高效的并发处理能力,而开始被越来越多的人接受和认可,现在很多网站使用lnmpa架构,用nginx做反向代理和负载均衡非常简单,支持两个用法 1个proxy, 1个upstream,分别用来做反向代理,和负载均衡。nginx...
  • python爬虫之抓取代理服务器IP

    千次阅读 2018-01-06 19:21:50
    转载请标明出处: ... 本文出自:hesong的专栏 前言 使用爬虫爬取网站的信息常常会遇到的问题是,你的爬虫行为被对方...那么这时候就需要使用代理服务器IP来伪装你的请求了。 免费代理服务器网站有: - 西刺免费
  • 使用Jmeter可以录制脚本,可以帮助我们进行...在测试计划下添加“HTTP代理服务器 HTTP代理服务器界面介绍 名称:为你的HTTP代理服务器起一个好听的名字,不好听可能无法运行 注释:字面意思,看个人意愿,多项目多...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 304,473
精华内容 121,789
关键字:

代理服务包括哪些内容