Nginx

Nginx ssi 與 proxy_cache 在第一次請求後掛起

  • March 23, 2013

我正在為我們的動態頁面使用 Nginx 的代理記憶體,並且最近集成了 ssi。第一個頁面載入工作正常,但是一旦頁面被記憶體並且另一個請求來自頁面就會掛起。

日誌似乎表明正在發出多個子請求(只有一個指令,並且在佈局中),我不確定為什麼會發生這種情況。頁面在第一次載入時載入良好,記憶體版本旋轉它的輪子並崩潰。這是我的配置。

proxy_cache_path  /var/cache/nginx levels=1:2 keys_zone=one:8m max_size=500m inactive=60m; #caching
proxy_temp_path /var/tmp; #caching

gzip_comp_level 6;
gzip_vary on;
gzip_min_length  1000;
gzip_proxied any;
gzip_types text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript;
gzip_buffers 16 8k;

upstream staging {
 server 127.0.0.1:1337;
}

server {
 listen 0.0.0.0:80;
 server_name dev.example.com;
 access_log /var/log/nginx/dev.example.log;
 error_log  /var/log/nginx/dev.example.error.log debug;   log_subrequest on;

 location ~ ^/(images/|scripts/|styles/|robots.txt|humans.txt|favicon.ico) { #caching
   root /home/example/app/website/public;
   access_log off;
   expires modified +1h;
 }

 location / {
   ssi on;

   proxy_redirect off;
   proxy_set_header X-Real-IP $remote_addr;
   proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
   proxy_set_header Host $http_host;
   proxy_set_header X-NginX-Proxy true;

   proxy_cache one; #caching
   proxy_cache_key sfs$request_uri$scheme; #caching

   proxy_http_version 1.1;
   proxy_pass http://staging/; #points to the upstream staging
 }
}

這是佈局中的指令

<!--# include virtual="/ssi/dynamic-content" -->
  • 編輯 -

我剛剛注意到頁面佈局似乎也多次渲染。ssi 請求除了 div 之外沒有返回任何標記,我不確定為什麼整個佈局會被插入多次。

– 編輯 2 –

我不知道為什麼會這樣,但我能夠通過將 ssi 請求移到 location / {} 塊之外並進入它們自己的請求來解決這個問題,從而跳過記憶體設置並直接進入伺服器。我的配置現在看起來像這樣。

proxy_cache_path  /var/cache/nginx levels=1:2 keys_zone=one:8m max_size=500m inactive=60m; #caching
proxy_temp_path /var/tmp; #caching

gzip_comp_level 6;
gzip_vary on;
gzip_min_length  1000;
gzip_proxied any;
gzip_types text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript;
gzip_buffers 16 8k;

upstream staging {
 server 127.0.0.1:1337;
}

server {
 listen 0.0.0.0:80;
 server_name dev.example.com;
 access_log /var/log/nginx/dev.example.log;
 error_log  /var/log/nginx/dev.example.error.log debug;   log_subrequest on;

 location ~ ^/(images/|scripts/|styles/|robots.txt|humans.txt|favicon.ico) { #caching
   root /home/example/app/website/public;
   access_log off;
   expires modified +1h;
 }

 #New proxy block specifically for ssi routes
 location /ssi {
   proxy_pass http://staging;
 }

 location / {
   ssi on;

   proxy_redirect off;
   proxy_set_header X-Real-IP $remote_addr;
   proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
   proxy_set_header Host $http_host;
   proxy_set_header X-NginX-Proxy true;

   proxy_cache one; #caching
   proxy_cache_key sfs$request_uri$scheme; #caching

   proxy_http_version 1.1;
   proxy_pass http://staging/; #points to the upstream staging
 }
}

經過更多調查後,問題似乎是該頁面確實將自身反复插入到 ssi 包含中。幾乎就像包含包含整個頁面一樣,該頁面也有一個包含,並繼續遞歸地包含新標記。

我認為通過將 ssi 請求移到記憶體塊設置之外,這種情況得到了緩解,但我不完全確定原因。

我發現了答案。

在之前的配置中,我為$request_uri. 這意味著 nginx 將根據傳入的請求歸檔和獲取記憶體。伺服器端包含發出另一個請求,但由於記憶體是基於傳入的 uri,它最終會獲取首頁本身,從而重複插入自身。

通過使用$uri而不是$request_uringinx 將尊重重寫和 ssi 請求,從而通過適當的命名空間進行記憶體和獲取(在這種情況下,應用程序定義的 ssi 路由)。

這是有關 nginx 變數的更多資訊

引用自:https://serverfault.com/questions/484283