Nginx之反向代理配置(二)

  前文咱們聊了Nginx的防盜鏈、反向代理以及開啓nginx代理緩存,回顧請參考http://www.javashuo.com/article/p-cdnpatub-p.html;今天咱們繼續說nginx的反向代理,上一篇主要就說了下nginx反向代理http協議的使用,被代理RUL包含和不包含RUI的處理邏輯;咱們能夠把這種先後端都用一樣的協議理解爲同構代理,就是說前端用戶訪問nginx是http或https協議,代理服務器訪問後端的真正提供服務的服務器也是基於http協議,這種先後端都是使用同一種協議,咱們就說這是同構;同理有同構就有異構,異構就是先後端使用的協議不一樣,好比前端用戶使用http或https協議,代理和後端服務器使用fastcgi協議,這種就叫異構;互聯網上絕大部分網站都不是純html靜態網頁,不少網站都是有本身的應用服務器,好比,咱們用戶訪問的數據是須要一段腳本,或者某一程序執行後的數據,那麼咱們就把後面須要執行腳本的服務器叫應用服務器;nginx做爲web服務器它雖然有不少功能,可是它本身沒有執行某些腳本的能力好比php腳本,通俗的講,nginx只能夠處理靜態文本,不能本身執行php腳本(需藉助其餘應用服務器),它和httpd相似,httpd還能夠動態的加載php模塊,讓其擁有執行php腳本的能力,nginx沒有,爲了實現這樣的功能,nginx就支持經過fastcgi協議向後端代理客戶端請求一個本身不能處理的資源;固然相似的協議還有不少好比,scgi、uwsgi等等;像這種異構的架構上,它的原理是這樣的,客戶端請求某一腳本資源,好比,index.php這個文件,若是咱們不把用戶的請求代理到後端應用服務器上,客戶端看到的數據是index.php裏的腳本內容,這顯然是不合情理的;那怎麼辦呢?一般狀況咱們須要在nginx服務器上配置,用戶訪問某某.php結尾的URL時,咱們就讓它幹嗎幹嗎,經過這種匹配用戶的URL去作代理,把用戶的請求代理到後端服務器,讓後端應用服務器把腳本執行完,而後把執行後的數據返回給代理,再由代理響應給客戶端;若是是後端應用服務器須要某些數據,須要到數據庫裏去拿數據,極可能應用服務器此時還會扮演客戶端角色,經過某種協議去數據庫拿數據;咱們能夠看到最終咱們用戶看到的網頁裏的內容,它來自不少服務器,因此說一個動態網站上由不少臺服務器共同完成一個處理請求的結果,咱們能夠理解成,每一個服務器處理本身擅長的事務,分工合做,最後把處理好的數據由代理響應給客戶端;php

  ngx_http_fastcgi_module:此模塊實現了nginx容許將用戶請求代理至fastcgi 服務器html

    一、fastcgi_pass address:設置fastcgi服務器的地址,此地址能夠是IP加端口的形式,也能夠是域名或者UNIX域套接字路徑;此選項可用於location 和if in location 配置段中前端

  示例nginx

fastcgi_pass localhost:9000

  提示:以上配置意思是,經過fastcgi協議反代本機的9000端口上的服務響應;web

fastcgi_pass Unix:/tmp/fastcgi.socket;

  提示:以上表示設置fastcgi地址是本機/tmp/fastcgi.socket文件;數據庫

  二、fastcgi_index name;設置fastcgi的默認主頁資源名稱;此指令可用於http、server、location配置段中vim

  三、fastcgi_param parameter value [if_not_empty]:設置一個參數,用於傳遞給後端fastcgi服務器,參數的值能夠是文本,變量,或者兩者的組合。後端

  示例瀏覽器

fastcgi_param SCRIPT_FILENAME /home/www/scripts/php$fastcgi_script_name;

  提示:以上配置表示把SCRIPT_FILENAME等於/home/www/scripts/php$fastcgi_script_name傳遞給fastcgi服務器,$fastcgi_script_name表示用戶請求的腳本名稱;意思是告訴fastcgi服務器該把那個腳本執行了返回給客戶端(這裏的客戶端一般指代理服務器)緩存

