nginx
【注意nginx中,正则表达式的括号引用不是\1而是$1】
pam linux资源限定看一下
web服务器:http,https协议的实现
反代服务器:http reverse proxy,smtp/pop3 reverse proxy
smtp:简单的邮件发送服务
pop3:邮局协议,存放邮件的
imap4:互联网邮件访问协议,pop3升级版
MIME:多功能的互联网邮件扩展
major/minor
http协议借助了mime来传输多媒体服务
web资源:URL
schem://user:[email protected]:port/path/to/some;params?perty#frag
http协议的报文格式
startline起始行
name:value
name:value header首部,有多个name:value组成
报文的主体部分
request:<method><request-URL><version>
<headers>
<body>
response:<version><status><reason-phrase>
<headers>
<body>
上边就是http协议的报文的具体格式,具体的事例,可以再自己用的浏览器上查看,例如你使用的是chrome的话可以按f12来查看,或者直接使用服务器插件查看
tcpdump wireshark tshark
接下来分开来说明各个部分的含义
1.method请求方法 打算以何种机制获得资源 表明客户端希望服务器对资源执行的动作
GET 下载
POST 提交表单将表单的数据基于body发送过去
HEAD 只要head不要body
TRACE 追踪资源,客户端到资源经过了那些web网关
客户端-正向代理---网关----反向代理--二级反向代理-资源
OPTIONS 请求服务器列出来某一个资源多支持的所有请求方法
webDAV:web的分布式版本协作功能,一般关闭,风险太大,开启后delete put可用
DELETE 删除
PUT 上传
2.status:状态码 告知客户端此次的响应是不是成功
三位数字,1xx 2xx ... 5xx
表明请求处理的状态
1xx:100 101 信息提示
2xx:成功类响应码 200-206;最常见的是200,资源已经正常发送
3xx:重定向的响应码 300-305
301(永久重定向 永久移动
302(临时重定向 临时移动
304(资源没有修改
(tips:有的时候资源可能移动到了新的地址,这个时候返回一个状态码,请加上新位置的信息,叫做重定向,返回码+location 值
这个值是新地址)
客户端的缓存时有期效的,每次到期了再去服务器上请求的时候会回复一个304表示资源没有改变,如果资源改变了会给一个新的值
并且回复200的响应码
4xx:400-415 错误类信息,主要是客户端错误,权限不够资源不再账号不对
404资源不再
403没有权限或对方拒绝你
401服务器让你输密码是用401响应
5xx:500-505 错误响应 服务器错误
500服务器内部错误,配置文件错误导致内部逻辑错误,或程序语法错误
502反向代理服务器与原始上游服务器无法再有效时间内获得资源或无法通信
3.headers:请求响应报文的首部
媒体格式 MIME
major/minor
name:value
首部分类:
1.通用首部 请求响应报文都可以使用
date 报文创建时间
connection 链接状态 keep-alive长连接 close短链接
via 报文经由的中间的代理服务器
cache-control 缓存控制 1.1启用的
2.请求首部 请求专用
accept:可接受的媒体媒介类型;(MIME机制可以传输多媒体信息,http只传输超文本)
accept-charest 接受的字符集格式
accept-encoding:接受的编码格式
accept—language:接受的语言
client-ip;允许的客户端主机ip
host:请求的服务器名称和端口
referer:包含当前正在请求的资源的上一级资源
user-agent:客户顿代理
a.条件式请求首部
except
if-modified-since:某一时间后是不是发生过修改
un
if-none-match本地缓存中存储的文件的etag值是否与服务器对应的资源不相同
if-match
b.安全请求首部
authrization:向服务器发送账号密码
cookie:向服务器发送cookie
3.响应首部 响应专用
a.信息行首部
age:相应时长
server:服务器端软件程序的名称版本等
b.协商首部
accept-ranges:服务器 端可接受的请求类型;*所有类型
vary:服务器查看您的其他首部列表,变化的
c.安全首部
set-cookie:给客户端设定cookie
WWW-AUTHENTICAT:认证质询
d.实体首部
allow:对此实体可使用的方法
location:资源的真正地址
content-encoding:资源编码格式
资源语言
长度
地址
类型
e.缓存相关
etag:缓存首部
expires:实体过期时间
last-modified:最近一次修改时间
4.实体首部
5.扩展首部 用户自己定义的
IO模型 unix网络编程
阻塞性IO模型,非阻塞IO模型,复用性IO模型,事件驱动模型,异步IO模型
同步/异步:
阻塞/非阻塞:
关注调用者返回结果前的状态,结果回来前能不能干别的事
阻塞:blocking 调用结果返回之前调用者被挂起,什么都不能做只能等着
非阻塞:nonblocking 调用结果返回之前调用者不会被挂起,处于忙等待,忙等待就是多久就回来看一下结果有没有回来
阻塞会被装入sleeping状态
异步:被调用者通过(状态),(通知)或者(回调)的方式,通知调用者被调用的运行状态
阻塞性IO:两个阶段全被阻塞
非阻塞IO:第一阶段没被阻塞,盲等,但当发现数据写入到内存中后开始阻塞,通常是串行
回调的通知方式有两种:
同步/异步:关注消息通知机制
同步:等待对方返回消息
边缘触发:只通知一次,听不见就拉倒
水平触发:听不见就一遍又一遍的通知
什么叫阻塞性IO 两个阶段 wait for data,copy data
复用性IO:额外在内核中多加了一项机制,在调用后加入一层SELECT(),用户阻塞在这层上,内核处理完后通知层,这层两边都是阻塞的
SELECT():层可以使是个总的,也可以每个用户发一个,但是数量最优是1024,
POLL()
信号性IO:调用者向内核注册一IO个信息,以备处理完成后内核的通知,提交后就可以作别的,但是当接收到一个结果后开始阻塞,不能再接收别的参数
异步IO:调用者发起后,留一个直制定的处理器,举例,你去饭店要了面,老板留了你的联系方式,面好了,老板就你会来吃,你还要自己端会桌子,这叫异步 ,老板给你端上桌才叫你,回来就能吃的叫同步
真正的多进程用户最少是个信号性IO
一次IO 请求分成两个阶段
1.等待数据,以及数据从磁盘到内核内存的过程
2.复制过程,数据从内核内存到进程内存的过程
Nginx主要是解决c10k问题10000个客户端并发连接
事件驱动模型实现
linux:epoll,
feature特性:
web服务器
web反向代理服务器
邮件反向代理服务器
通用的tcp/udp反代服务器(负载均衡的调度效果)最新版支持
作为web服务器功能的实现LNMP
反代功能,负载均衡 回话保持
sendfile
让静态资源不进入用户空间,直接在内核空间处理外发送给用户
mmap
内存映射,将磁盘中的文件数据,映射到用户空间,读取时直接读映射,但是虽然节省了读取时间,却加中了性能消耗
事件驱动
异步
非阻塞
nginx程序架构
master/worker
master进程
负责加载配置文件,管理worker进程,平滑升级等
worker进程(可多个)
处理并响应用户请求
nginx公用
静态的web资源服务器
结合fastcgi/uwsg/scgi等协议反代动态资源请求(lnmt,lnmp)
http/https反向代理(负载均衡)
smtp/imap/pop3协议的反向代理
tcp/udp协议的反代
负载均衡,容错功能
高度模块化,模块类型
1.核心模块:任何协议都会用到的模块core module
2.标准模块:自带的模块
Standard HTTP modules
Optional HTTP modules
Mail modules
Stream modules 每个协议都有核心模块xxx core module,也要启动
3.第三方模块
静态资源服务器配置
1.nginx安装
rpmbuild 创建rpm包
尽管这里演示的是编译安装,但是工作的时候为了方便分发还是尽量用rpm安装
groupinstall D Ts S P D
pcre-devel zlib-devel openssl-devel
【pid文件在/var/run】
【lock文件在/var/run或/var/lock】
nginx -s stop reload
2.配置
配置的组成部分
主配置文件:nginx.conf
include conf.d/*.conf
fastcgi,uwsgi,scgi的相关配置文件
mime.types:支持的mime配置
主配置文件的配置指令
directive value1 [value2...];空格隔开,分号结尾
注意:1.必须;结尾但是花括号不需要;
2.支持使用配置变量
內建变量
自定义变量
set variable_name 值
引用:$variable_name
主配置文件结构(花括号叫配置上下文)
main block:主配置段,全局配置
event {
...
} :事件驱动相关配置
http {
...
}:http/https等相关的配置端
mail{
...
}:邮件配置段
http配置段的结构
无论有几个站点服务都要配置虚拟主机,也有FQDN端口IP地址三种
http {
...
...
server {
server_name
root
alias
location {
...
}:访问控制
}
server {
...
}
...
}
main block常见配置指令
a.正常运行必备配置指令
user username [groupname];
制定运行worker的用户
pid /path/to/pid_file ;
守护进程的pid文件路径
worker_rlimit_nofile number #;
单个worker打开的文件的总数量最值
b.优化性能相关配置
1.worker_processes number|auto
worker进程的数量,通常是<=cpu核心数
2.worker_cpu_affinity cpumask|auto
指定worker用哪个cpu,但是不隔离
cpumask:
0000 0001 第一个cpu
0000 0010 第二个cpu
0001 0010 第一个和第二个
3.worker_priority nice;
优先级[-20,19]数字越小优先级越高
c.调试及定位问题相关配置
1.daemon on|off;
是不是以非守护方式运行
2.master_process on|off;
是不是以master/worker模型启动进程
3.error_log file[level];
日志文件路径和级别
error_log file | stderr | syslog:server=address[,parameter=value] | memory:size [debug | info | notice | warn | error | crit | alert | emerg];
错误日志文件的记录方式,及其日志级别:
方式:
file /PATH/TO/SOME_LOG_FILE;
stderr:发送到错误输出;
syslog:server=address[,parameter=value]:发送给syslog服务器;
memory:size
日志级别:
debug依赖于configure时的--with-debug选项;
4.thread_pool name thread=number [max_queue=number];
定义线程数量和后援队列长度
【因为是依赖核心模块的,所以以上配置语句的位置也很重要】
【/etc/security/limits.conf定义一个程序打开的最大的文件数量】
event 主要配置
a.worker_connections #;
每个worker进程所能够并发打开的最大连接数
worker_processes*worker_connections
当前nginx所能相应的最大的并发连接数
b.use method(连接处理方法:select,poll等,但是linux上只有 epoll可用)
c.accept_mutex on|off
是否打开负载均衡(互斥)锁;开启后各个worker将会轮序的相应用户请求,默认是开启的
d.lock_file file
上边的锁的文件的路径
http 专用配置
a.定义套接字相关功能
1.server {...}
定义虚拟主机,nginx都是虚拟主机,但是基于IP地址和基于主机名没有区分
server{
listen PORT;(端口443是什么?)
server_name HOSTNAME;
root /PATH/TO/DIR;
}
注意:1.不配置hosts文件的话,直接输入IP地址,如果有多个server虚拟主机的话,将会显示从上到下第一个server定义的主页
2.配置多个虚拟主机的时候,可以不再主配置文件中写server,但是要在主配置文件中的http{...}写include写
include conf.d/*.conf
然后创建同名目录,在目录中编辑.conf结尾的配置文件,文件内容是server{...}
2.listen address[:port] [default_server] [ssl] [backlog=number] [rcvbuf=size] [sndbuf=size];
listen port [default_server] [ssl];指定端口的所有可用地址,多的选项和上边一样
listen unix:path [default_server] [ssl] ;unix sock 套接字,二者使用本地回环接口通信,直接使用一段内存存储请求和相应,双方去内存取,避免了很多封装操作,双方一般值得是内核和程序
【怎么给这个设置防火墙?使用-i lo -o lo 定义两次-i/o定义回顾】
default_server:默认虚拟主机;
根据IP地址配置的虚拟主机,用户用主机名登录,或者放过来的情况下,无法匹配时会自动跳转到的虚拟主机
ssl:限制该虚拟主机只能通过ssl连接提供服务;
backlog:后缓队列的长度;
rcvbuf:接收缓冲大小;
sndbuf:发送缓冲区大小;
3.server_name name;
为虚拟主机指明当前server的主机名
可以使连续多个名字,空格隔开
可以使用统配和正则表达式(~开头,后边的是正则表达式)
【问题是,如果有用户输入的可以被多个虚拟机匹配怎么办?有优先级】
优先级 1.精确匹配
2.左侧统配
3.右侧统配
4.正则表达式
4.root path;可以放在http(对所有server生效
server(对当前server生效
location(对某个url生效
if in location(对某个条件生效
root 本地系统路径
设置web资源的路径映射,用户请求的url对应的本地系统上的文档目录路径
5.tcp_nodelay on|off
是不是启用nodelay功能,默认启用,只有keepalive场景中才有意义
在ka场景下,如果请求的是一个很小的资源,那么会默认等待,等多个小请求一起发过去,但是影响客户端的体验,开启了nodelay之后不等待,有一个发一个不论多小
6.tcp_nopush on|off
只有在send_file启用时才有效,默认是关闭,一般用不到
7.send_file
让静态资源不进入用户空间,直接在内核空间处理外发送给用户,默认是关闭的,要手动启动,必须启动的功能
b.定义路径相关的配置
1.root:看上边
2.location:比较难但是用的非常多,看着很复杂
location [ = | ~ | ~* | ^~ ] uri { ... }
location @name { ... }
作用:根据用户请求的uri来匹配定义的location,匹配到的时候请求将被相应的location块中的配置所处理
location ~*\.txt {
....
}:location开了一个新的上下文,但是里边的处理动作只对location匹配到的资源有效,并且会先于别的资源处理,其实含有些if的含义
location可以有多个并且location中还可以嵌套location
location也并不是server必须要有的
=:uri精确匹配
~:正则表达式匹配,区分大小写
~*:正表,但不区分大小写
^~:锚定行首,就是对做左半部分匹配,不区分大小写
【那么一个请求的资源被多个location匹配怎么办?优先级= ,^~,~/~*优先级相同,不带符号的location】
3.alias path
定义路径别名,与httpd的alias一样,只能用在location的上下文,只有被location匹配带才解析到对应的别名上
结合httpd的alias来说明
httpd:
alias /bbs/ /web/forum/
nginx:
location /bbs/ {
alias /web/forum/;
}
关于alias右侧的/的问题,结合root来解释
我们访问一个网站的时候,网址是这样 www.mymy.com/bbs/
如果location中是root /web/forum/
那么实际的应该是/web/forum/bbs/,/bbs/值得是root下的目录
如果是alias呢
实际是/web/forum/,/bbs/就等于/web/forum/
5.index
设置默认主页,可用位置location,server,http
6.error_page code uri
根据用户请求资源的相应的状态码实现错误页的重定向。就是指定对应的状态码显示对应的页面
注意:一个请求,会从开头由上到下一次匹配,上边的都匹配不到,将被error_log匹配,重定向到404页面,这又是一个新的请求,又要从上边依次匹配下来,所有要在root的目录中要准备好404页面,并且要注意的是这次的404虽然是正确的匹配到的,但是404中匹配要求不能是200还是404但是可以再配置文件中的error_page的地方中间状态码的后边加上=200,f12就会显示的是200
7.try_files file...url
某个url不在的话尝试这里定义的第一个文件,直到第n-1个,最后一个是个跳转,重定向,如果前边有就用其那边的都没有就重定向
作用在server和location
例:
location /test {
try_files: test1.html test2.html test3.html http://172.16.7.5/index.html
}
c.定义客户端请求的相关配置
1.keepalive_timeout timeout;
保持连接的超时时长,0表示禁止使用长连接;默认75s
keepalive_requests number;
一次长连接上允许请求的资源的最大数量,默认100个
keepalive_disable none|browser...
对哪种浏览器禁止长连接
2.send_timeout
向客户端发送响应报文的超时时长,特别的指两次写操作之间的间隔时长
3.client_body_buffer_size size;
用于接收客户端请求报文的body部分的缓冲区大小;默认为16k;超时此大小时,其将被暂存到磁盘上;
client_body_temp_path path [level1 [level2 [level3]]];
设定用于存储客户端请求报文的body部分的临时存储路径及子目录结构和数量;
level1.2.3是数字,表示创建多少个[1|2|3]级子目录
/var/tmp/body 2表示使用2个16进制字符创建子目录256个2^8
/var/tmp/body 2 1 2
使用两个字符创建一级子目录,1个16进制字符创建二级子目录,2个16进制字符创建三集子目录
d.对客户端的请求进行限制
1.limit rate rate
限定速率,每秒相应给客户端的传输速率默认为0无限制,默认单位字节/s
应用在http server location if上下文
2.limit_except method(GET,POST等)
限制客户端请求时使用的方法
适用于location
method多个之间用空格隔开
location dir {
limit_except method
allow IP地址
deny all|IP地址
}表示对除了allow的网址以外的其余都只允许用method这种方法
e.文件操作优化配置(不是很关键,了解)
1.aio on|off|thread[=pool]
异步传输功能是不是打开
http server location
默认是关闭的
2.directio size|off
是不是关闭直接io,启用定义多大空间
3.open_file_cache off;
open_file_cache max=N【inactive=tme】缓存条目的上限
打开的文件缓存
nginx可以缓存以下三种信息
文件的描述符,文件大小和最近一次的修改时间
打开的目录的结构
没有找到的或者没有权限访问的文件的相关信息
在一定程度上提高性能
【那么当缓存达到了允许缓存最大条目的上限后,又有要缓存的文件怎么办?采用lru算法,就是说查找最近最少用到缓存,清除,然后将新的放进去】
inactive=time
缓存的超时时长,再次制定的时间中没有达到下边的最小访问次数的缓存就被定义成非活动项
4.open_file_cache_errors on|off
没有找到的或者没有权限访问的文件的相关信息是否被缓存
5.open_file_cache_min_users number
缓存项的最少被访问的次数,在上边定义的非活动期限inactive=time内最少被访问的次数
6.open_file_cache_valid time
多长时间检查一次缓存项中的非活动缓存,将其删除,默认是60秒
f.ngx_http_access_module
实现基于ip的访问控制
allow 192.168.1.102/16
deny 192.168.0.0
这个跟之前httpd基于ip的访问控制很像,都是从上到下定义,上边的意思就是192.168.0.0这个网段除了192.168.1.102意外都不允许访问
哪里都能用
g.ngx_http_auth_basic_module
基于用户认证的访问控制
auth_basic string|off
是不是开启基于用户的访问控制string是说明,有点像httpd的authname
auth_basic_user_file file
认证用的账号密码文件路径
文件格式(明文)
name:passwd:comment
密码格式
1.htpasswd生成
2.crypt也行,但不如htpasswd,用第一个就好
h.ngx_http_stub_status_module模块:
用于输出nginx的基本状态信息
至关重要 面试要用
输出nginx基本状态信息
之后好多内容都是些脚本来从获取里边的内容的
location /status {
stub_status;
}
active connections 1
server accepts handed requests
155 155 298
reading:0 writing:1 waiting:0
active connections # 活动客户端连接数
accepts 接受的客户端连接总数量(第一个155)
handed 已经处理完成的客户端请求的总数(第二个255)
requests 请求总数;总数-accepts=没接收的数量
reading 正在读取客户端请求报文首部的连接数
writing 正在向客户端发送响应报文过程的连接数
waiting 启用了保持连接功能后,处于正在等待客户端发出请求的空闲连接数,如果数值很大,可能是keepalive时间太长了
i.ngx_http_referer_module
记录跳转的信息,像从哪些连接跳转到我们的网站,或者是盗链的防止,定义那些是合法合理的跳转
1.valid_referers none | blocked | server_names | string ...;
定义合法的referer数据;
server location
none:请求报文中没有referer首部的,允许
blocked:请求报文中存在referer,但是没有值,也是允许,合法的
server_names:值是主机名,凡是来自这个域名的referer都是合法的
arbitrary string:直接字符串,或者可以用*统配的
regular expression:~正表,正则表达式模式所描述的字符串
valid_referers none blocked server_names *.magedu.com magedu.* ~\.magedu\.;
if ($invalid_referer) {
return 403;
}
$invalid_referer模块自带的变量,值得是没有被valid_referer匹配到的,返回403后去403那边定义返回的网页之类的
ssl module
ngx_http_ssl_module 默认不会编译,编译时记得启用
【ssl/tls
tls:传输层安全 1.0 1.1 1.2 与ssl版本一一对应
ssl:v3.1 v3.2 v3.3
ssl在建立连接的时候,先向服务器hello,服务器收到后返回hello以及自己的证书,然后双方进行秘钥加密算法的交换,完成后建立连接
断开的时候,要先断开ssl连接,在断开tcp/udp连接】
nginx -V 安装信息
# HTTPS server
#
#server {
# ssl on|off (或者在listen后面加ssl,两者取一即可)
# listen 443 ssl;
为了保证443端口一定是ssl监听,要在后边加上ssl
# server_name localhost;
# ssl_certificate cert.pem;
证书路径(不管后缀名叫什么都是pem格式)
# ssl_certificate_key cert.key;
私钥路径(与证书匹配的私钥文件)
# ssl_protocols [SSLv2] [SSLv3] [TLSv1] [TLSv1.1] [TLSv1.2];
SSL协议的版本;默认值就好
# ssl_session_cache shared:SSL:1m;
ssl_session_cache off | none | [builtin[:size]] [shared:name:size];
两种,一种是每个worker私有builtin,一个是共享shared
shared共享(建议)
name 缓存的名称
1m是缓存大小,1m能缓存4000个sessions
大大提高性能
土豪公司会在前端的负载均衡上靠硬件实现ssl
# ssl_session_timeout 5m;
超时时间
ssl会话超时时长,指ssl session cache中缓存条目有效时长
时间内一个客户端再次来请求会话,不需要从新验证等
# ssl_ciphers HIGH:!aNULL:!MD5;
加密方式,!是取消,+是增加的
# ssl_prefer_server_ciphers on;
是不是有服务端选择加密算法
客户端把支持的所有算法发过无由服务端选择
# location / {
# root html;
# index index.html index.htm;
# }
ngx_http_log_module
定义访问日志日志格式和日志文件位置,文件描述符缓存也可以定义,错误日志是全局定义的
log_format name “string”
httpd中是用的%f等,而nginx中是但前配置文件中自带的或者是用户创建的变量
编译安装的默认值就行
access_log off;
access_log path [format [buffer=size [flush=time]]gzip[=level] [if=condition]];
open_log_file_cache max=N [inactive=time][min_uses=N] [valid=time]
日志文件的文件描述符缓存机制
max=N 最大可以缓存的文件描述符数量
inactive=time 非活动项,当满了的时候会将最近没达到最少使用次数的删除
min_uses=N 最小使用次数
valid=time 多长时间检查一次哪些项失效
ngx_http_rewrite_module 重要的不行
url重写
rewrite ragex正表 replacement[flag]
将基于前边正则表达式模式进行检查,匹配到的替换成后边的replacement制定的url
在同一级别的配置块中,存在多个rewrite的时候,会自上而下逐个检查,含有循环机制
【当nginx替换循环了10次还没结束,nginx会自动结束并报错】
如果replacement是以http:// https:// 开头,替换结果直接以重定向通知客户端301.302
[flag]
客户端不参与:
last:替换完成后,停止接下来的多有操作,从location的rewrite开始进行新一轮的检查,替换以及后续操作
break:重写完成后,即可停止对当前location中的rewrite检查,进行其他配置
客户端参与
redirect:重写完成后以临时重定向的方式返回重写完成后生成的新的url给客户端,客户端发起新的请求;但是不能以http,https开头
permanent:重写完成后以永久重定向的方式返回重写完成后生成的新的url给客户端,客户端发起新的请求,必须以http,https开头
【只要是以http,https开头的就是永久重定向】
【正则表达式匹配的位置是root后边的,例如
rewrite ^/bbs /forum
www.mymy.com/bbs-----www.mymy.com/forum 】
rewrite_log on|off
适配与notice级别,并记录到error_log中
return code|code url|url
停止以及后续的所有处理,并返回给客户端一个响应码,一般在错误的格式下才会使用return或者是用户请求一个不允许的资源的时候使用,用户的请求终止
if (condition){...}
引入新的上下文,适用于server和location
当条件()满足时候,执行{}中的动作
比较操作符
==
!=
~ 区分大小写
~*
!~
!~*
文件目录存在判断
-e
-f
-d
-x 执行权限
set $variable value
适用于server location if中
ngx_http_gzip_module
压缩,以CPU的计算能力换取带宽
gzip on|off
gzip_buffers number size
指明用于压缩功能的buffers的数量和大小
gzip_comp_level level
压缩级别,数字越大压缩比越大越消耗CPU
gzip_disable regex
被正则表达式匹配到的,不会启用压缩功能
gzip_min_length #;
报文的值大与这个值的时候才启用压缩功能
gzip_proxied off | expired | no-cache | no-store | private | no_last_modified | no_etag | auth | any ...;
对代理的请求所获取的响应报文是不是启用压缩功能,以及如何启用
off:禁止压缩
expired:响应报文中包含expired的启用
any:什么请求都进行压缩
gzip_types mime_type
压缩过滤器,只对这个设定的内容进行压缩
mime_type text/plain text/cdd text/xml...
一般简单设置直接gzip on|off就可以,想要更加正确在加其他选线
ngx_http_limit_req_module
单ip的速率(请求数)限制
limit_req_zone key(一般是客户端的IP地址) zone=name size rate=rate
基于区域空间,为了识别每一个独立的个体,要给个key,可以使堵路地址也可以是。。
ngx_http_fastcgi_module
LNMP
nginx+php:fastcgi协议
nginx:client
php-fpm:server
php:编译时,支持fpm;
./configure ... --enable-fpm ...
/etc/php-fpm/conf/www.conf
php-fpm工作方式(类似于httpd的prefork):
listen = 127.0.0.1:9000
listen.allowed_clients = 127.0.0.1
pm = dynamic | static
pm.start_servers:启动fpm进程时启动的工作进程数量;
pm.min_spare_servers:最少空闲进程数;
pm.max_spare_servers:最大空闲进程数;
pm.max_children:最大工作进程数;
user = USERNAME
group = GROUPNAME
fastcgi_pass address
指明服务器端地址,php-fpm监听的地址ipv4 ipv6 unix domain
fastcgi_index name
默认的fastcgi职业资源
fastcgi_param parameter value[if not empty]
/usr/local/html(root)$fastcgi_script_name(用户请求的文件名)
fastcgi_cache cachename
调用缓存,能命中的话就会性能提升,所以缓存的命中率是很重要
【调用缓存时必须要有的三个参数
..cache
..cache_key
..cache_valid】
【对于所有缓存来说,命中率都是一种药的指标,有两种标准命中需要时间和次数一般命中率30%以上就很好了】
【缓存结构很简单,一个key(用户的url)一个value(url对应的脚本的执行结果)】
【缓存是个哈希表,效率十分高,而且nginx还把key放到了内存中,查找更加快捷】
【内容放在磁盘中,将内容的哈希码做目录名,将内容放进去,然后将哈希码放到key中】
【分级将哈希码前两位切出来做一级目录名,再切两做二级目录名......】
fastcgi_cache_path path [levels=levels] [use_temp_path=on|off] keys_zone=name:size [inactive=time] [max_size=size] [loader_files=number] [loader_sleep=time] [loader_threshold=time] [purger=on|off] [purger_files=number] [purger_sleep=time] [purger_threshold=time];
适用于http中
path:缓存数据存放路径
levels= 缓存目录层级熟料,以及每一级的目录数量
levels=1:2:1
1指使用1位16进制字符,2值使用2位16进制字符,分别是1级目录2级目录3级目录
倒着的哈希码
keys_zone=name:size 缓存名和缓存key在内存中使用多大空间
inactive=time 缓存的有效时长
max_size=size 磁盘上用于缓存数据的缓存空间的最大值
fastcgi_cache zone|off
适用于 http server location
调用指定的缓存空间来缓存数据
fastcgi_cache_key string
用作上边定义的缓存空间的key的字符串,一般是用户请求的url,用变量 $request_uri 表示
fastcgi_cache_key $request_uri;
fastcgi_cache_methods GET HEAD POST..
缓存哪些类型的请求的相关数据;
fastcgi_cache_min_uses number
请求几次才放进缓存,1表示有请求就放
fastcgi_cache_valid[code...]time
对不同响应码的对应资源的缓存时长
404 403 301 303 304
any
epoll select详细内容记住
select 是轮训,该模式可操作的socket数量是FD_SETSIZE操作的,内核默认是32*32=1024个,通过遍历1024个socket来完成调度,不论是不是活跃的都要遍历一遍
epoll 是触发式的,socket同poll一样是无限制的,操作是基于内核提供的反射模式,那个socket是活跃就去访问那个socket,而不需要遍历,但是如果全部的socket都是活跃的,那么性能不如轮训遍历
nginx load balance负载均衡:(1.10以后)
对tcp/udp调度
nginx proxy 反代:
reverse proxy
【反代通常指对单一客户端反代,而不是一组,面向多个主机的时候要先通过别的组件(独立的实体)将主机们定义成组,独立实体代为收到反代请求,然后分发给多个主机】
upstream模块
对于数据流,lvs是工作在内核空间,对于长数据流,是直接发过去,而不是等发完后一起发过去,因为直接发效率高,并且不直接发的话对于内存的占用大,但是nginx是要完整接受后转发,如果太大就缓存,还是太大就先暂存在磁盘的临时空间,还要注意的是,后端响应回去的,报文是存下来一起发,但是大文件是切割成小报文在发,所以他也要个缓存位置
截图1.0801 09:28
为毛启用反代:
1.前段阻断一些恶意请求
2.后端与代理服务器可以建立一个长时间的长连接,减少每次建立连接的消耗
3.代理开启缓存后端更加轻松
【注意:后端主机接受到的请求都是代理服务器的地址】
【想要后端有源地址,可以再代理服务器封装请求报文的时候封装进去,然后后端记录一下就好】
【多级代理的每一级都要额外附加原地址,常用的xforwarded就是初级代理附加,然后后边的代理转发报文就好】
缓存可以拿出来单独放一个服务器
反代算法可以基于url来调度具体到那个缓存服务器
哈希表存, url当键,服务器当地址,没有就按照算法调度,一般是加权轮序wrr
调度后端服务器,可以分析user agent调度
版本上线 应用程序发布
灰度模型:一次只更新一部分主机,一般在凌晨,访问量较小,将一部分的权重该为零,然后停止服务器,添加新应用,重启,改回正常的权重,然后看请求是不是正常进行,正常就依次重启
问题:
1.但是如果有回话怎么办
一般session都是放在server上的
【http的长连接是不超过10秒的,权重设置为0的等10秒就好了可以下线(冷模式,一定要停掉,反正已经下线了)了,有回话就等回话的最长时间】
2.发了新版本后发现有bug怎么办
回滚
3.如果用户上传文件了怎么办,又不能覆盖
一般nginx可以将用户上传的文件(静态)单独放到一个目录或服务器来,到时候软连接等就好
【nginx应用层可以实现动静分离,lvs就不行】
压缩对动态资源会对缓存服务器造成负担
proxy模块 upstream模块
ngx_http_proxy_module
1.proxy_pass URL
location,if in location,limit_expect
【注意pass后面路径不带url(带/)时,其会将location的uri传递给后端主机
location /uri/ {
proxy_pass http://HOST;
}
http://HOST/uri;
如果后面的路径是一个uri的时候,会将location的uri替换为proxy_pass的uri
location /uri/ {
proxy_pass http://HOST/new_uri/;
}
http://HOST/new_uri/uri/a.jpg
如果location定义uri的时候使用了正则表达式的模式,那么proxy_pass之后必须不能使用uri;否则为语法错误
location ~|~* PATTERN {
proxy_pass http://HOST;
}
】
上午第二节课
$proxy_host 当前代理服务器地址
2.proxy_set_header name value
http,server,location
将请求报文的首部重新定义,后直接添加一个首部,设定某个首部的值,为我们制定的值,然后给后端主机
默认值 Host $proxy_host
connection close 关闭长连接
proxy_set_header X-RealHost $remote_addr
X-Forward-For $prox_add_x_forwarded_for
后端服务器(httpd)配置文件的logformat 默认的格式之一里边加上{X-RealHost}i
3.proxy_cache_path[levels=levels]keys_zone=name:size [inactive=time] [max_size=size] ;
适用于http
调用缓存
proxy_cache zone|off
适用于http,location,server
proxy_cache_key string
$scheme$proxy_host$requests_uri
proxy_cache_valid [code] time
4.proxy_cache_use_stale 腐败过期error|timeout|invalid_header|
是不是能用过期的缓存来给用户
5.proxy_connect|read|send_timeout
连接超时时长
尤其是read,加长这个时间可以避免很多的502
6.proxy_buffer_size 缓冲,一般是开启的不需要修改
buffering
buffers
ngx_http_headers_module
1.add_header name value [always]
向相应报文中添加自定义首部
可用上下文:http,server,location,if in location
add_header X-Via $server_addr;
X-accel $server_name
2.expires [modified] time
epoch|max|of
ngx_http_upstream_module 负载均衡调度模块
将多个后端服务器定义成组,然后提供负载均衡,分发等功能,对于proxy还是一个后端服务器,不只是proxy,fastcgi也行
upstream name组名{
server backend1.mymy.com weight权重
server IP地址:端口 max_fails=3 fail_timeout weight权重
【server address[parameters]】
server unix:/path/to/sock_file
server backend1.mymy.com weight权重
}
只能用在http
server 参数
weight=#
默认为1
max_fails=#
最大失败尝试次数
fail_timeout=#
这个时间中可以尝试max_fails次数
backup
备用标记,所有主服务器不可用的时候才会使用
down
手动标记服务器为不可用
least_conn;
upstream
最少链接算法,当服务器拥有不同权重的时候,使用wlc算法,不写时默认的加权轮序wrr,考虑权重
least_time header|last_byte
最少平均响应时间,和最少连接
header 只记录接受响应报文首部的时长
last_byte 报文全部接受完后响应时间
仅对nginx企业版有效
ip hash
原地址哈希算法SH,来自同一个源IP地址的请求始终发往同一个后端服务器
hash key[consistent]
key $requests_uri等对同一uri都送到同一服务器
$remote_addr
$cookie_name
常用于缓存服务器,缓存服务器必须用一致性哈希算法并且对uri做哈希计算
【对后面分布式算法至关重要】
调度基于hash 的key来调度,key可是文本,变量或二者组合
consistent:参数,指定使用一致性哈希算法
【正常哈希算法:把key做哈希计算,然后对key基于服务器总权重取余,余数是几就放第几泰服务器】
但是增删服务器,总权重变了,哈希计算就全部不同了,于是有了一致性哈希算法
【一致性哈希算法:一个哈希环,分为0到2^32-1个节点,将服务器放在节点上,然后对2^32取余,落在环上后,做顺时针旋转,找离他最近的服务器,影响范围小,但是容易造成环偏斜,有的环可能承载的请求太多,可以做虚拟节点,一个服务器做多个虚拟节点】
sticky cookie name后边默认就行,基于cookie绑定
keepalive connection
(设定可以一直处在保持连接状态的数量)
keepalive #;
nginx主机与后端代理服务器启用保持连接功能
大大减少连接创建删除时间和套接字使用数量
health_check
定义健康状态检测机制
只能用于location,也就是说只能定义在proxy_pass后边
interval=time
检测频率,默认5秒1一次
fails=number
检测失败的次数,第一次检测成失败不马上处理,默认为1但是不要设为1
passes=number
默认为1,服务器从失败转为成功是需要检测的次数
uri=uri
判断健康与否使用的uri
match=name
基于制定的match来衡量检测结果的成败,match是额外定义的出来的,这里应用定义的match的名字就好
port=number
使用独立的端口专门进行健康状态检测
仅对nginx企业版有效
match name{..}
只能用在http,衡量检测结果是不是成功的方法
status code|!dode
header HEADER=VALUE
HEADER~VALUE
body ~|!~ “PATTERN"
下午第一节课
博客作业:讲到的所有nginx内容
课外实践作业:实践tengine
ngx_stream_core_module
stream{
upstream sshsvrs {
server 192.168.10.130:22;
server 192.168.10.131:22
hash $remote_addr consistent;
}
server{
listen 172.16.100.6:22202;
proxy_pass sshsvrs
}
}
代理后端的ssh服务
1.listen后边要指明要监听的端口,如果协议有区别要指明是tcp或udp协议等,默认是tcp
下午第二节课
}