Discuz!官方免费开源建站系统

 找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索

[教程] Discuz 和 Varnish 配合做页面和静态文件反向代理

[复制链接]
jxmd007 发表于 2013-6-19 00:07:44 | 显示全部楼层 |阅读模式
       维护discuz论坛已经一段时间了,以前是用nginx + php + mysql 跑 Discuz!X2.0,高峰时期页面总是502、负载也狂升 {:soso_e101:} ,虽然后来优化了一下SQL,但还是502不断,502是由于php执行超时造成的,为了减缓502出现的频率,又设置了一下php的执行超时时间max_execution_time,但502的问题和机器的负载依然没有解决。 {:soso_e109:}       后来我想到了反向代理,说干就干 {:soso_e202:} ,在机器上搭建了squid,配置了反向代理,很快用户就反应了成功登陆论坛页面跳转后,页面出现了没登陆的提示,而且我观察到缓冲一直没有命中 {:soso_e136:} ,无奈在用户此起彼伏的投诉声中  {:soso_e105:} ,取消了反向代理。


       在谷歌和百度了N张帖子后,我发现很多站长和我有相似的问题,如反向代理后,discuz没能获取用户的真实IP  {:soso_e103:}  (取不到用户的真实IP,论坛的防止用户恶意猜密码的功能就出问题了  {:soso_e126:}  )、用户无法登陆或登陆后还是显示未登陆,在对论坛程序和页面抓包分析后,我用varnish做了一个反向代理,成功解决以上问题,反向代理后,discuz能获取用户的真实IP,用户注册登陆或用QQ、微博等第三方登陆都正常,关键是论坛高峰时期流量跑到300MB  但页面从没有出现过502、机器负载也近乎与0。  {:soso_e129:}
       小小说明一下,我的破服务器是4核的CPU、4G的内存,varnish、nginx、php、mysql、memcache、ftp都跑在这台小破服务器上  {:soso_e113:}
       不信?!  {:soso_e116:}  ,大家可以来体验一下 羊城网 http://www.gznf.net
       突然感觉废话写多了  {:soso_e113:}  ,不急很快入正题,先小小普及一下varnish,复制百度知道的  {:soso_e113:} ,Varnish是一款高性能的开源HTTP加速器,挪威最大的在线报纸 Verdens Gang 使用3台Varnish代替了原来的12台Squid,性能比以前更好。
       varnish的安装我就不详细说了,如果大家有需要,以后补上  {:soso_e113:}
       varnish的缓冲规则是依赖于它强大的VCL语言来实现的,所以几乎所有的设置都是写这个VCL,我先把我的VCL贴出来,后面我再解析没一个VCL语句的作用
       backend default {
    .host = "127.0.0.1";
    .port = "80";
}
acl purge {
    "localhost";
    "127.0.0.1"/24;
}

sub vcl_recv {
    set req.grace = 30s;
    if (req.http.host ~ "^1.1.1.1") {
        return (pass);
    }
    remove req.http.Cache-Control;
    remove req.http.Pragma;
    if (req.http.x-forwarded-for) {
        set req.http.X-Forwarded-For = req.http.X-Forwarded-For+", "+client.ip;
    }else {
        set req.http.X-Forwarded-For = client.ip;
    }
    if (req.http.host ~ "^(.*.)?gznf\.net$" && req.http.host !~ "www\.gznf\.net") {
        error 750 "http://www.gznf.net" + req.url;
    }
    if (req.url ~ "\.(flv|ico|pdf|avi|mov|ppt|doc|mp3|wmv|wav|gif|jpg|jpeg|png|swf|xml|txt|js|css|bmp)(\?.*|)$") {
        remove req.http.Cookie;
        remove req.http.User-Agent;
        remove req.http.Accept-Encoding;
        set req.url = regsub(req.url, "\?.*$", "");
        return (lookup);
    }elseif(req.http.host ~ "www\.gznf\.net" && req.http.Cookie !~ "RA6v_2132_auth=" && req.url ~ "\.(php|htm|html)(\?.*|)$" && req.url !~ "(member\.php(\?.*|)$|\/api\/|denglu\.php(\?.*|)$)"){
        remove req.http.Cookie;
        remove req.http.User-Agent;
        remove req.http.Accept-Encoding;
        return (lookup);
    }elseif (req.request == "URGE") {
        if (client.ip ~ purge) {
            return(lookup);
        }
    }else{
        return (pass);
    }
}

