假如前端是LVS或者nginx,后端是Apache服务器

nginx反向代理服务器,lvs代理服务器

nginx的LVS的区别

如果是lvs,lvs只是把用户发来的请求数据包转到后端的服务器,后端的服务器看到是用户请求是来自于客户端

如果是nginx,nginx不是转发用户发来的请求,而是代替用户去后端的Apache服务器去访问,后端Apache服务器看到的用户请求是来自nginx服务器,这叫反向代理

lvs 工作在内核级,支持并发400万

nginx工作在应用级,支持并发3万

nginx代替远程主机访问服务器

nginx的并发是30000

nginx新版本支持动态部署模块

支持高可用

支持热部署,不停机升级版本,新发起的请求,在新版本响应,如果是一个连接旧版本,就在旧版本响应,当旧的访问结束了,新发起的请求我们就可以连接新的版本。也加平滑升级

低内存消耗

支持的模块 event-driven ,aio,mmap,sendfile

nginx是一个优秀的静态资源的web服务器,用来存放一些静态的页面

例如:html,图片,js,css,txt等静态资源

nginx还可以充当http协议的反向代理服务器

nginx还可以充当邮件的反向代理服务器

nginx支持fastcgi

nginx支持动态加载模块

lnmp :linux nginx mysql php-fpm php-mysql 注:php-fpm是fastcgi

nginx充当的是fastcgi的客户端,nginx要监听fastcgi的9000端口

客户端连接nginx,nginx连接php-fastcgi,php-fastcgi连接php-mysql,php-mysql在连接mysql数据库

web服务器的功能

支持室内主机

支持keep-alive和管道连接

访问日志

url rewirte 地址重写

路径别名

基于ip及用户的访问控制

支持速率限制及并发数字限制

支持平滑升级

nginx处理并发用户请求

事件驱动或异步模型,

主进程master负责生成子进程并读取重载配置文件等等

而子进程worker连接各种所需要的模块来处理用户请求,而处理请求时基于事件驱动模型能实现单进程处理多路请求,单个进程能处理连接数由worker kenaiks定义,而一共能启用的进程数只有worker_processes定义,二者的乘级就是他能处理的并发连接请求数量

nginx的架构

nginx是一个master开多个worker,但是worker不多。但是每个worker可以并发支持很多人的访问,worker中没有线程,用的是I/O复用,

一个worker就可以支持上万的用户请求,

worker支持很多模块,每个模块有特定的功能,例如:web服务,代理服务,fastcgi

当用户发来请求,用worker提供服务

master和worker之间的关系:master管理worker进程,例如:销毁,会加载一个worker,平滑升级,都是master进程来负责的,master相当老板,用户发来请求,master不会提供服务

nginx支持反向代理:nginx可以将用户的请求调度到后端的web服务器,或者fastcgi服务器

nginx还支持缓存功能:用户将请求发给nginx,nginx可以缓存一份数据,下次用户访问就可以直接在缓存中响应请求,就不用到后端服务器去重新查找数据。nginx基于缓存加载,缓存管理的功能。这个缓存放在内存中也可能放在nginx磁盘里

nginx的特性

multiplexing 多路复用

via kevent/epoll

event-drivent 异步

asynchronous 事件驱动

non-blocking 非阻塞

clip_image002

HTTP 和nginx的相同点和不同点

Apache支持多http虚拟主机,不支持多https虚拟主机

nginx支持多https虚拟主机,因为nginx支持SNI

apache的并发只能达到10000,而nginx能轻松达到30000

nginx支持epoll

apache支持select

select 跨平台,在linux实现了,也在windows支持

epoll :epoll比select有巨大的区别,因为epoll具有信号驱动I/O模型的某些特性

epoll和select的区别

select和epoll都可以面对多个用户的进程发请求,select和epoll相当代理人收集很多用户的请求过来,然后收集完成,select和epoll去帮你从磁盘上发数据,得到数据方复制到内核中,来得到相应的数据,但是这个数据有没有准备好,select和epoll的实现机制是不一样的

select和poll :遍历机制,一个一个的查找用户的数据是否准备好

epoll :回调机制:相当于异步的机制,具有信号的一些特性,因此,当你的数据准备好以后epoll会主动通知你,相对来讲epoll比select效率要高 。

select并发连接,接收的用户请求是1024个,poll的并发连接无上限

epoll并发连接,接收的用户请求是无上限