fastcgi_param QUERY_STRING $query_string;

  提示:咱們知道一個腳本傳遞不一樣的參數,執行的結果就會不一樣;以上配置表示把請求的腳本的參數經過QUERY_STRING變量保存,並傳遞給後端fastcgi服務器,讓其運行某腳本時,把QUERY_STRING保存的值做爲參數傳遞給腳本;固然咱們向後端傳遞的東西不少,不便一一寫出來,也不太可能一一寫到配置文件中,在nginx的配置目錄裏有一個文件,專門存放nginx上的變量對應後端fastcgi服務器上的變量的一個配置文件fastcgi.conf  一般咱們把這個配置文件用include指令來導入到咱們須要定義nginx變量經過fastcgi變量傳遞給fastcgi服務器;

  示例

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;
}

  提示:以上配置表示匹配用戶URI,若是用戶URI是以.php結尾的,就經過fastcgi協議代理至本機的127.0.0.1:9000端口進行處理(執行),fastcgi服務器默認主頁資源名叫index.php,並告訴fastcgi服務器到/usr/share/nginx/html/下去找用戶請求的資源腳本,若是還有其餘參數和指令要傳遞,就使用/etc/nginx/fastcgi_params中的定義來把nginx的變量保存的值傳遞給後端fastcgi服務器,以上是反代動態php網頁的配置示例,有了以上配置 nginx就能夠做爲代理服務器響應客戶端請求動態腳本php的能力了;

[root@www nginx]# vim /etc/nginx/conf.d/proxy.conf 
  


server {

        server_name www.test.com;

        proxy_cache proxy_cache;
#       proxy_cache_key $request_uri;
#       proxy_cache_methods GET HEAD;
        proxy_cache_valid 200 302 15m;
        proxy_cache_valid 404 1m;
#       proxy_cache_use_stale http_500 http_502;
        location  /en/docs/ {
                proxy_pass http://nginx.org;
        }
        location ~* /(.*).php$ {
                root /app/php_scripts;
                fastcgi_pass 127.0.0.1:9000;
                fastcgi_index index.php;
                fastcgi_param SCRIPT_FILENAME /app/php_scripts$fastcgi_script_name;
                include /etc/nginx/fastcgi_params;
        }
}
~                                                                                                                                                                          
~                                                                                                                                                                          
~                                                                                                                                                                          
~                                                                                                                                                                          
~                                                                                                                                                                          
~                                                                                                                                                                          
~                                                                                                                                                                          
~                                                                                                                                                                          
~                                                                                                                                                                          
~                                                                                                                                                                          
~                                                                                                                                                                          
~                                                                                                                                                                          
~                                                                                                                                                                          
~                                                                                                                                                                          
~                                                                                                                                                                          
~                                                                                                                                                                          
~                                                                                                                                                                          
~                                                                                                                                                                          
~                                                                                                                                                                          
~                                                                                                                                                                          
~                                                                                                                                                                          
~                                                                                                                                                                          
~                                                                                                                                                                          
"conf.d/proxy.conf" 23L, 500C written
[root@www nginx]# nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
[root@www nginx]# mkdir /app/php_scripts -p
[root@www nginx]# cat >> /app/php_scripts/test.php 
<?php
        phpinfo();
?>
^C
[root@www nginx]# cat /app/php_scripts/test.php 
<?php
        phpinfo();
