Varnish,Nginx搭建缓存服务器

本文介绍如何配置Varnish与Nginx搭建高效缓存服务器,包括安装步骤、配置文件详解及常见问题解决方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Varnish,Nginx搭建缓存服务器
一. varnish
1.安装pcre库,兼容正则表达式
# tar -zxvf pcre-8.10.tar.gz
# cd pcre-8.10
# ./configure --prefix=/usr/local/pcre
# make && make install
2.配置安装varnish
# tar -zxvf varnish-3.0.2.tar.gz
# cd varnish-3.0.2
# export PKG_CONFIG_PATH=/usr/local/pcre/lib/pkgconfig/
# ./configure --prefix=/usr/local/varnish
# make && make install
3.修改varnish配置文件
/usr/local/varnish/etc/varnish/default.vcl
# mv default.vcl default.vcl.bak
# vi cq.vcl
backend cqserver {
.host = "127.0.0.1";
.port = "8087";
.connect_timeout = 20s;
}
acl purge {
"localhost";
"127.0.0.1";
"192.168.1.0"/24;
}
sub vcl_recv {
if (req.request == "PURGE") {
if (!client.ip ~ purge) {
error 405 "Not allowed.";
}
return (lookup);
}
if (req.http.host ~ "^www.baidu.com") {
set req.backend = cqserver;
if (req.request != "GET" && req.request != "HEAD") {
return (pipe);
}
else{
return (lookup);
}
}
else {
error 404 "caoqing Cache Server";
return (lookup);
}
}
sub vcl_hit {
if (req.request == "PURGE") {
set obj.ttl = 0s;
error 200 "Purged.";
}
}
sub vcl_miss {
if (req.request == "PURGE") {
error 404 "Not in cache.";
}
}
(1)Varnish通过反向代理请求后端IP为127.0.0.1,端口为8087的web服务器,即nginx服务器监听端口;
(2)Varnish允许localhost、127.0.0.1、192.168.1.*三个来源IP通过PURGE方法清除缓存;
(3)Varnish对域名为www.baidu.com的请求进行处理,非www.baidu.com域名的请求则返回"caoqing Cache Server";
(4)Varnish对HTTP协议中的GET、HEAD请求进行缓存,对POST请求透过,让其直接访问后端Web服务器。
4.启动varnish
# cd /usr/local/varnish/sbin/
# ./varnishd -f /usr/local/varnish/etc/varnish/cq.vcl -s file,/var/varnish_cache,1G -T 127.0.0.1:2000 -a 0.0.0.0:80

二. nginx
1.安装nginx
# rpm -ivh zlib-devel-1.2.3-4.el5.i386.rpm
# tar zxvf nginx-1.4.1.tar.gz
# cd nginx-1.4.1
# ./configure --prefix=/usr/local/nginx --with-openssl=/usr/lib --with-pcre=/root/tool/pcre-8.10 --with-http_stub_status_module
# make && make install
2.启动nginx
# cd /usr/local/nginx/sbin
# ./nginx
3.修改ngnix配置文件
测试配置文件/usr/local/nginx/sbin/./nginx -t
# cd /usr/local/nginx/conf
# vi nginx.conf
#使用的用户和组
user  root root;
#制定工作衍生进程数(一般为CPU总核数两倍)
worker_processes  8;
#制定文件描述符数量
worker_rlimit_nofile 51200;
#指定错误日志存放路径
error_log  logs/error.log
#指定pid存放路径
pid        logs/nginx.pid;
event
{    
#使用网络I/O模型
     use epoll;
#允许的连接数
     worker_connections  65535;
}

http {
#访问日志存放路径
    access_log logs/access.log;
#开启gzip压缩
    gzip             on;
    gzip_min_length  1000;
    gzip_proxied     expired no-cache no-store private auth;
    gzip_types       text/plain text/css text/xml text/javascript application/x-javascript application/xml application/rss+xml application/xhtml+xml application/atom_xml;
    gzip_disable "MSIE [1-6].(?!.*SV1)";
#限定PHP-CGI的连接、发送和读取的时间为300s
    fastcgi_connect_timeout 300s;
    fastcgi_send_timeout 300s;
    fastcgi_read_timeout 300s;
#虚拟主机配置
server {
#监听端口
       listen 8087;
#主机名称
       server_name 127.0.0.1;
#google提供的DNS服务
       resolver 8.8.8.8
       location / {
#nginx作为HTTP代理服务器
            proxy_pass http://$http_host$request_uri;
            proxy_set_header Accept-Encoding '';
            proxy_redirect          off;
       }
}
}

