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的預設頁面
}
}
如果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/;
}
}
如果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();
?>
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