天天看點

nginx之反代相關ngx_http_proxy_modulengx_http_fastcgi_module

ngx_http_proxy_module

nginx也提供反代伺服器的功能,跟lvs一樣,隻不過lvs是轉發伺服器,将所有的請求的轉發到後端伺服器上,而nginx是代替用戶端去通路後端伺服器。

同時nginx的反代還具有ldirector的功能,檢測後端伺服器心跳,并自動down掉無法服務的後端主機。

proxy_pass URL

将請求發送到後端的server上。

[[email protected] conf.d]# cat a.com.conf 
server{
	listen 80 default_server;
	server_name www.a.com;
	root /data/a;
	location / {
		proxy_pass http://192.168.192.137:80;
	}


}
#将所有的請求都發送到137主機上

[[email protected] ~]# curl http://www.a.com
192.168.192.137

           

當定義uri時,如果proxy_pass最後的uri不帶

/

的話,那麼location定義的目錄将會附加到

/

上。

示例:

[[email protected] conf.d]# cat a.com.conf 
server{
	listen 80 default_server;
	server_name www.a.com;
	root /data/a;
	location / {
		proxy_pass http://192.168.192.137:80;
	}
	location /images {   
		proxy_pass http://192.168.192.137:80;  #此處最後沒有添加/,那麼location中的/images會自動附加到192.168.192.137:80/images。是以通路images下時會自動跳轉到137的預設頁面
	}


}
           
nginx之反代相關ngx_http_proxy_modulengx_http_fastcgi_module

如果proxy_pass最後添加

/

的話,那麼proxy_pass的uri直接頂替location中的内容。相當于通路後端伺服器的時候,直接通路proxy_pass下的uri。

[[email protected] conf.d]# cat a.com.conf 
server{
	listen 80 default_server;
	server_name www.a.com;
	root /data/a;
	index index.html index.php;
	location / {
		proxy_pass http://192.168.192.137:80;
	}
	location /images {
		proxy_pass http://192.168.192.137:80/picture/;
	}


}

           
nginx之反代相關ngx_http_proxy_modulengx_http_fastcgi_module

如果location使用正規表達式,那麼proxy_pass後面一定不能跟uri。如果proxy_pass後面有uri,将會報錯。必須使用第一種模式,不帶

/

,就是将location中的uri添加到proxy_pass最後邊。

proxy_set_header field value

設定發往後端伺服器的請求封包的請求首部的值

預設情況下,後端伺服器接收到的請求封包中的用戶端ip是nginx伺服器的ip位址,但是這樣就會出現無法統計真正通路的用戶端ip位址。這一選項就可以自定義頭部值

[[email protected] conf.d]# cat a.com.conf 
server{
	listen 80 default_server;
	server_name www.a.com;
	root /data/a;
	index index.html index.php;
	proxy_set_header X-Real-IP $remote_addr;   #将用戶端ip位址命名為X-Real-IP。
	location / {
		proxy_pass http://192.168.192.137:80;
	}
	location /images {
		proxy_pass http://192.168.192.137:80/picture/;
	}

}


apache主機上将logformat進行修改
  LogFormat "%{X-Real-IP}i %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined


重新開機服務之後再次通路
[[email protected] ~]# tail -f /var/log/httpd/access_log
192.168.192.134 - - [16/Apr/2020:21:18:58 +0800] "GET / HTTP/1.0" 200 16 "-" "curl/7.29.0"  # 134為nginx的私網位址。

192.168.199.132 - - [16/Apr/2020:21:20:52 +0800] "GET / HTTP/1.0" 304 - "-" "Mozilla/5.0 (X11; Linux x86_64; rv:60.0) Gecko/20100101 Firefox/60.0"

           

定義與緩存相關

proxy_cache_path

設定緩存的路徑和其他參數,隻能定義http中

文法:

proxy_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 zone | off

預設off,指明調用的緩存,或關閉緩存機制;

