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
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,670评论 5 460
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,928评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,926评论 0 320
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,238评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,112评论 4 356
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,138评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,545评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,232评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,496评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,596评论 2 310
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,369评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,226评论 3 313
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,600评论 3 299
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,906评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,185评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,516评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,721评论 2 335

推荐阅读更多精彩内容

  • 第一章 Nginx简介 Nginx是什么 没有听过Nginx?那么一定听过它的“同行”Apache吧!Ngi...
    JokerW阅读 32,605评论 24 1,002
  • 1.简介:  Nginx:engine X ,2002年,开源,商业版 http协议:web服务器(类似于ht...
    尛尛大尹阅读 1,854评论 0 3
  • I/O模型Nginx介绍Nginx的安装和目录结构Nginx的配置Nginx的编译安装 一、I/O模型 (一)I/...
    哈喽别样阅读 884评论 0 4
  • Nginx简介 解决基于进程模型产生的C10K问题,请求时即使无状态连接如web服务都无法达到并发响应量级一万的现...
    魏镇坪阅读 1,980评论 0 9
  • 《老男孩Linux运维》笔记 隐藏Nginx软件版本号 一般来说,软件的漏洞都和版本有关。因此要尽量隐藏对访问用户...
    Zhang21阅读 3,600评论 0 28