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 00000100; 3、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 } 14、if 语法: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; #}
为什么要坚持,想一想当初!