?>
[root@www nginx]# nginx -s reload
[root@www nginx]# 

  提示:在上面配置前須要先安裝好php-fpm,安裝好後須要更改/etc/php-fpm.d/www.conf裏的user 和group,一般狀況要看前端代理是用那個用戶啓動的,咱們後端就用那個用戶啓動便可,咱們前端代理商nginx,這裏須要更改爲nginx便可,這樣修改後,保存配置,而後啓動php-fpm,而後在本機就能夠看到127.0.0.1:9000就處於監聽狀態了;以上配置表示用戶請求.php結尾的資源都反代至127.0.01:9000進行處理;而且明確說明了後端fastcgi主頁資源名稱爲index.php,後端應用服務器的根路徑爲/app/php_scripts;fastcgi_param  SCRIPT_FILENAME /app/php_scripts$fastcgi_script_name同nginx裏的root alias指令的做用相同,指定用戶訪問的URI對應磁盤上的路徑,至關於指定後端fastcgi服務器的工做目錄吧;

  提示:能夠看到咱們訪問test.php是可以被php-fpm服務器執行並返回執行後的結果;

  四、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];此指令同proxy_cache_path同樣,做用定義fastcgi的代理緩存;其中levels表示定義緩存目錄的級別,最多3級,每級最多2個字符;keys_zone=name:size表示k/v映射的內存空間的名稱及大小;inactive=time表示非活動時長;max_size=size表示指定磁盤上用於緩存路徑的存放緩存的空間上限;

  五、fastcgi_cache zone |off;調用指定的緩存空間來緩存數據;可用於http,server,location配置段中

  六、fastcgi_cache_key string;定義用做緩存項的key的字符串;

  七、fastcgi_cache_methods GET|HEAD|POST ……;定義那些請求方法使用緩存;默認是GET和HEAD

  八、fastcgi_cache_min_uses number;定義緩存空間中的緩存項在inactive定義的非活動時間內至少要被訪問到此處所指定的次數方可被認爲活動的緩存項,不被清理;

  九、fastcgi_cache_valid[code] tiem;設定不一樣的響應碼各自緩存的時長;

  十、fastcgi_keep_conn on | off;:設置是否保持鏈接,默認狀況下,FastCGI服務器將在發送響應後當即關閉鏈接。可是,當這個指令被設置爲值on時,nginx將指示FastCGI服務器保持鏈接打開。

  示例

   提示:在定義緩存空間時,必需要在http配置段定義,以上表示定義一個fastcgi的緩存空間,其名稱爲php_cache,在內存中使用10m的空間,在物理磁盤上的路徑爲/cache/proxy/php-fpm/目錄下,最大空間爲2g;

   提示:以上配置表示使用fastcgi的緩存空間php_cache,緩存key爲$request_uri,就是把用戶請求的uri hash做爲緩存路由,什麼意思呢,就是nginx查找緩存是經過hash什麼來查找緩存的,上面的配置就是定義nginx把用戶請求的URI做爲hash對象;對用戶請求用的方法是GET 或HEAD方法時,使用緩存;緩存最小命中次數爲3次,也就說在非活動時長內,該緩存項命中次數小於3次就會被認爲該緩存是無效的,在下次檢查緩存的有效性,就會被清理;對響應碼是200 或302的資源緩存15分鐘,對404響應碼的資源緩存1分鐘;開啓和後端的fastcgi服務器的長鏈接;

  提示:能夠看到咱們訪問test.php頁面時,在咱們定義的緩存空間裏生成了緩存,可是咱們訪問了test.php這一個頁面,爲何會緩存三項呢?其實咱們能夠打開瀏覽器的web開發者模式,查看它請求和響應的狀況

   提示:能夠看到咱們訪問test.php這個頁面,其背後是3次請求,因此咱們在緩存空間裏看到有三條緩存項,其實緩存空間裏的緩存項每個緩存項就表明一個緩存資源,咱們是能夠經過cat命令查看緩存項裏的內容的;以下

   提示:咱們能夠看到裏面的緩存項紀錄的信息,其中有一項KEY 就是咱們指定的fastcgi_cache_key 說指定變量的值;咱們查看緩存項裏的內容極可能出現亂碼,緣由是緩存的內容有二進制,或者其餘字符編碼的內容;

  以上就是nginx做爲反向代理服務器代理動態資源的介紹,總結一點,nginx代理動態資源和代理http資源的思想是相似的,只是使用的指令不同;尤爲對於緩存,二者的思想幾乎徹底一致,只是使用的模塊和指令不一樣而已;對於動態資源咱們除了要指定被代理的地址外,還須要指定被代理端資源路徑,導入nginx變量與fastcgi變量對應的配置指令文件;對於緩存,二者沒有什麼區別;

相關文章
相關標籤/搜索