假如前端是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 非阻塞
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
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;
4.worker进程能打开的文件数量上限,支持多少个用户并发
vim /etc/nginx/nginx.conf
worker_rlimit_nofile 30000; 代表worker的总值
5. events 事件驱动,我们在nginx用的是epoll模型
vim /etc/nginx/nginx.conf
我们可以定义一个worker的并发连接是15000,两个worker的并发就是30000
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 指定网站的路径
我们可以建多个虚拟主机,建每个虚拟主机放在不同的.conf文件里面,方便管理
default_server 代表默认的网站
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里面设置
location:可以定义某个位置,根据这个位置来单独的做额外的处理
根据具体的路径,定义相应的规则
当我们访问news的url的时候,访问的是/data/sitea/
当访问url的news的上,访问的是/app/sitea/下news目录下的index.html
我们也可以在url前面加一些符号
location = / 精确匹配 /根
访问www.a.com 的根站点 /www/sitea/目录
还可以支持
^~ 对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/ 页面
防止流氓网站,盗取我们的错误页面
当我们访问一个错误页面,我们将404响应改成200的响应码,我们看到的还是404报错的页面
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
如果找不到我们也可以返回404
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访问,不允许其他人访问
ngx_http_access_module 控制用户谁能访问,谁不能访问
默认是不限制的
allow 允许
deny 拒绝
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 用户密码文件的位置
ngx_http_stub_status_module 状态页
启用状态页
为了安全限制用户的访问
ngx_http_log_module 指定日志格式的记录请求
日志只能在主配置文件http语句块里面写
vim /etc/nginx/nginx.conf
[$time_iso8601] 更改日期格式
调用日志
access_log /var/log/nginx/a.com_access.log testlog;
调用的日志是 testlog
日志的存放位置 /var/log/nginx/a.com_access.log
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充当登录服务器,是否对后端服务器的响应报文在某中条件下压缩,根据后端服务器发的信息决定压缩不压缩
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加密的虚拟主机
测试
可以创建多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
rewrite ^/bbs/(.*)$ /froum/$1 last
如果访问^/bbs/开头的index.html文件就跳转到froum下的index.html文件
redirect 临时重定向,代表是302
代表是302
permanent 永久重定向,代码是301
代码是301
当访问不加密的网站,跳转到加密的网站
rewrite / https://www.a.com/ redirect;
如果访问/根网站,就转到https://www.a.com/
我们也可以用一个虚拟主机
location / {
if ( $scheme = http ){ 如果是http就跳转到https://www.a.com/
rewrite / https://www.a.com/ redirect;
}
}
如果访问文本文件txt,就跳转到html
break 到这就结束循环,避免死循环出现
如果访问txt文件,就跳转到magedu网站
跳转的时候返回指定的响应码
如果访问www.a.com/admin/就返回拒绝,显示这是一个非法地址
if如果 url ~* 不区分大小写,包含admin的就返回403拒绝访问,并返回一个提示DENY ACCESS
ngx_http_referer_module 防盗链
有两个网站www.a.com 和 www.b.com
在a的网站主页目录/data/sitea/目录下创建一个daolian.html
在a网站盗取了b网站的图片,为a网站服务
我们要避免这种情况,来避免自己网站的图片被别的网站盗取我们的图片
跳转,当我们点击www.b.com的时候。从当前站点跳转到www.b.com
varid_referer有效的访问, 根据跳转的网站,是非法的还是合法的,假如,是从百度跳过来的就是合法的,从别的地方跳过来的就是非法的。
我们用varid_referer决定谁是合法的,谁是非法的
定义referer首部的合法值,不能匹配的将是非法的
none :请求报文首部没有referer首部
blocked:请求报文有referer首部,但没有有效值,可能是反向代理服务器吧referer清空了
server_names 参数,将来带有的值是某一个域名,当然也有可能是某一个模式
arbitrary_string 可以写通配符
regular expression 可以写正则表达式,但是有一个要求,要用~波浪符表示开头,后面才是正则表达式
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服务器
当访问特定的url,进行反向代理
因为/bbs 比/ 更精确,优先级更高,所以先查找/bbs目录的url下的数据,发现一bbs开头的目录下的文件都转换成/froun目录下的文件,然后在查找/根发现,代理到192.168.63.131后端的服务器上,就变成了.*
如果后端服务器的端口发生改变,会发现报错502
如果后端的服务器端口是8080
如果是只有/bbs才反向代理,其他都不代理
注意:加/斜杆和不加/斜杆的区别
加/斜杆: 就是当访问/bbs的时候,就置换成
不加/斜杆:当访问/bbs的时候,就在后面加/bbs目录充当我的URL,变成http://192.168.63.131/bbs
proxy_pass 前面加斜杆是不允许有正则表达式的,否则会有语法错误
例如:如下
如果不加加斜杆是允许有正则表达式
例如:如下
只有图片文件的时候例如 .jpg .gif 等文件的时候,才调度到 服务器
动静分离
一台后端服务器安装apache服务器
一台后端服务器安装Apache,php-fpm ,php-mysql连接数据库
一台后端服务器安装数据库,mariadb-server,创建允许远程连接的用户
一台代理服务器安装nginx
动态就调度到131服务器,如果是其他就调度到132服务器
注意:后端服务器收到的请求的ip地址来源于nginx代理服务器的ip,并不是真正的远程客户端的ip
解决方法:是在数据报文的头部在添加一个新的头,数据报文的结构有首行,首部字段行,还有实体行,其中我们可以在首部字段添加一个新的报文头部。就是在请求报文的头部加上客户端的ip
proxy_set_header 给请求报文添加首部
但是后端的web服务器默认记录日志,记录的是还是客户端也就是nginx代理服务器的地址,不会记录加的报文头部的地址,因为web服务器的日志格式是预先定义好的,所以我们要更改日志的格式
%h 就是客户端的地址
1. 在nginx代理服务器
用proxy_set_header添加一个新的报文头部
proxy_set_header remoteclientip $remote_addr
remoteclientip 自己定义
$remote_addr 代表客户端地址
2.在后端Apache服务器端修改日志格式
vim /etc/httpd/conf/httpd.conf
LogFormat "%{remoteclientip}i
remoteclientip是在nginx代理服务器上新加的头部
这样就就可以看见远程客户端的ip地址
proxy_add_x_forwarded_for 解决多层代理
在生产中可能有多台代理服务器,我们可以将多台代理服务器地址累加在一起
例如:有两层代理
如果在两层代理服务器上都加proxy_set_header 会在后端服务器上看到所有叠加的代理服务器的ip,还有真实的客户端ip
如果只在最外层的代理服务器上加proxy_setheader,在后端服务器上的日志只会显示真实客户端的ip,看不到中间发现代理服务器的地址
在后端日志服务器上更改日志格式
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 主配置文件
在我们的虚拟主机记录 在哪个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分钟
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的名称
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测试是否存活
启动服务并查看监听的端口
让nginx发请求到php-fpm
创建一个用于存放php页面的目录
mkdir /data/php -p
创建php测试页面
创建连接数据库的php文件
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哪个文件夹上
在客户端测试
获取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;
}
测试
配置fastcgi的缓存
在主配置文件http语句块插入,缓存的存放的路径,还有定义缓存的名字fcgicache,内存的大小20m,这个内存存放的是key键和源数据和源数据的次数。缓存的值是放在磁盘里面
fastcgi_cache fcgicache;
fastcgi_cache_key $request_uri;
fastcgi_cache_valid 200 302 10m;
fastcgi_cache_valid 301 1h;
fastcgi_cache_valid any 1m;
ngx_http_upstream_module 调度
nginx自带健康性检查功能,如果发现有一台后端服务器down机,可以实现不给down的服务器调度
例如后端有多台服务器,可以用nginx的upstream模块实现调度
upstream模块只能在主配置文件的http语句块设置
vim /etc/nginx/nginx.conf
在upstream模块指定要调度的server的服务器地址
我们还要在我们自定义的虚拟主机定义怎么转发
我们针对的这个网站
location / 当访问根的时候,访问的www代表的两个主机
www是在主配置文件定义的upstream模块的名字
测试
我们还可以实现权重
weight=
还可以设置连接后端服务器最大的并发活动连接数
max_conns
还可以设置连接后端服务器失败几次,超出这个数字,就是出故障了,就不调度了
max_fails=
还可以设置超时时长,多长时间连接不了后端服务器,后端服务器就故障了
fail_timeout= 默认10s
可以将后端服务器标记为备用,只有后端的所有服务器都不能用了,才启用备用服务器
backup
还可以吧后端服务器标记为不可用,就不往这个服务器上调度,例如要更新的时候,可以先把这个服务器下线,进行更新
down
进行源地址进行哈希运算,只要是同一个ip地址来的请求,始终往一个服务器上调度
ip_hash
在主配置文件的http语句块
最少连接调度算法,如果后端的连接少,就给谁调度
least_conn
哈希,根据用户请求报文中的一些首部字段来做调度
hash key
hash $request_uri 根据uri进行调度,例如我们有一台调度服务器,后端有2台服务器,用户发来请求,我们查看uri是什么,如果一个url就向后端其中以个服务器进行调度,如果是另一个uri就向另外一个服务器调度,这2个服务器的权重还不一样,第一台服务器的权重是1,第二台服务器的权重是2,我们可以根据权重进行哈希运算并和权重的总和取模,
只要uri固定,就始终往一个服务器上调度