文章出處

昨天嘗試用nginx搭建nuget鏡像服務器,鏡像服務器需要兩個功能:1)反向代理;2)內容緩存。

用nginx做反向代理,配置非常簡單,只需在/etc/nginx/nginx.conf中添加一個包含proxy_pass的server設置:

server {
    listen       80;
    listen       [::]:80;
    server_name  鏡像服務器主機名;
    location / {
        proxy_pass http://www.nuget.org;
    }
}

而添加緩存功能,配置稍微復雜些。

首先要創建一個用于存放緩存文件的文件夾,比如這里用 /data/nuget-cache 。

mkdir /data/nuget-cache

然后在nginx.conf的http設置部分添加proxy_cache_path設置:

proxy_cache_path /data/nuget-cache levels=1:2 keys_zone=nuget-cache:20m max_size=50g inactive=168h;

* keys_zone指的是緩存空間名稱。

* max_size指的是緩存文件可以占用的最大空間。

* inactive指的是如果一個緩存文件多長時間不被訪問,就會被刪除。

接著在server設置部分添加proxy_cache與proxy_cache_valid設置:

server {
    listen       80;
    listen       [::]:80;
    server_name  鏡像服務器主機名;
    location / {
        proxy_pass http://www.nuget.org;
        proxy_cache nuget-cache;
        proxy_cache_valid 168h;
    }
}

* proxy_cache設置的就是proxy_cache_path中keys_zone的值。

* proxy_cache_valid設置的是緩存過期時間,比如這里168小時過期。

這樣設置后運行nginx,發現只有少部分內容被緩存,大部分內容不能被緩存,比如下面的URL的響應內容就不能被緩存:

http://www.myget.org/F/aspnetvnext/api/v2/FindPackagesById%28%29?id=%27System.Linq%27

查看http響應頭(http headers),發現了下面2個http header:

Cache-Control: private
Set-Cookie: ai_session=ad829b6c509946098fa7f8e32fada661|2015-06-24T03:52:38.2032109+00:00|2015-06-24T03:52:38.4219541
+00:00; expires=Wed, 24-Jun-2015 04:22:38 GMT; path=/

問題就是它們引起的,需要在nginx中通過proxy_ignore_headers設置忽略它們,設置方法如下:

server {
    listen       80;
    listen       [::]:80;
    server_name  鏡像服務器主機名;
    location / {
        proxy_pass http://www.nuget.org;
        proxy_cache nuget-cache;
        proxy_cache_valid 168h;
        proxy_ignore_headers Set-Cookie Cache-Control;
        proxy_hide_header Cache-Control;
        proxy_hide_header Set-Cookie;
    }
}

【參考資料】

Understanding the nginx proxy_cache_path directive

Nginx Caching

【相關鏈接】

nuget國內鏡像的解決辦法


文章列表


不含病毒。www.avast.com
arrow
arrow
    全站熱搜
    創作者介紹
    創作者 大師兄 的頭像
    大師兄

    IT工程師數位筆記本

    大師兄 發表在 痞客邦 留言(0) 人氣()