I/O模型+Nginx基本配置

http协议以及IO 模型:
    
    http协议:80/tcp 超文本传输协议
        html开发或标记的文本
        html:超文本标记语言、

        http协议
            MEMI:编码方案
            major/minor

        URL : scheme://server:port/path/to/source;


        HTTP事物:
            request:
                <method> <URL> <version>
                <header>

                <entity-body>

            response:
                <version> <status> <reason phrase>
                <header>

                <body>

            应用层协议格式:
                文本:smp,http
                二进制:缓存服务器 memeacher

        method:
            GET:从服务器获取一个资源
            HEAD:只从服务器获取响应首部(<version> <status> <响应短语>  <headers>这两行)
            POST:向服务器发行要处理的数据
            PUT:将请求的主体部分存储在服务器上(危险)
            DELETE:删除服务器上指定的文档
            TRACE:追踪请求到达服务器中间经过的代理服务器
            OPTIONS:请求服务器返回对指定资源支持的使用方法

        status:
            1xx:100-101,信息提示
            2xx:200-206,成功类的信息
            3xx:300-305,重定向类的状态码,301 永久重定向,302 临时重定向
            4xx:400-415:客户端错误
            5xx:500-505,服务器错误

            常用的状态码:
                200:成功响应 -- ok
                301:永久重定向 -- Moved Permanently
                302:临时重定向 -- Moved Temporarily
                304:本地有缓存,问服务器端,资源是否发生变化,服务器端资源未发生改变 -- Not Modified
                401:需要输入账号密码访问 Unauthorized
                403:请求别禁止Forbidden
                404:服务器无法找到客户端请求的资源, Not Found
                500:服务器内部错误 Intrenal Server Error
                502:代理服务器从后端服务器收到了一条伪响应,如无法连接到网关:Bad Gateway
                503:服务器不可用,临时服务器维护或过载,服务器无法处理请求
                504:网关超时

            首部的分类:
                通用首部:即可用在响应也可用在请求

                请求首部
                响应首部

                实体首部
                扩展首部

                    通用首部:
                        Date:报文的创建时间
                        Connecion:连接方式
                        Via:显示报文经过的中间节点
                        Cache-Control:控制缓存
                        Pragma:也是缓存相关
                    请求首部:
                        Accept:通过服务器自己可接受的媒体类型
                        Accept—Charset
                        Accept-Ecoding:接受的编码格式,如gip
                        Accept-Language

                        Client-IP
                        Host:请求的服务器名称和端口号
                        Referer:包含当前正在请求的资源的上一级资源
                        User-Agent:客户端代理(浏览器类型等)

                        条件式请求首部:
                            Expect
                            IF-Modified-Since:自从指定的时候之后,请求的资源是否修改
                            IF-Unmodified-Since
                            IF-None-Match:本地缓存中存储的文档的ETag标签是否与服务器文档的ETag不匹配
                            IF-Match
                        安全请求的首部:
                            Authorization:向服务器发送认证信息,如账号密码
                            Cookie:向服务器端发送cookie
                            Cookie2
                        代理请求首部:
                            Proxy-Authorization:向待服务器认证
                    响应首部:
                        信息性:
                            Age:有效期限,响应持续时长
                            Server:服务器类型 ,软件名称和版本
                        协商首部:某资源有多种昂表示方法时使用
                            Accept-Range:服务器可接受的请求范围类型
                            Vary:服务器查看的其他首部列表
                        安全响应首部:
                            Set-Cookie:向客户端设置cookie
                            www.Authenticate:来自副武器的对客户端的质询认证表单
                    实体首部:
                        Allow:列出对此实体可使用的请求方法
                        Location:告诉客户端真正实体位与何处

                        Content-Encoding:内容编码模式
                        Content-Language
                        Content-Length:主体的长度
                        Content-Location:实体真正所处的位置
                        COntent-Type:主体的对象类型

                        缓存相关的:
                            ETag:实体的扩展标签
                            Expires:实体的过期时间
                            Last-Modified:最后一次修改的时间    

    web页面:多个资源
        URL:
            pv:page view
            UV:基于cookie

            尽可能的快速打开页面方案:
                并行访问:
                    支持的最大并发数 是 针对对单个域名做限制,所以很多时候,不同的资源 提供不同的域名。
                页面缓存:

    认证:
        基于IP认证:
        基于用户认证:
            basec认证
            digest认证

    资源认证:
        Alias:路径 别名
        DocumentRoot:url映射路径

    httpd:MPM
        prefork:
        worker:
        event I/O类型:
        同步和异步:synchronous   asyncronous
            关注的是:消息通知机制(如何通知)

            同步:调用发出之后,不会立即返回,一旦返回,则返回的是最终结果
            异步:调用发出之后,被调用方立即返回消息,但返回的并非最终给结果;被调用者通过状态、通知机制等来通知调用者,或通过回调函数来处理结果。

        阻塞和非阻塞:block, nonblock
            关注的是:调用者等待被调用者返回调用结果时的状态(过程)

            阻塞:调用结果返回之前,调用者会被挂起,调用者只有在得到返回结果之后,才能继续。
            非阻塞:调用者在结果返回之前,不会被挂起,即调用者不会被阻塞。

        常用的IO 模型:
            阻塞式IO:
                一直等
            非阻塞式IO:
                数据在到用户空间时,一次又一次的查看,数据是否好了
                当数据进入用户空间,在往进程内存时,处于阻塞状态
            IO复用:
                select() poll() --- 效果一样的系统调用 (BSD,sysv风格)
                prefork, work就是基于select实现的,所以最多支持1024个请求并发
                还是被阻塞,只是阻塞留给了select,因为没有腾出干别的事,性能没有什么提高,只是可以接受新IO
            事件驱动IO:
                通知机制:
                    1、水平触发通知,一直通知,直到处理
                    2、边缘触发, 只通知一次
                event 是事件驱动IO
            异步IO:

            一个进程同一时刻只能处理一个IO

                一个web有网络IO 和 磁盘IO

        nginx:事件IO/边缘触发 ,异步IO, mmap,所以支持很好的并发能力
  
  
  
  
  
  
  
  