select 水平触发

epoll支持水平触发和边缘触发

select支持跨平台,支持windows和linux

epoll只支持linux

水平触发和边缘触发的区别

当我们的一个程序准备好以后,我是通知你一次还是多次

水平触发:如果是水平触发,是通知多次,这次数据没有准备好,在通知

边缘触发:只做一次的事,不分多次做,相对消耗资源少,边缘触发性能要更好

nginx的模块,分为三类

核心模块:core module

标准模块:只要描述了三个功能

HTTP功能模块

mail邮件功能模块

stream功能模块,stream可以做的tcp协议的代理

第三方模块

如果要安装新版本的nginx可以在nginx的官方网站,进行拷贝官方提供的yum源

老版本 1.12.2 17年10月发布的稳定版

nginx 重新启动nginx服务

nginx -s stop 停止nginx服务

用什么工具启用的nginx服务,要用什么工具停止服务

nginx -t 检查配置文件的语法

nginx -V 查看版本和编译选项

nginx -v 只显示版本

nginx -s reload 重载服务

nginx的功能

1.做web服务器用

2.做web反向代理服务器

3.和邮件相关

4.和tcp/udp转发相关的

nginx在配置文件中的指令都是由;分到结尾的

支持变量

内建变量:就是nginx自身的变量

自定义变量:

引用变量:

pstree -p 查看线程

ab命令的包

yum install httpd-tools -y

并发测试

ab -c 1000 -n 2000 http://172.20.127.169/

nginx的优化

1.worker_processes auto; 根据CPU当前的情况自动定义worker的数量,最好和当前的CPU数量相等,例如:我们有两个cpu就有2个worker,但是并不是worker越多性能就越好,因为每开一个进程都要消耗CPU,如果开的进程多,消耗的CPU就越多。nginx的一个worker就可以并发支持多个用户的访问,所以nginx不是一个进程响应一个用户

2.我们可以将一个worker和一个CPU绑定,这样的好处是提高缓存的命中率,我们的CPU里面也有缓存,如果一个worker和cpu绑定在一起,这样CPU里面的缓存就可以一直被这个worker重复使用,如果不绑定就有可能带来问题,例如:支持跑在这个CPU,待会又可能跑在另一个CPU上,这样原来CPU上的缓存就将失效了,由此会反过来影响我们的性能

我们可以用命令查看worker进程在哪个CPU上

watch -n 0.5 'ps axo pid,cmd,psr |grep nginx'

worker绑定CPU的命令

vim /etc/nginx/nginx.conf

例如有两个CPU,两个worker,我们将worker绑定在第一个和第二个CPU上

01 代表第一个CPU

10 代表第二个CPU

如果有4个CPU就是0001和0010

clip_image004

3.worker进程的优先级,worker优先级的 -20,19

查看worker的优先级,默认的优先级是0

watch -n 0.5 'ps axo pid,cmd,psr,nice |grep nginx' 注:nice就是优先级

vim /etc/nginx/nginx.conf

worker_priority -10;

clip_image006

4.worker进程能打开的文件数量上限,支持多少个用户并发

vim /etc/nginx/nginx.conf

worker_rlimit_nofile 30000; 代表worker的总值

clip_image008

5. events 事件驱动,我们在nginx用的是epoll模型

vim /etc/nginx/nginx.conf

我们可以定义一个worker的并发连接是15000,两个worker的并发就是30000

clip_image010

6. accept_mutex on |off 互斥 处理新请求的方法

如果启用,如果有多个请求,第一个请求发送给第一个worker,第二个请求发送给第二个worker

如果不启用,如果来了一个请求,就都唤醒所有的worker,最后还是一个worker提供服务的

7.调试和定位的问题

1. daemon on|off

是否以守护进程方式运行,默认是守护进程,守护进程就是前台执行还是后台执行

2. master_process on|off

是否以master/worker模型运行nginx,默认是on启用的

3. error_log 错误日志

记录的nginx的各种错误信息

nginx的配置

ngx_http_core_module 模块,模块中的指令

server 语句块,这个server语句块是放在http语句块里面的

listen 监听的端口

server_name 主机名

root 指定网站的路径

clip_image012

我们可以建多个虚拟主机,建每个虚拟主机放在不同的.conf文件里面,方便管理

default_server 代表默认的网站

clip_image014

server_name 也可以写成

