Nginx
Nginx + 乘客:記憶體 404 url
語境
我有一個帶有 nginx 伺服器和乘客的 Rails 應用程序。
應用程序根據請求 url 動態生成頁面:如果 url 存在於數據庫中,則應用程序呈現相應的頁面。或者,如果數據庫中不存在 url,則應用程序會呈現 404 頁面。
問題
許多爬蟲試圖找到漏洞並請求大量 url(.git、admin/config.php、wp-login.php 等…)
這些請求中的每一個都到達 Rails 應用程序,該應用程序在數據庫中生成命中。
解決方案
我正在尋找一種方法來做到這一點:
- 如果請求第一次“不存在”的 url,它會通過 Rails 應用程序,該應用程序以 404 響應
- nginx 記憶體並記住這個 url
- 下次請求相同的 url 時,nginx 直接以 404 狀態響應,而不通過 Rails 應用程序
此外,當 Rails 應用程序重新啟動(通過Passenger)時,應該清除此記憶體。
嘗試
- 我試圖添加
fastcgi_cache_valid 404 10m;
伺服器塊,它不起作用。- 也試過
proxy_cache_valid 404 10m;
你可能猜到我是 nginx 的新手。謝謝你的幫助。
Nginx 配置
server { listen ...; server_name ...; root /path/to/rails/app; error_page 404 /404; error_page 500 502 503 504 /500; # First I tried this, no success so I removed it fastcgi_cache_valid 404 10m; # Then I tried this, no success so I removed it also proxy_cache_valid 404 10m; location / { gzip_static on; etag off; charset utf-8; add_header Cache-Control "max-age=0, private, must-revalidate"; add_header Referrer-Policy strict-origin-when-cross-origin; add_header Strict-Transport-Security "max-age=31536000; includeSubDomains"; add_header X-Content-Type-Options nosniff; add_header X-Frame-Options deny; add_header X-XSS-Protection "1; mode=block"; location = / { try_files /cached/index.html @rails; } location / { try_files /cached$uri.html /cached$uri $uri @rails; } } location @rails { passenger_enabled on; passenger_ruby /path/to/ruby; passenger_app_env production; } }
我最熟悉反向代理環境中的記憶體,所以這就是我要採用的方法。值得慶幸的是,Nginx 能夠相當容易地為自己代理:
# define your cache proxy_cache_path /path/to/cache levels=1:2 keys_zone=cacheName:[metaDataSize] max_size=[maxCacheSize] inactive=60m use_temp_path=off; http { server { # Any TLS, caching, or gzipping on this virtual server listen ...; server_name [Actual Domain]; location / { proxy_pass http://127.0.0.1:80; proxy_set_header Host [domain.passenger]; # Activate and configure caching here proxy_cache cacheName; proxy_cache_valid 404 10m; ...any other proxy settings you want. # Forward original request info proxy_set_header X-Original-Host $http_host; proxy_set_header X-Original-Scheme $scheme; proxy_set_header X-Forwarded-For $remote_addr; # Gzip if you want gzip on; gzip_proxied any; ...etc } } server { # Any Rails/Passenger configuration on this virtual server listen 80; server_name [domain.passenger]; # Don't log requests twice access_log off; # Only allow local requests allow 127.0.0.1; deny all; location / { passenger_enabled on; passenger_ruby /path/to/ruby; passenger_app_env production; } } }
清除記憶體只需要 running
rm -rf /path/to/cache/*
,因此您可以以最喜歡的方式將其編寫到 Rails 重新啟動過程中。