一圆米、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發(fā)展改進而來的。傳統(tǒng)CGI接口方式的主要缺點是性能很差刃鳄,因為每次HTTP服務器遇到動態(tài)程序時都需要
重新啟動腳本解析器來執(zhí)行解析盅弛,然后結果被返回給HTTP服務器。這在處理高并發(fā)訪問時叔锐,幾乎是不可用的挪鹏。另外傳統(tǒng)的
CGI接口方式安全性也很差,現(xiàn)在已經(jīng)很少被使用了愉烙。
FastCGI接口方式采用C/S結構讨盒,可以將HTTP服務器和腳本解析服務器分開,同時在腳本解析服務器上啟動一個或者多個腳
本解析守護進程步责。當HTTP服務器每次遇到動態(tài)程序時返顺,可以將其直接交付給FastCGI進程來執(zhí)行禀苦,然后將得到的結果返回
給瀏覽器。這種方式可以讓HTTP服務器專一地處理靜態(tài)請求或者將動態(tài)腳本服務器的結果返回給客戶端创南,這在很大程度上
提高了整個應用系統(tǒng)的性能伦忠。
Nginx不支持對外部程序的直接調(diào)用或者解析省核,所有的外部程序(包括PHP)必須通過FastCGI接口來調(diào)用稿辙。FastCGI接口在
Linux下是socket,(這個socket可以是文件socket气忠,也可以是ip socket)邻储。為了調(diào)用CGI程序,還需要一個FastCGI的wrapper
(wrapper可以理解為用于啟動另一個程序的程序)旧噪,這個wrapper綁定在某個固定socket上吨娜,如端口或者文件socket。當Nginx
將CGI請求發(fā)送給這個socket的時候淘钟,通過FastCGI接口宦赠,wrapper接納到請求,然后派生出一個新的線程米母,這個線程調(diào)用解釋
器或者外部程序處理腳本并讀取返回數(shù)據(jù)勾扭;接著,wrapper再將返回的數(shù)據(jù)通過FastCGI接口铁瞒,沿著固定的socket傳遞給Nginx
妙色;最后,Nginx將返回的數(shù)據(jù)發(fā)送給客戶端慧耍,這就是Nginx+FastCGI的整個運作過程身辨。
ngx_http_fastcgi_module模塊
轉(zhuǎn)發(fā)請求到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服務器的參數(shù)值泌豆,可以是文本怪瓶,變量或組合
示例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; 參數(shù)數(shù)組
…
}
示例2:
通過/pm_status和/ping來獲取fpm server狀態(tài)信息
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 緩存位置為磁盤上的文件系統(tǒng)
max_size=size 磁盤path路徑中用于緩存數(shù)據(jù)的緩存空間上限
levels=levels:緩存目錄的層級數(shù)量洗贰,以及每一級的目錄數(shù)量
levels=ONE:TWO:THREE
#示例: leves=1:2:2
keys_zone=name:size k/v映射的內(nèi)存空間的名稱及大小
inactive=time 非活動時長
5、 fastcgi_cache zone | off; 調(diào)用指定的緩存空間來緩存數(shù)據(jù)可用位置: 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定義的非活動時間內(nèi)至少要被訪問到此處所指定的次數(shù)方可被認作活動項
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;
...
}
}
啟用代理功能轉(zhuǎn)發(fā)到fastcgi上面庶艾,安裝fastcgi服務器袁余,fastcgi可以用apache代替,在106安裝fastcgi
106機器
yum install php-fpm
修改php-fpm配置文件
vim /etc/php-fpm.d/www.conf 刪除監(jiān)聽地址咱揍,留端口颖榜,允許遠程ip連接
注釋掉遠程連接;listen.allowed_clients = any
狀態(tài)頁煤裙,測試ping掩完,發(fā)消息pong
php-fpm是獨立進程,自定義存放路徑硼砰,創(chuàng)建目錄app/php(使其與反向代理服務器
fastcgi_param SCRIPT_FILENAME /app/php/$fastcgi_script_name對應) 并在此目錄中存放動態(tài)資源
mkdir /app/php
cd /app/php/
vim index.html
107機器
收到請求后需要通過代理功能轉(zhuǎn)發(fā)到后端的fastcgi服務器上面由9000端口處理且蓬,把頁面返回傳至客戶端
vim /etc/nginx/vhost.conf
location ~ \.php$ 哪種格式的轉(zhuǎn)發(fā)
fastcgi_pass address; address 轉(zhuǎn)發(fā)后端的fastcgi server的地址和端口
fastcgi_index name; fastcgi默認的主頁資源
fastcgi_param SCRIPT_FILENAME 用戶發(fā)請求腳本名稱是放在后端fastcgi哪個路徑上面后面跟上URL
107創(chuàng)建頁面文件
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頁面檢測服務狀態(tài)
做相應的控制location符合status|ping路徑時候,轉(zhuǎn)發(fā)到后端fastcgi做處理,需要用到路徑
狀態(tài)信息可以調(diào)整格式题翰,status?full,status?xml,status?json
www連接chi
連接狀態(tài)
開始時間
連接數(shù)
進程數(shù)
還可以ping下恶阴,會出現(xiàn)pong說明還在
可以切換格式顯示
可以觀察后端fastcgi的狀態(tài)
108數(shù)據(jù)庫
yum install mariadb-server
創(chuàng)建賬號授權用戶
106機器php
yum install php-mysql
vim /app/php/index.php 連接數(shù)據(jù)庫代碼 后端是mariadb,兩種格式都可以
使用mysql擴展連接數(shù)據(jù)庫的測試代碼
<?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 "連接數(shù)據(jù)庫失敗!";
$mysqli=null;
exit;
}
echo "連接數(shù)據(jù)庫成功!";
$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 動態(tài)頁面也是在這個位置
vim /etc/nginx/vhost.conf調(diào)用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 { ... } 定義后端服務器組桅咆,會引入一個新的上下文 默認調(diào)度算法是wrr
Context: http
upstream httpdsrvs {
server ...
server...
...
}
2、 server address [parameters];
在upstream上下文中server成員坞笙,以及相關的參數(shù)岩饼; Context:upstream
address的表示格式:
unix:/PATH/TO/SOME_SOCK_FILE
IP[:PORT]
HOSTNAME[:PORT]
parameters:
weight=number 權重,默認為1
max_conns 連接后端報務器最大并發(fā)活動連接數(shù)薛夜, 1.11.5后支持
max_fails=number 失敗嘗試最大次數(shù)籍茧;超出此處指定的次數(shù)時, server將被標記為不可用,默認為1
fail_timeout=time 后端服務器標記為不可用狀態(tài)的連接超時時長梯澜,默認10s
backup 將服務器標記為“備用”寞冯,即所有服務器均不可用時才啟用
down 標記為“不可用”,配合ip_hash使用晚伙,實現(xiàn)灰度發(fā)布 打補丁吮龄,修復加載
3、 ip_hash 源地址hash調(diào)度方法 來自一個客戶端的請求會一直調(diào)度過去
4咆疗、 least_conn 最少連接調(diào)度算法漓帚,當server擁有不同的權重時其為wlc,當所有后端主機連接數(shù)相同時午磁,
則使用wrr尝抖,適用于長連接
5毡们、 hash key [consistent] 基于指定的key的hash表來實現(xiàn)對請求的調(diào)度,此處的key可以直接文本昧辽、變量或二者組合
作用:將請求分類衙熔,同一類請求將發(fā)往同一個upstream
server,使用consistent參數(shù)搅荞, 將使用ketama一致性hash算法红氯,適用于后端是Cache服務器(如varnish)時使用
hash $request_uri consistent; 目標請求做hash 全部包括參數(shù) ,適合配合緩存vanish
hash $remote_addr; 客戶端hash
6取具、 keepalive 連接數(shù)N;
為每個worker進程保留的空閑的長連接數(shù)量,可節(jié)約nginx端口脖隶,并減少連接管理的消耗
7扁耐、 health_check [parameters];
健康狀態(tài)檢測機制暇检;只能用于location上下文常用參數(shù):
interval=time檢測的頻率,默認為5秒
fails=number:判定服務器不可用的失敗檢測次數(shù)婉称;默認為1次
passes=number:判定服務器可用的失敗檢測次數(shù)块仆;默認為1次
uri=uri:做健康狀態(tài)檢測測試的目標uri;默認為/
match=NAME:健康狀態(tài)檢測的結果評估調(diào)用此處指定的match配置塊
注意:僅對nginx plus有效
8 match name { ... }
對backend server做健康狀態(tài)檢測時王暗,定義其結果判斷機制悔据;只能用于http上下文
常用的參數(shù):
status code[ code ...]: 期望的響應狀態(tài)碼
header HEADER[operator value]:期望存在響應首部,也可對期望的響應首部的值基于比較操作符和值進行比較
body:期望響應報文的主體部分應該有的內(nèi)容
注意:僅對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
一組服務器
后端兩個服務器 端口號 權重
定義后端服務器組俗壹,會引入一個新的上下文健康狀態(tài)檢查 默認調(diào)度算法是wrr
vim /etc/nginx/vhosts.conf 誰的請求調(diào)度科汗,端口,網(wǎng)站 绷雏,調(diào)度協(xié)議名稱
加載服務 nginx -s reload
106機器http停止服務头滔,107代理機器會默認調(diào)度到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
換過端口后訪問轉(zhuǎn)發(fā)到107代理機器上面早歇,108再開啟服務,系統(tǒng)就主動的轉(zhuǎn)發(fā)到后端108機器上面
hash $request_uri consistent; 目標請求做hash 全部包括參數(shù) 讨勤,適合配合緩存vanish
四箭跳、ngx_stream_core_module
nginx的其它的二次發(fā)行版:
Tengine:由淘寶網(wǎng)發(fā)起的Web服務器項目。它在Nginx的基礎上潭千,針對大訪問量網(wǎng)站的需求谱姓,添加了很多高級功能和特性。
Tengine的性能和穩(wěn)定性已經(jīng)在大型的網(wǎng)站如淘寶網(wǎng)脊岳,天貓商城等得到了很好的檢驗逝段。它的最終目標是打造一個高效垛玻、穩(wěn)定、
安全奶躯、易用的Web平臺帚桩。從2011年12月開始, Tengine成為一個開源項目嘹黔,官網(wǎng) http://tengine.taobao.org/
OpenResty:基于 Nginx 與 Lua 語言的高性能 Web平臺
模擬反代基于tcp或udp的服務連接账嚎,即工作于傳輸層的反代或調(diào)度器
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模塊 可實現(xiàn)代理基于TCP, UDP (1.9.13), UNIX-domain sockets的數(shù)據(jù)流
1 proxy_pass address;指定后端服務器地址
2 proxy_timeout timeout;無數(shù)據(jù)傳輸時喂江,保持連接狀態(tài)的超時時長默認為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;
根據(jù)客戶端地址進行hash值調(diào)度召锈,只要客戶端來自一個地址就一直調(diào)度過去,tcp,udp協(xié)議也可以往一個上面調(diào)度
}
server {
listen 172.16.100.10:2323;
proxy_pass telnetsrvs;
proxy_timeout 60s;
proxy_connect_timeout 10s;
}
}
測試轉(zhuǎn)發(fā)調(diào)度mysql服務器
后端機器106 安裝mysql 版本5.1
后端機器108 安裝mysql 版本5.5
代理機器107
106后端機器創(chuàng)建數(shù)據(jù)庫
108后端機器創(chuàng)建數(shù)據(jù)庫
107代理機器
后端數(shù)據(jù)庫組名 mysqlsrvs
指定監(jiān)聽前段互聯(lián)網(wǎng)信息端口
反向代理調(diào)度到mysqlsrvs
客戶端機器測試調(diào)度過去的數(shù)據(jù)庫
106后端服務器的mysql被調(diào)度