Nginx (六)

一、ngx_http_headers_module

1、 add_header name value [always];
2、 add_trailer name value [always];

FastCGI:

二、ngx_http_fastcgi_module

1、 fastcgi_pass address;
2、 fastcgi_index name
3、 fastcgi_param parameter value [if_not_empty];
4、 fastcgi_cache_path
5、 fastcgi_cache zone | off; 
6、 fastcgi_cache_key string;
7、 fastcgi_cache_methods GET
8、 fastcgi_cache_min_uses number;
9、 fastcgi_keep_conn on | off;
10、 fastcgi_cache_valid [code ...] time;

三、ngx_http_upstream_module

1、 upstream name { ... }
2、 server address [parameters];
3、 ip_hash 
4、 least_conn
5、 hash key [consistent]
6、 keepalive 
7、 health_check [parameters];
8、 match name { ... }

四、ngx_stream_core_module

1、 stream { ... }
2、 listen

一、ngx_http_headers_module

向由代理服务器响应给客户端的响应报文添加自定义首部,或修改指定首部的值
1、 add_header name value [always];
添加自定义首部
add_header X-Via $server_addr;
add_header X-Cache $upstream_cache_status;
add_header X-Accel $server_name;

2、 add_trailer name value [always];
添加自定义响应信息的尾部

FastCGI:

二、ngx_http_fastcgi_module

FastCGI是从CGI发展改进而来的。传统CGI接口方式的主要缺点是性能很差,因为每次HTTP服务器遇到动态程序时都需要
重新启动脚本解析器来执行解析,然后结果被返回给HTTP服务器。这在处理高并发访问时,几乎是不可用的。另外传统的
CGI接口方式安全性也很差,现在已经很少被使用了。

 FastCGI接口方式采用C/S结构,可以将HTTP服务器和脚本解析服务器分开,同时在脚本解析服务器上启动一个或者多个脚
本解析守护进程。当HTTP服务器每次遇到动态程序时,可以将其直接交付给FastCGI进程来执行,然后将得到的结果返回
给浏览器。这种方式可以让HTTP服务器专一地处理静态请求或者将动态脚本服务器的结果返回给客户端,这在很大程度上
提高了整个应用系统的性能。

Nginx不支持对外部程序的直接调用或者解析,所有的外部程序(包括PHP)必须通过FastCGI接口来调用。FastCGI接口在
Linux下是socket,(这个socket可以是文件socket,也可以是ip socket)。为了调用CGI程序,还需要一个FastCGI的wrapper
(wrapper可以理解为用于启动另一个程序的程序),这个wrapper绑定在某个固定socket上,如端口或者文件socket。当Nginx
将CGI请求发送给这个socket的时候,通过FastCGI接口,wrapper接纳到请求,然后派生出一个新的线程,这个线程调用解释
器或者外部程序处理脚本并读取返回数据;接着,wrapper再将返回的数据通过FastCGI接口,沿着固定的socket传递给Nginx
;最后,Nginx将返回的数据发送给客户端,这就是Nginx+FastCGI的整个运作过程。
ngx_http_fastcgi_module模块
转发请求到FastCGI服务器,不支持php模块方式
1、 fastcgi_pass address;
address为后端的fastcgi server的地址可用位置: location, if in location
2、 fastcgi_index name;   fastcgi默认的主页资源
示例: fastcgi_index index.php;
3、 fastcgi_param parameter value [if_not_empty];  
设置传递给 FastCGI服务器的参数值,可以是文本,变量或组合
示例1:
1)在后端服务器先配置fpm server和mariadb-server
2)在前端nginx服务上做以下配置:
location ~* \.php$ {
fastcgi_pass 后端fpm服务器IP:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME
/usr/share/nginx/html$fastcgi_script_name;
include fastcgi_params;    参数数组
…
}
示例2:
通过/pm_status和/ping来获取fpm server状态信息
location ~* ^/(pm_status|ping)$ {
include fastcgi_params;
fastcgi_pass 后端fpm服务器IP:9000;
fastcgi_param SCRIPT_FILENAME
$fastcgi_script_name;
}
4、 fastcgi_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];
定义fastcgi的缓存;
path 缓存位置为磁盘上的文件系统
max_size=size  磁盘path路径中用于缓存数据的缓存空间上限
levels=levels:缓存目录的层级数量,以及每一级的目录数量
levels=ONE:TWO:THREE

#示例: leves=1:2:2
keys_zone=name:size  k/v映射的内存空间的名称及大小
inactive=time 非活动时长

5、 fastcgi_cache zone | off;  调用指定的缓存空间来缓存数据可用位置: http, server, location

6、 fastcgi_cache_key string;  定义用作缓存项的key的字符串
示例: fastcgi_cache_key $request_rui;

7、 fastcgi_cache_methods GET | HEAD | POST ...;  为哪些请求方法使用缓存

