昨天嘗試用nginx搭建nuget鏡像服務器,鏡像服務器須要兩個功能:1)反向代理;2)內容緩存。html
用nginx作反向代理,配置很是簡單,只需在/etc/nginx/nginx.conf中添加一個包含proxy_pass的server設置:nginx
server { listen 80; listen [::]:80; server_name 鏡像服務器主機名; location / { proxy_pass http://www.nuget.org; } }
而添加緩存功能,配置稍微複雜些。api
首先要建立一個用於存放緩存文件的文件夾,好比這裏用 /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指的是緩存空間名稱。session
* max_size指的是緩存文件能夠佔用的最大空間。ide
* inactive指的是若是一個緩存文件多長時間不被訪問,就會被刪除。post
接着在server設置部分添加proxy_cache與proxy_cache_valid設置:url
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
【相關連接】