三. 排错优化
1)修改环境变量
vi ~/.bashrc
PATH=$PATH:/usr/local/nginx/sbin:/usr/local/varnish/sbin:/usr/local/varnish/bin
export PATH
2)nginx启动与关闭
参数:
-v:查看版本
-V:查看配置模块
-t:查看配置文件是否正确
-c:制定其他配置文件
pkill -9 nginx
3)varnish启动与关闭
参数: 
-u:以什么用户运行
-g:以什么组运行
-f:varnish配置文件 
-a:绑定IP和端口
-s:varnish缓存位置和大小
-w:最小,最大线程和超时时间
-T:varnish管理端口,主要用来清除缓存
pkill varnishd
varnish服务动态加载配置文件 
#varnishadm -T 127.0.0.1:2000
vcl.load vcl-name_vcl "配置文件路径" # vcl-name 这里可以任意取名 
vcl.use vcl-name
vcl.show vcl-name #显示vcl-name配置文件内容 
# varnishncsa -w /usr/local/varnish/logs/varnish.log
将输出日志写入到制定日志文件。
4)修改windows客户端
C:\Windows\System32\drivers\etc\hosts
192.168.1.202 www.baidu.com


来源:https://my.oschina.net/u/1449160/blog/198650

转载于:https://www.cnblogs.com/chenjw-note/p/6291922.html