通配符 例: *.a.com

正则表达式 例:~^www\d+magedu\.com$

注:\d代表[0-9]

tcp_nodelay on|offf

是否当用户发请求到http网站的时候,如果我们启用keepalived服务器状态监测模式,意味着用户发来请求不立即断开,可以继续发多个请求过来,一次tcp握手,可以连接多次请求

当是off时:延迟发送,合并多个请求后在发送

默认是on:不延迟发送

sendfile on|off

直接从磁盘把数据复制到内核空间,然后内核空间直接把数据复制到内核关于socket ba fe的缓冲区

server_tokens on |off | build |string

显示服务器的nginx版本

如果打开非常的危险,我们要把这个版本号隐藏了

我们要在配置文件的http语句块里面设置,这样隐藏全部的版本号,如果想隐藏单独的虚拟主机我们可以虚拟主机的server里面设置

clip_image016

location:可以定义某个位置,根据这个位置来单独的做额外的处理

根据具体的路径,定义相应的规则

clip_image018

当我们访问news的url的时候,访问的是/data/sitea/

clip_image020

当访问url的news的上,访问的是/app/sitea/下news目录下的index.html

clip_image022

我们也可以在url前面加一些符号

location = / 精确匹配 /根

访问www.a.com 的根站点 /www/sitea/目录

clip_image024

还可以支持

^~ 对url的最左边部分做匹配检测,不区分大小写

~ 对url做正则表达式模式匹配,区分字符大小写

~*对url做正则表达式模式匹配,不区分字符大小写

不带符号 :匹配起始于此uri的所有uri

匹配优先级从高到第

=,^~,~/~*,不带符号

alias别名

location /bbs/{

alias /web/forum/;

}

alias和root不同

alias 例如:当我们访问网站url的/bbs/目录时,得到的数据是来自于/web/forum/index.html

location /bbs/ {

root /web/forum/;

}

root 例如:当我们访问网站url的/bbs/目录时,的到的数据是来自于/web/forum/bbs/index.html

root 相当于匹配的是location左侧的根

alias相当于匹配的是location右侧的根

error_page_code 错误页面

如果访问的是一个不存在的页面,我们可以定义把报错转到我们定义的位置页面

如果404报错就将报错页面转到我们指定的/data/sitea/404.html/ 页面

clip_image026

防止流氓网站,盗取我们的错误页面

当我们访问一个错误页面,我们将404响应改成200的响应码,我们看到的还是404报错的页面

clip_image028

try_files :当我们找一个内容,按照什么顺序去寻找顺序

location /images/ {

try_files $uri /images/default.gif;

}

当访问/images/目录下的内容的时候,进到目录挨个找,先找$uri(xx.html),如果找不到就访问/images/default.gif默认页面

location / {

try_files $uri $uri/index.html $uri.html =404;

}

当访问根的时候,先找$uri,如果没有就找$uri $uri/index.html,如果还找不到,就找$uri.html并返回一个404页面

当访问images目录下的a.jpg就返回a.jpg,如果没有a.jpg就返回default.jpg

clip_image030

如果找不到我们也可以返回404

clip_image032

client_body_buffer_size

用于接收每个客户端请求报文的body部分的缓冲区大小,默认是16k,超出此大小时,其将被暂存到磁盘上的由下面client_body_temp_path指令所定义的位置。

client_body_temp_path

把数据做哈希运算

limit_rate 限速

limit_except method 只能用在location

限定客户端的请求方法

GET ,POST 生产中使用

HEAD 测试的时候使用

OPTIONS 探测对方网站支持哪些方法

limit_except GET {

allow 192.168.1.0/24;

deny all;

}

只能是内部管理员访问除了GET的其他方法,其他互联网用户都不能访问

只允许192.168.63.141访问,不允许其他人访问

clip_image034

ngx_http_access_module 控制用户谁能访问,谁不能访问

默认是不限制的

allow 允许

deny 拒绝

clip_image036

ngx_http_auth_basic_module 用户身份验证

创建账号

yum install httpd-tools -y

htpasswd -cm nginxuser httpuser1 创建用户httpuser1,第一次创建要加 c

htpasswd -cm nginxuser httpuser2 创建用户httpuser2,第二次创建不用加 c

在配置文件中告诉用户和密码的文件位置

vim /etc/nginx/conf.d/a.com.conf

auth_basic "login info" 提示符