sub vcl_error {
    if (obj.status == 750) {
        set obj.http.Location = obj.response;
        set obj.status = 301;
        return(deliver);
    }
}

sub vcl_pipe {
    return (pipe);
}

sub vcl_hash {
    hash_data(req.url);
    if (req.http.host ~ "^(.*.)?gznf\.net$"){
        hash_data("gznf.net");
    }else {
        hash_data(req.http.host);
    }
    return (hash);
}

sub vcl_hit {
    if (req.request == "URGE") {
        set obj.ttl = 0s;
        error 200 "urged.";

    }else{
        return (deliver);
    }
}

sub vcl_miss {
    if (req.request == "PURGE") {
        error 404 "Not in cache.";
    }
    set bereq.url = regsub(req.url, "\?.*", "");
    return (fetch);

}

sub vcl_fetch {
    set beresp.grace = 30s;
    if (req.url ~ "\.(htm|html|xml|js|css|bmp|txt)(\?.*|)$") {
        set beresp.do_gzip = true;
    }
    if(req.http.host ~ "www\.gznf\.net" && req.http.Cookie !~ "RA6v_2132_auth=" && req.url ~ "\.(php|htm|html)(\?.*|)$"  && req.url !~ "(member\.php(\?.*|)$|\/api\/|denglu\.php(\?.*|)$)"){
        set beresp.ttl = 120s;
    }
    return (deliver);
}

sub vcl_deliver {
    if (obj.hits > 0) {
        set resp.http.X-Cache = "HIT";
    } else {
        set resp.http.X-Cache = "MISS";
    }
    remove resp.http.X-Varnish;
    remove resp.http.Via;
    remove resp.http.X-Powered-By;
    remove resp.http.Server;
    return (deliver);
}




夜深了  {:soso_e147:}  ,VCL说明 明晚后补  {:soso_e113:} ,这个VCL我会不断修改以提高缓存的命中率,也会同步更新到这里的




如果问题,可以QQ联系我,壹扒叁贰叁叁伍叁零,广告一下,我也接网站、论坛、网游等的运维兼职工作  {:soso_e163:}  {:soso_e163:} {:soso_e163:}  {:soso_e113:}  {:soso_e113:}  {:soso_e113:}
ggg011 发表于 2013-6-19 18:01:39 | 显示全部楼层
十分感谢楼主,已经生效了 {:soso_e179:}
回复

使用道具 举报

crx349 发表于 2013-6-22 00:22:05 | 显示全部楼层
感谢分享了~
回复

使用道具 举报

 楼主| jxmd007 发表于 2013-7-25 12:24:16 | 显示全部楼层
谢谢各位支持
回复

使用道具 举报

gygzs 发表于 2013-7-25 14:20:33 | 显示全部楼层
感谢楼主分享,我想问下楼主我的网站是 win2003+phpnow!组合搭建的服务器,现在出现问题是访问速度慢,当人数达到100人左右的时候就会宕机
回复

使用道具 举报

crx349 发表于 2013-7-26 09:22:04 | 显示全部楼层
gygzs 发表于 2013-7-25 14:20
感谢楼主分享,我想问下楼主我的网站是 win2003+phpnow!组合搭建的服务器,现在出现问题是访问速度慢,当 ...

用iis哦~亲
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|Discuz! 官方站 ( 皖ICP备16010102号 )star

GMT+8, 2024-5-3 17:30 , Processed in 0.096953 second(s), 17 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表