Nginx
Nginx ssi 與 proxy_cache 在第一次請求後掛起
我正在為我們的動態頁面使用 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_uri
nginx 將尊重重寫和 ssi 請求,從而通過適當的命名空間進行記憶體和獲取(在這種情況下,應用程序定義的 ssi 路由)。