auth_basic_user_file 用户密码文件的位置

clip_image038

ngx_http_stub_status_module 状态页

启用状态页

为了安全限制用户的访问

clip_image040

clip_image042

ngx_http_log_module 指定日志格式的记录请求

日志只能在主配置文件http语句块里面写

vim /etc/nginx/nginx.conf

clip_image044

[$time_iso8601] 更改日期格式

调用日志

access_log /var/log/nginx/a.com_access.log testlog;

调用的日志是 testlog

日志的存放位置 /var/log/nginx/a.com_access.log

clip_image046

ngx_http_gzip_module 压缩 注:必须使用在生产中

用gzip方法压缩响应数据,节约带宽

gzip on |off 启用或禁用压缩

gzip_comp_level 压缩的级别 1到9,默认是1

gzip_min_length 达到多大才进行压缩

gzip_http_version 1.0 | 1.1 启用压缩功能时的协议版本,http一般是1.1

gzip_buffers 压缩时缓冲区数量及每个缓冲区的大小

gzip_types 针对什么资源压缩 例如:text文本和html压缩,默认对html压缩

gzip_vary on|off 如果启用压缩是否在响应报文的首部插入一个专门表示压缩的首部报文头部

gzip_proxied 压缩的时候,如果nginx充当登录服务器,是否对后端服务器的响应报文在某中条件下压缩,根据后端服务器发的信息决定压缩不压缩

clip_image048

gzip on; 启用压缩

gzip_comp_level 9; 压缩级别

gzip_min_length 64; 压缩的大小 单位字节

gzip_proxied any; 反向代理

gzip_types text/xml text/css application/javascript text/plain; 压缩的资源

ngx_http_ssl_module 加密

https在nginx中的实现

只要加密就需要证书

可以放在server和http中

ssl on|off 启用或禁用加密

ssl_certificate 证书文件

ssl_certificate_key 私钥文件

ssl_protocols ssl的协议支持的版本TLSv1;TLSv1.1;TLSv1.2

ssl_session_cache 我们通过http连接到网站 会有一些session会话消息,session消息为了加速访问可以考虑缓存cache

off 不启用缓存

none 通知客户端表面上是支持客户端的,实际是不支持

builtin[:size] 所用的openssl内建缓存,每个worker进程它的ssl会话信息是私有的,可以指定大小

[shared:name:size] 在多个worker之间使用一个共享的缓存。使用的时候要起名,并指定大小

ssl_session_timeout session会话的超时时长,默认是5分钟

创建证书

cd /etc/pki/tls/certs/ 进入目录下

make a.crt 创建证书

会生成两个文件

a.crt a.key

我们是加密的,如果要启用nginx分为要输入密码,我们可以解密密码

openssl rsa -in a.key -out aa.key a.key解密成aa.key

将证书和秘钥文件拷贝到指定的目录

cp a.crt aa.key /etc/nginx/conf.d/

创建基于https加密的虚拟主机

clip_image050

测试

clip_image052

可以创建多https加密虚拟主机,因为nginx支持SNI名称空间,要创建新的证书,秘钥

查看证书信息

openssl s_client -connect www.c.com:443

ngx_http_rewrite_module

nginx第二天视频的第一节课第60分钟

rewrite 重写地址

例如:我们平常访问http:/www/baidu.com 会跳到https:/www/baidu.com,就是基于rewrite实现的

新的url代替旧的url的规则

last :url会按照正则表达式去查找,例如:如果找到符合的url2就会替换成新的url2,然后看到last就不会往下查找 ,建议不要在location中使用,会造成死循环

break : 如果发现break就在终止跳转,不会在往下跳转,不会造成死循环

redirect 临时重定向代码是302

permanent 永久重定向,代码是301

rewrite regex1 url1

rewrite regex3 url2

rewrite regex3 url3

http://nginx/regex1 ---》http://nginx/url2

clip_image054

rewrite ^/bbs/(.*)$ /froum/$1 last

如果访问^/bbs/开头的index.html文件就跳转到froum下的index.html文件

clip_image056

redirect 临时重定向,代表是302

clip_image058

代表是302

clip_image060

permanent 永久重定向,代码是301

clip_image062

代码是301

clip_image064

当访问不加密的网站,跳转到加密的网站

rewrite / https://www.a.com/ redirect;

如果访问/根网站,就转到https://www.a.com/

clip_image066

