1

我有一些使用 Mono 和 Nginx 在 linux 机器上运行的 https ASP MVC 2 Web 服务。

如何配置它们与ASP MVC的输出缓存功能一起使用?

using System.Web.Mvc;

namespace MvcApplication1.Controllers
{
[HandleError]
public class HomeController : Controller
{
    [OutputCache(Duration=10)]
    public ActionResult Index()
    {
        return View();
    }

}
}

我想将缓存存储在运行 Web 服务的同一台机器上。

我已经尝试调整我的 nginx 配置以包含 proxy_cache 并重定向到同一台机器上的另一个端口以运行原始请求,使用了这个示例中的大部分代码。但是,我没有运气让它工作。

这是我所拥有的:

proxy_cache_path /usr/local/nginx/proxy_temp/ levels=1:2 keys_zone=cache:10m inactive=10m max_size=250M;
proxy_temp_path /usr/local/nginx/proxy_temp/tmp;

server
{
   listen   443 ssl;
   server_name myserver.com;

   ssl_certificate /home/ubuntu/ssl/nginx_https.pem;
   ssl_certificate_key /home/ubuntu/ssl/nginx_https.key;


    location /
    {
                    proxy_set_header  X-Real-IP        $remote_addr;
                    proxy_set_header  Host             $http_host;
                    proxy_pass https://127.0.0.1:4430;
                    proxy_cache cache;
                    proxy_cache_valid 200 302 60m;
                    proxy_cache_valid 404 1m;

    }
}


server
{
   listen   4430 ssl;

   root          /var/www/mywebpage/;

   ssl_certificate /home/user/ssl/https.pem;
   ssl_certificate_key /home/user/ssl/https.key;

    location /
    {
            index index.html index.htm default.aspx Default.aspx;
            fastcgi_pass 127.0.0.1:9000;
            include /etc/nginx/fastcgi_params;
    }
}

如果我添加该行:

proxy_ignore_headers Cache-Control; 

然后缓存工作,但是它开始缓存所有内容,我只希望它缓存在我的 MVC 应用程序中标记有 OutputCache 属性的方法,尽管我不确定如何正确配置 Nginx 缓存来处理它。

将 Nginx 缓存系统与在 Mono 上运行的 ASP MVC 应用程序的输出缓存属性耦合的正确方法是什么?

4

1 回答 1

2

Nginx 缓存和 ASP.NET 缓存是两个完全不同的东西。如果您[OutputCache]在 ASP.NET 项目中使用,Nginx 将不会意识到这一点。反之亦然,proxy_cache_*您的 nginx 配置中的指令绝不会影响 ASP.NET 缓存。

您应该决定在哪里缓存,使用 nginx 或使用 ASP.NET。如果要使用 Nginx 进行缓存,请删除 [OutputCache] 属性或通过 alltogether 禁用输出缓存web.config。相反,在 nginx 中为不同的缓存区域创建不同的位置,如下所示:

# for your Home controller, assuming you use the /home/ route
location /home/ {
    proxy_set_header  Host             $http_host;
    proxy_pass https://127.0.0.1:4430;
    proxy_cache cache;
    proxy_cache_valid 200 302 10m;
    proxy_cache_valid 404 1m;
}
# for all other routes
location / {
    proxy_set_header  Host             $http_host;
    proxy_pass https://127.0.0.1:4430;
    # no proxy_cache here means no caching on the nginx side
}

您可以创建复杂location的部分,甚至使用正则表达式来匹配您的 ASP.NET 路径/路由。请参阅有关该内容的nginx 文档

如果您想在 ASP.NET 中控制缓存,请proxy_cache*从 nginx 配置中删除所有指令(location如上例中的最后一部分)并使用常规的 ASP.NET 缓存指令,如[OutputCache]指令。

我建议使用 nginx 方法,因为 nginx 非常快速且功能强大,但首先需要阅读一些内容。但是如果你了解它,你可以使用它的反向代理功能来创建强大的网络缓存,不仅适用于 ASP.NET,也适用于所有其他的 web 应用程序,如 ruby​​、node.js 等。

于 2012-12-29T18:28:57.470 回答