一.I/O介绍
httpdMPM
-
perfork:一个master进程开启多个子进程,master只负责读取配置文件和生成子进程,子进程只负责处理每一个进程
-
worker:一个master进程开启多个子进程,每一个子进程复制开启多个线程,每一个线程负责相应一个请求
-
event:事件驱动,一个进程可以处理多个请求
网络IO:本质是socket读取,数据收到请求,进入网卡,应用程序就要读取数据就是I,用户准备好数据,相应数据就是O,都是从socket中IO
硬盘IO:用户空间给内核发送指令,让内核从磁盘读取数据,内核将数据存入内核空间,然后赋值给用户空间,这个过程就发生了一次硬盘IO
同步和异步:关心的是消息的通讯机制
同步:调用者自动等待被调用返回消息,才能继续执行。
异步:被调用者通过状态,通知回调机制,回调机制主动通知调用者被调用者的状态。
阻塞和非阻塞:关心的是用户是否等待
阻塞:指IO操作需要彻底完成才返回到用户空间,调用结果返回前,调用者被挂起
非阻塞:指IO操作需要彻底完成后才返回到用户空间,调用结果返回前,调用者不会被挂起
同步阻塞IO模型:
用户发送请求访问页面,内核解开封装,然后内核将数据包发送给Nginx进程,Nginx查看MIME类型,然后发送指令让内核访问硬盘读取数据,然后内核将数据放在缓冲区,将数据复制给进程空间,Ninx在将数据发送给用户。缺点:CPU利用不高
PIO:CPU全程参与
DMA:只是发送指令,不直接参与
image.png
同步非阻塞IO模型
进程发送请求,请求发送给内核,内核去磁盘中访问数据,将数据存放在缓冲区,然后在复制到进程的内存空间,在这个过程中,进程不会等待,但是需要一次 一次来询问,从另外一个角度看,进程来询问请求是否完成也是一个CPU资源的浪费
image.png
IO多路复用模型
在接受请求之前增加了一个系统条用(select只是其中一个),有系统调用来帮进程处理后面的事,系统调用程序可以同时接受多个进程访问,但是该模型也是会阻塞,子select开始时会阻塞
应用场景:
-
当客户端处理多个描述符时,一般是交互式输入和网络套接字
-
一个客户端同时处理多个套接字
-
当一个TCP服务器既要处理监听套接字,又要处理已经连接的套接字
-
当一个服务器既要处理TCP,又要处理UDP
-
当一个服务器要处理多个服务或多个协议
image.png
信号驱动IO模型:
阻塞在内核到进程空间拷贝数据阶段,前面的阶段可以继续执行其他操作,用户进程通过sigaction系统注册一个信号处理程序
image.png
异步IO模型:
整个过程都不会阻塞,但是该模型内核比较繁忙,进程比较轻松,但是进程可以处理更多的用户请求,所以每一个进程可以支持更多的并发链接
image.png
主要使用IO复用和信号驱动IO模型
主要实现:
select:Linux实现,IO复用模型,支持各种操作系统,Apache使用。
poll:Linux实现,IO复用模型,system V。
epoll:Linux实现,IO复用模型,具有信号驱动IO模型的某些特性,Nginx能够实现高并发就是因为使用epoll。
image.png
水平触发:如果报告进程后没有被处理,那么下次poll还会再次报告。
边缘触发:只通知一次,epoll支持。
epoll:支持水平触发和边缘触发,只会告诉一次,没有并发连接限制,能打开1024(1G的内存能监听10万个端口)
不会随着fd数目的增加而效率下降。
mmap():直接内存读取,文件映射,就是将磁盘的文件直接映射到内存中来提高访问速度。
二、Nginx基础
Nginx主要功能:
- WEB服务器
- 反向代理
- 邮件服务器反向代理
- 基于TCP协议代理,伪4层调度器
反向代理作用:
- 负载均衡,Nginx可以通过upstream模块实现负载均衡。
- 安全性,真正的服务器不会暴露在外网,客户端不会直接接触WEB服务器。
- 动静分离,将文件直接分开调度到不同的服务器,也可以通过客户端调度到不同的服务器。
- 检查后端服务器的健康状态。
- 可以在反向代理服务器上增加缓存。
- 支持模块化。
- 支持fastCGI和uWCGI。
sedfile:直接在内核空间相应用户,加快访问速度。
Nginx框架
- 虚拟机
- 支持长连接和管道连接
- 支持日志
- URL rewirte:地址重写
- 路径别名
- 基于IP及用户的访问
- 平滑升级,可以不断业务的升级,旧的子进程还会继续访问正在连接的用户请求,等待完成后才会将旧进程停止
- 支持速率及并发数限制
- 支持Memcached的GET接口
image.png
Nginx服务的主要功能:
1.WEB服务器
2.反向代理服务器
3.负载均衡
4.fastCGI
5.动静分离,根据需求调度服务器
6.安全,外网不会直接接触
7.支持缓存,可以加速访问
Nginx程序结构
master/worker结构,一个master进程至负责加载和分析配置文件,管理worker进程,平滑升级,一个或多个worker进程处理相应用户请求
核心模块:
http模块、mail模块、TCP的stream模块
第三方模块
Nginx软件包文件说明
软件包:Nginx,需要epel源
配置文件
/etc/nginx/nginx.conf:主配置文件
/etc/nginx/nginx.conf.default:默认配置文件
/usr/sbin/nginx:主程序
/var/log/nginx:日志文件
/usr/lib64/nginx/modules:模块目录
/etc/nginx/conf.d/*.conf:扩展配置文件
相关命令:
nginx:启动服务,测试使用
nginx -s reload或stop:用来重读配置文件或停止服务
-T:测试并且打印到屏幕
-h:命令帮助
-c:用来检测指定配置文件
三、常用配置参数
配置文件格式
main
envents {
}
http {
server {
listen 80;
root 主目录;
index 主页;
alias
location / {
rewrite
}
}
include ;
server{
listen 443;
}
}
mail {
mail协议相关配置段;
}
stream {
stream,tcp调度服务器相关配置段;
}
main常见配置
1.user:指定提供服务的用户,默认指定哪个用户,就用同用户名的组
user nginx;
2.pid /PATH:定义pid文件路径及文件名
pid /run/nginx.pid;
3.include:定义其他的扩展配置
include /usr/share/nginx/modules/*.conf;
4.load_module file:调用模块路径
include /usr/share/nginx/modules/*.conf; #定义模块路径
性能相关配置
1.worker_processes:定义worker进程打开数量,通常应该为主机CPU的物理核心数
worker_processes auto;
2.worker_cpu_affinity:将每个CPU绑定到某个CPU,提高缓存命中率,默认不存在,CPU核心数使用二进制使用
worker_cpu_affinity 0001 0010 0100 1000;
3.worker_priority:指定worker进程的nice值,优先级-20~19,默认不存在
worker_priority 0:默认为0
ps axo pid,cmd,psr,ni |grep nginx #查看进程工作在那个cpu上
4.worker_rlimit_nofile:worker进程所能够打开的文件数量上限,默认不存在
worker_rlimit_nofiler nuber
事件驱动相关的配置
events {
worker_connetions 1024;
}
1.worker_connetions:每个worker进程所能打开的最大并发连接数,总的最大并发数=worker_processes*worker_connetions
worker_connetions 1024;
2.use:指明并发连接请求的处理方法,默认自动选择最优方法epoll,无需修改
use epoll;
3.accept_mutex:互斥,处理新的连接请求的方法,on指由各个worker轮流处理请求,off指每个新请求到达时,都会通知所有的worker进程,只有一个进程可获得连接,造成惊群,影响性能,默认on;
accept_mutex on|off;
调试和定位
1.daemon:是否以守护进程方式运行nginx,默认为守护进程的方式,若关闭则表示占用终端的方式运行服务
daemon on|off
2.master_process:是否以master/worker模型运行nginx,默认为on,off则不会在开启worker进程,若关闭,则master直接提供服务
master_process on|off
3.error_log file或error_log level:定义错误日志路径,或定义日志的级别
level:debug|info|notice|warn|error|crit|alter|emerg
error_log /var/log/nginx/error.log;
server配置段
ngx_http_core_module:模块名
1.server {}:虚拟主机
server{
listen 80;
root /path;
index index.html;
......
}
2.listen:指定监听端口或IP地址
listen 80;
listen IP地址:port;
listen hostname;
3.server_name:虚拟主机的名称,表示只要可以解析,那么就是在网页中输入的RUL
匹配优先级机制从高到低:
- 字符精确匹配
- 左侧*通配符
- 右侧*通配符
- 正则表达式
- default_server
server_name www.lin.com web.lin.com;
server_name *.lin.com
server_name www.lin.com
server_name ~^.*\.lin\.$
4.tcp_nodelay:在长连接状态下,是否启用tcp_nodelay选项,当为off时,将延迟发送,将不够一个数据包的数据等待后面的数据一块发送,会影响速度,默认为ON,不延迟发送
tcp_nodelay on|off
5.sendfile:是否开启在内核中封装报文直接发送,默认off
sendfile on|off
6.server_tokens:是否在相应文本server首部显示nginx的版本,商业版或自己编译源码可以定制显示版本
server_tokens on|off|build|string
7.root:指定访问网站的路径
root /var/www/html;
8.location:在server配置段为特定的路径进行其他的配置
在location中可以对URI进行精确匹配或模糊匹配
=:对URI做精确匹配
^~:对URI最左侧部分做匹配检查,不区分字符大小写
~:对URI做正则表达式模式匹配,区分大小写
~:对URI做正则表达式模式匹配,不区分字符大小写
不带符号:匹配起始于URL的所有的URI
匹配优先级从高到低:
=,^~ /,不带符号
server{
root /path;
location / {
root /path/path;
}
}
location ~ / {
alias /web/webser1; #在访问网站的根时,相当于访问/web/webser1目录下的网站
}
9.alias:路径别名,文档映射的另一种机制,仅能够使用在location上下文
location中的alias和root的指令意义不同
root:给定的路径对应于location中的uri左侧的/
alias:给定的路径对应于location中的url右侧的/
location / {
alias /web; #在访问网站的/目录时,实际上就是访问/web目录下的资源
}
10.index:定义网站的主页,可以定义多个,若定义多个主页格式,则谁在前谁优先
index index.html index.php;
11.error_page:错误页面,若输入的页面不存在,则可以指定错误页面
error_page 404 /错误页面;
error_page 404 =200 /错误页面; #有些浏览器看到错误页面会显示浏览器自定义错误页面,可以显示正确代码来确定显示自己指定的错误页面
12.try_files:按顺序检查文件是否存在,最后一个页面必须存在,否则返回网页错误代码
try_files $uri /app/$uri uri =错误代码;
server{
listen 80;
server_name www.lin.com;
root /app/web/webser1/;
index index.html;
location / {
try_files $uri /test/$uri =404; #该参数在后面指定文件不存在,则寻找后面的目录中是否有该文件,一直找到最后,若都没有则显示后面指定的错误代码,若没有指定,则显示500服务器错误代码
}
}
定义客户端请求相关配置
13.keepalive_timeout:设定保持连接超时时长,0表示禁止长连接,默认为75s
keepalive_timeout 0;
14.keepalive_requests:设置一次长连接上所允许请求资源的最大数量
keepalive_requests 100;
15.keepalive_diable:对那种浏览器禁用长连接
keepalive_disble none|browser;
16.send_timeout time:两次写操作之间的间隔时长,不是整个相应过程的输出时长
send_timeout 10;
17.client_bady_buffer_size:用于接受每个客户端请求报文的body部分缓冲区的大小,默认16k,超出的部分将被暂存到磁盘上有client_body_temp_path参数来控制
client_bady_buffer_size 16k;
18.client_body_temp_path: 指定超过缓存区大小的部分存放位置,并且根据hash值32中取几位创建目录来加速访问,根据16进制数来创建,其中数字代表去16进制的几位
client_bady_temp_path path 1 2; #表示第一级目录取1位16进制数,第二级目录取2位 0-f
19.limit_rate:限制相应给客户端的传输速率,0表示不限速
limit_rate 0;
20.limit_except method {}:仅用于location,限制除了指定请求方法之外的其他方法
GET, HEAD, POST, PUT, DELETE,MKCOL, COPY, MOVE, OPTIONS, PROPFIND,PROPPATCH, LOCK, UNLOCK, PATCH
limit_except GET{ #除了GET之外的其他方法允许还有拒绝
allow 192.168.1.0/24;
deny all;
}
文件操作优化的配置
21.aio:是否开启aio功能
22.directio:是否同步写磁盘
aio on;
directio size|off;
23.open_file_cache:是否允许缓存数据的元数据,若超过则按照LRU算法管理,将最久的删除
open_file_cache off;
open_file_cache max=N [inactive=time];
nginx可以缓存以下三种数据
1.文件元数据:文件的描述符,文件大小和最近一次的修改时间
2.打开的目录结构
3.没有找到的或没有访问的文件相关信息
max=N:可缓存的上限,达到上限后会使用LRU算法实现管理
inactive=time:缓存项的非活动时长,在此处指定的时长内未被命中的或命中次数少于open_file_cache_min_uses指令所指定的次数的缓存项及非活动项,将被删除
24.open_file_cache_errors:是否缓存查找时发生的文件一类的信息默认值为off
open_file_cache_errors on|off;
25.open_file_cache_min_uses:open_file_cache指令的inactive参数指定的时长内,至少命中此处指定的次数才能被归类为活动项,默认1
open_file_cache_min_uses 1;
26.open_file_cache_vaid:缓存项有效性的检查频率,默认60
open_file_cache_valid 60;
基于IP地址的访问控制
ngx_http_access_module模块
1.allow:允许访问
allow all|IP地址|网段;
2.deny:拒绝访问
deny all|IP地址|网段;
例如
location /admin { #仅允许一个IP地址进入该目录下,其他用户不允许进入
allow 192.168.1.1;
deny all;
}
基于用户的访问控制,使用basic机制进行用户认证
ngx_http_auth_basic_module模块
1.auth_basic定义显示字符串
auth_basic string|off;
2.auth_basic_user_file:指定用户认证文件,nginx没有专门生成账户密码的命令需要使用htpasswd来实现
location /admin/ {
auth_basic "admin page";
auth_basic_user_file /etc/nginx/.ngxpasswd;
}
nginx基本状态信息网页
ngx_http_stub_status_module模块
location /status {
stub_status; #必须添加,若需要访问控制,可以根据allow和deny来控制,也可以根据用户来控制
allow 172.16.0.1;
deny all;
}
日志格式记录请求
ngx_http_log_module模块
1.log_format:定义日志格式,该命令需要在http代码段中指定,不可以在server中指定
log_format compression '$remote_addr-$remote_user [$time_local] '
'"$request" $status $bytes_sent'
'"$http_referer" "$http_user_agent" "$gzip_ratio"';
2.access_log:指定日志路径 缓存大小 缓存时间 压缩比
access_log /var/log/nginx/www.lin.com.access_log buffer=32k gzip=6;
3.open_log_file_cache:缓存各日志文件相关的元数据信息
用gzip方法压缩相应数据,节约带宽
1.gzip:关闭或关闭gzip压缩
gzip on|off;
2.gzip_comp_level:定义压缩级别1-9
gzip_comp_level 9;
3.gzip_disable:匹配到的客户端浏览器不执行压缩
gzip_disable regex;#匹配条件可以使用正则表达式
4.gzip_min_length:启用压缩功能的相应报文大小阈值
gzip_min_length 100K;
5.gzip_http_version:设置启用压缩功能,协议最小版本,默认为1.1
gzip_http_version 1.1;
6.gzip_buffers:指定支持实现压缩功能缓冲区数量及每个缓冲区大小
gzip_buffers 32 4k;指定几个,指定大小
7.gzip_types :指定仅对那些类型的资源执行压缩,默认包含有text/html,不用显示指定,否则就会出错,可以根据 /etc/mime.types或者根据nginx软件包自带的类型/etc/nginx/mime.types
gzip_types mime-type; #设置类型,不用添加text/html类型
8.gzip_vary:如果启用压缩,是否在相应报文首部插入"vary:Accept-Encoding"
gzip_vary on|off;
9.gzip_proxied:nginx对于代理服务器请求的相应报文,在任何条件下启用压缩功能
gzip_proxixd off|expired|no-cache|no-store|prvate|no_last_modified|no_etag|auth|any;
off:对代理的请求不启用压缩
expired,no-cache,no-store,private:对代理服务器请求的相应报文首部cache-control值任何一个,启用压缩功能
例如
server{
listen 80;
server_name www.lin.com;
root /app/web/webser1/;
gzip on;
gzip_comp_level 9;
gzip_min_length 100k;
gzip_buffers 32 4k;
gzip_types text/plain;
}
ssl加密
ngx_http_ssl_module模块
1.ssl:是否开启https功能
ssl on|off;
2.ssl_certificate:指定当前虚拟主机使用的公钥文件
ssl_certificate /path; #公钥文件
3.ssl_certificate_key:指定当前虚拟主机使用的私钥文件
ssl_certificate_key /path; #私钥文件
4.ssl_protocols:定义支持协议版本
ssl_protocols [SSLv2] [SSLv3] [TLSv1] [TLSv1.1] [TLSv1.2]; #定义支持协议版本,默认支持后三个版本
5.ssl_session_cache:定义worker进程是否有缓存,缓存时每一个worker都有单独的缓存空间,也可以多个worker公用一个共享空间
off:关闭
none:实际没有缓存,但是会告诉客户端可以缓存
builtin:为每个worker进程创建缓存空间
shared:在各个worker之间使用一个共享的缓存
ssl_session_cache off|none|builtin:size|shared:name:size;
6.ssl_session_timeout:客户端连接可以复用ssl_session_cache中缓存的sll参数的有效时长,默认5m
ssl_session_timeout 5m;
例如
1.生成公钥和私钥文件,这里使用的时自签名证书文件
[root@vs webser1]# cd /etc/pki/tls/certs/
[root@vs certs]# make nginx.key #这里需要输入私钥密码
[root@vs certs]# openssl rsa -in nginx.key -out nginx.key #解开私钥密码,不然在每此启动服务都需要输入密码
[root@vs certs]# make nginx.crt #生成自签名证书文件
[root@vs certs]# cp nginx.* /etc/nginx/conf.d/ #将证书文件复制到指定目录下
[root@vs conf.d]# vim test.conf
server{
listen 443 ssl;
server_name www.lin.com;
root /app/web/webser1/;
index index.html;
ssl_certificate /etc/nginx/conf.d/nginx.crt;
ssl_certificate_key /etc/nginx/conf.d/nginx.key;
ssl_session_cache builtin:1000 shared:SSL:10m;
ssl_session_timeout 5m;
}
rewrite:将用户请求的URI基于条件匹配所描述的模式进行检查,而后完成重定向替换
ngx_http_rewrite_module:模块
1.rewrite:将一个URI路径转换成另外一个路径
rewrite 匹配路径 改变路径 last|break|redirect|permanent;
last:重写完成后停止对当前URI在当前location中后续的其他重写操作,而后对新的URI启动新一轮重写检查,提前重启新一轮循环
break:重写完成后停止对当前URI在当前location中后续的其他重写操作,而后直接跳转至重写规则匹配块之后的其他配置,结束循环,建议在location中使用
redirect:临时重定向,重写完成后以临时重定向方式直接返回重写后新生成的新URI给客户端,由客户端重新发起请求,不能以http://或https://开头,使用相对路径,状态码302
permanent:重写完成后以永久重定向直接返回重写生成的新URI给客户端,由客户端重新发起请求,状态码301
例如,该参数不可以重新定义root目录
server{
listen 80;
server_name www.lin.com;
root /app/web/;
index index.html;
location /webser1 {
rewrite ^/webser1/(.*)$ /webser2/$1 break;
}
}
2.return:停止处理,并返回给客户端指定的响应吗
return 500;
return URL;
return 301|302 URL; #不可以写错误代码,错误代码则显示后面RUL地址,不会跳转
3.rewrite_log:是否开启重写日志,发送至err_log
rewrite_log on|off;
4.set $variable value:
5.if (条件) {}: 引入新的上下文,条件满足时,执行配置块中的配置指令,server,location,conditi on
比较操作符
==:相等
!=:不同
~:模式匹配,区分字符大小写
~:模式匹配,不区分字符大小写
!~:模式不匹配,区分大小写
!~:模式不匹配,不区分字符大小写
文件及目录存在性判断:
-e,!-e:存在,包括文件,目录,软连接
-f,!-f:文件
-d,!-d:目录
-x,!-x:执行
if ($http_user_agent ~ MSIE) {
rewrite ^(.*)$ /msie/$1 break;
}
if ($http_cookie ~* "id=([^;]+)(?:;|$)") {
set $id $1;
}
if ($request_method = POST) {
return 405;
}
if ($slow) {
limit_rate 10k;
}
if ($invalid_referer) {
return 403;
}
防盗链技术
1.valid_referers:定义referer首部的合法可用值,不能匹配的将时非法值
none:请求报文没有referer首部
blocked:请求报文有referer首部,但无有效值
server_names:参数,其可以有值作为主机名或主机模式
arbitrary_string:任意字符串,但可使用作通配符
regular:被指定的正则表达式模式匹配到的字符串,要使用开头,例如:.magedu.com
valid_referers none block server_names *.magedu.com *.mageedu.com magedu.* mageedu.* ~\.magedu\.; #定义不被拒绝的referers首部合法
if ($invalid_referer) { #表示只要不包括上面指定的,全部都拒绝
return 403;
}
ngx_http_proxy_module代理模块:
1.proxy_pass:匹配指定的路径,若匹配则重新定义到某个服务器,可以放到location,if中
server {
...
server_name HOSTNAME;
location ~|~* /uri/ {
proxy_pass http://host; #不能加/,加上/则表示置换,相当于alias
}
...
}
2.proxy_set_header:详情求报文中增加内容,因为添加代理之后,在后端服务器上显示访问网站的来源全部都是代理服务器,所以需要增加该内容
1.在代理服务配置文件中设置
proxy_set_header 字段名 $remote_addr(表示客户端地址)
2.在真是服务器上将日志格式修改
在日志格式出增增加
%{字段名}i #在日志logformat定义格式中增加即可,若需要重新定义,则需要重新引用
$remote_addr #当前面只有一个代理时
$X-Forwarded-For #当前面不止一个代理服务器时,使用该服务器
3.proxy_cache_path:定义缓存路径,将特定数据分成两部分,数据本身放到磁盘上,数据名字做hash做运算,放入内存的表中,将hash值分成若干个段,然后根据hash的位数来分层创建目录
该命令是定义,只能存放到http中
proxy_cache_path path [levels=levels] [use_temp_path=on|off] keys_zone=name:size[inactive=time] [max_size=size] [manager_files=number] [manager_sleep=time] [manager_threshold=time] [loader_files=number] [loader_sleep=time] [loader_threshold=time] [purger=on|off] [purger_files=number] [purger_sleep=time] [purger_threshold=time];
path :路径
levels:级别
use_temp_path=on|off:是否开启临时目录
keys:指定谁做hash值,起个名称
调用定义好的缓存
4.proxy_cache:指明调用的缓存,或关闭缓存功能
proxy_cache keys_zone指定的name |off
5.proxy_cache_key $request_uri :缓存中用于的键的内容 ```bash
proxy_cache_key $request_uri;
6.proxy_cache_valid:定义对特定响应码的响应内容的缓存时长
```bash
proxy_cache_valid 200 302 301 1h;
proxy_cache_valid any 1m;
7.proxy_cache_use_stale:在被代理的后端服务器出现那种情况下,可以直接使用过期相应客户端
proxy_cache_use_stale error|timeout|invalid_header|updating|http_500|http_502|http_503|http_504|http_403|http_404|off;
8.proxy_cache_methods:定义那些HEAD方法可以缓存默认之后GET,HEAD
proxy_cache_methods GET HEAD;
9.proxy_hide_header:隐藏后端的一些信息,默认隐藏
proxy_hide_header Server; #定义隐藏后端服务器特定的相应首部
10.prixy_connect_timeout time:定义后端服务器建立连接的时长,不要设置太长,默认60,一般不建议超过75s
prixy_connect_timeout 60; #默认定义与后端服务器建立连接的时长,默认60s
11:proxy_send_timeout:把请求发送给后端服务器对的超时时间,默认60s
proxy_send_timeout 60;
12:proxy_read_timeout:等待后端服务器发送相应报文的超时时长,默认60s
proxy_read_timeout 60;
实例
1.定义配置文件中的缓存定义
http代码段
proxy_cache_path /app/cache levels=1:2:2 keys_zone=cache:20m inactive=120s max_size=1g;
2.扩展配置文件,可以在server也可以在location,if中定义
server{
listen 80;
server_name www.lin.com;
root /app/web/webser1/;
index index.html;
location / {
proxy_pass http://192.168.1.142;
proxy_cache cache;
proxy_cache_key $request_uri;
proxy_cache_valid 200 301 302 1h;
proxy_cache_valid any 1m;
}
}
修改数据包的首部信息和尾部信息
ngx_http_headers_module模块
1.add_header name value:首部信息
add_header server test;
2.add_trailer name value:尾部信息
add_header server test;
fastcgi模块
Nginx默认不支持php请求,需要fastcgi来发送到能处理到服务器上
代理功能可以是同构协议,也可以是异构协议
ngx_http_fastcgi_module模块,不支持php模块模式的fpm,只能是单独的php-fpm
1.fastcgi_pass address:后端fastcgi server的地址,放到location if中
2.fastcgi_index name :指定默认主页资源
3.fastcgi_param:文件路径
1.在后端安装单独的php-fpm软件,来处理php类型的网页
[root@cip ~]# yum install -y php-fpm.x86_64
vim /etc/php-fpm.d/www.conf #至少修改两处,
listen = 9000
listen.allowed_clients = 127.0.0.1,192.168.1.137
2.设置代理服务器
server{
listen 80 default_server;
server_name www.lin.com;
root /app/web/webser1/;
index index.html;
location ~ \.php {
fastcgi_pass 192.168.1.142:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME /app/php$fastcgi_script_name;
include fastcgi_params;
}
}
1.在后端安装单独的php-fpm软件,来处理php类型的网页
[root@cip ~]# yum install -y php-fpm.x86_64
vim /etc/php-fpm.d/www.conf #至少修改两处,
listen = 9000
listen.allowed_clients = 127.0.0.1,192.168.1.137
pm.status_path = /status
ping.path = /ping
2.设置代理服务器
server{
listen 80 default_server;
server_name www.lin.com;
root /app/web/webser1/;
index index.php index.html;
location ~ / {
fastcgi_pass 192.168.1.142:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME /app/php$fastcgi_script_name;
include fastcgi_params;
}
location ~ ^/(status|ping)$ {
fastcgi_pass 192.168.1.142:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME /app/php$fastcgi_script_name;
include fastcgi_params;
}
}
4.fastcgi_cache_path:定义缓存,需要在http代码代码段中定义
fastcgi_cache_pathpath [levels=levels] [use_temp_path=on|off] keys_zone=name:size[inactive=time] [max_size=size] [manager_files=number] [manager_sleep=time] [manager_threshold=time] [loader_files=number] [loader_sleep=time] [loader_threshold=time] [purger=on|off] [purger_files=number] [purger_sleep=time] [purger_threshold=time];
path:缓存位置为磁盘上的文件系统
max_size:磁盘path路径中用于缓存数据的缓存空间上限
levels=leves:缓存目录的层级数量,以及每一集的目录数量
keys_zone=name:size:定义映射在内存中的名称以及大小
inactive=time:非活动时长
5.fastcgi_cache:调用缓存空间来缓存数据
fastcgi_cache zone|off;
6.fastcgi_cache_key:定义用作缓存项的key的字符串
fastcgi_cache_key $requost_uri;
7.fastcgi_cache_methods:那些请求方法使用缓存
fastcgi_cache_methods GET|HEAD|POST;
8.fastcgi_cache_min_uses:缓存空间的缓存项存在inactive定义的非活动时间内至少要访问到此处指定的次数方可被认作活动项
fastcgi_cache_min_uses number;
9.fastcgi_keep_conn:收到后端服务器相应后,fastcgi服务器是否关闭连接,建议启用长连接
fastcgi_keep_conn on|off;
10.fastcgi_cache_valid:不同响应码各自的缓存时长
fastcgi_cache_valid time;
实验:利用上面已经搭建好的环境,来添加加速
1.在http代码段定义fastcgi
fastcgi_cache_path /app/fastcgi levels=1:2:2 keys_zone=fastcgi:20m inactive=120s max_size=1g;
2.在server中调用定义好的fastcgi
server{
listen 80 default_server;
server_name www.lin.com;
root /app/web/webser1/;
index index.php index.html;
location ~ / {
fastcgi_pass 192.168.1.142:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME /app/php$fastcgi_script_name;
include fastcgi_params;
fastcgi_cache fastcgi; #若需要关闭缓存则,直接off即可
fastcgi_cache_key $request_uri;
fastcgi_cache_min_uses 1;
fastcgi_cache_valid 200 301 302 10m;
fastcgi_cache_valid any 1m;
}
location ~ ^/(status|ping)$ {
fastcgi_pass 192.168.1.142:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME /app/php$fastcgi_script_name;
include fastcgi_params;
}
}
实现调度功能
ngx_http_upstream_module模块
1.upstream name {server ;server ;}:指定调度主机,定义在http中
upstream name {
server IP地址 ;
server IP地址:port;
server IP地址:prot weight=2 max_conns=最大连接数,1.11.5版本之后才支持 max_fails=1(默认选项为1)bakup;#增加权重
}
2.server:指定后端服务端的主机IP地址:port
upstream name {
server IP地址:port weight=1;
server IP地址:port;
}
weight=number:权重,默认为1
max_conns:连接后端服务器最大并发活动链接数,1.11.5后支持
max_fails=number:失败尝试最大连接次数
fail_timeout=time:后端服务器标记位不可用状态的连接超时时长,默认10s
backup:将服务器标记为备用,即所有服务器均不可用时才启用
down:标记为不可用,配合ip_hash使用,实现灰度发布
3.ip_hash:原地址hash调度方法,根据客户端访问服务器的IP地址来调度到同一台服务器上
4.least_conn:最少连接调度算法,当server拥有不同的权重时,其为wlc,当所有后端主机连接数相同时,则使用wrr,适用于长连接
5.hash key consistent:基于指定的key的hash表来实现对请求的调度,此处key可以直接文本,变量或二者组合
作用:将请求分类,同一类请求将发布同一个upstream server,使用consistent参数,将使用ketama一致性hash算法,适用于后端时cache服务器,比如varnish时使用
hash $request_uri consistent;
hash $remote_addr;
6.keepalive:为每一个worker进程保留的空闲的长连接数量,可节约nginx端口,并减少连接管理的消耗
keepalive 10;
7、health_check[parameters];
健康状态检测机制;只能用于location上下文
常用参数:
interval=time检测的频率,默认为5秒
fails=number:判定服务器不可用的失败检测次数;默认为1次
passes=number:判定服务器可用的失败检测次数;默认为1次
uri=uri:做健康状态检测测试的目标uri;默认为/
match=NAME:健康状态检测的结果评估调用此处指定的match配置块
注意:仅对nginxplus有效
8 match name { ... }
对backend server做健康状态检测时,定义其结果判断机制;只能用于http上下文
常用的参数:
status code[ code ...]: 期望的响应状态码
header HEADER[operator value]:期望存在响应首部,也可对期望的响应首部的值基于比较操作符和值进行比较
body:期望响应报文的主体部分应该有的内容
注意:仅对nginxplus有效
upstream backend {
server backend1.example.com route=a;
server backend2.example.com route=b;
sticky cookie srv_id expires=1h domain=.example.com path=/;
}
stream:模拟反向代理,基于tcp或udp的服务连接
ngx_stream_core_module模块
1.stream{}:定义stream相关服务,必须放到main中,和http同级
stream {
upstream mysqldb{
server 192.168
}
server{
listen
}
}
编译安装
1.获取安装包
2.创建用户
[root@localhost ~]# useradd -r -s /sbin/nologin nginx
3.准备编译所需要的软件包
[root@localhost nginx-1.12.2]# yum groupinstall -y "Development Tools"
[root@localhost nginx-1.12.2]# yum install -y pcre-devel openssl-devel
4.编译
./configure --prefix=/usr/local/nginx --conf-path=/etc/nginx/nginx.conf --error-log-path=/var/log/nginx/error.log --http-log-path=/var/log/nginx/access.log --pid-path=/var/run/nginx.pid --lock-path=/var/run/nginx.lock --user=nginx--group=nginx--with-http_ssl_module --with-http_v2_module --with-http_dav_module --with-http_stub_status_module --with-threads --with-file-aio
网友评论