clip_image068

我们也可以用一个虚拟主机

location / {

if ( $scheme = http ){ 如果是http就跳转到https://www.a.com/

rewrite / https://www.a.com/ redirect;

}

}

clip_image070

clip_image072

如果访问文本文件txt,就跳转到html

clip_image074

break 到这就结束循环,避免死循环出现

clip_image076

如果访问txt文件,就跳转到magedu网站

clip_image078

跳转的时候返回指定的响应码

如果访问www.a.com/admin/就返回拒绝,显示这是一个非法地址

if如果 url ~* 不区分大小写,包含admin的就返回403拒绝访问,并返回一个提示DENY ACCESS

clip_image080

clip_image082

ngx_http_referer_module 防盗链

有两个网站www.a.com 和 www.b.com

clip_image084

在a的网站主页目录/data/sitea/目录下创建一个daolian.html

在a网站盗取了b网站的图片,为a网站服务

clip_image086

我们要避免这种情况,来避免自己网站的图片被别的网站盗取我们的图片

跳转,当我们点击www.b.com的时候。从当前站点跳转到www.b.com

clip_image088

varid_referer有效的访问, 根据跳转的网站,是非法的还是合法的,假如,是从百度跳过来的就是合法的,从别的地方跳过来的就是非法的。

我们用varid_referer决定谁是合法的,谁是非法的

定义referer首部的合法值,不能匹配的将是非法的

none :请求报文首部没有referer首部

blocked:请求报文有referer首部,但没有有效值,可能是反向代理服务器吧referer清空了

server_names 参数,将来带有的值是某一个域名,当然也有可能是某一个模式

arbitrary_string 可以写通配符

regular expression 可以写正则表达式,但是有一个要求,要用~波浪符表示开头,后面才是正则表达式

clip_image090

valid_referers none block server_names *.b.com ~\.baidu\.; none 没有referer的,block有referer但是没值的,server_names带有域名的,*.b.com以b.com结尾的,~\.baidu\包含baidu的都是合法的

if ($invalid_referer) { 其他的都是非法的,返回403

return 403 ;

}

ngx_http_proxy_module 反向代理

当访问www.a.com 的根时候就代理到后端的192.168.63.131服务器

clip_image092

当访问特定的url,进行反向代理

clip_image094

因为/bbs 比/ 更精确,优先级更高,所以先查找/bbs目录的url下的数据,发现一bbs开头的目录下的文件都转换成/froun目录下的文件,然后在查找/根发现,代理到192.168.63.131后端的服务器上,就变成了http://192.168.63.131//froun/.*

如果后端服务器的端口发生改变,会发现报错502

如果后端的服务器端口是8080

clip_image096

如果是只有/bbs才反向代理,其他都不代理

clip_image098

注意:加/斜杆和不加/斜杆的区别

clip_image100

加/斜杆: 就是当访问/bbs的时候,就置换成http://192.168.63.131/

不加/斜杆:当访问/bbs的时候,就在http://192.168.63.131/后面加/bbs目录充当我的URL,变成http://192.168.63.131/bbs

proxy_pass 前面加斜杆是不允许有正则表达式的,否则会有语法错误

例如:如下

clip_image102

如果不加加斜杆是允许有正则表达式

例如:如下

clip_image104

只有图片文件的时候例如 .jpg .gif 等文件的时候,才调度到http://192.168.63.131 服务器

clip_image106

动静分离

一台后端服务器安装apache服务器

一台后端服务器安装Apache,php-fpm ,php-mysql连接数据库

一台后端服务器安装数据库,mariadb-server,创建允许远程连接的用户

一台代理服务器安装nginx

动态就调度到131服务器,如果是其他就调度到132服务器

clip_image108

注意:后端服务器收到的请求的ip地址来源于nginx代理服务器的ip,并不是真正的远程客户端的ip

解决方法:是在数据报文的头部在添加一个新的头,数据报文的结构有首行,首部字段行,还有实体行,其中我们可以在首部字段添加一个新的报文头部。就是在请求报文的头部加上客户端的ip

proxy_set_header 给请求报文添加首部

但是后端的web服务器默认记录日志,记录的是还是客户端也就是nginx代理服务器的地址,不会记录加的报文头部的地址,因为web服务器的日志格式是预先定义好的,所以我们要更改日志的格式

%h 就是客户端的地址

clip_image110

1. 在nginx代理服务器

