http请求过程
1)建立TCP连接
2)web浏览器想服务器发送请求
3)web浏览器发送请求头部信息(请求报文)
4)应答(响应报文)
5)web服务器发送应答头部
6)web服务器发送数据
7)web服务器关闭TCP连接
头部信息分为通用头部、请求头部、响应头部、实体头部
其中需要仔细了解的
通用头部:
Cache-control(缓存信息)
pragma
transfer-encoding(web服务器表明自己对本响应消息体,比如是否分快)
Connection:表示是否需要持久连接(keep-alive等)
请求头部:
Methord-requert-URI http-version accept(告诉web服务器自己接受什么介质类型 */*表示任何类型、type/*表示该类型下的所有子类型)
Accetp-enconding
浏览器申明自己接受的编码方法,通常指定压缩方法,是否支持压缩,支持什么压缩方法
HOST
referer (跳转的信息如上一跳)
user-agent
HTTP协议报文格式
请求报文
<method> <URL> <version>
<HEADERS>
<body>
响应报文
<version> <status> <reason phrase>
<HEADERS>
<body>
协议的格式分为:文本格式、二进制格式
method: (常见的)
GET:请求 、HEAD:响应首部 、POST: 提交表单 DELETE: 删除资源 TRACE:资源经过的代理服务器
、OPTIONS:查看资源支持的请求
URL: scheme://server[:port]/path/to/source
status:
1**:信息类
2**:成功类 200
3**:重定向类 301 302 304
4**:客户端错误类:403 404 401
5**:服务器端错误类 502 504
HEADER:
通用首部
请求首部
if-modified-since 、if-none-match
响应首部
实体首部
扩展http请求过程
1)建立TCP连接
2)web浏览器想服务器发送请求
3)web浏览器发送请求头部信息(请求报文)
4)应答(响应报文)
5)web服务器发送应答头部
6)web服务器发送数据
7)web服务器关闭TCP连接
头部信息分为通用头部、请求头部、响应头部、实体头部
其中需要仔细了解的
通用头部:
Cache-control(缓存信息)
pragma
transfer-encoding(web服务器表明自己对本响应消息体,比如是否分快)
Connection:表示是否需要持久连接(keep-alive等)
请求头部:
Methord-requert-URI http-version accept(告诉web服务器自己接受什么介质类型 */*表示任何类型、type/*表示该类型下的所有子类型)
Accetp-enconding
浏览器申明自己接受的编码方法,通常指定压缩方法,是否支持压缩,支持什么压缩方法
HOST
referer (跳转的信息如上一跳)
user-agent
HTTP协议报文格式
请求报文
<method> <URL> <version>
<HEADERS>
<body>
响应报文
<version> <status> <reason phrase>
<HEADERS>
<body>
协议的格式分为:文本格式、二进制格式
method: (常见的)
GET:请求 、HEAD:响应首部 、POST: 提交表单 DELETE: 删除资源 TRACE:资源经过的代理服务器
、OPTIONS:查看资源支持的请求
URL: scheme://server[:port]/path/to/source
status:
1**:信息类
2**:成功类 200
3**:重定向类 301 302 304
4**:客户端错误类:403 404 401
5**:服务器端错误类 502 504
HEADER:
通用首部
请求首部
if-modified-since 、if-none-match
响应首部
实体首部
扩展首部
我们请求的一般是web页面,其中一个页面基本都有很多个资源。
认证方式
基于IP的用户
基于用户的认证
basic认证
digest认证
资源映射
ailas :路径别名
docuementroot:URL根
htpd:MPM
prefork:主进程生成多个子进程,每个子进程处理一个请求
worker:主进程生成多个子进程,每个子进程生成U盾讴歌线程
event:主进程生成多个子进程,每个子进程响应多个请求
IO类型:
同步和异步:aynchronous
synchronous
阻塞和非阻塞:block ,nonblock
同步/异步:关注的是消息通信机制
. 同步:synchronous,调用者等待被调用者返回消息,才能继续执行
异步:asynchronous,被调用者通过状态、通知或回调机制主动通知调用者被调用者的运行状态
阻塞/非阻塞:关注调用者在等待结果返回之前所处的状态
阻塞:blocking,指IO操作需要彻底完成后才返回到用户空间,调用结果返回之前,调用者被挂起
非阻塞:nonblocking,指IO操作被调用后立即返回给用户一个状态值,无需等到IO操作彻底完成,最终的调用结果返回之前,调用者不会被挂起
阻塞型、非阻塞型、复用型、信号驱动型、异步
IO本身的执行过程
A 调用者
B 被调用者
IO的过程在B看来分成两部分
1)数据从磁盘到内核空间的过程
2)从内核空间被复制到进程空间中
nginx的优点:
1)高并发连接:支持2-3W的并发连接数
2)内存消耗少:3W的并发量下开启10个NGINX进程消耗只有150M内存
3)配置简单:
4)支持重写
6)内置的健康检查功能: 一旦宕机不影响负载均衡调度
7)节省带宽:支持压缩
8)稳定性高
9)模块化设计:模块可以动态编译
10)外围支持好:文档比较全,二次开发和模块比较多
11)支持热部署:可以不停机重载配置文件
12)支持时间驱动AIO.MMAP等性能优化
发布项目可以利用内置检查功能,直接修改状态码为404等 然后下线下线后,上限包,然后修改回来状态包,或者在重启时写脚本curl web 然后修改状态码然后自动上线
web服务相关的功能:
虚拟主机(server)
支持 keep-alive 和管道连接
访问日志(支持基于日志缓冲提高其性能)
url rewirte
路径别名
基于IP及用户的访问控制
支持速率限制及并发数限制
重新配置和在线升级而无须中断客户的工作进程
Memcached 的 GET 接口
nginx的程序架构:
master/worker结构
一个master进程:
负载加载和分析配置文件、管理worker进程、平滑升级
一个或多个worker进程
处理并响应用户请求
缓存相关的进程:
cache loader:载入缓存对象
cache manager:管理缓存对象
NGINX的工作模式:
基于非阻塞、事件驱动、由一个master进程生成读个worker线程,每个worker响应N个请求
模块类型:
模块分类:
核心模块:core module
标准模块:
HTTP 模块: ngx_http_*
HTTP Core modules 默认功能
HTTP Optional modules 需编译时指定
Mail 模块 ngx_mail_*
Stream 模块 ngx_stream_*
第三方模块
nginx:1.8以后支持的新特性
1、基于哈希的负载均衡方法
2、后端ssl证书校验
3、线程池定义线程
4、支持更多的代理功能
NGINX中的模块
正常运行的必备配置
每一个指令必须以分号结尾
1、user USER [GroupName]:指定用来运行worker的用户(组 【省略表示和用户名同名的组】)
如:user nginx nginx
2、pid /Path/to/pid_files
指定nginx守护进程的pid文件
如:pid /var/run/nginx/nginx.pid
3、work_rlimit_nofile_ Number
指定所有worker进程可以打开的最大并发文件句柄数(默认是1024 比较小,linux中最大可以支持5W左右但是端口号只有三万左右所以我们需要把它调大)
4、work_rlimit_core Size
所有worker文件所使用的文件最大支持的大小(一般不需要更改)
性能优化相关配置
1、worker_processes #
worker的进程数(通常应该略少为cpu核心数)
2、worker_cpu_affintify_cpumask ....
优点:能够提升缓存的利用率
context switch :会产生cup的性能消耗,所以我们要绑定worker在cpu上
如:worker_cpu_affintify_cpumask 0001 0100 (表示绑定第一和第三颗)
3、timer_resolution
计时器解析度
降低此值,颗减少gittimeofday()系统调用的次数
4、woker_priority Number
指明worker进程的nice值(-20---19)
事件相关的配置
1、accept_mutex on|off;
:新的请求到达时,master调度至多个worker进程的负载均衡锁;on 表示让多个worker轮流响应
2、lock_file file accept_mutex用到的锁文件路径;
3、use Use_Methord [epoll,poll,select];: 指定使用的事件模型(建议让NGINX自行选择)
4、worker_connections # ;
设定单个worker进程所能够处理的最大并发连接
用于调试、定位错误的
编译安装时必须用--with-debug才能使用此项
1、daemon on|off; :
是否按守护进程的方式运行nginx,调试时应该设置为off 其他时间设置为on
2、master_process on|off;
是否以master/worker模式运行(调试时可以设置为off)
3、error_log /Path/to/file level(debug|info|notice|warn|error|crit|alert|emerg)
格式 error_log 位置 级别
总结:常需要调整的参数
worker相关的那四个
新改动配置文件生效的方式
nginx -s reload
stop quit reopen
nginx作为web服务器时使用的配置
http{} 由 ngx_http_core_moudle模块引入
主配置文件结构:四部
main block:主配置段,即全局配置段,对http,mail都有效
event {
...
} 事件驱动相关的配置
http {
...
} http/https 协议相关配置段
mail {
...
} mail 协议相关配置段
stream {
...
} stream 服务器相关配置段
http {
...
... 各server的公共配置
server { 每个server用于定义一个虚拟主机
...
}
server {
...
server_name 虚拟主机名
root 主目录
alias 路径别名
location [OPERATOR] URL { 指定URL的特性
...(一个server可以有多个location)
if CONDITION {
...(还可以有条件判断的功能)
...(可以有多个server)
}
}
}
}
注意与HTTP相关的指令只能防止与http 、server、loction、upstream、if上下文
但是有些指令仅应用于这五种上下文的某些种
指令
1、server{
listen 8080;
server_name www.a.com;
root "/app/a";
}
2、listen
listen PORT|address[:port]|unix:/PATH/TO/SOCKET_FILE
listen address[:port] [default_server] [ssl] [http2 | spdy] [backlog=number] [rcvbuf=size] [sndbuf=size]
default_server 设定为默认虚拟主机
ssl 限制仅能够通过ssl连接提供服务
backlog=number 超过并发连接数后,新请求进入后援队列的长度
rcvbuf=size 接收缓冲区大小
sndbuf=size 发送缓冲区大小
注意:
(1) 基于port;
listen PORT; 指令监听在不同的端口
(2) 基于ip的虚拟主机
listen IP:PORT; IP 地址不同
(3) 基于hostname
server_name fqdn; 指令指向不同的主机名
server_name name ...;
虚拟主机的主机名称后可跟多个由空白字符分隔的字符串
支持*通配任意长度的任意字符
server_name *.a.com wwwa.*
支持~起始的字符做正则表达式模式匹配,性能原因慎用
server_name ~^www\d+\.a\.com$
匹配优先级机制从高到低:
(1) 首先是字符串精确匹配 如:www.weenry.com
(2) 左侧*通配符 如:*.weenry.com
(3) 右侧*通配符 如:www.weenry.*
(4) 正则表达式 如: ~^.*\.weenry\.com$
(5) default_server
4、root
设置web资源的路径映射;用于指明请求的URL所对应的文档的目录路径,可用于http, server, location, if in location(指明根位置(越精确匹配度越高生效))
5、location
location [ = | ~ | ~* | ^~ ] uri { ... }
location @name { ... }
在一个server中location配置段可存在多个,用于实现从uri到文件系统的路径映射;ngnix会根据用户请求的URI来检查定义的所有location,并找出一个最佳匹配,而后应用其配置
示例
server {...
server_name www.weenry.com;
location /images/ {
root /data/imgs/;
}
}
http://www.weenry.com/images/logo.jpg
--> /data/imgs/images/logo.jpg
=:对URI做精确匹配;
location = / {
...
}
http://www.weenry.com/ 匹配
^~:
对URI的最左边部分做匹配检查,不区分字符大小写
~:
对URI做正则表达式模式匹配,区分字符大小写
~*:
对URI做正则表达式模式匹配,不区分
不带符号:
匹配起始于此uri的所有的uri
匹配优先级从高到低:
=, ^~, ~/~*, 不带符号
6、alias path;
路径别名,文档映射的另一种机制;仅能用于location上下文
location指令后定义的URL是相对于alias所指明的路径而言
示例:
http://www.magedu.com/bbs/index.php
location /bbs/ {
alias /web/forum/;
} --> /web/forum/index.html
location /bbs/ {
root /web/forum/;
} --> /web/forum/bbs/index.html
注意:location中使用root指令和alias指令的意义不同
(a) root,给定的路径对应于location中的/uri/左侧的/
(b) alias,给定的路径对应于location中的/uri/右侧的/
index file ...;
指定默认网页文件,注意:ngx_http_index_module模块
7、index file :
默认主页面
8、error_page code [...] [=code] URI |@name
模块:ngx_http_core_module
定义错误页,以指定的响应状态码进行响应
可用位置:http, server, location, if in location
error_page 404 /404.html
error_page 404 =200 /404.html
基于IP的访问控制机制
allow IP
deny IP
基于用户的访问控制
basic
digest
auth_basic "提示语句"
auth_basic_user_file /PATH/to/.file
然后用htpasswd -c -m /Path/tp/file
生成账号密码(如果没有命令需要安装http-tools)
SSL:
1、进入/etc/pki/CA
(umask 077; openssl genrsa -out private/cakey.pem 2048)
2、创建自签名证书
openssl req -new -x509 -key cakey.pem -out cacert.pem -days 3655
填写信息
3、touch serial index.txt
echo 01 > serial
4、创建nginx证书目录 cd /etc/nginx
mkdir SSL
cd SSL
(umask 077; openssl genrsa -out nginx.key 2048
openssl req -new -key nginx.key -out nginx.csr
填写信息主机名必须与提供服务的主机名一致
发送给ca端
5、ca端签名
openssl ca -in nginx.csr -out nginx.crt -days 3655
6、修改配置文件
server {
listen 443 ssl;
server_name www.magedu.com;
root /vhosts/ssl/htdocs;
ssl on;
ssl_certificate /etc/nginx/ssl/nginx.crt;
ssl_certificate_key /etc/nginx/ssl/nginx.key;
ssl_session_cache shared:sslcache:20m;
ssl_session_timeout 10m;
}
stub_status on|off
仅能使用在location中
示例:
location /status {
stub_status on;
allow from 172.20.87.1/16;
deny all;
}
结果示例: Active connections: 4 (所有处于打开状态的活动链接数)
server accepts handled requests (接受下来并处理的请求)
25 25 16 (接受的链接 处理的链接 处理的请求) (备注:在保持链接下请求的数量可能会多于连接数)
Reading: 0 Writing: 1 Waiting: 3
(正处于接受请求状态的连接数
请求已经接受完成,整处于处理请求或者发送响应的过程中的连接数
保持链接模式,且处于活动状态的连接数)
rewrite regex replacement [flag ]
将用户请求的URI基于regex所描述的模式进行检查,匹配到时将其替换为replacement指定的新的URI
注意:如果在同一级配置块中存在多个rewrite规则,那么会自下而下逐个检查;被某条件规则替换完成后,会重新一轮的替换检查
隐含有循环机制,但不超过10次;如果超过,提示500响应码,[flag]所表示的标志位用于控制此循环机制
如果replacement是以http://或https://开头,则替换结果会直接以重向返回给客户端, 即永久重定向301
[flag]:
last:重写完成后停止对当前URI在当前location中后续的其它重写操作,而后对新的URI启动新一轮重写检查;提前重启新一轮循环,不建议在location中使用
break:重写完成后停止对当前URI在当前location中后续的其它重写操作,而后直接跳转至重写规则配置块之后的其它配置;结束循环,建议在location中使用
redirect:临时重定向,重写完成后以临时重定向方式直接返回重写后生成的新URI给客户端,由客户端重新发起请求;使用相对路径,或者http://或https://开头,状态码:302
permanent:重写完成后以永久重定向方式直接返回重写后生成的新URI给客户端,由客户端重新发起请求,状态码:301
示例: rewrite ^/images/(.*\.jpg)$ /img/$1 break;
http://www.weenry/a.b/a.jpg-->imgs/a/b/a.jpg
、if (condition) { ... }
条件满足时,执行配置块中的配置指令;server, location
condition:
变量名:
变量值为空串,或者以0开始则为false 其他均为true
比较操作符:
= 相同 != 不同
正则表达式的模式匹配操作
~:模式匹配,区分字符大小写
~*:模式匹配,不区分字符大小写
!~:模式不匹配,区分字符大小写
!~*:模式不匹配,不区分字符大小写
文件及目录存在性判断:
-e, !-e 存在(包括文件,目录,软链接)
-f, !-f 文件 -d, !-d 目录 -x, !-x 执行
ngx_http_referer_module模块:
用来阻止Referer首部无有效值的请求访问,可防止盗链
1、valid_referers none|blocked|server_names|string ...;
定义referer首部的合法可用值,不能匹配的将是非法值
none:请求报文首部没有referer首部
blocked:请求报文有referer首部,但无有效值
server_names:参数,其可以有值作为主机名或主机名模式
arbitrary_string:任意字符串,但可使用*作通配符
regular expression:被指定的正则表达式模式匹配到的字符串,要使用~开头,例如: ~.*\.magedu\.com
定制日志访问格式:
log_format:
1、 log_format name string ...;
string可以使用nginx核心模块及其它模块内嵌的变量
2、access_log path [format [buffer=size] [gzip[=level]] [flush=time] [if=condition]];
access_log off;
访问日志文件路径,格式及相关的缓冲的配置
buffer=size
flush=time
网络连接相关的配置
keepalive_timeout timeout [header_timeout];
设定保持连接超时时长,0表示禁止长连接,默认为75s(这个值有些大)
keepalive_requests number;
在一次长连接上所允许请求的资源的最大数量
默认为100
keepalive_disable none | browser ...
对哪种浏览器禁用长连接
send_timeout time;
向客户端发送响应报文的超时时长,此处是指两次写操作之间的间隔时长,而非整个响应过程的传输时长
client_body_buffer_size size;
用于接收每个客户端请求报文的body部分的缓冲区大小;默认为16k;超出此大小时,其将被暂存到磁盘上的由下面client_body_temp_path指令所定义的位置
client_body_temp_path path [level1 [level2 [level3]]];
设定存储客户端请求报文的body部分的临时存储路径及子目录结构和数量
目录名为16进制的数字;
client_body_temp_path /var/tmp/client_body 1 2 2
1 1级目录占1位16进制,即2^4=16个目录 0-f
2 2级目录占2位16进制,即2^8=256个目录 00-ff
2 3级目录占2位16进制,即2^8=256个目录 00-ff
nginx反向代理