Nginx(web server, web server proxy)(俄罗斯人) Nginx: 国内: Tengine:淘宝 Registry:陌陌用 libevent:高性能的网络库 epoll():实现 事件驱动IO nginx特性: 模块化设计,较好的扩展性,nginx不支持动态装卸在模块,Tengine支持动态装卸在 高可靠:类似httpd,主控进程,工作线程 master
--> worker master: worker: 低内存消耗: 一个线程响应多个请求,10000个keep-alive模式下的请求,仅需2.5MB内存 支持热部署: 配置甚至nginx版本更新,日志文件的滚动,不停机 支持事件驱动 支持AIO,异步io 支持mmap:内存映射 基本功能: 静态资源的web服务器(类似httpd),能缓存打开的文件描述符 支持的协议:http,smtp,pop3协议的反向代理 缓存加速,负载均衡(反带实现) 支持fscgi(fpm,LNMP),uWSGI(Python) 模块化(非DSO) 过滤器zip,SSI及图像的大小调整 支持SSL 扩展功能: 基于名称和IP的虚拟主机 支持keepalive 支持平滑升级 定制访问日志,支持日志缓冲区提供日志缓存新能 支持路径别名 支持基于IP及用户的访问控制 支持速率限制,支持并发限制 正向代理:代理客户端,请求所有的服务器 -- 内部访问外部 反向代理:代替客户端,访问某些服务器的某些资源 -- 外部访问内部 缓存是基于 K-V 缓存的 Nginx基本架构: 一个master生成多个worker进程 事件驱动,epoll(边缘触发) kquequ,/dev/poll 复用器:select,poll,rt signal 支持sendfile,sendfiled64 支持mmap 支持AIO Nginx工作模式: 非阻塞,事件驱动,由一个master进程生成多个worker进程,每个worker响应n个请求 worker * n (端口才65535) sendfile机制: nginx模块类型: 核心模块: 变准的http模块(standerd http modules): 可选的模块: 第三方模块:编译的时候,手动指定在何处 安装方法: 原码:编译安装 制作好的程序:rpm包 原码编译安装: 安装pcre-devel,支持正则,以便url重写 配置文件放在安装目录下(推荐),以便后期移植 rpm及源码安装: # ./configure --prefix=/usr/local/nginx --conf-path=/etc/nginx/nginx.conf --user=nginx --group=nginx --error-log-path=/var/log/nginx/error.log --http-log-path=/var/log/nginx/access.log --pid-path=/var/run/nginx/nginx.pid --lock-path=/var/lock/nginx.lock --with-http_ssl_module --with-http_stub_status_module --with-http_gzip_static_module --with-http_flv_module --with-http_mp4_module --http-client-body-temp-path=/var/tmp/nginx/client --http-proxy-temp-path=/var/tmp/nginx/proxy --http-fastcgi-temp-path=/var/tmp/nginx/fastcgi # make && make install 配置文件: main配置段:全局配置 event:定义event类型工作特性 http{}:定义heep协议相关的配置 nginx.org 查看文档 主配置段的指令: 正常运行的必备配置: 1、user USRNAME [groupName]: 指定运行work运行的用户和组(使用同一个身份,有别于httpd) user nginx nginx; 2、pid /path/to/pid_file:nginx守护进程的pid文件 默认可能是编译的位置 、pid /var/run/nginx/nginx.pid 3、work_rlimt_nofile #; 指定所有work进程打开的最大文件句柄数 性能优化相关的配置: 1、worker_process #; worker进程的个数,通常少于物理核心数 2、worker_cpu_affinity cpumask ...; cpu绑定,只是说,该进程绑定到了该核心上,自己使用自己的缓存,不被调到其他核心,但不是说其他进程不切进该cpu (如果一直霸占cpu,启动时就绑定,同时去掉cpu的中断功能,隔离出一个cpu处理其它进程) cpumask: 0000 0001 0000 0010 0000 0100 0000 1000 worker_cpu_affinity 00000001 00000010 000001003、timer_reslution 计时器解析度,降低此值,可减少gettimeofday系统调用的次数 4、work_priority number: 指明worker进程的优先级 nice -20 19 优先级 100 139 nice 数字越小优先级越大 默认是以root启动,所以可以设置的 事件相关的配置; 1、accept_mutex (off |on) master调度用户请求至worker进程时使用的负载均衡锁,on表示能让多个worker轮流,序列化的去响应新请求 2、lock_file file: accept_mutex用到的所文件路径 3、use [epoll |rtsig | select | poll ] 指明使用的时间类型,建议nginx自行选择 4、worker_connection:单个worker的最大并发链接数 worker_connection 10240 worker_process 3 3 * 10240 但是大于65535 就没用了 用于调试,定位问题: --with-debug,编译的时候要编译进去 1、daemon (off|on); 是否以守护进程方式运行nginx,可以看到日志等信息,调试时 off 2、master_process (off| on); 是否以master-worker模型类运行nginx,调试时,可以设置为off,便于调试 3、error_log /path/to/error_log level; 日志记录位置 和 级别 ,可以本地,可以日志服务器等 常用: nginx: worker_processes worker_connections worker_cpu_affinity worker_priority 新改动配置文件生效: nginx -s reload stop,quit,reopen Nginx作为服务器使用的配置: http {}:由nginx_http_core_module模块引入 配置静态服务器 配置框架: http { upstream { } server { } # 每个server类似httpd中的一个<VirtualHost ''>; 出现多次 server { location URL{ root 'path' :本地文件系统 if ... { } }# 类似于httpd中的<Location> 用于定义UR与本地文件系统的映射关系,可以有多个 } } 注:与http相关的指令的配置,仅能在http,server,location,upstream,if 上下文,但有些指令仅能用于这5中的某些中 配置指令: 1、server{} :定义虚拟主机,基于IP,端口,域名 server { listen 8080; server_name www.a.com; root '/vhost'; } 2、listen:指定监听的地址和端口 3、server_name Name1 Name2 ... 主机名,可以多个,可以使用正则表达式(~开头,表示使用正则)或通配符; 匹配顺序: (1)、先精确匹配 www.a.com server { server_name www.a.com; } server { server_name *.a.com; } (2)、左侧通配符匹配: *.a.com server { server_name *.a.com; } server { server_name mail.*; } (3)、右侧通配符匹配; (4)、最后正则表达式匹配: ~^.*\.a\.com$ (5)、default_server 4、root:除了upstream,都可以使用 设置资源路径映射,用于指明请求的url锁对应的资源所在文件系统上的其实路径 5、location [=|~|~*|^~] url [...] location @name {...} 功能:允许根据用户请求的url来匹配定义的各location;匹配到时,此请求将被相应的location配置块中的配置所处理,例如做访问控制功能。 优先级:=, ^~, ~, ~*, 不带任何符号的location =:精确匹配检查 location = / { root '/vhost' } 必须从根开始检查 ~:正则表达式模式检查,区分大小写, ~* :表示不区分字符大小写 ^~ : url的前半部分匹配,不支持正则,只匹配到url格式的path部分 http://www.a.com/bbs/index.html ---> 匹配到第一个,获取的文件就在/vhost下 server { listen 8080; server_name www.a.com; location / { root '/vhost'; } location /images/ { root '/vhost/images/'; } location ~* \.php$ { fcgipass; } } 6、alias path:路径映射,路径别名 用于location配置段, 注意:root表示路径为对应的location '/' URL;alias表示路径映射,即location指令后定义的URL是相对于alias所指明的路径而言。 location /images/ { root '/vhost/web1/'; } http://www.a.com/iamges/a.jpg ---> /vhost/web1/images/a.jpg location /images/ { alias '/www/pictures/'; } http://www.a.com/iamges/a.jpg ---> /www/pictures/a.jpg 7、index file; 默认主页面 index index.html index.php; 从左往右。 8、error_page code ...[=code] URL | @name 根据http响应状态吗 来指明特用的错误页面。 error_page 404 /404_customed.html (对应于location而言) [= code]:以指定的响应吗响应,而不是默认原来的响应,可以指定响应页面 ---- error_page 404 =200 /404_customed.html 测试: /vhost/web1/404_customed.html server { listen 8080; server_name www.a.com; location / { root '/vhost/web'; error_page 404 =200 /404_customed.html } } 9、基于IP的访问控制:http,server,location中 allow all: deny : server { listen 8080; server_name www.a.com; location / { root '/vhost/web'; error_page 404 =200 /404_customed.html; deny 192.168.112.111; } } 10、基于用户的访问控制; basic,digest auth_basic 'Only For Vip' # 一段说明 auth_basic_user_file:账号密码文件 使用 htpasswd生成 server { listen 8080; server_name www.a.com; location / { root '/vhost/web'; error_page 404 =200 /404_customed.html; auth_basic 'Only For Vip' ; auth_basic_user_file /etc/nginx/.htpwsswd; } } 11、ssl--实现https # HTTPS server # #server { # listen 443 ssl; # server_name localhost; # ssl_certificate cert.pem; # ssl_certificate_key cert.key; # ssl_session_cache shared:SSL:1m; # ssl_session_timeout 5m; # ssl_ciphers HIGH:!aNULL:!MD5; # ssl_prefer_server_ciphers on; # location / { # root html; # index index.html index.htm; # } #} 12、stub_status {on|off} 仅能用于location上下文中 server { listen 8080; server_name www.a.com; location /status { stub_status on allow from 172.16.0.0/16 deny all } } 结果: Active connectionas:6 当前所有处于打开的链接数 server acceptcs handled requests 241 241 431 --- 接受进来的链接 --- 已经处理的链接 --- 已经处理的请求(注意:持久连接) Reading:0 writing:1 Waiting 5 reading :正在处于链接请求状态的链接数 writing:请求已经接收完成,正处于请求或发送响应的过程中的链接数 waiting:保持链接模式,且处于活动状态的链接数 13、URL rewrite:URL重写,重定向 url regex 例如: rewrite ^/image/(.*\.jpg)$ /imgs/$1 breaak; www.a.com/iamges/a/b/1.jpg ---> www.a.com/imgs/a/b/1.jpg seo? flag: last:(多条规则的时候)此rewrite规则完成后,就不在被后面的write规则处理,由useragent重新对重写后的url发起新请求 break:一旦此rewrit规则重写完成之后,发起新请求,且不会再被当前location中的热河rewrite规则检查 redirect:以302响应吗返回新的url(临时重定向) permanent:以301响应吗,永久重定向 location / { rewrite ^/bbs(.*)$ /forum/$1 break } 14if 语法:if (conditon) {....} 应用环境:server,location condition: 1、变量名 变量值为空串,或者以‘0’ 开始,则为false 2、以变量为操作数构成的比较表达式 可用 =, !=类似的比较操作符进行测试 3、正则表达式的模式匹配操作 ~:区分大小写的模式匹配检查 ~*:不区分大小写 !~和!~*:不进行正则匹配 4、测试文件是否存在: -f, !-f 5、测试指定的路径为目录的可能性 -d !-d 6、测试文件的存在性: -e !-e 7、检查文件是否有执行权限: -x !-x 例如: if ($http_user_agent ~* MSIE) { rewrite ^(.*)$ /msie/$1 break } 15、防盗链: location ~* \.(jpg|gif)$ { valid_referer none blocked www.a.com 合法的引用者 if ($invalid_referer) { rewrite ^/ http://www.a.con/403.html } } 16、定制访问日志格式; log_format log_format main '$remote_addr - $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" "$http_x_forwarded_for"'; access_log logs/access.log main; main是格式名 17、网络连接相关的配置: 1、keepalive_timeout #; 长连接的超时时长,默认75s 2、keepalive_requeste #; 在一个长连接上锁能够允许请求的最大资源数 3、keepalive_disable [msie6|safar1|none] 对指定的useragent 禁用长连接 4、tcp_modelay on|off 是否对长连接使用tcp_modelay,响应延迟 5、client_header_timeout #; 读取http请求报文首部的超时时长、 6、client_body_timeout # 读取http请求报文的bdy部分的超时时长 7、send_timeout #; 发送响应报文的超时时长。 18 fastcgi的相关配置: nginx:php启用为fpm模型 http :php作为模块 #location ~ \.php$ { # root html; # fastcgi_pass 127.0.0.1:9000; # fastcgi_index index.php; # fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name; # include fastcgi_params; #}

 

posted @ 2018-10-24 14:46  JerryZao  阅读(456)  评论(0编辑  收藏  举报