用proxy_set_header添加一个新的报文头部

proxy_set_header remoteclientip $remote_addr

remoteclientip 自己定义

$remote_addr 代表客户端地址

clip_image112

2.在后端Apache服务器端修改日志格式

vim /etc/httpd/conf/httpd.conf

LogFormat "%{remoteclientip}i

remoteclientip是在nginx代理服务器上新加的头部

clip_image114

这样就就可以看见远程客户端的ip地址

proxy_add_x_forwarded_for 解决多层代理

在生产中可能有多台代理服务器,我们可以将多台代理服务器地址累加在一起

例如:有两层代理

如果在两层代理服务器上都加proxy_set_header 会在后端服务器上看到所有叠加的代理服务器的ip,还有真实的客户端ip

如果只在最外层的代理服务器上加proxy_setheader,在后端服务器上的日志只会显示真实客户端的ip,看不到中间发现代理服务器的地址

clip_image116

在后端日志服务器上更改日志格式

clip_image118

proxy_cache_path 可以定义反向代理缓存的功能

我们可以将一些页面缓存到服务器上,下次客户端就不需要跑到后端服务器去找数据了,直接在代理服务器进行数据的响应,进而提高速度

缓存只能放在主配置文件http语句块

proxy_cache_path

缓存的位置

[levels=levels]存放缓存不是文件名的方式,而是把文件起哈希值做计算,把哈希值当文件名,哈希值存的时候会按照一级,二级,三级,定义多少级来存,每一级就是安装哈希值的数字来作为文件夹名,所以要设定,分几级,每一级占几个16进制数

keys_zone=name:size 是否起一个名称,这个名字是将来要在某个虚拟主机去用这个缓存,所以要起一个名字,调用这个名称,接下来还要指定它的大小,缓存占多大空间

[inactive=time] 缓存失效的时间,当失效了就将缓存删掉

max_size=size:最多在磁盘占多大空间

例:

proxy_cache_path /var/cache/nginx/proxy_cache 将来要存放缓存的位置

levels=1:1:1 keys_zone=proxycache:20m

inactive=120s max_size=1g;

注意: keys_zone指定的20m,说的是在内存中占20m的空间,但是这个缓存存的不是数据,真正的数据放在/var/cache/nginx/proxy_cache 磁盘路径里面,这个缓存放在内存中是key键和metadata源数据,所谓的key键就是用户访问的url,值就是文件名,但是值不放在缓存的内存中,它是放在磁盘空间上max_size=1g; 最大1g

问:nginx的缓存里面内存中的缓存放的是什么?

放的是key和metadata源数据,比如说源数据访问了多少次

/var/cache/nginx/proxy_cache 这个路径放的的是页面文件,放在磁盘里面

vim /etc/nginx/nginx.conf 主配置文件

clip_image120

在我们的虚拟主机记录 在哪个location里面转发的时候反向代理服务器缓存信息放在过程指定的位置里面

vim /etc/nginx/conf.d/c.conf

proxy_cache proxycache; 指定前面定义缓存的名字proxycache,要定义这个缓存

proxy_cache_key $request_uri; 调用的时候用$request_uri用户访问的url当key,值是文件内容

proxy_cache_valid 200 302 301 1h; 在200 302 301 这些响应吗的时候才启用缓存,缓存1小时

proxy_cache_valid any 1m; 其他的缓存1分钟

clip_image122

nginx代理服务的缓存大概的原理是什么

缓存的是什么

缓存是放在什么地方

缓存分两块

一部分放在内存里面

内存里面放的是,访问的url也就是key键,还有metadata源数据,访问了几次也就是缓存命中率

一部分放在磁盘里面

真正的数据是存放在磁盘上的,而且存放磁盘的时候他是把文件做了一个哈希运算,放到文件上

proxy_cache_use_stale

在某些场景下,可能还得做一些错误的缓存信息,或过期的缓存

如果后端服务器down机了,然后缓存的信息又过期了,我们可以考虑用过期的缓存继续提供服务

proxy_hide_header 隐藏后端服务器的特定报文

默认将时间,后端服务器的版本号等等隐藏了

ngx_http_headers_module模块,加这个模块有助于排除

添加首部

向由代理服务器响应给客户端的响应报文添加自定义首部,或修改指定首部的

add_header X-Via $server_addr; 中间的反向代理服务器地址

