ngx_http_proxy_module只能反向代理後端使用HTTP協議的主機。而ngx_http_fastcgi_module只能反向代理後端使用FPM或者使用FastCGI協議的客戶端。php
1、部署LNMPhtml
一、首先安裝必要的包mysql
[root@ELK-chaofeng07 nginx]# yum install php-fpm php-mcrypt php-mbstring php-mysql mariadb-server
Loaded plugins: fastestmirror
二、接下來咱們還要修改php-fpm的配置文件linux
主要是修改如下幾處nginx
1)監聽端口web
; Note: This value is mandatory. listen = 127.0.0.1:9000
此處表示監聽在哪一個ip的9000端口,我這裏只是用在本地,而且是隻有一個主機安裝LNMP,因此我就監聽在本地。通常上來講這個修改成IP地址比較好。算法
2)容許哪些客戶端訪問sql
; Default Value: any listen.allowed_clients = 127.0.0.1
個人是本地安裝LNMP,所以這個值就能夠知足要求apache
3)修改訪問用戶後端
; RPM: apache Choosed to be able to access some dir as httpd user = nginx ; RPM: Keep a group allowed to write in log dir. group = nginx
4)接下來是一些調優參數
; Note: This value is mandatory. pm.max_children = 150
; Default Value: 0 pm.max_requests = 500
須要調優的比較多,能夠視狀況而定
5)打開php的狀態獲取功能
; Default Value: not set pm.status_path = /status
6)開啓php-fpm的狀態檢測功能
ping.path = /ping ; This directive may be used to customize the response of a ping request. The ; response is formatted as text/plain with a 200 response code. ; Default Value: pong ping.response = pong
7)會話保存的地址
; Set session path to a directory owned by process user php_value[session.save_handler] = files php_value[session.save_path] = /var/lib/php/session
此地址須要手動建立,並賦予權限
三、手動建立會話保存路徑。確保以文件的形式保存
[root@ELK-chaofeng07 php-fpm.d]# mkdir /var/lib/php/session -pv [root@ELK-chaofeng07 php-fpm.d]# chown nginx:nginx /var/lib/php/session
賦予的用戶以及用戶組是咱們剛剛上面修改的那兩個
四、重啓php-fpm服務
五、編寫nginx的配置文件。
server{ listen 80; server_name www.lnmp.io; index index.php index.html; location / { root /data/nginx/html; } location ~* \.php$ { fastcgi_pass 127.0.0.1:9000; fastcgi_index index.php; include fastcgi_params; fastcgi_param SCRIPT_FILENAME /data/nginx_php/$fastcgi_script_name; } }
include的目的是主要加載fastcgi_params這個文件內容。它是在/etc/nginx目錄下存放的。咱們使用nginx向php-fpm轉發請求時,與咱們平時的http代理是不相同的。從語法上就不同。這與LAMP中的php-fpm的調用寫法也是不一樣的。
咱們最後一行的fastcgi_param的內容也是重寫fastcgi_params這個文件內容中的一個參數,是SCRIPT_FILENAME參數。由於咱們路徑須要從新映射,這裏的php-fpm的路徑映射與nginx的路徑映射方法是不同的。此處須要注意一下。
詳細如文章最後所示。
六、接下來是咱們編寫文件中路徑以及index.html和index.php文件。
[root@ELK-chaofeng07 nginx]# cat /data/nginx/html/index.html <h1>This is the html</h1> [root@ELK-chaofeng07 nginx]# cat /data/nginx_php/index.php <html> <head> <title>PHP </title> </head> <body> <?php echo '<p>Hello World</p>'; ?> </body> </html>
七、重載nginx服務,咱們來測試一下看看效果。
訪問index.html
訪問php文件
能夠看看調用狀況:
這說明nginx在處理php網頁的時候調用php-fpm來處理請求。
二、LNMP的原理:
第一步,瀏覽器發送http request請求到服務器(Nginx),服務器響應並處理web請求,將一些靜態資源(CSS,圖片,視頻等)保存服務器上。 第二步,將php腳本經過接口傳輸協議(網關協議)PHP-FCGI(fast-cgi)傳輸給PHP-FPM(進程管理程序),PHP-FPM不作處理,而後PHP-FPM調用PHP解析器進程,PHP解析器解析php腳本信息。PHP解析器進程能夠啓動多個,進行併發執行。 第三步,將解析後的腳本返回到PHP-FPM,PHP-FPM再經過fast-cgi的形式將腳本信息傳送給Nginx。 第四步,服務器再經過Http response的形式傳送給瀏覽器。瀏覽器再進行解析與渲染而後進行呈現。
nginx配置文件補充說明,背會:
ngx_http_fastcgi_module模塊: The ngx_http_fastcgi_module module allows passing requests to a FastCGI server. 1、fastcgi_pass address; address爲fastcgi server的地址; location, if in location; http://www.ilinux.io/admin/index.php --> /admin/index.php (uri) /data/application/admin/index.php 2、fastcgi_index name; fastcgi默認的主頁資源; 3、fastcgi_param parameter value [if_not_empty]; Sets a parameter that should be passed to the FastCGI server. The value can contain text, variables, and their combination. 配置示例1: 前提:配置好fpm server和mariadb-server服務; location ~* \.php$ { root /usr/share/nginx/html; fastcgi_pass 127.0.0.1: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 127.0.0.1:9000; fastcgi_param SCRIPT_FILENAME $fastcgi_script_name; }
這個例子就和我這篇博客:https://www.cnblogs.com/FengGeBlog/p/10539898.html 講都是相似的緣由。這個例子中咱們請求pm_status時,默認不會去匹配php後綴名的那個主機上找「location ~* \.php$」,是由於location中的uri不一致,因此沒法匹配。那這個時候就須要一種處理方法,當訪問的uri是pm_status的時候,咱們也要去「location ~* \.php$」的主機上去尋找,這時候就須要從新定義location了或者重寫rewrite規則來實現。
三、重點講解:ngx_http_fastcgimodule模塊中的fastcgi_cache功能
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所指定路徑來定義; levels=levels:緩存目錄的層級數量,以及每一級的目錄數量;levels=ONE:TWO:THREE leves=1:2:2 keys_zone=name:size k/v映射的內存空間的名稱及大小 inactive=time 非活動時長 max_size=size 磁盤上用於緩存數據的緩存空間上限 5、fastcgi_cache zone | off; 調用指定的緩存空間來緩存數據;http, server, location 6、fastcgi_cache_key string; 定義用做緩存項的key的字符串; 7、fastcgi_cache_methods GET | HEAD | POST ...; 爲哪些請求方法使用緩存; 8、fastcgi_cache_min_uses number; 緩存空間中的緩存項在inactive定義的非活動時間內至少要被訪問到此處所指定的次數方可被認做活動項; 9、fastcgi_cache_valid [code ...] time; 不一樣的響應碼各自的緩存時長; 示例: http { ... fastcgi_cache_path /var/cache/nginx/fastcgi_cache levels=1:2:1 keys_zone=fcgi:20m inactive=120s; ... server { ... location ~* \.php$ { ... fastcgi_cache fcgi; fastcgi_cache_key $request_uri; fastcgi_cache_valid 200 302 10m; fastcgi_cache_valid 301 1h; fastcgi_cache_valid any 1m; ... } ... } ... }
要記住上面紅色字體的內容。
四、開啓fastcgi協議的保持長鏈接功能:
10、fastcgi_keep_conn on | off; By default, a FastCGI server will close a connection right after sending the response. However, when this directive is set to the value on, nginx will instruct a FastCGI server to keep connections open.
案例演示:
在反向代理的服務器上進行以下配置:
五、對上述的知識作一個綜合實例:
server { listen 80; server_name www.chaofeng.io; index index.php index.html; location / { root /data/nginx/html; proxy_pass http://10.10.10.12:80; } location ~* \.php$ { fastcgi_pass 192.168.22.23:9000; #指定fastcgi服務器 fastcgi_index index.php; #指定默認的fastcgi主頁 include fastcgi_params; #調用nginx的變量定義 fastcgi_param SCRIPT_FILENAME /data/apps/$fastcgi_script_name; #指定fastcgi服務器上的php目錄 fastcgi_cache fcache; #調用fache緩存空間 fastcgi_cache_key $request_uri; #設置緩存的key爲$request_uri fastcgi_cache_valid 200 302 10m; #狀態碼爲200和302的頁面緩存10分鐘 fastcgi_cache_valid 301 1h; #狀態碼爲301的頁面緩存1小時 fastcgi_cache_valid any 1m; #剩下的都緩存1分鐘 fastcgi_keep_conn on; #開啓長鏈接 } location ~* ^/(status|ping)$ { fastcgi_pass 10.10.10.11:9000; include fastcgi_params; fastcgi_param SCRIPT_FILENAME /data/apps/$fastcgi_script_name; } }
六、 nginx的負載均衡配置講解
此模塊用於定義可以被proxy_pass, fastcgi_pass, uwsgi_pass, scgi_pass和memcached_pass配置段所引用的服務器組。
一、upstream name { ... }
配置段:http
此指令爲一個上下文配置段,用於定義能後端服務器組,此服務器組可以被proxy_pass, fastcgi_pass, uwsgi_pass, scgi_pass和memcached_pass所調用。
示例:
upstream httpdsrvs { server 10.10.10.11:80; server 10.10.10.12:80; ... }
upstream模塊調度算法通常分爲兩類「
第一類:靜態調度算法
分配的時候,不須要考慮後端服務器節點的狀況(rr,wrr,ip_hash算法)
第二類:動態調度算法
負載均衡器根據後端服務器的節點狀態來進行調度
二、server address [parameters];
配置段: upstream
此指定用於在上下文中定義後端服務器成員以及相關的參數。
其中address的表示格式爲可以使用下列三種格式:
unix:/PATH/TO/SOME_SOCK_FILE
IP[:PORT]
HOSTNAME[:PORT]
parameters的配置內容以下所示:
weight=number 權重,默認爲1; max_fails=number 失敗嘗試最大次數;超出此處指定的次數時,server將被標記爲不可用,默認爲1; fail_timeout=time 設置將服務器標記爲不可用狀態的超時時長; max_conns=number 當前的服務器的最大併發鏈接數; backup 將服務器標記爲「備用」,即全部服務器均不可用時此服務器才啓用; down 標記爲「不可用」;
二、rr輪詢(默認調度算法)
rr輪詢調度算法是按照客戶端請求順序把客戶端的請求逐一分配到不一樣後端節點服務器
三、wrr權重輪詢
在rr輪詢算法的基礎上加上權重,權重值越大,被轉發的請求就越多,能夠根據服務器狀態進行指定權重大小
四、ip_hash;
配置段: upstream
在指定的服務器組中使用源地址hash調度方法;來自同一個IP地址的請求統一被分配到同一個server響應,至關於lvs的sh調度算法。
五、least_conn;
配置段: upstream
在指定的服務器組中啓動最少鏈接調度算法,請求被髮送到激活鏈接數最少的服務器,當設置了權重時,至關於WLC加權最少鏈接調度算法;默認nginx負載均衡的調度算法爲輪詢。
六、hash key [consistent];
配置段:upstream
基於指定的key的hash表來實現對請求的調度,此處的key能夠直接文本、變量或兩者的組合;可以將請求分類,同一類請求將發往同一個後端服務器 。
示例:
hash $request_uri consistent;
hash $remote_addr;
這裏講解一下一致性hash算法
一致性hash算法通常用於代理後端業務爲緩存服務(squid、memocached)的場景,經過將用戶請求的URL或指定字符串進行計算,而後調度到後端服務器上,此後任何用戶查找同一個URL或者指定字符串都會被調度到這一臺服務器上。
七、keepalive connections;
配置段:upstream
設置爲每一個nginx worker進程保留的空閒的長鏈接數量。
upstream http_backend { server 127.0.0.1:8080; keepalive 16; }
注意:對於使用fastcgi代理的後端服務器來講,keepalive要結合fastcgi_keep_conn指令一塊兒使用纔會生效,好比:
upstream fastcgi_backend { server 127.0.0.1:9000; keepalive 8; } server { ... location /fastcgi/ { fastcgi_pass fastcgi_backend; fastcgi_keep_conn on; ... } }
八、總結
upstream模塊的綜合使用
##在/etc/nginx/nginx.conf文件中配置: upstream websrvs { ip_hash; server 10.10.10.11:80 weight=2 down; server 10.10.10.12:80 weight=1 fail_timeout=1 max_fails=3; server 127.0.0.1:80 backup; } #在server配置段: server { listen 80; server_name www.ilinux.io; location / { root /data/nginx/html; proxy_pass http://websrvs; } }