• 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; #}
    为什么要坚持,想一想当初!
  • 相关阅读:
    获取资源文件 r.drawable中的图片转换为drawable、bitmap
    Android 启动白屏或者黑屏闪现解决
    Android应用截图方法
    史上最全的变量、作用域和内存问题
    RunLoop总结:RunLoop的应用场景(四)
    poj3436 ACM Computer Factory, 最大流,输出路径
    android开发——从相冊中选择图片不裁剪
    <html>
    poj3073
    poj 2482 Stars in Your Window (线段树扫描线)
  • 原文地址:https://www.cnblogs.com/JerryZao/p/9843475.html
Copyright © 2020-2023  润新知