利用cloudflare访问被墙的VPS(web和vpn)

最近vps频繁被墙,中途尝试过host winds,尽管hostwinds可以换ip,可是最近一次被墙后换了n次IP也没通,不想折腾了,牺牲点速度用cloudflare吧。vps主要是放个blog,再搭建个私有vpn偶尔上谷歌查查文献。

1、利用cloudflare访问被墙的web。这个很简单,网上教程一大堆,主要是把自己的域名加到cloudflare里面,把nameserver也改成cloudflare的,添加A记录到vps的ip,打开代理(灰云变成黄云),等dns服务器刷新(约3-6分钟)后,再次访问就通了,可能速度会变慢,还有个好处是隐藏真实ip地址。

2、vpn。目前v2ray比较流行,以centos安装v2ray为例,比较好用的脚本是233blog的。在安装v2ray之前得在cloudflare里面新建一个vpn专用域名解析,比如vpn.xxx.com指向100.200.100.200,暂时关闭代理状态,也就是灰云。再在root命令行模式下输入:bash <(curl -s -L https://git.io/v2ray.sh),会出现下图(借个图,不要照图抄,图上的设置用不了域名,用ip的话,ip又被墙了):

传输协议选择4,websocket+tls。

端口选择很关键,因为cloudflare有端口限制,自己去cloudflare网上查:https://developers.cloudflare.com/fundamentals/get-started/reference/network-ports/。

输入域名(刚才在cloudflare里面建好的),如果解析已经生效了(不要开启cloudflare代理),安装会继续向前,否则就会提示错误并停止安装。

如果协议选择4,后面还会让选择是否自动配置tls,选择是继续,安装caddy(因为已经有nginx了,所以安装好就把caddy停了)。

广告拦截和ss都默认选否就行。

接下来放几张相对正确的有参考意义的图(借个图):

安装好后会显示配置信息,当然,如果用了233blog的脚本,后期随时可以用“v2ray”命令调出选项菜单,根据需要进行各种操作和查看。同时,会发现配置信息里的端口是443(没错你刚才设置的不是443,443端口是https或者tls协议要用到的端口,我们在客户端输入的端口都是443,tls证书怎么搞就不写了,自己上网查吧)。

还记不记得刚才自动安装的caddy,如果你有nginx和宝塔,可以在命令行输入“service caddy stop”来停止这个服务,这是一个web服务,在233blog的脚本中是用来建立反向代理的,即当cloudflare解析到vps时用的时443端口,需要从服务器内部“转发”至刚才你设置的端口上(比如上图的8844,因为是服务器内部“转发”所以地址就是127.0.0.1:8844),这个功能nginx完全可以胜任。

只要在集成nginx的宝塔面板新建网站vpn.xxx.com(前面设定的vpn域名),静态页面就行,然后在网站设置里找到反向代理一栏,新建反向代理,目标地址里设置“http://127.0.0.1:8844”(不需要加引号),随便输入最上方的别名确定保存。

保险起见,重启v2ray和nginx,不知道怎么重启的直接在命令行打入“reboot”。

然后再cloudflare里面把黄云点亮,开启代理。

最后,客户端设置,就照着刚安装好v2ray时显示的信息设置就行,保存,点击连接就ok了。

因为我很懒,对大部分人来说这个看着很乱,总体思路就是我们通过vpn客户端访问域名(因为ip被封了),域名通过cloudflare解析到cloudflare的cdn节点(这个节点可以连通你的网络和vps的网络),然后cdn节点解析到VPS,这个访问通过tls即443端口连接,然而v2ray服务端口是8844(举例),这就需要在vps本地建立一个反向代理,把外部的请求“转发”到8844端口,完整地址就是127.0.0.1:8844(本服务器地址可以写localhost或127.0.0.1),实际上这是一个双向通讯的过程,所以“转发”两个字加了引号。

nginx中性能需要调整,参考:https://blog.csdn.net/weixin_44972135/article/details/92806391

当v2ray连接不稳定时可能是被防火墙封了,需要检查防火墙日志,可能会被误判cc攻击,将相关内容加入白名单就行。

禁用wpjam首页获取文章第一张图

之前一直用wpjam basic来在首页显示文章第一张图片,最近发现wpjam好像会影响页面加载速度,禁用之后速度明显变快,于是尝试自己加代码。

1、在主题编辑器中编辑function.php,在最后加入如下代码:

function catch_that_image() {
global $post, $posts;
$first_img = '';
ob_start();
ob_end_clean();
$output = preg_match_all('/<img.+src=[\'"]([^\'"]+)[\'"].*>/i', $post->post_content, $matches);

$first_img = '';
if(empty($matches[1])) $first_img = "";
else $first_img = $matches [1][0];
return $first_img;
}

2、在主题编辑器中编辑content-search.php,在第22行插入:

<?php

if(catch_that_image()){?>

<div align=”center”>
<img src="<?php echo catch_that_image(); ?>" width="600" >
</div>
<?php } ?>

3、在该主题目录下修改index.php第39行为“get_template_part( ‘content-search’, get_post_format() );”。这一点操作在以前的文章也提到过:wp主题twentyfifteen首页布局的修改

禁用优化插件获得效率提升

今天心血来潮,把所有插件都禁用了,然后一个一个打开,测试页面打开速度,结果发现一些所谓的优化插件(WP-Optimize、W3 Total cache)都会影响网页打开速度,对个人博客来说,这简直是负优化啊,可能当访问量很大的时候需要用到这类插件,至少目前低负载情况下这两个插件对网页打开速度的影响是明显的。

本站优化7:waf防火墙改进动态封禁ip

此文转载自:斐斐のBlog

原文地址:宝塔面板Nginx的Lua-Waf防火墙终极改进 动态封禁IP

实在没有需要修改的地方,就连理由都一样,原文如下:

宝塔面板自带的Nginx防火墙有些鸡肋,对于大量的恶意攻击只能临时拦截,而不能封禁IP,下面的修改可以帮你做到:

CC攻击屡教不改,立即ban!

漏洞扫描屡教不改:立即ban!

同一个IP段轮流攻击,整个IP段都给你ban了!

使用了CDN?没关系,获取了真实IP再ban!

一小时后,unban……

宝塔面板的nginx修改/www/server/nginx/waf/目录下的三个文件即可,如果没有宝塔面板,nginx必须安装Lua,然后对下面的代码稍加修改,并且自己加上正则黑名单(或者下载个宝塔面板把规则文件拷出来)也可以正常使用。

代码:config.lua

RulePath = "/www/server/panel/vhost/wafconf/"    --规则文件夹
attacklog="on"
logdir = "/www/wwwlogs/waf/"    --日志文件夹
UrlDeny="on"
Redirect="on"
CookieMatch="on"
postMatch="on"
whiteModule="on" 
black_fileExt={"php"}
ipWhitelist={}
ipBlocklist={}
CCDeny="on"
CCrate="500/100"    --这个是CC攻击的几秒钟允许请求几次

代码:init.lua

require 'config'
local match = string.match
local ngxmatch=ngx.re.find
local unescape=ngx.unescape_uri
local get_headers = ngx.req.get_headers
local optionIsOn = function (options) return options == "on" and true or false end
logpath = logdir 
rulepath = RulePath
UrlDeny = optionIsOn(UrlDeny)
PostCheck = optionIsOn(postMatch)
CookieCheck = optionIsOn(cookieMatch)
WhiteCheck = optionIsOn(whiteModule)
PathInfoFix = optionIsOn(PathInfoFix)
attacklog = optionIsOn(attacklog)
CCDeny = optionIsOn(CCDeny)
Redirect=optionIsOn(Redirect)
function subString(str, k)    --截取字符串
    ts = string.reverse(str)
    _, i = string.find(ts, k)
    m = string.len(ts) - i + 1
    return string.sub(str, 1, m)
end
function getClientIp()
        IP  = ngx.var.remote_addr 
    if ngx.var.HTTP_X_FORWARDED_FOR then
      IP = ngx.var.HTTP_X_FORWARDED_FOR
    end
        if IP == nil then
                IP  = "unknown"
        end
    IP = subString(IP, "[.]") .. "*"
        return IP
end
function getRealIp()
        IP  = ngx.var.remote_addr 
    if ngx.var.HTTP_X_FORWARDED_FOR then    --如果用了CDN,判断真实IP
      IP = ngx.var.HTTP_X_FORWARDED_FOR
    end
        if IP == nil then
                IP  = "unknown"
        end
    return IP
end
function write(logfile,msg)
    local fd = io.open(logfile,"ab")
    if fd == nil then return end
    fd:write(msg)
    fd:flush()
    fd:close()
end
function log(method,url,data,ruletag)
    if attacklog then
        local realIp = getRealIp()
        local ua = ngx.var.http_user_agent
        local servername=ngx.var.server_name
        local time=ngx.localtime()
        if ua  then
            line = realIp.." ["..time.."] \""..method.." "..servername..url.."\" \""..data.."\"  \""..ua.."\" \""..ruletag.."\"\n"
        else
            line = realIp.." ["..time.."] \""..method.." "..servername..url.."\" \""..data.."\" - \""..ruletag.."\"\n"
        end
        local filename = logpath..'/'..servername.."_"..ngx.today().."_sec.log"
        write(filename,line)
    end
end
------------------------------------规则读取函数-------------------------------------------------------------------
function read_rule(var)
    file = io.open(rulepath..'/'..var,"r")
    if file==nil then
        return
    end
    t = {}
    for line in file:lines() do
        table.insert(t,line)
    end
    file:close()
    return(t)
end
-----------------------------------频繁扫描封禁ip-------------------------------------------------------------------
function ban_ip(point)
    local token = getClientIp() .. "_WAF"
    local limit = ngx.shared.limit
    local req,_=limit:get(token)
    if req then
    limit:set(token,req+point,3600)  --发现一次,增加积分,1小时内有效
    else
    limit:set(token,point,3600)
    end
end

function get_ban_times()
  local token = getClientIp() .. "_WAF"
  local limit = ngx.shared.limit
        local req,_=limit:get(token)
  if req then
    return req
  else return 0
  end
end

function is_ban()
  local ban_times = get_ban_times()
  if ban_times >= 100 then        --超过100积分,ban
    ngx.header.content_type = "text/html;charset=UTF-8"
    ngx.status = ngx.HTTP_FORBIDDEN
    ngx.exit(ngx.status)
    return true
  else
    return false
  end
  return false
end

urlrules=read_rule('url')
argsrules=read_rule('args')
uarules=read_rule('user-agent')
wturlrules=read_rule('whiteurl')
postrules=read_rule('post')
ckrules=read_rule('cookie')
html=read_rule('returnhtml')

function say_html()
  ban_ip(15)      --恶意攻击,罚15分
    if Redirect then
        ngx.header.content_type = "text/html;charset=UTF-8"
    ngx.status = ngx.HTTP_FORBIDDEN
        ngx.say(html)
        ngx.exit(ngx.status)
    end
end

function whiteurl()
    if WhiteCheck then
        if wturlrules ~=nil then
            for _,rule in pairs(wturlrules) do
                if ngxmatch(ngx.var.uri,rule,"isjo") then
                    return true 
                 end
            end
        end
    end
    return false
end
function fileExtCheck(ext)
    local items = Set(black_fileExt)
    ext=string.lower(ext)
    if ext then
        for rule in pairs(items) do
            if ngx.re.match(ext,rule,"isjo") then
          log('POST',ngx.var.request_uri,"-","file attack with ext "..ext)
            say_html()
            end
        end
    end
    return false
end
function Set (list)
  local set = {}
  for _, l in ipairs(list) do set[l] = true end
  return set
end
function args()
    for _,rule in pairs(argsrules) do
        local args = ngx.req.get_uri_args()
        for key, val in pairs(args) do
            if type(val)=='table' then
                 local t={}
                 for k,v in pairs(val) do
                    if v == true then
                        v=""
                    end
                    table.insert(t,v)
                end
                data=table.concat(t, " ")
            else
                data=val
            end
            if data and type(data) ~= "boolean" and rule ~="" and ngxmatch(unescape(data),rule,"isjo") then
                log('GET',ngx.var.request_uri,"-",rule)
                say_html()
                return true
            end
        end
    end
    return false
end


function url()
    if UrlDeny then
        for _,rule in pairs(urlrules) do
            if rule ~="" and ngxmatch(ngx.var.request_uri,rule,"isjo") then
                log('GET',ngx.var.request_uri,"-",rule)
                say_html()
                return true
            end
        end
    end
    return false
end

function ua()
    local ua = ngx.var.http_user_agent
    if ua ~= nil then
        for _,rule in pairs(uarules) do
            if rule ~="" and ngxmatch(ua,rule,"isjo") then
                log('UA',ngx.var.request_uri,"-",rule)
                say_html()
              return true
            end
        end
    end
    return false
end
function body(data)
    for _,rule in pairs(postrules) do
        if rule ~="" and data~="" and ngxmatch(unescape(data),rule,"isjo") then
            log('POST',ngx.var.request_uri,data,rule)
            say_html()
            return true
        end
    end
    return false
end
function cookie()
    local ck = ngx.var.http_cookie
    if CookieCheck and ck then
        for _,rule in pairs(ckrules) do
            if rule ~="" and ngxmatch(ck,rule,"isjo") then
                log('Cookie',ngx.var.request_uri,"-",rule)
                say_html()
            return true
            end
        end
    end
    return false
end

function denycc()
    if CCDeny then
        CCcount=tonumber(string.match(CCrate,'(.*)/'))
        CCseconds=tonumber(string.match(CCrate,'/(.*)'))
        local token = getRealIp()
        local limit = ngx.shared.limit
        local req,_=limit:get(token)
        if req then
            if req > CCcount then
         limit:incr(token,1)
         ban_ip(req - CCcount)  --CC攻击,罚分
         ngx.header.content_type = "text/html"
         ngx.status = ngx.HTTP_FORBIDDEN
                 ngx.say("老哥你手速也忒快了吧,要不休息"..CCcount.."秒?")
                 ngx.exit(ngx.status)
                 return true
            else
                 limit:incr(token,1)
            end
        else
            limit:set(token,1,CCseconds)
        end
    end
    return false
end

function get_boundary()
    local header = get_headers()["content-type"]
    if not header then
        return nil
    end

    if type(header) == "table" then
        header = header[1]
    end

    local m = match(header, ";%s*boundary=\"([^\"]+)\"")
    if m then
        return m
    end

    return match(header, ";%s*boundary=([^\",;]+)")
end

function whiteip()
    if next(ipWhitelist) ~= nil then
        for _,ip in pairs(ipWhitelist) do
            if getClientIp()==ip then
                return true
            end
        end
    end
        return false
end

function blockip()
     if next(ipBlocklist) ~= nil then
         for _,ip in pairs(ipBlocklist) do
             if getClientIp()==ip then
                 ngx.exit(444)
                 return true
             end
         end
     end
         return false
end

代码:waf.lua

local content_length=tonumber(ngx.req.get_headers()['content-length'])
local method=ngx.req.get_method()
local ngxmatch=ngx.re.match
if whiteip() then
elseif blockip() then
elseif whiteurl() then
elseif is_ban() then
elseif denycc() then
elseif ngx.var.http_Acunetix_Aspect then
    ngx.exit(444)
elseif ngx.var.http_X_Scan_Memo then
    ngx.exit(444)
elseif ua() then
elseif url() then
elseif args() then
elseif cookie() then
elseif PostCheck then
    if method=="POST" then   
            local boundary = get_boundary()
      if boundary then
      local len = string.len
            local sock, err = ngx.req.socket()
          if not sock then
          return
            end
      ngx.req.init_body(128 * 1024)
            sock:settimeout(0)
      local content_length = nil
          content_length=tonumber(ngx.req.get_headers()['content-length'])
          local chunk_size = 4096
            if content_length < chunk_size then
          chunk_size = content_length
      end
            local size = 0
      while size < content_length do
    local data, err, partial = sock:receive(chunk_size)
    data = data or partial
    if not data then
      return
    end
    ngx.req.append_body(data)
          if body(data) then
               return true
            end
    size = size + len(data)
    local m = ngxmatch(data,[[Content-Disposition: form-data;(.+)filename="(.+)\\.(.*)"]],'ijo')
          if m then
                fileExtCheck(m[3])
                filetranslate = true
          else
                if ngxmatch(data,"Content-Disposition:",'isjo') then
                    filetranslate = false
                end
                if filetranslate==false then
                  if body(data) then
                          return true
                    end
                end
          end
    local less = content_length - size
    if less < chunk_size then
      chunk_size = less
    end
   end
   ngx.req.finish_body()
    else
      ngx.req.read_body()
      local args = ngx.req.get_post_args()
      if not args then
        return
      end
      for key, val in pairs(args) do
        if type(val) == "table" then
          if type(val[1]) == "boolean" then
            return
          end
          data=table.concat(val, ", ")
        else
          data=val
        end
        if data and type(data) ~= "boolean" and body(data) then
                      body(key)
        end
      end
    end
    end
else
    return
end

本站优化6:开启nginx的过滤器

最近,本站一直遭到cc攻击骚扰,实在受不了了,这么个小站点,只是记录点自己关注的东西,还天天被练手,有意思吗.......

于是尝试了悬镜防火墙,实测1.9以下总是用的不爽,还占了一部分资源,还不如用nginx自带的过滤器,也算一个小小的防火墙了,至少cc攻击和一些字符串能过滤掉,还能禁ip。

本站优化4:程序及插件的选择(不定期更新页面)

本站使用了wordpress,经过一段时间测试,保留了一些比较好的插件,列表如下(按照首字母排序):

 

这个插件和mip改造插件就是为提高网页响应速度,提升用户体验的 BaiduXZH Submit(百度熊掌号) 百度熊掌号wordpress插件,自动推送最新文章或历史文章至百度,以及原创保护文章推送,并支持页面改造SEO优化。
这个可以直接复制图片进编辑器,免去上传步骤,不同于远程下载图片 Clipboard Images

Support paste images from clipboard for posts & comments (based on filereader.js)

禁用谷歌字体加速 Disable Google Fonts

Disable enqueuing of Open Sans and other fonts used by WordPress from Google.

检测插件是否有问题 Health Check & Troubleshooting

Checks the health of your WordPress install.

用过好多lightbox,真正在缓存页面条件下能用的就只有这个,专门针对原生自带主题 Meow Lightbox

Lightbox designed by and for photographers.

评论表单验证码 Mimi Captcha

在WordPress登陆、评论表单中加入验证码功能,支持字母、数字、中文和算术验证码。

页面改造加速,如果百度能够收录,那基本是秒开,因为百度会缓存页面(比一般cdn还好用) MIP改造 PRO

MIP for WP - Add Mobile Instant Pages support to your WordPress site. Wordpress站点的百度MIP格式改造

这个功能强大,各种缓存设置,加速,以后细说。 W3 Total Cache

The highest rated and most complete WordPress performance plugin. Dramatically improve the speed and user experience of your site. Add browser, page, object and database caching as well as minify and content delivery network (CDN) to WordPress.

中文题目转拼音题目 Wenprise Pinyin Slug

自动转换 WordPress 中的中文文章别名、分类项目别名、图片文件名称为汉语拼音。

防攻击的 Wordfence Security

Wordfence Security - Anti-virus, Firewall and Malware Scan

自动生成关键字 WP AutoTags

Often publish articles and updates people loves forgets to set tags when editing an article, the article automatically add keywords tag. tag extraction based on TF-IDF implementation. Built-in TF-IDF interface does not work when you try to find an existing tag in WordPress. If found, these markers are added to the post automatically each time you save the post.

这个是管理opcache的,启用opcache是在w3 total这插件里的 WP OPcache

This plugin allows to manage Zend OPcache inside your WordPress admin dashboard.

主要是wpjam虽然禁用生成草稿,但有时候还是会生成,所以就用这个去清理数据库,包括优化,能有明显提升 WP-Optimize

WP-Optimize is WordPress's #1 most installed optimization plugin. With it, you can clean up your database easily and safely, without manual queries.

文章阅读计数,看需要按照,只有这个能在静态页显示正常,不需要太多设置 WP-PostViews Plus

开启本插件后可以,可以为您分别显示每篇文章来自读者和搜索引擎蜘蛛的访问量

有些插件卸载后仍有数据库残留,药用本插件删除 WPDBSpringClean

A WordPress Plugin which deletes unused plugin tables from the database and also allows you to optimize existing DB tables

功能强大,具体到wpjam主页去看,但我实际用到的不多,特别是插件推荐的七牛镜像,我考虑一下还是没用,选择了百度 WPJAM BASIC

WPJAM 常用的函数和 Hook,屏蔽所有 WordPress 所有不常用的功能。

这个对懒人有用,自动生成摘要描述,定义首页描述(不固定的话首页描述就取第一篇文章摘要,这样首页的描述会不断变,影响seo),sitemap我用wpjam生成的 多合一SEO包

升级到Pro专业版 

Out-of-the-box SEO for your WordPress blog. Features like XML Sitemaps, SEO for custom post types, SEO for blogs or business sites, SEO for ecommerce sites, and much more. More than 50 million downloads since 2007.

主要有些内容需要挡一挡,以免不必要麻烦,刚好原来有个没用起来的订阅号,就拿来用了,对于生成静态页来说可能会有点问题(因为用了内存缓存,这样如果登陆状态访问该页面就没遮挡,生成的页面也没遮挡效果) 微信公众号涨粉

本插件可以隐藏文章中的任意部分内容,当访客关注您的微信公众后,可获取验证码查看隐藏内容

这个插件,描述写了一大堆,其实也就是个百度分享功能,可以不装,自己修改post文件 百度分享按钮

百度分享是一个提供网页地址收藏、分享及发送的WEB2.0按钮工具,借助百度分享按钮,网站的浏览者可以方便的分享内容到人人网、开心网、QQ空间、新浪微博等一系列SNS站点。 网站主可以在百度分享网站中获得分享按钮JS代码,嵌入到自己的网站,让网站链接分享到互联网各个角落!通过百度分享按钮,您的网站的浏览者可以便捷得分享您网站上的内容到人人网、开心网、qq空间、新浪微博等SNS站点进行传播,为您的网站带回更多的流量。通过百度分享按钮,您网站上的网页将更容易被百度搜索引擎所发现,从而有机会从百度搜索带回更多的流量。通过百度分享按钮,后续您还可以免费获取详尽的分享统计分析,了解网民将您网站上哪些内容分享到哪些SNS网站,每日的分享次数是多少,帮您更好得的跟踪、分析、激励用户的分享行为,为网站带来更多的流量。(该功能即将开放,敬请期待)赶紧免费获取百度分享按钮,获取更多的流量,您还等什么呢?

本站优化3:搬瓦工vps的环境搭建

注册购买这种我就不写了。vps到手后,自己熟悉一下面板和功能。

1、重装系统。选择centos7 bbr加速版,选bbr是为了网络加速,选centos7也就图个新,可能会支持更多新的功能,其实性能和centos6差不多。

2、安装宝塔运维。自己百度,宝塔运维很重要,主要就是图方便,我很懒。根据宝塔运维的推荐,安装lnmp,装好后,要修改php版本至最新7.x,修改mysql为mariaDB,有提示内存低于2g的主机不建议装mysql5.5以上版本,我装了mariaDB10.2好像也没事。


3、安装php扩展。这个在php7设置界面可以找到。安装apcu、yac、opcahe。更改php.ini,开启gzip、level1-6都可以,更改zend opcahe的内存使用为192,更改apcu内存为256MB。为什么这么设置,可是花了我好多精力去试验试出来的,这个很重要,而且每个人可能会有点不一样,但这么设应该能符合大部分人需求,以后会提到,关键是要掌握原理。

 

4、仍然在php设置这里设置php-fpm,从动态改成静态,并发数20,我设置30感觉很危险,马上要宕机的感觉。

5、nginx里面修改配置文件,把gzip level改成和php一样。

这样下来估计内存没剩多少了。图片稍后上传。如果有想到什么再补充。

一直很懒,第4篇一直没时间写。

本站优化2:选择合适的主机或空间

我买过godaddy域名和主机delux,hostease的美国主机、香港主机,bluehost的云虚拟主机,最后选择了搬瓦工。

1、godaddy。域名管理不错,就是慢,太慢,不知道现在怎样,我已经不想去考虑和折腾godaddy了,而且价格不便宜,虚拟主机还没我现在的vps便宜,虽然标榜无限空间、无限流量,我可以很负责的告诉你,只要限制你资源,即使给你无限空间和流量也是没啥卵用,用虚拟主机的是最不值的。有一点,这个换ip还比较方便,就是windows和linux系统切换就可以了,不知道现在行不行,比较多年了。

2、hostease。比起godaddy快好多,但后来也不是不太禁得住折腾,越来越慢,但比godaddy快多了,比起godaddy和bluehost,推荐用hostease,不过这个hostease的域名管理还是比较蛋疼的......能用就是有时候需要重新设置ns服务器。我目前还有用他们的空间。

3、bluehost。我当时买了云虚拟,说是双核1g内存.....,我以为是vps,买来以后,我靠,竟然是虚拟主机......,买都买了,用用看,结果ssh连不上,权限也不能设置777(这个可以理解吧,但是你至少给我ssh权限啊,一个网站连个777都没办法搞),可以在文件管理器里设置777,设置好就不能访问,也不能通过ssh把www用户组加上,那还玩个屁。因为比如zblog、wp的在线安装插件、主题、升级,还有其他一些采集程序,全部要用到文件夹777权限,你这个云虚拟主机买了等于没买,所以退款了,好像到现在还没到账........

 

最后,终极推荐:搬瓦工。网上铺天盖地的搬瓦工,然后官网又特别特别低调,我刚开始都找不到官网在哪里,甚至一度以为这个搬瓦工是个山寨的公司,因为“搬瓦工”这个中文的名字就是山寨取出来的。而且这个是vps,不是虚拟空间能比的,能自己安装linux系统,能够通过ssh连接,有完全控制权限,不仅仅是目录权限,而是可以在主机上安装程序、软件的那种。

推荐搬瓦工的理由:

1、速度快,各种配置都有,但是我使用下来觉得512m内存真的小了点,最起码要1g内存,因为有很多和优化相关的东西需要机器还是有一定配置的,所以推荐的是20g硬盘、1g内存、双核cpu、1g带宽、1t流量的vps。几点注意的:订单要买kvm主机,因kvm比ovz独立性高;机房要选择US-Los Ageles DC2 QNET(USCA_2),因为我每个都访问了一遍,什么CN2、DC8、凤凰城、Fremont等等都没这个快,因为前期CN2泛滥,我测试访问的时候有些网站都访问不了,很不稳定,可能他们手上有太多这种主机相应出手,所以一个劲的推19.9美元一年的主机等等(说实话这种512m内存的vps性能上是可以挂ss、反向代理、vpn,但想要做一个用户体验好的网站就算了,而且从政策上,你用这些主机挂代理被墙的概率是非常非常高的,喜欢折腾的人可以尽管折腾);

2、关于空间大小和流量的问题。首先1t流量基本是用不完的,远远的用不完;其次,空间虽然小,20g暂时也用不完;最后当你真的不够用了(到那时你已经有点小牛了),可以进行单项升级。其实很多地方宣传的无限空间和流量真的是没啥用.......等你们全部折腾一遍就能体会我说的了。

3、价格问题。vps产品中价格最实惠,你们可以自己再比较比较;甚至比bluehost、hostease和godaddy的虚拟空间价格还低,除了bluehost的云虚拟空间通过优惠码连赠送域名是480.7元(1美元=6.99元),但不好用;我买的搬瓦工的vps用完优惠码是46.87usd(1美元=7元),这个不带域名(我域名从godaddy买的,首年12元,两年123元),总共加起来451.09元。

4、域名问题。这个只卖主机没有域名,也不送域名,所以请自备域名,推荐去godaddy买域名。

5、优惠码
6.25%优惠码 BWH26FXH3HIQ
5.97%优惠码 BWH25AQH2CMQ

6、测试站汇总(我用了别人的,只推kvm,其实ovz更快,但是仍然建议kvm,自己百度)。什么测评、比较乱七八糟的,还不如实际访问看看,自己感受,我感觉只有第一个可以访问,前几天就慢点,就一个访问不了,今天都不行了。

搬瓦工(DC2 QNET) [USCA_2]:本站   http://findelephant.com
http://w40.gubo.org/

(DC8 CN2) [USCA_8] 洛杉矶CN2 GT

(DC4 MCOM) [USCA_4]洛杉矶Multacom

(DC3 CN2) [USCA_3]洛杉矶CN2 GT

7、更换ip问题。这个vps是独立ip,比虚拟主机优质吧。万一被墙了就只能更换ip,这个好像每间隔5个月还是10个月能免费更换ip一次,如果连着被墙两次,那只能花钱换ip,也不贵好像2.5美元,具体还是看官方价格吧。不过,你老实做个网站,别搞那些乱七八糟的是不会被墙的。比如什么赌博、色情、挂代理等等,这些基本就在作死边缘了,不过把平时收集的图片设置个私人密码自己用用倒是不错的哈........算了吧,20g空间,我还舍不得这么用

8、官方网站http://bwh8.net

其实这是官方中文镜像站,真正官网被墙了:https://www.bandwagonhost.com/

本站优化1:目前优化结果

很懒,不想打字,看图就知道了。使用动态页加载时间在0.1秒以内,在0.05-0.07秒左右。开启静态页面就不更不用说了,虽然和wordpress酱的网站加载速度没法比,但对于一般用用是足够了,而且我的页面是可以动态显示postviews的,不是完全静态的,也没有用cdn加速,因为目前没必要。

这个速度不光和程序、优化有关,第一步还是要找个好的服务器,目前我用的是vps,位于洛杉矶服务器,好像速度和配置都还能接受吧。

就先起个头吧........

装了mip改造插件,希望能被百度收录,这样可以大大提高页面打开速度