add_header X-Cache $upstream_cache_status; 缓存的命中率情况

add_header X-Accel $server_name; server的名称

clip_image124

ngx_http_fastcgi_module

让nginx支持fastcgi

搭建lnmp nginx+mysql+php-fpm

192.168.63.131 nginx

192.168.63.132 php-fpm php-mysql

192.168.63.141 mysql

192.168.63.132

yum install php-fpm php-mysql -y

更改PHP的监听ip

vim /etc/php-fpm.d/www.conf

listen = 9000 监听本机的所有端口

listen.allowed_clients = 192.168.63.131 允许访问的ip

pm.status_path = /status 启用测试页面

ping.response = pong 测试PHP测试是否存活

启动服务并查看监听的端口

clip_image126

让nginx发请求到php-fpm

创建一个用于存放php页面的目录

mkdir /data/php -p

创建php测试页面

clip_image128

创建连接数据库的php文件

clip_image130

192.168.63.131

yum install nginx -y

nginx连接fastcgi

nginx要启用下面几项

fastcgi_pass fastcgi服务器的地址

fastcgi_index fastcgi的主页程序

fastcgi_param nginx要充当fastcgi的客户端要传一些变量参数过去

在nginx的程序中已经有很多自带的有关fastcgi变量在/etc/nginx/fastcgi_params

关键的参数有一项

fastcgi_param 就是fastcgi传过去的具体路径,将来将前端发来的PHP请求发送到后端fastcgi哪个文件夹上

clip_image132

在客户端测试

clip_image134

获取php-fpm的状态信息

location ~* ^/(pm_status|ping)$ { 当访问fastcgi的pm_status或ping的时候就转发大后端的fastcgi服务器

include fastcgi_params;

fastcgi_pass 192.168.63.141:9000;

fastcgi_param SCRIPT_FILENAME $fastcgi_script_name;

}

clip_image136

测试

clip_image138

配置fastcgi的缓存

在主配置文件http语句块插入,缓存的存放的路径,还有定义缓存的名字fcgicache,内存的大小20m,这个内存存放的是key键和源数据和源数据的次数。缓存的值是放在磁盘里面

clip_image140

fastcgi_cache fcgicache;

fastcgi_cache_key $request_uri;

fastcgi_cache_valid 200 302 10m;

fastcgi_cache_valid 301 1h;

fastcgi_cache_valid any 1m;

clip_image142

ngx_http_upstream_module 调度

nginx自带健康性检查功能,如果发现有一台后端服务器down机,可以实现不给down的服务器调度

例如后端有多台服务器,可以用nginx的upstream模块实现调度

upstream模块只能在主配置文件的http语句块设置

vim /etc/nginx/nginx.conf

在upstream模块指定要调度的server的服务器地址

clip_image144

我们还要在我们自定义的虚拟主机定义怎么转发

我们针对的这个网站

location / 当访问根的时候,访问的www代表的两个主机

www是在主配置文件定义的upstream模块的名字

clip_image146

测试

clip_image148

clip_image150

我们还可以实现权重

weight=

还可以设置连接后端服务器最大的并发活动连接数

max_conns

还可以设置连接后端服务器失败几次,超出这个数字,就是出故障了,就不调度了

max_fails=

还可以设置超时时长,多长时间连接不了后端服务器,后端服务器就故障了

fail_timeout= 默认10s

可以将后端服务器标记为备用,只有后端的所有服务器都不能用了,才启用备用服务器

backup

还可以吧后端服务器标记为不可用,就不往这个服务器上调度,例如要更新的时候,可以先把这个服务器下线,进行更新

down

进行源地址进行哈希运算,只要是同一个ip地址来的请求,始终往一个服务器上调度

ip_hash

在主配置文件的http语句块

clip_image152

最少连接调度算法,如果后端的连接少,就给谁调度

least_conn

clip_image154

哈希,根据用户请求报文中的一些首部字段来做调度

hash key

hash $request_uri 根据uri进行调度,例如我们有一台调度服务器,后端有2台服务器,用户发来请求,我们查看uri是什么,如果一个url就向后端其中以个服务器进行调度,如果是另一个uri就向另外一个服务器调度,这2个服务器的权重还不一样,第一台服务器的权重是1,第二台服务器的权重是2,我们可以根据权重进行哈希运算并和权重的总和取模,

只要uri固定,就始终往一个服务器上调度

clip_image156