zoukankan      html  css  js  c++  java
  • 实战nginx 基础知识总结(一)1.1

    squid

    Squid是一个缓存Internet数据的软件,其接收用户的下载申请,并自动处理所下载的数据。当一个用户想要下载一个主页时,可以向Squid发出一个申请,要Squid代替其进行下载,然后Squid连接所申请网站并请求该主页,接着把该主页传给用户同时保留一个备份,当别的用户申请同样的页面时,Squid把保存的备份立即传给用户,使用户觉得速度相当快。Squid可以代理HTTP、FTP、GOPHER、SSL和WAIS等协议并且,Squid可以自动地进行处理,可以根据自己的需要设置Squid,使之过滤掉不想要的东西。

    Squid可以工作在很多的操作系统中,如AIX、Digital、UNIX、FreeBSD、HP-UX、Irix、Linux、NetBSD、Nextstep、SCO、Solaris、OS/2等。

    在使用过程中,合理使用访问控制是非常重要的工作。使用访问控制特性,可以控制其在访问时根据特定的时间间隔进行缓存、访问特定站点或一组站点等等。Squid访问控制有两个要素:ACL元素和访问列表。访问列表可以允许或拒绝某些用户对此服务的访问。 

    Epoll

    可参看我以前博客详细:http://blog.csdn.net/u010236550/article/details/12624619

    Epoll模型主要负责对大量并发用户的请求进行及时处理,完成服务器与客户端的数据交互。其具体的实现步骤如下:
    (a) 使用epoll_create()函数创建文件描述,设定将可管理的最大socket描述符数目。
    (b) 创建与epoll关联的接收线程,应用程序可以创建多个接收线程来处理epoll上的读通知事件,线程的数量依赖于程序的具体需要。
    (c) 创建一个侦听socket描述符ListenSock;将该描述符设定为非阻塞模式,调用Listen()函数在套接字上侦听有无新的连接请求,在 epoll_event结构中设置要处理的事件类型EPOLLIN,工作方式为 epoll_ET,以提高工作效率,同时使用epoll_ctl()注册事件,最后启动网络监视线程。
    (d) 网络监视线程启动循环,epoll_wait()等待epoll事件发生。
    (e) 如果epoll事件表明有新的连接请求,则调用accept()函数,将用户socket描述符添加到epoll_data联合体,同时设定该描述符为非阻塞,并在epoll_event结构中设置要处理的事件类型为读和写,工作方式为epoll_ET.
    (f) 如果epoll事件表明socket描述符上有数据可读,则将该socket描述符加入可读队列,通知接收线程读入数据,并将接收到的数据放入到接收数据的链表中,经逻辑处理后,将反馈的数据包放入到发送数据链表中,等待由发送线程发送。

     

    1.不要采用一个连接一个线程的方式,而是尽量利用操作系统的事件多路分离机制
    如:UNIX下的 select  linux下的epoll BSD下的kqueue
    或者使用这些机制的高层API (boost.asio&&ACE Reactor)
    2.尽量使用异步I/O,而不是同步
    3.当事件多路分离单线程无法满足并发需求时,将事件多路分离的线程扩展成线程池  

    两种方式的区别主要体现在以下几个方面:
    1. select所能控制的I/O数有限,这主要是因为fd_set数据结构是一个有大小的,相当与一个定长所数组。
    2. select每次都需要重新设置所要监控的fd_set(因为调用之后会改变其内容),这增加了程序开销。
    3. select的性能要比epoll差,具体原因会在后续内容中详细说明

    Kqueue

    首先需要简单的说明几个概念, struct event, kevent()和kqueue。

    struct event就是kevent()操作的最基本的事件结构。
    kevent() 是一个系统调用syscall,而kqueue是freebsd内核中的一个事件队列kernel queue。
    kevent()是kqueue的用户界面,是对kqueue进行添加,删除操作的用户态的界面。

    // ==========================================================

    下面就重点介绍一下struct event和kevent()这两个开发者必须要了解的参数和API。

    1. struct event 结构体中主要成员介绍

    • ident     – 标记事件的描述符, socketfd, filefd, signal
    • filter      – 事件的类型, 读事件:EVFILT_READ, 写事件:EVFILT_WRITE, 信号:EVFILT_SIGNAL
    • flags     – 事件的行为, 对kqueue的操作:
    1. 添加到kqueue中:EV_ADD, 从kqueue中删除:EV_DELETE, 这两种是主要的行为
    2. 一次性事件:EV_ONESHOT, 此事件是或操作, 指定了该事件, kevent()返回后, 事件会从kqueue中删除
    3. 更新事件: EV_CLEAR,此事件是或操作, 手册上的解释是,当事件通知给用户后,事件的状态会被重置。可以用在类似于epoll的ET模式,也可以用在描述符有时会出错的情况。
    4. 其他事件: EOF事件:EV_EOF, 错误事件:EV_ERROR(返回值)
    • fflags    -
    • data     -
    • udata   – 用户指定的数据

    2. kevent() 各参数的说明

    • kq               - kqueue() 返回的唯一描述符, 标记着一个内核队列
    • changes       – 需要对kqueue进行修改的事件集合, 此参数就是kevent()对目前kqueue中的事件的操作,比如删除kqueue中已经存在的事件,或者向kqueue中添加新的事件,也就是说,kevent()通过此参数对kqueue的修改
    • nchanges     – 需要修改的事件的个数
    • events         – kevent()会把所有事件存储在events中
    • nevents       – kevent()需要知道存储空间有多大, == 0 : kevent()会立即返回
    • timeout        – 超时控制, = NULL:kevent()会一直等到有关注的事件发生; != NULL:kevent()会等待指定的时间

    // ==========================================================

    有几点需要说明的是 :

    1) 指定EV_ADD|EV_ONESHOT或者EV_DELETE|EV_ONESHOT的行为, kevent()返回后, 会把事件从kqueue中删除;

    2) 当事件类型指定为EVFILT_SIGNAL的时候, struct event 中data会返回此时信号发生了多少次
    3) 如果 nevents == 0, kevent()会立即返回, 不会理会timeout指定的超时时间, 这是一种直接注册事件的方法.

  • 相关阅读:
    分块传输编码在WEB安全中的应用——sql注入用,可以直接复用chunkSplitPostData还原
    漏扫是如何做的?——从xunfeng源码看漏扫原理
    WhatWeb使用——可识别Web技术,包括内容管理系统(CMS),博客平台,统计/分析包,Javascript库,服务器和嵌入式设备
    PyCharm单行执行代码 或 运行选中的代码
    PyCharm 改变黑色主题的颜色方案
    Docker四种网络模式
    Does C# have an equivalent to JavaScript's encodeURIComponent()?
    When are you supposed to use escape instead of encodeURI / encodeURIComponent?
    Difference between escape(), encodeURI(), encodeURIComponent()
    How can I trace the HttpClient request using fiddler or any other tool?
  • 原文地址:https://www.cnblogs.com/riasky/p/3431058.html
Copyright © 2011-2022 走看看