Http协议简介
http协议:80/tcp,HyperText Transfer Procotol
html:Hypertext Mark Language
文本:HTTP/1.0 MIME
MIME:Multipurpose Internet Mail Extension
- major/minor
- text/plain
- image/jpeg
- major/minor
URL:schem://server[:port]/path/to/source
http事务:request <——–> response
request:
response:
- 协议格式:文本,二进制
method:
GET,HEAD,POST,PUT,DELETE,TRACE,OPTIONSstatus:
1xx: 信息类
2xx: 成功类 200(ok)
3xx: 重定向类 301,302,304
4xx: 客户端错误类 403,404
5xx: 服务器端错误 502HEADER:
通用首部
请求首部:
IF-Modified-Since IF-None-Match
响应首部
实体首部
扩展首部
Web页面访问及其页面资源
Web页面:多个资源
入口,资源引用认证:
基于IP认证
基于用户认证资源映射:
Alias
DocumentRoothttpd:MPM
prefork,worker,event
prefork:主进程,生成多个子进程,每个子进程处理一个请求
worker:主进程,生成多个子进程,每个子进程生成多个线程,每个线程响应一个请求
event:主进程,生成多个子进程,每个子进程响应多个请求
I/O类型
同步与异步:synchronous,asynchronous
关注的是消息通知机制- 同步:调用发生之后不会立即返回,但一旦返回,就返回最终结果
- 异步:调用出发之后,被调用方立即返回消息,但返回并非最终结果;被调用通过状态,通知机制来通知调用者,或通过回调函数来处理结果过
阻塞与非阻塞:block,nonblock
关注的是调用者等待返回调用结果时的状态- 阻塞:调用返回之前,调用者被挂起,只能得到返回结果过才能继续
- 非阻塞:调用在结果返回之前,不会被挂起,即调用不会阻塞调用者
I/O模型
blocking I/O:阻塞式
nonblocking I/O:非阻塞式
IO multiplexing:复用型
select(),poll()signal driven IO:事件驱动
- 通知:
水平触发:多次通知
边缘触发:只通知一次
- 通知:
asynchronous IO:异步
例如:一次读操作
- 等待数据准备好,磁盘到内核内存
- 从内核复制到进程内存
注:前三个为同步,后两个为异步
Nginx
http://nginx.org/ , C10k
Igor Sysoev,Rambler Media;
- engine X:nginx
- tenglne,OpenResty
Nginx特性:
- 模块化设计,较好的扩展性
- 高可靠性:master/worker
- 支持热部署:不停机更新配置值文件,更新日志,更新服务器程序版本
- 低内存消耗:10000个keep-alive连接模式的非活动链接仅占2.5M
- event-driven,alo,mmap
基本功能
静态资源的web服务器
http协议的反向代理
- http代理:指的是使用代理服务器使网络用户访问外部网站。代理服务器是介于浏览器和Web服务器之间的一台服务器,是建立在超文本传输协议上的网络浏览方式,作用是可以防伪部分对协议进行了限制的局域网。
- 关于HTTP代理服务器的主要功能包括五个方面:
- 突破自身IP访问限制,访问国外站点;
- 访问一些单位或团体内部资源,如某大学的内部网,使用教育网内地址段免费代理服务器可以用于对教育 网开放的各类下载上传以及各类资料查询共享等服务;
- 突破中国电信的IP封锁:中国电信有很多网站限制了用户访问,使用HTTP代理可以突破访问限制;
- 提高访问速度:通常代理服务器都设置一个较大的硬盘缓冲区,当有外界的信息通过时将信息保存到缓冲区中,当其他用户再访问相同的信息时, 可直接由缓冲区中取出信息传递给用户,提高访问速度;
- 隐藏真实IP:HTTP代理可以隐藏IP地址,避免受到网络攻击。
- http反向代理:所谓反向代理(Reverse Proxy)方式是指以代理服务器来接受Internet上的连接请求,然后将请求转发给内部网络上的服务器,并将从服务器上得到的结果返回给Internet上请求连接的客户端,此时代理服务器对外就表现为一个服务器。
我们常说的代理是指正向代理,正向代理的过程,它隐藏了真实的请求客户端,服务端不知道真实的客户端是谁,客户端请求的服务都被代理服务器代替来请求,科学上网工具 Shadowsocks 扮演的就是典型的正向代理角色。在天朝用浏览器访问 www.google.com 时会被无情的墙掉,要想翻阅这堵墙,你可以在国外用 Shadowsocks 来搭建一台代理服务器,让代理帮我们去请求 www.google.com,代理再把请求响应结果再返回给我。
反向代理隐藏了真实的服务端。
- http反向代理:所谓反向代理(Reverse Proxy)方式是指以代理服务器来接受Internet上的连接请求,然后将请求转发给内部网络上的服务器,并将从服务器上得到的结果返回给Internet上请求连接的客户端,此时代理服务器对外就表现为一个服务器。
pop3,SMPT,IMap4等邮件协议的反向代理
能缓存打开的文件(元数据),支持FastCGI(php-fpm),uWSGI(python web Framwork)等协议
模块化,过滤器zip,ssi,ssl
Web服务相关功能
虚拟主机,keepalive,访问日志,url rewrite,路径别名,基于IP及用户的访问控制,支持速率限制及并发数限制;……Nginx基础架构
master/worker
一个master进程,可以生成多个worker进程;
事件驱动:epoll(Linux),kqueue(FreeBSD),/dev/poll(Solars)- 消息通知:select,poll,rt signals
支持sendfile,sendfile64
支持AIO,mmapmaster:加载配置文件,管理worker进程,平滑升级……
worker:http服务,http代理,fastcgl代理……
模块类型
- 核心模块:core module
- Standard HTTP modules
- Optional HTTP modules
- Mail modules
- 3rd party modules
做什么?
静态资源web服务器
http服务器反向代理
Nginx安装与配置
Nginx:Window下安装与配置
Nginx:Ubuntu下安装与配置
配置文件
- 主配置文件:nginx.conf
- mime.types
- fastcgi配置文件:fastcgi_params uwsgl_params
- proxy.conf
- sites.conf
配置指令(必须以分号结尾)
Directive value1[value2……];
支持使用变量:
- 内置变量:又模块引入
- 自定义变量:
set variable value
- 引用变量:$variable
nginx.conf配置文件组织结构
main block
event{
...
}
http{
...
upstream{
...
}
//至少一个server
server{
...
server_name
root
alias
location /url/{
...
}
}
server{
...
}
}
main block配置
类别:
- 正常运行必备的配置
1. user USERNAME [GROUPNAME]; 指定用于运行work进程的用户和组.
user nginx nginx
2. pid /PATH/TO/PID_FILE; 指定nginx进程的pid文路径
pid /var/run/nginx.pid
3. worker_rlimit_nofile #; 一个work进程所能打开的最大文件描述符数量
4. worker_rlimit_slgpending #; 每个用户能够发给worker进程的信号数量
- 优化性能相关的配置
1. work_processes # ; worker进程的个数,通常为该物理CPU核心数量-1,可以设置为‘auto’
2. worker_cpu_affinity CPUMASK CPUMASK ……
CUPMASK:0001 0010 0100 1000
worker_cpu_affinity 00000001 00000010 00000100
3. worker_priority nice;
[-20,19]
- 用于调试,定位问题的配置
1. daemon off|on; 是否以守护进程方式启动nginx
2. master_process on|off; 是否以master/worker模型运行nginx
3. error_log /PATH/TO/ERROR_LOG level; 错误日志文件及其级别;用于调试需要,可以设为debug,但debug仅在编译时使用‘--with-debug’选项时才生效
event配置
1. worker_connections # ; 每个worker进程能够响应最大的并发请求数量
worker_proceses * worker_connections
2. use [epoll|rgsig|select|poll];定义使用的事件模型,建议让nginx自动选择
3. accept_mutex [on|off]; 各worker接受用户请求的负载均衡锁;启用时,表示用于让多个worker轮流的,序列的响应新请求
4. lock_file /PATH/TO/LOCK_FILE;
http配置
- 套接字或主机相关指令
server{}://定义虚拟主机
server{ listen PORT; server_name NAME; root /PATH/TO/DOCUMENTROOT; }
注:(1)基于port:listen监听不同的端口;
(2)基于hostname:server_name指令指向不同主机listen
listen address[:port][default_server][ssl][http2|spdy] listen port[default_server][ssl][http2|spdy] //default_server:设置默认虚拟主机,用于基于IP地址,或使用任意不能对应任何一个server的name时所返回的站点; //ssl:用于限制只能通过ssl连接提供服务 //spdy:SPDY protocol(speedy),在编译时spdy模块情况下,用于支持SPDY协议 //http2:http version 2;
server_name NAME [……];
可跟一个或多个主机名,名称还可以使用通配符和正则表达式(~);
1.首先做精准匹配:www.magedu.com
2.左侧通配符:*.magedu.com
3.右侧通配符:www.magedu.*
4.正则表达式:~^.*\magedu\.com$
5.default server
tcp_nodelay on|off
在keepalive模式下的连接是否使用TCP_NODELAY选项;tcp_nopush on|off
是否启用TCP_NOPUSH(FREEBSE)或TCP_CORK(LINUX)选项;仅在sendfile为on时有用sendfile on|off
是否启用sendfile功能
- 路径相关指令
- root
设置web资源的路径映射,用于指明请求的URL所对应的文档目录的路径:server{ ... root /data/www/vhost1; } // 访问http://www.a.com/image/logo.jpg -->/data/www/vhost1/image/logo.ipg server{ ... server_name www.a.com location /image/ { root /data/imgs/; ... } // 访问http://www.a.com/image/logo.jpg -->/data/imgs/image/logo.ipg
- location [= | ~ |
* | ^] url{……}
location @name {……}
功能:允许根据用户请求的url来匹配定义的各location,匹配到时,此请求将被相应的location块中的配置所处理,简言之,即用于需要的专用配置的URL提供特定配置。
- =:url的精确匹配
- ~:做正则表达式匹配,区分字符大小写
- ~*:做正则表达式匹配,不区分字符大小写
- ^~:url左半部分匹配,不区分字符大小写
匹配优先级:=,^,或~*,不带符号的url;
alias
只能用于location匹配段,定义路径别名location /image/{ root /data/imgs/; } location /image/{ alias /data/imgs/; }
注:
root:给定的路径对应location的“/”这个url
/image/test.jpg–>/data/imgs/image/test.jpg
alias:给定的路径对应于location的“/url”这个url
/image/test.jpg–>/data/imgs/test.jpgindex
index file ……;
默认主页面
error_page code … [=[response]] url
根据http的状态码重定向错误页面;error_page 404 /404.html error_page 404=200 /404.html //以指定状态码响应
try_files file…… url;
try_files file……=code;
尝试查找第一个至第N-1个文件,第一个返回给请求者的资源,若N-1文件都不存在,则跳转至最后一个url(必须不能匹配至当前location,而应该匹配至其他location,否则会导致死循环);
用户请求相关配置
keepalive_timeout timeout [header_timeout]
设定keepalive连接的超时时长;0表示禁止长连接keepalive_requests number;
在keepalive链接上所允许请求的最大资源数量;默认100keepalive_disable none|browser …;
指明禁止为何种浏览器使用keepalive功能;send_timeout #;
发送响应报文超时时长,默认60sclient_body_buffer_size size;
接受客户端请求报文body的缓冲区大小,默认16k;超出此值时,将被移存于磁盘上client_body_temp_path path [level1 [level2 [level3]]];
设定用于存储客户端请求body的临时储存路径及子目录结构和数量;client_body_temp_path /var/tmp/client_body 2 2
对客户端请求进行限制
limit_except METHOD{…}
对指定范围外的其他方法进行访问控制;limit_except GET{ allow 172.16.0.0/16; deny all; }
limit_rate speed;
限制客户端每秒钟所能够传输的字节数,默认为0表示无限制。
文件操作优化相关配置
aio on|off
directio size|off;
open_file_cache off;
open_file_cache max=N [inactive=time]nginx可以缓存以下三种信息:
- 文件描述符,文件大小和最近一次的修改时间
- 打开的目录的结构
- 没有找到的或者没有权限操作的文件的相关信息
max=N 表示可缓存的最大条目上限,则会使用LUR算法中删除最近最少使用的缓存项;
inactive=time:在此处指定的时长内没有被访问的缓存项视为非活动缓存项,因此直接删除;
open_file_cache_errors on|off;
是否缓存找不到路径的文件,或没有权限访问的文件相关信息;open_file_cache_valid time;
没隔多久检查一次缓存中缓存项的有效性,默认60s;open_file_cache_min_uses number;
缓存项在非活动期限内最少应该被访问的次数;
ngx_http_access_module模块(基于IP的访问控制)
allow address|CIDR|unix|all;
deny address|CIDR|unix|all;
应用上下文:http,server,location,limit_except
ngx_http_auth_basic_module模块(basic认证)
auth_basic string|off;
使用http basic认证协议对用户进行认证auth_basic_user_file file;
实现用户认证的账号文件;
文件格式:
name1:password1
name2:password2;commit密码格式:
1.encrypted with the crypt() function;
2.md5加密;
location /admin/ {
auth_basic "admin"
auth_basic_user_file /etc/nginx/.ngxhtpasswd;
}
ngx_http_log_module模块(访问日志)
log_format name string …;
定义日志格式及其名称,日志格式一般通过调用内置函数变量来定义access_log path [format[buffer=size[flush=time]]];
access_log off;
访问日志路径,格式名称以及缓存大小的刷写时间间隔;建议定义缓冲以提升性能。
- open_log_file_cache max=N[inactive=time][min_user=N][valid=time];
open_log_file_cache off;
ngx_http_stub_status_module模块
- stub_status;
通过指定的url的stub_status
Active connections: 291
server accepts handled requests
16630948 16630948 31070465
Reading: 6 Writing: 179 Waiting: 106
- Active connections:当前活动客户端连接数,包括
Waiting
连接数。 - accepts:已接受的客户端连接总数。
- handled:已处理连接的总数。通常,参数值与
accepts
除非已达到某些资源限制(例如, worker_connections限制)相同。 - requests:客户端请求的总数。
- Reading:nginx正在读取请求标头的当前连接数。
- Writing:nginx将响应写回客户端的当前连接数。
- Waiting:当前等待请求的空闲客户端连接数。
ngx_http_referer_module模块
- valid_referers none | blocked | server_names | string …;
- none 请求标头中不存在“Referer”字段;
- blocked:“Referer”字段出现在请求标头中,但其值已被防火墙或代理服务器删除; 这些值是不以“ http://”或“ https://” 开头的字符串;
- server_names:“Referer”请求头字段包含一个服务器名称;
- arbitrary string:直接字符串,可以使用通配符
- regular expression:以~起始的正则表达式
内置变量:$invalid_referer(所有不能符合valid_referer指令定义的引用请求均为不合法引用)
实例:
valid_referers none blocked server_names
*.example.com example.* www.example.org/galleries/
~\.google\.;