昨天尝试用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
【相关连接】