Nginx

Nginx + 乘客:記憶體 404 url

  • April 17, 2019

語境

我有一個帶有 nginx 伺服器和乘客的 Rails 應用程序。

應用程序根據請求 url 動態生成頁面:如果 url 存在於數據庫中,則應用程序呈現相應的頁面。或者,如果數據庫中不存在 url,則應用程序會呈現 404 頁面。

問題

許多爬蟲試圖找到漏洞並請求大量 url(.git、admin/config.php、wp-login.php 等…)

這些請求中的每一個都到達 Rails 應用程序,該應用程序在數據庫中生成命中。

解決方案

我正在尋找一種方法來做到這一點:

  1. 如果請求第一次“不存在”的 url,它會通過 Rails 應用程序,該應用程序以 404 響應
  2. nginx 記憶體並記住這個 url
  3. 下次請求相同的 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 重新啟動過程中。

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