proxy_cache_key string

緩存中使用鍵的内容

proxy_cache_valid [code …] time

定義對特定響應碼内容的緩存時長 定義在http中

根據上面指令,在配置檔案中指定:

[[email protected] ~]# cat /etc/nginx/nginx.conf | grep proxy_*
    proxy_cache_path /var/cache/a_cache/proxy_cache   # 存放cache的目錄
		     levels=1:1:1 keys_zone=proxy_cache:20m
		     存放目錄級别    存放的名字以及空間大小
    proxy_cache proxy_cache;   啟動哪個名字的緩存
    proxy_cache_key $request_uri;   針對哪個來定義緩存
    proxy_cache_valid 301 200 302 1h;  
    proxy_cache_valid any 1m;


[[email protected] ~]# ls /var/cache/a_cache/proxy_cache/9/d/7/6666cd76f96956469e7be39d750cc7d9 
/var/cache/a_cache/proxy_cache/9/d/7/6666cd76f96956469e7be39d750cc7d9
通路之後就會将緩存存放在這個目錄中。
           

ngx_http_fastcgi_module

轉發請求到fastcgi伺服器上,不支援php子產品方式

fastcgi_pass address

address為後端的fastcgi server的位址

fastcgi_index name

fastcgi預設的首頁資源

fastcgi_param parameter value [if_not_empty]

設定傳遞給 FastCGI伺服器的參數值,可以是文本,變量或組合。

示例:

[[email protected] conf.d]# cat a.com.conf
server{
	listen 80 default_server;
	server_name www.a.com;
	root /data/a;
	index index.html index.php;
	proxy_set_header X-Real-IP $remote_addr;

	location ~* \.php$ {
		fastcgi_pass 11.2.3.63:9000;
		fastcgi_index index.php;
		fastcgi_param SCRIPT_FILENAME /data/a$fastcgi_script_name;#設定此選項相當于通路/index.php時,通路的目錄是/data/a/index.php
		include fastcgi_params; 
	}	

}


#在php-fpm主機上安裝php-mysql子產品和index.php
[[email protected] ~]# cat /data/a/index.php 
<?php
 $conn = mysqli_connect('11.2.2.228','wpuser','centos');
 if ($conn)
echo "OK";
else
echo "Failure";
 #echo mysql_error();
 mysql_close();
 ?>

           
nginx之反代相關ngx_http_proxy_modulengx_http_fastcgi_module

fastcgi緩存設定

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_pass的緩存沒有什麼大的差別,同樣也隻能定義在http中

fastcgi_cache zone | off

調用指定的緩存空間來緩存資料

fastcgi_cache_key string

定義用作緩存項的字元串

fastcgi_cache_methods GET | HEAD | POST …

為哪些請求方法使用緩存

fastcgi_cache_min_uses number

緩存空間中的緩存項在inactive定義的非活動時間内至少要被通路到此處所指定的次數方可被認作活動項

fastcgi_keep_conn on | off

收到後端伺服器響應後,fastcgi伺服器是否關閉連接配接,建議啟用長連接配接。

fastcgi_cache_valid [code …] time

不同的響應碼各自的緩存時長

示例:

fastcgi_cache_path /var/cache/nginx/fcgi_cache
                       levels=1:2:1 keys_zone=fcgicache:20m 
		       inactive=120s max_size=1g;
    fastcgi_cache fcgicache;
    fastcgi_cache_key $request_uri;
    fastcgi_cache_valid 200 302 10m;
    fastcgi_cache_valid 301 1h;
    fastcgi_cache_valid any 1m;		

# 通路index.php之後,會将請求緩存在/var/cache/nginx下。
[[email protected] ~]# ls /var/cache/nginx/fcgi_cache/1/af/5/e251273eb74a8ee3f661a7af00915af1 
/var/cache/nginx/fcgi_cache/1/af/5/e251273eb74a8ee3f661a7af00915af1

           

繼續閱讀