8、 fastcgi_cache_min_uses number;
缓存空间中的缓存项在inactive定义的非活动时间内至少要被访问到此处所指定的次数方可被认作活动项

 9、 fastcgi_keep_conn on | off;  收到后端服务器响应后, fastcgi服务器是否关闭连接,建议启用长连接

10、 fastcgi_cache_valid [code ...] time; 不同的响应码各自的缓存时长
示例:
http {
fastcgi_cache_path /var/cache/nginx/fcgi_cache
levels=1:2:1 keys_zone=fcgicache:20m inactive=120s;
...
server {
location ~* \.php$ {
...
fastcgi_cache fcgicache;
fastcgi_cache_key $request_uri;
fastcgi_cache_valid 200 302 10m;
fastcgi_cache_valid 301 1h;
fastcgi_cache_valid any 1m;
...
}
}
启用代理功能转发到fastcgi上面,安装fastcgi服务器,fastcgi可以用apache代替,在106安装fastcgi
106机器
yum install php-fpm
修改php-fpm配置文件
vim /etc/php-fpm.d/www.conf  删除监听地址,留端口,允许远程ip连接
注释掉远程连接;listen.allowed_clients = any
状态页,测试ping,发消息pong
php-fpm是独立进程,自定义存放路径,创建目录app/php(使其与反向代理服务器
fastcgi_param SCRIPT_FILENAME  /app/php/$fastcgi_script_name对应) 并在此目录中存放动态资源
mkdir /app/php
cd /app/php/
vim index.html
107机器
收到请求后需要通过代理功能转发到后端的fastcgi服务器上面由9000端口处理,把页面返回传至客户端
vim /etc/nginx/vhost.conf  
location ~ \.php$   哪种格式的转发
fastcgi_pass address;  address  转发后端的fastcgi server的地址和端口
fastcgi_index name;  fastcgi默认的主页资源
fastcgi_param SCRIPT_FILENAME  用户发请求脚本名称是放在后端fastcgi哪个路径上面后面跟上URL
107创建页面文件
cd /app/site1/
echo 107 > index.html
108机器访问107代理机器
curl http://192.168.25.107  
性能测试
107机器
修改fastcgi.conf模板文件也可以
vim /etc/nginx/vhost.conf  
vim /etc/nginx/fastcgi.conf  修改路径/app/php
跟上面操作效果一样
vim /etc/nginx/vhost.conf      不用写路径默认主页
Nginx 服务器开启status页面检测服务状态
做相应的控制location符合status|ping路径时候,转发到后端fastcgi做处理,需要用到路径

状态信息可以调整格式,status?full,status?xml,status?json

www连接chi
连接状态
开始时间
连接数
进程数

还可以ping下,会出现pong说明还在
可以切换格式显示
可以观察后端fastcgi的状态
108数据库
yum install mariadb-server
创建账号授权用户
106机器php
yum install php-mysql
vim /app/php/index.php   连接数据库代码   后端是mariadb,两种格式都可以
使用mysql扩展连接数据库的测试代码
<?php
$conn = mysql_connect(‘mysqlserver','username','password');
if ($conn)
echo "OK";
else
echo "Failure";
mysql_close();
?>

<?php
$mysqli=new mysqli("mysqlserver",“username",“password");
if(mysqli_connect_errno()){
echo "连接数据库失败!";
$mysqli=null;
exit;
}
echo "连接数据库成功!";
$mysqli->close();
?>

启动服务   systemctl start php-fpm
106机器  搭建wordpress
cd /app/php/  
tar xvf wordpress-4.8.1-zh_CN.tar.gz
107代理机器
缓存定义nginx.conf
fastcgi 动态页面也是在这个位置
  vim /etc/nginx/vhost.conf调用fastcgi缓存   跟之前proxy 格式差不多
加载nginx服务
nginx -s reload

108机器
curl http://192.168.25.107/index.php

107代理机器
查看缓存记录
108机器测试缓存
ab -c 100 -n 2000 http://192.168.25.107/index.php
之前测试800左右,这次开启缓存4000多
关闭缓存测试
效果很明显800多
完成OK

三、ngx_http_upstream_module

用于将多个服务器定义成服务器组,而由proxy_pass,fastcgi_pass等指令进行引用
1、 upstream name { ... } 定义后端服务器组,会引入一个新的上下文  默认调度算法是wrr
Context: http
upstream httpdsrvs {
server ...
server...
...
}

2、 server address [parameters];
在upstream上下文中server成员,以及相关的参数; Context:upstream
address的表示格式:
unix:/PATH/TO/SOME_SOCK_FILE
IP[:PORT]
HOSTNAME[:PORT]
parameters:
weight=number 权重,默认为1
max_conns 连接后端报务器最大并发活动连接数, 1.11.5后支持
max_fails=number 失败尝试最大次数;超出此处指定的次数时, server将被标记为不可用,默认为1
fail_timeout=time 后端服务器标记为不可用状态的连接超时时长,默认10s
backup 将服务器标记为“备用”,即所有服务器均不可用时才启用
down 标记为“不可用”,配合ip_hash使用,实现灰度发布    打补丁,修复加载

3、 ip_hash 源地址hash调度方法    来自一个客户端的请求会一直调度过去

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   全部包括参数  ,适合配合缓存vanish
hash $remote_addr;      客户端hash
6、 keepalive 连接数N;
为每个worker进程保留的空闲的长连接数量,可节约nginx端口,并减少连接管理的消耗

 7、 health_check [parameters];
健康状态检测机制;只能用于location上下文常用参数:
interval=time检测的频率,默认为5秒
fails=number:判定服务器不可用的失败检测次数;默认为1次
passes=number:判定服务器可用的失败检测次数;默认为1次
uri=uri:做健康状态检测测试的目标uri;默认为/
match=NAME:健康状态检测的结果评估调用此处指定的match配置块
注意:仅对nginx plus有效

 8 match name { ... }
对backend server做健康状态检测时,定义其结果判断机制;只能用于http上下文
常用的参数:
status code[ code ...]: 期望的响应状态码
header HEADER[operator value]:期望存在响应首部,也可对期望的响应首部的值基于比较操作符和值进行比较
body:期望响应报文的主体部分应该有的内容
注意:仅对nginx plus有效
106后端机器
cat /var/www/html/index.html
welcome to centos 6  106
108后端机器
 cat /var/www/html/index.html
centos 7  108

107代理机器
vim /etc/nginx.conf     
一组服务器
后端两个服务器   端口号  权重
定义后端服务器组,会引入一个新的上下文健康状态检查 默认调度算法是wrr
vim /etc/nginx/vhosts.conf 谁的请求调度,端口,网站 ,调度协议名称
加载服务 nginx -s reload
106机器http停止服务,107代理机器会默认调度到108机器上面,
108机器宕机了服务就502访问失败,107代理机器也可以当server
vim /etc/lnginx/nginx.conf       backup 将服务器标记为“备用”,即所有服务器均不可用时才启用
重启服务nginx -s reload
curl 127.0.0.1   正常来说是可以的,

也可以新建一个地址,域名,端口号
vim /etc/nginx/vhosts.conf
curl 127.0.0.1     
换过端口后访问转发到107代理机器上面,108再开启服务,系统就主动的转发到后端108机器上面
hash $request_uri consistent; 目标请求做hash 全部包括参数 ,适合配合缓存vanish

四、ngx_stream_core_module

nginx的其它的二次发行版:
Tengine:由淘宝网发起的Web服务器项目。它在Nginx的基础上,针对大访问量网站的需求,添加了很多高级功能和特性。
Tengine的性能和稳定性已经在大型的网站如淘宝网,天猫商城等得到了很好的检验。它的最终目标是打造一个高效、稳定、
安全、易用的Web平台。从2011年12月开始, Tengine成为一个开源项目,官网 http://tengine.taobao.org/
OpenResty:基于 Nginx 与 Lua 语言的高性能 Web平台
模拟反代基于tcp或udp的服务连接,即工作于传输层的反代或调度器
1、 stream { ... }
定义stream相关的服务; Context:main
stream {
upstream telnetsrvs {
server 192.168.22.2:23;
server 192.168.22.3:23;
least_conn;
}
server {listen 10.1.0.6:23;
proxy_pass telnetsrvs;
}
}

2、 listen

listen address:port [ssl] [udp] [proxy_protocol]
[backlog=number] [bind] [ipv6only=on|off] [reuseport]
[so_keepalive=on|off|[keepidle]:[keepintvl]:[keepcnt]];
ngx_stream_proxy_module模块
ngx_stream_proxy_module模块   可实现代理基于TCP, UDP (1.9.13), UNIX-domain sockets的数据流
1 proxy_pass address;指定后端服务器地址
2 proxy_timeout timeout;无数据传输时,保持连接状态的超时时长默认为10m
3 proxy_connect_timeout time;设置nginx与被代理的服务器尝试建立连接的超时时长默认为60s
示例
stream {
upstream telnetsrvs {
server 192.168.10.130:23;
server 192.168.10.131:23;
hash $remote_addr consistent;    
根据客户端地址进行hash值调度,只要客户端来自一个地址就一直调度过去,tcp,udp协议也可以往一个上面调度
}
server {
listen 172.16.100.10:2323;
proxy_pass telnetsrvs;
proxy_timeout 60s;
proxy_connect_timeout 10s;
}
}
测试转发调度mysql服务器
后端机器106    安装mysql   版本5.1
后端机器108    安装mysql    版本5.5
代理机器107 
106后端机器创建数据库
108后端机器创建数据库
107代理机器
后端数据库组名 mysqlsrvs
指定监听前段互联网信息端口
反向代理调度到mysqlsrvs
客户端机器测试调度过去的数据库
106后端服务器的mysql被调度
108后端服务器的MySQL被调度
完成OK

推荐阅读更多精彩内容