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;
#}