<think>我们正在讨论使用Nginx和memcache搭建CDN服务器。根据引用[2],Nginx+memcache是构建CDN的一种主流方案,尤其适用于大规模网站,因为它天然支持分布式存储。引用[1]和[3]提供了一些配置Nginx和memcache的线索。搭建CDN的基本思路是:将静态资源(如图片、CSS、JS文件)缓存到多个CDN节点(即Nginx+memcache服务器)上,用户访问时由最近的节点提供服务。Nginx负责接收请求并从memcache中获取缓存内容,如果缓存中没有,则回源到原始服务器获取并缓存。以下是搭建步骤:1.**安装Nginx和memcached**:在服务器上安装Nginx和memcached。可以使用操作系统自带的包管理器,例如在CentOS上:```bashyuminstallnginxmemcached```或者,为了获得更多功能(如memcache模块),可以选择编译安装Nginx并包含第三方模块(如https://github.com/openresty/nginx-memc-module)。2.**配置memcached**:启动memcached服务,并设置监听地址和端口(默认11211)。确保Nginx服务器可以访问memcached。3.**配置Nginx**:Nginx需要配置为从memcache中获取内容。以下是一个基本的配置示例:```nginx#在http块中配置memcache服务器upstreammemcache{serverlocalhost:11211;#如果memcache在同一台机器上#可以添加多个memcache服务器,实现分布式#serveranother_memcache_server:11211;}server{listen80;server_nameyour_cdn_domain;location/{#设置memcache的key,通常使用URIset$memcached_key$uri;#尝试从memcache获取内容memcached_passmemcache;#如果缓存未命中,则返回错误(通常我们会用错误重定向到后端)error_page404=@fallback;}location@fallback{#当memcache中没有时,回源到原始服务器proxy_passhttp://your_origin_server;#将获取的内容存储到memcache中(这一步通常需要额外模块或逻辑,见下文说明)}}```但是,上面的配置有一个问题:当memcache中没有内容时,Nginx默认返回404,然后我们通过`@fallback`回源。但是,回源获取的内容并不会自动存储到memcache中。因此,我们需要在回源后把内容存入memcache。这通常需要借助额外的模块(如`srcache`模块)或者使用OpenResty(集成了Lua,可以编写脚本)。4.**使用OpenResty增强功能**:引用[1]提到了OpenResty(Nginx+memcache作为web服务器)。OpenResty是一个基于Nginx和Lua的Web平台,可以方便地实现复杂的逻辑,包括从后端获取内容并存入memcache。以下是使用OpenResty的示例配置:```nginxlocation/{#设置memcache的keyset$memc_key$uri;#尝试从memcache获取memc_connect_timeout100ms;memc_read_timeout100ms;memc_passmemcache;#如果memcache未命中(返回404,502等),则通过@fallback处理error_page404502=@fallback;}location@fallback{#回源获取internal;proxy_passhttp://your_origin_server;#将回源获取的内容存入memcache(通过Lua脚本)header_filter_by_lua'--获取响应头中的Content-Typelocalcontent_type=ngx.header.content_type--设置一个变量,标记是否应该缓存(例如只缓存图片和文本)ifcontent_typeand(string.find(content_type,"text/plain")orstring.find(content_type,"image/"))thenngx.ctx.should_cache=trueend';body_filter_by_lua'--如果应该缓存,则收集响应体ifngx.ctx.should_cachethenlocalbody=ngx.arg[1]localok,err=ngx.shared.cache:set(ngx.var.memc_key,body)ifnotokthenngx.log(ngx.ERR,"failedtosettomemcache:",err)endend';}```注意:上述Lua脚本仅为示例,实际使用中需要更完善的逻辑(比如考虑响应体分块传输、错误处理等)。另外,OpenResty提供了更便捷的库(如`lua-resty-memcached`)来操作memcache。5.**缓存管理**:需要定期清理或更新memcache中的缓存。可以通过memcache的协议(如`flush_all`命令)或者通过设置过期时间来实现。6.**分布式部署**:当需要多台CDN服务器时,每台服务器都配置相同的memcache后端(多台memcache服务器组成集群),或者使用一致性哈希将请求分发到不同的memcache节点。7.**性能优化**:-使用Nginx的proxy_cache_path(引用[4])可以配合memcache使用,也可以单独使用文件缓存。-调整memcache的内存大小和过期策略。注意:上述配置仅为示例,实际部署需要根据具体需求调整。引用[1]中提到了使用ab测试性能,在搭建完成后,可以使用类似工具测试CDN的性能。另外,引用[5]展示了Varnish的配置,虽然我们这里使用Nginx+memcache,但负载均衡的思想类似(如轮询后端服务器)。以上是搭建Nginx+memcacheCDN服务器的基本方法。由于具体环境差异,可能需要进一步调整。§§相关问题§§1.如何测试Nginx+memcacheCDN的性能?2.Nginx+memcache和Varnish在CDN应用中的优缺点比较?3.如何实现CDN节点之间的数据同步?</think>### 使用 Nginx + Memcache 搭建 CDN 服务器的教程 #### 一、核心原理 CDN 通过分布式节点缓存静态资源(如图片、CSS、JS 文件),Nginx 作为反向代理处理用户请求。当请求到达时: 1. Nginx 先查询 Memcache 缓存 2. 若缓存命中(`HIT`),直接返回内容 3. 若未命中(`MISS`),回源到后端服务器获取资源,并存入 Memcache[^2] #### 二、搭建步骤 ##### 1. 安装依赖 ```bash # 安装 Nginx 和 Memcached yum install nginx memcached # CentOS apt install nginx memcached # Ubuntu # 启动服务 systemctl start memcached systemctl enable memcached ``` ##### 2. 配置 Memcached 编辑 `/etc/sysconfig/memcached` (CentOS) 或 `/etc/memcached.conf` (Ubuntu): ```ini # 监听所有 IP,端口 11211 PORT="11211" USER="memcached" MAXCONN="1024" CACHESIZE="2048" # 缓存大小 2GB OPTIONS="-l 0.0.0.0" ``` ##### 3. 配置 Nginx **核心配置 (`/etc/nginx/nginx.conf`)**: ```nginx http { # 定义缓存路径(备用) proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=STATIC:100m inactive=24h max_size=2g; upstream memcached_backend { server 127.0.0.1:11211; # Memcached 地址 keepalive 10; } server { listen 80; server_name cdn.yourdomain.com; location / { # 设置缓存 Key(使用 URI) set $memcached_key $uri; # 连接 Memcached memcached_pass memcached_backend; # 缓存未命中时回源 error_page 404 502 = @fallback; } location @fallback { # 回源到原始服务器 proxy_pass http://origin_server_ip; # 将响应存入 Memcache proxy_set_header X-Store-Cache $uri; proxy_ignore_headers Set-Cookie; proxy_hide_header Set-Cookie; } } } ``` ##### 4. 回源存储脚本(可选) 在原始服务器部署存储脚本(PHP 示例): ```php <?php $key = $_SERVER['HTTP_X_STORE_CACHE']; $content = file_get_contents('php://input'); $memcached = new Memcached(); $memcached->addServer('cdn_node_ip', 11211); $memcached->set($key, $content, 3600); // 缓存 1 小时 ?> ``` ##### 5. 启动服务 ```bash mkdir -p /var/cache/nginx chown -R nginx:nginx /var/cache/nginx systemctl restart nginx ``` #### 三、验证配置 1. 测试缓存命中: ```bash curl -I http://cdn.yourdomain.com/image.jpg ``` 查看响应头包含 `X-Memcached: HIT` 表示成功 2. 监控 Memcache: ```bash echo "stats items" | nc localhost 11211 ``` #### 四、性能优化建议 1. **多级缓存**:结合 `proxy_cache` 文件缓存 + Memcache[^4] ```nginx location @fallback { proxy_cache STATIC; proxy_cache_valid 200 1h; proxy_pass http://origin_server; } ``` 2. **分布式部署**: - 多台 Nginx 服务器指向同一个 Memcache 集群 - 使用 `consistent hashing` 分发请求 3. **缓存策略**: - 静态资源设置长缓存:`Cache-Control: max-age=31536000` - 动态内容设置短缓存或跳过缓存 #### 五、故障排查 - **缓存不生效**:检查 `error_log` 中的 `memcached_connect()` 错误 - **高并发瓶颈**:增加 Memcache 连接数: ```nginx memcached_connect_timeout 50ms; memcached_read_timeout 100ms; ``` > **关键优势**:天然支持分布式存储,通过添加 Memcache 节点即可扩展缓存容量,避免单点故障[^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值