成航先森 成航先森

成都航院计算机系一个学生的个人博客

 

随便看看:

分段图 CDNkeepalivedLinuxmysqlnginxrsyncUEditorWordPressWordPress插件七牛体育部信息志愿服务队免流全体例会向党组织靠拢团学会学习部宣传部影视相关心理部成都航院报社招生信息教学资源文艺部毕业就业流量活动生活杂谈社会实践部站长经历系部介绍系部动态纪检部组织部经验分享老师腾讯云资源下载轻松时刻高考录取分数线

标签:WordPress

慎用百度云观测 竟把网站拖垮

经验杂笔慎用百度云观测 竟把网站拖垮

标签:, | 5 条评论 | 2017-09-13

先森的网站还是放在阿里云免费云虚拟主机,每个月被关停之后,只能启动三次。先森上一次被关停是7月份的事情,没想到昨天凌晨,噩梦又来袭。早上先森上班之后,抽空看了一下网站的日志。因为阿里云的提示短信是凌晨三点四十多发的短信,所以先森重点关注这个时间段的,然后就发现了罪魁祸首,这篇文章的主角——百度云观测。坑爹的百度云观测在日志中,我发现了大量的请求,全是User-Agent:Baidu-YunGuanCe-ScanBot(ce.baidu.com),而且访问的还都是/wp-comments-post.php和/wp-admin/admin-ajax.php这些会接收数据,查询、修改数据库的php文件,这样一来对网站的压力就非常的大了。来自百度云观测的大量请求这种情况,先森赶紧去百度云观测把网站监控关闭,百度云观测的骚操作太恐怖了。关闭百度云观测后续先森在百度云观测找到这样的一段话,先森感觉心中一万只。。。。网站初始化包含多个分析过程,一般需要5~10分钟。 网站初始化时,我们会对你的网站进行全方位安全体检。初始化这段时间内,可能会向你的网站发送一定攻击探测请求,以发现安全漏洞。 一般情况下,正常网站不会因为安全体检受到任何影响。后来,昨天下午先森的网站又被关停了一次,这一次,不是百度云观测的锅了,先森已经关了。这次,是有人在拿先森网站练手,搞DDOS,先森看日志,发现大量的125.39.239.*网段的请求。因为网站放在百度云CDN,免费版又不能设置黑白名单,所以先森只把防守放在了.htaccess文件里面,但是先森发现,放在里面并无卵用,有了CDN,该访问还是能访问。所以先森还是把网站CDN都解析到腾讯云CDN。腾讯云CDN对移动宽带的支持貌似不太友好,但是好在是能够配置黑白名单,有这点就够了。

CDN后用Ajax动态提交、显示文章阅读量,cookies避免重复刷新

WordPress技巧CDN后用Ajax动态提交、显示文章阅读量,cookies避免重复刷新

标签:, , | 12 条评论 | 2017-08-29

上篇文章解决了WordPress加入CDN后“非插件浏览次数统计”浏览次数不刷新问题,同时留下了两个未解决的问题:1.按F5可无限制刷新文章访问量,并影响数据库效率;2.只解决了后台不更新问题,前台显示还是得等CDN刷新后才能更新。那么这篇文章就是为了解决以上两个问题。问题分析第一个问题,先森想到的解决方法是用JS代码创建cookies,如果cookies存在就不在更新后台的统计量。第二个问题,直接让ajax获取后台的访问量,修改前台显示的访问量就行了。一开始,先森配置的让ajax多传一个参数,是判断cookies是否存在的,存在为1,不存在为0。若cookies不存在,则后台访问量统计就+1,并返回数据库中的浏览量并+1。若cookies存在,则后台不增加访问数量,直接返回数据库中的浏览量并+1,如此访客刷新也不会增加访问量了。但是这样还是存在会在后台查询数据的问题,查询多了对数据库也是一种负担。先森之前没有意识到这个问题,结果还是晚上睡觉前反思发现了,且也琢磨除了一个更好的解决方法。直接在JavaScript代码中加判断,如果cookies已存在,则直接不向后端服务器发数据。这样一来,前端再怎么刷新,也停留在CDN的层面上。那么要实现这种效果,就需要先实现不向后端服务器发送数据,也能获取到当前文章的访问量。解决方法很简单,第一次获取访问量时,将后端服务器返回的访问量直接写入cookies,下次刷新时,直接从cookies中读取访问量。另外,还有一个地方需要解释一下,cookies的过期时间。如果cookies时间太长了的话,那么未免还是会损失一些访问量,所以先森就没有设置cookies的过期时间,保持默认。cookies的默认过期为关闭浏览器,先森觉得,这样一来还是比较合理的。同时,一个访客,可能并不会只打开本站一篇文章就关闭,打开多篇文章时,每篇文章的访问量是不一样的,需要从cookies中获取的话,cookies的名称就必须不一样。不然访问打开其他文章,看到了访问量都是同一个数值。解决方法就是,已“固定值+文章ID”的方式,确定cookies名称的唯一。效果实现上一篇文章中,先森是模仿通用的评论ajax提交的处理方式,自建了一个类似的php。但这样可能有点不安全,也有点麻烦,所以先森还是研究着将php代码部分放进了主题的functions.php。首先还是在footer.php中添加ajax的代码,注意需要将前台显示访问量的标签ID或class名称改成自己的。<script type= "text/javascript" > function GetCookie(sName) {    var arr = document.cookie.match(new RegExp("(^| )"+sName+"=([^;]*)(;|$)"));    if(arr !=null){return unescape(arr[2])};    return null;}var postviews_cook=GetCookie("postviews<?php the_ID();?>");  if ( postviews_cook == null ){$.ajax({ type:'POST', url: "<?php echo admin_url('admin-ajax.php');?>" , data:"postviews_id=<?php the_ID();?>&action=postviews",cache:false,success: function(postviews_count){ $("#views").text('阅读:' + postviews_count + ' 次');document.cookie="postviews<?php the_ID();?>=" + postviews_count;} });   }  else{$("#views").text('阅读:' + postviews_cook + ' 次');}; </script><?php endif ; ?>然后直接在自己主题的functions.php中添加下面的代码:/** 缓存时更新浏览量-有缓存* http://www.capjsj.cn/ajax_cookies_views.html*/function postviews_cache(){    if( empty( $_POST['postviews_id'] ) ) return;        $post_ID = $_POST['postviews_id'];        if( $post_ID > 0 ) {                $post_views = (int)get_post_meta($post_ID, 'views', true);/*if( !defined( 'WP_CACHE' ) || !WP_CACHE ){ 以前的错误代码*/if( defined( 'WP_CACHE' ) && WP_CACHE ){ //如果wp-config.php开启缓存    update_post_meta($post_ID, 'views', ( $post_views + 1 ));}                echo ( $post_views + 1 );                exit();        }}add_action( 'wp_ajax_nopriv_postviews', 'postviews_cache' );add_action( 'wp_ajax_postviews', 'postviews_cache' );2018年06月07日更新:感谢网友@鱼鱼 在评论区指出的BUG,以前写上面的代码的时候参考了wp-postviews插件wp-postviews.php里面的代码,结果学艺不精,只看了上半截,忽略了下半截。错误的代码竟然用了近1年的时间没发现,还发布在这里误人子弟,实在羞愧。上面的代码中,错误的代码依然留存着,只是注释了,修改的方法有两种,第一种是上面那样,第二种则是将10-12行的if段改为下方模式(这种就是wp-postviews插件的写法):if( defined( 'WP_CACHE' ) && WP_CACHE ) //如果wp-config.php没有开启缓存    return;                             //退出(中止函数的运行)    update_post_meta($post_ID, 'views', ( $post_views + 1 ));注意,如果网站的WordPress只加入了CDN,没有使用缓存插件的话,需要将上面代码改成下面的,也就是删除开启缓存判断:/** 缓存时更新浏览量-无缓存* http://www.capjsj.cn/ajax_cookies_views.html*/function postviews_cache(){    if( empty( $_POST['postviews_id'] ) ) return;        $post_ID = $_POST['postviews_id'];        if( $post_ID > 0 ) {                $post_views = (int)get_post_meta($post_ID, 'views', true);                update_post_meta($post_ID, 'views', ( $post_views + 1 ));                echo ( $post_views + 1 );                exit();        }}如果想使用有缓存的版本,想要开启网站缓存,可以选择安装缓存插件,或者直接在网站根目录的wp-config.php中,加入下面这行代码:define('WP_CACHE', true);如果网站没有加入CDN,也没有使用缓存插件,那么有两个选项:1、Ctrl + D 保存本页到书签,待文章变成静态页面后再拿出来看看;2、Ctrl + W 关闭本页,因为除非你要研究代码,本页对你没有什么价值,看看更多该看的吧。总结对于本文的解决方案有什么意见和建议,希望能够在下方评论栏中提出来,先森觉得还有能够改进的地方,但一人之力实在有些相形见绌。ajax是个很实用的东西,可能还有更多可以使用的地方,先森也得好好想想。

解决WordPress加入CDN后“非插件浏览次数统计”浏览次数不刷新问题

WordPress技巧解决WordPress加入CDN后“非插件浏览次数统计”浏览次数不刷新问题

标签:, , | 6 条评论 | 2017-08-25

不知道多少人和先森一样,在最初接触wordpress的时候,被网上的各类教程灌输了“能用代码版,就不用插件”的概念。先森就本着这个概念,在文章的访问量的时候,先森就找的代码版。网上提供的代码版浏览次数统计功能的文章,名称都差不多,类似“WordPress非插件添加文章浏览次数统计功能”这种比比皆是。先森应该是在wordpress大学看到的教程,关于教程先森就不再赘述了。本文主要解决的是,开启CDN后,用这种代码版访问量统计的方式浏览次数不再刷新的问题,如果想结合着来使用的话,统计代码部分可以去wordpress大学看《WordPress非插件添加文章浏览次数统计功能》这篇文章。浏览次数问题分析先森其实很早就意识到,开启CDN后,其实浏览量不是不刷新,而是只在首次缓存的时候才会增加一次。因为只有第一次访问的时候才会执行php,缓存后就直接访问的html了,所以就不会增加统计了。所以解决问题的方式,是让html也能统计到浏览次数,先森认知中的方法就只有一个:ajax。然而当初先森虽然知道问题原因,知道解决方式,但奈何先森代码能力不强,当时没能解决。先森始终认为,一个问题如果死活解决不了,那么就先放放,过段时间再反顾可能就会发现,这个问题根本就不是事。当然,这个时间可能就有点久了,起码就ajax这个问题,先森等了一两年。。。。先森想到的用ajax更新浏览次数的方法就是,使用ajax提交文章的ID给后方的php,后方的php接收到文章ID后,将该文章的浏览次数+1。效果实现先森研究了一晚上,发现要解决还是挺简单的。又是研究几小时,分享几分钟,心塞。首先,在footer.php中添加ajax的代码,注意url的地址要改为自己的php路径:<?php if  (is_singular()) : ?>  <!-- ajax post view -->  <!-- ajax post view -->  <script type= "text/javascript" >$.ajax({ type:'POST', url: "http://www.capjsj.cn/wp-content/themes/*/*.php" ,   /*此处需要修改为自己的php路径*/data: { "postviews_id" : "<?php the_ID();?>" } });   </script><?php endif ; ?>接收数据的php代码很简单,参考了评论的comments-ajax.php的头部,禁止直接访问,然后加上了几行更新浏览量的代码。将下面内容保存到一个php文件中,放入自己的wordpress主题里面,将该php的访问链接加入到上面的url中:<?php//禁止直接访问本phpif ( 'POST' != $_SERVER['REQUEST_METHOD'] ) {        header('Allow: POST');        header('HTTP/1.1 405 Method Not Allowed');        header('Content-Type: text/plain');        exit;}require( dirname(__FILE__) . '/../../../wp-load.php' );nocache_headers();$post_ID = $_POST['postviews_id'];$post_views = (int)get_post_meta($post_ID, 'views', true);update_post_meta($post_ID, 'views', ($post_views+1));?>如此一来,即使加入了CDN,文章页面变成了静态页面,后台也会更新访问次数了。总结这样仅仅是解决了文章页面被缓存后,浏览次数无法被统计到的问题,但是还并不完善。上面的功能实现之后,你会发现,每一次刷新浏览次数都会加一,如果有人一直按着F5,那么增加的浏览次数就有点恐怖了。这样还会增加服务器的负担,像先森这种把网站放在阿里云虚拟主机的,若负载过量还会直接关停,被人这样搞的关机先森就哭了。所以,下篇文章先森会分享使用cookies来限制访问次数无限增加的问题。另外,除了访问量持续增加的问题,还有一个地方可以优化。既然ajax能够异步提交数据,那么能不能动态的修改文章中的浏览次数呢?答案是肯定的,先森也会在下一篇文章中更新。关于上面的问题,请查看下一篇文章:CDN后用Ajax动态提交、显示文章阅读量,cookies避免重复刷新

WordPress让管理员在前台匿名,避免CDN缓存

WordPress技巧WordPress让管理员在前台匿名,避免CDN缓存

标签:, | 6 条评论 | 2017-08-23

自从用上CDN,需要关注的前台页面的问题就更多了,因为要避免一些不该被CDN缓存的内容被缓存,导致访客访问到不该看到的内容,影响使用体验。最近,先森发现曾解决过的问题故态复萌。用了CDN之后比较突出的问题,就是如果一篇文章如果先森登录之后再去访问,其他访客访问的时候,会显示“内容管理”、“登出”、评论框会显示先森的头像等问题。这个问题其实之前已经处理过了,但是先森wordpress升级之后,发现原本通过WP Super Cache设置的“不要为已知用户缓存”和“让已知用户匿名使他们浏览的内容是缓存文件”竟然失效了。查看了下WP Super Cache的版本,发现四周前才更新,并且提示与当前WordPres版本兼容,先森也确定选项已经勾选,但就是不生效,所以就很心塞。发现问题,处理问题。先森冒着英语超烂的风险,去了WP Super Cache的插件页面,看了一圈问题讨论,就是没发现有人提这个BUG的,在官方找解决方案的道路失败了。也不知道新的版本什么时候发布,发布会不会包含解决这个问题,所以先森只能又冒着php一知半解的风险来写代码了。解题思路解决方式先森觉得有两种,一个是去把自己的主题中的前台中管理员登录后才会显示的代码给删掉,另一种就是让管理员在前台匿名,被认为没有登录。第一种方案,先森觉得有点费时费力。当初主题的代码是自己一行一行的写的,现在让自己去删,内心表示很痛苦啊(心中憧憬着哪天要是不用CDN了...)。所以先森还是想实现第二种方案。经过研究自己的主题,先森发现,会显示管理员才能看到的东西,大多使用了这样的一种套路:<?php if (is_user_logged_in()){    '我是管理员'} ?>都用的is_user_logged_in()这个函数来判断用户是否登录,所以先森就想,让这个函数返回“用户没有登录”岂不是就可以了?is_user_logged_in()函数介绍:is_user_logged_in()函数位于wp-includes/pluggable.php函数参数:该函数不接受任何参数。返回值:已登陆返回True,否则返回False。先森在函数所在位置,找到了这个函数的代码:if ( !function_exists('is_user_logged_in') ) :/** * Checks if the current visitor is a logged in user. * * @since 2.0.0 * * @return bool True if user is logged in, false if not logged in. */function is_user_logged_in() {        $user = wp_get_current_user();        return $user->exists();}endif;先森把上面的return内容改成了如下内容:if(!is_admin()){    return false;}else{return $user->exists();}这样之后,只要不是后台,就会返回false,这样前台就会得到管理员没有登录。先森发现使用了is_user_logged_in()函数的位置都已经不会在登录的情况下显示了,但是还有两个地方例外。第一个地方是文章页面上的“编辑”按钮,另一个就是评论的头像了。通过查看代码,先森发现编辑按钮用的是edit_post_link()函数:edit_post_link('编辑', ' &#124; ', '');函数说明:若用户已登录且具有编辑文章的权限,该标签显示一个可编辑当前文章的链接。该标签必须用在主循环(loop)中。这个函数就没有使用is_user_logged_in()函数了,所以通过修改is_user_logged_in()的返回值就对“编辑”按钮不生效了。再来看评论头像。修改了is_user_logged_in()的返回值之后,头像旁边的文字已经变成了未登录状态下的文字,但是头像依然是先森的管理员评论头像。再去查看代码,发现评论头像部分虽然也使用了is_user_logged_in()函数,但是还另外使用了一个全局变量,代码大致如下:global $current_user;get_currentuserinfo();...echo get_avatar( $current_user->user_email, $size = '48' ,'');这样是通过获取当前用户信息,然后来获取用户的email邮箱地址,这样就和is_user_logged_in()函数无关了,因此前台还是会显示管理员的头像。但也正是这个问题,让先森找到了解决的办法。让管理员在前台匿名评论头像是通过获取当前登录用户的相关信息,进而获取用户邮箱来显示头像的。用到的获取用户信息函数是:get_currentuserinfo()而其实看is_user_logged_in()函数,其实它也有获取当前用户的相关信息,但用的是另一个函数:$user = wp_get_current_user();而这两个函数,其实是同一个函数,只是wp_get_current_user()是get_currentuserinfo()的进阶版:Notice: 自4.5.0版本起,已不建议使用get_currentuserinfo,请换用wp_get_current_user()。 in ***\wp-includes\functions.php on line 3707既然如此,只需要让当前用户信息为空即可。在自己的主题function.php最后加入以下代码,那么在前台就用户信息就为空了,即获取不到用户信息了:/*** 让管理员在前台访问匿名** http://www.capjsj.cn/make_known_users_anonymous.html*/function make_known_users_anonymous() {    global $current_user; if(!is_admin()){    $current_user = array( 'user_login' => '', 'user_email' =>'', 'user_level' => '', 'user_firstname' => '', 'user_lastname' => '', 'display_name' => '', 'ID' => '', 'user_url' => '', ); } return $current_user;}add_action( 'init', 'make_known_users_anonymous' );如果想要调试的话,可以把以下代码放在前台页面中想放的位置:<?php  global $current_user; get_currentuserinfo(); //或者将这两行换成 $current_user = wp_get_current_user();if( is_user_logged_in()){    echo '已经登录';}else{    echo '没有登录';}echo('Username: ' . $current_user->user_login . "\n"); //输出用户名  ?>但目前这种方式有个BUG,那就是在文章编辑页面点击预览的时候会返回404,这个待先森找找解决方法。2017-09-01更新先森看了下,预览的页面会在文章链接后面加上“?preview=true”或者“?p=xxx&preview=true”,那么,当访问链接是带了“preview=true”的,就不清除登录信息就行了。那么,把上面的匿名代码改成下面的代码,加入functions.php中/*** 让管理员在前台访问匿名** http://www.capjsj.cn/make_known_users_anonymous.html*/function make_known_users_anonymous() {    global $current_user; if(!is_admin() && $_GET['preview'] != 'true'){    $current_user = array( 'user_login' => '', 'user_email' =>'', 'user_level' => '', 'user_firstname' => '', 'user_lastname' => '', 'display_name' => '', 'ID' => '', 'user_url' => '', ); } return $current_user;}add_action( 'init', 'make_known_users_anonymous' );如果有任何问题,可以在下方评论。关于访客填写的昵称、邮箱、域名等信息不被CDN缓存,可以看看先森的解决方案:用cookie解决网站开启CDN缓存之后已知用户头像昵称被缓存等系列问题用cookie记住用户信息后隐藏信息输入框,优化用户体验

新版Linux/vps本地十五天循环备份和七牛远程备份脚本

WordPress技巧新版Linux/vps本地十五天循环备份和七牛远程备份脚本

标签:, , , | 2 条评论 | 2017-08-20

最新在新建一个博客,新的博客是建在云服务器的,完全自主,不得不说感觉非常好,比起虚拟主机可操作性强太多了。因为可操作性强,所以想把该做的都做好,比如备份。受张戈博客影响,看到了张戈的同步7天的那篇文章,想照着操作的时候发现,七牛的qrsync工具竟已废弃:qrsync已废弃看这简介,推荐使用qshell命令行工具,先森就干脆研究下使用新的工具来同步。有段时间没和七牛云储存打交道了,变化还是挺大的。为七牛的推陈出新点个赞。一、数据库、网站本地备份脚本在服务器上编辑shell脚本,脚本代码如下:#!/bin/bash# Name:liuxxbak.sh# This is a ShellScript For Auto Backup and Delete old Backup# Date:2017-8-19source /etc/profilebackupdir=/web/data/liuxx_bak   # 本地备份路径time=` date +%Y%m%d `date=` date +"%Y-%m-%d %H:%M:%S" `day=15  #本地备份保留天数# 数据库信息user=rootpassword=******host=127.0.0.1port=3306databases=wordpress# 本地网站根目录backhome=/web/data/html/if [ ! -d $backupdir ]; then  mkdir $backupdirfi        mysqldump -h $host -P $post -u $user -p$password ${data} | gzip > $backupdir/${data}_$time.sql.gzif [ "$?" == 0 ];then        echo "[${date}] 数据库 ${data} 备份成功!!" >> ${backupdir}/mysqllog.logelse#备份失败则进行以下操作        echo "[${date}] 数据库 ${data} 备份失败!!" >> ${backupdir}/mysqllog.logfi# 备份网站tar -zcvf $backupdir/liuxx_${time}.tar.gz $backhome > /dev/null 2>&1# 删除同步find $backupdir -name "*.gz" -type f -mtime +${day} -exec rm {} \; > /dev/null 2>&1先森将以上代码保存为‘liuxxbak.sh’,名称可以随意自定义。保存后需要增加可执行权限:chmod +x liuxxbak.sh使用说明:将以上内容变量按需修改:backupdir=本地备份绝对路径day=本地备份保留天数user=数据库用户名(建议使用root用户,出错可能性小)password=数据库密码host=数据库IP或域名port=数据库端口databases=数据库名称backhome=本地网站根目录脚本执行方式:./liuxxbak.sh或者/web/data/liuxxbak.sh    # 绝对路径执行如此可以检查一下是否能够成功备份。二、远程备份到七牛云储存1.命令。首先下载qshell命令行工具,下载页面:根据服务器类型选择下载linux 64位的服务器可以直接在服务器上这样下载并增加可执行权限:wget -O qshell http://devtools.qiniu.com/2.1.3/qshell-linux-x64 && chmod +x qshell可以将qshell命令放入自定义目录。或直接放至/usr/bin/路径下,这样就可以任何地方直接输入命令了。2.鉴权。有了命令之后,我们需要七牛的鉴权,否则没法使用接下来的命令。需要鉴权的命令都需要依赖七牛账号下的 AccessKey 和 SecretKey。所以这类命令运行之前,需要使用 account 命令来设置下 AccessKey ,SecretKey 。鉴权的方式很简单,首先进入七牛的个人中心->密钥管理中,找到AccessKey 和 SecretKey。然后在服务器中运行一下命令:/web/data/qshell account ak sk执行之后,用户的所有信息写入到磁盘$HOME_DIR/.qshell下面。如:root用户执行后,信息会保存在/root/.qshell/account.json文件中。如果你修改了密钥,只需要重新执行以上命令即可,配置信息将被覆盖。3.同步。终于到了这一步。qshell命令的命令有很多,同步需要用到的命令是qupload。qupload是用来将本地目录中的文件同步到七牛空间中的命令。命令格式:qshell qupload [<ThreadCount>] <LocalUploadConfig>ThreadCount:并发上传的协程数量,默认为1,即文件一个个上传,对于大量小文件来说,可以通过提高该参数值来提升同步速度。LocalUploadConfig:数据同步的配置文件,该配置文件里面包含了一些诸如本地同步目录,目标空间名称等信息。ThreadCount是可以忽略的参数,默认一个文件一个文件的上传,因为是要备份数据库和本地网站文件,文件较少且大,顾保持默认就好。LocalUploadConfig为配置文件,配置文件中可带的参数共有21个,先森选用了其中的7个。详细的配置介绍请看这里。先森选用的参数如下,将以下内容保存到文件‘localupload.cnf’:{   "src_dir"            :   "/web/data/liuxx_bak",   "bucket"             :   "liuxx-backup",   "ignore_dir"         :   true,   "overwrite"          :   true,   "check_exists"       :   true,   "check_hash"         :   true,   "rescan_local"       :   true}解释,*为必须项:"src_dir":"/web/data/liuxx_bak",  # 本地备份路径*"bucket":"liuxx-backup",    #同步数据的目标空间名称,可以为公开空间或私有空间*"ignore_dir":true,    #远程同步到七牛时,忽略本地路径"overwrite":true,    #覆盖同名文件"check_exists":true,    #上传前检查是否有同名文件"check_hash":true,    #在check_exists设置为true的情况下生效,是否检查本地文件hash和空间文件hash一致"rescan_local":true,    #检测本地新增文件并同步最后,远程同步到七牛云储存的命令为:/web/data/qshell qupload /web/data/localupload.cnf可以执行一下上面的命令,检查是否能够成功同步。先森同步到七牛云的效果:同步效果三、定时备份同步准备工作已经完毕了,现在所需的就是每天的自动备份及远程备份了。执行crontab -e添加以下内容:00 02 * * * /web/data/liuxxbak.sh30 02 * * * /web/data/qshell qupload /web/data/localupload.cnf >/dev/null 2>&1凌晨两点执行本地备份,凌晨两点半执行远程备份。当然,你也可以将qshell命令加到liuxxbak.sh脚本的最后,那么只用添加第一条计划任务就可以了。四、七牛十五天循环备份七牛云储存免费的存储空间大小是10G,如果你的七牛云存储空间有点紧急的话,可以继续本操作。这时候,点击‘生命周期’,添加规则,我们可以设定删除15天前的文件。先森设定的规则如下:删除15天前的文件当然,如果七牛云存储的剩余空间很足的话,可以保留更多天,这样可供回退的版本就更多了。总结无论是用虚拟主机,还是使用云服务器,有一套备份的机制是很重要的。如果像先森一样,主站使用的是虚拟主机,也有另外的云服务器的话,这套备份方案改改,也可以把自己虚拟主机的数据库一起备份起来嘛。

解决网页搜索框无法使用手机输入法中的“搜索”按钮的问题

WordPress技巧解决网页搜索框无法使用手机输入法中的“搜索”按钮的问题

标签:, | 8 条评论 | 2017-07-05

先森之前就发现,“成航先森”在手机上访问使用搜索时,无法使用键盘上的“前往/搜索”按钮。点击没有反应,必须要点击网页中的搜索按钮才行。之前因为懒得管,就一直没有解决这个问题,这两天丑了点时间研究了一下,最后发现这个问题是分阶段的。“前往”和“搜索”按钮的问题手机中的输入框,有时候右下角是“前往”,而有时候是“搜索”。先森起初以为是因为先森的搜索框显示的是“前往”,所以无法使用这个按钮。后来先森发现,写一个简单的html页面,通过手机访问,无论是“前往”还是“搜索”,都不会影响点击该按钮的效果。不过让键盘显示“搜索”还是要显得专业一些。实现方法:<input type="search">搜索框的type必须是search。“前往”与“搜索”点击输入法中的“搜索”没有反应的原因上面所说的,按键上无论显示什么文字,都不会影响功能。然而先森的网站中,点输入法上的按钮是死活没有作用,所以原因还是要继续找。先森本以为是某个JS代码导致了这个问题,所以先森把首页保存到本地,一个个的删除尝试。花费了大概一个小时的时间,终于,先森确认跟JS代码没有任何关系。最后无意间删了一个<base>标签,结果发现竟然可以了,手机输入法点击“搜索”可以搜索了。罪魁祸首就是它:<base target="_blank">这个base标签的作用是网页中的每个链接都默认为新标签页打开,好不好用就不做累述了。删除与恢复删除这个<base>标签就可以实现使用手机输入法中的搜索按钮效果,但是我们想要的新标签页打开网页就没有了。先森参考网上的JavaScript脚本,新写了一段js代码,从而实现相类似的效果。需要注意的是,不能简单的给每个<a>标签都增加上新标签页打开,因为有些地方不适合新标签页打开,比如页码,每点一次下一页就新开一个窗口,访客要疯了吧?所以,当<a>标签已经设置了本页打开的需要排除,其他<a>标签才加上_blank属性。把下面的JavaScript代码放在head某处:<script type="text/javascript">$(function(){    $('body a').each(function(){        if($(this).attr('target')!=='_self'){        $(this).attr('target','_blank');}    });});</script>那么,你的网站搜索框能用手机的搜索按钮吗?

WordPress:WPJAM BASIC插件与anylink冲突

WordPress技巧WordPress:WPJAM BASIC插件与anylink冲突

标签:, | 4 条评论 | 2017-02-20

很久没有管过博客了,最近发现博客里的跳转链接全都失效了,点击只能跳转到首页。通过审查元素查看,是从末尾不加斜杠的链接301跳转到加个斜杠的链接。无论如何,结局就是跳转失败了。周末一个闲着无事,就想着解决一下这个问题。通过漫长的排除,发现问题是安装了WPJAM BASIC插件的问题,停用了之后跳转链接就正常了。WPJAM BASIC插件不得不吐槽一下水煮鱼,之前用这WPJAM七牛镜像存储,有一天发现可以升级了,随手就点了升级,结果升级后发现,要启用这个插件,还需要另外装一个WPJAM BASIC。然后装了发现启动不了,后来看报错是插件里的函数和先森主题的函数冲突了,先森注释了自己主题里的函数后,插件可以启动了。因为先森有保留函数来源的习惯,所以先森检查那个冲突函数发现,这TM就是从水煮鱼网站拷贝的函数。这个插件果然是各种功能的集合,但总有一种强制消费的感觉,隐隐让人不爽。anylink这个插件先森自建立博客以来就一直在用了,用着已经习惯了,虽然有代码版但也不想去弄了,觉得还是有操作页面的比较实用。先森更是用anylink与张戈博客的跳转美化界面做了结合,还专门发布了一篇文章:WordPress为anylink插件外链跳转添加漂亮的跳转页面所以,先森对于anylink这个插件是非常难以抛弃的。但是很棘手的是,为什么WPJAM BASIC插件会与anylink插件起冲突,如何解决。而先森已经在七牛图片处理样式的正确使用方式一文中提到,主题已经添加了七牛CDN代码版。经测试取消启用WPJAM BASIC插件后,对博客使用七牛并不会产生什么问题,所以,只能抛弃WPJAM BASIC了。

Linux开启telnet远程登录服务

经验杂笔Linux开启telnet远程登录服务

标签:, | 0条评论 | 2016-12-01

首先说明,telnet登录服务器是一种不安全的远程登录方式。先森之所以会需要telnet登录服务器,是因为有时候需要对OpenSSH进行配置修改、漏洞修复、升级等操作时,需要telnet作为保险,以免误操作导致无法登录服务器。基础先科普一点基础。telnet:是telnet的客户端,除了Linux可以安装外,Windows默认也是安装了的(先森是win7系统,win7以下的不知道是否自带)。telnet通常还可以检测服务器端口是否开启。telnet-server:这才是可以开启远程登录的服务端软件。部署系统:CentOS 6.8 x641.直接yum安装telnet-server:yum install -y telnet-server2.守护进程。telnet需要依赖超级守护进程xinetd启动,若为安装还需要先安装。yum install -y xinetd3.启动telnet:chkconfig telnet onservice xinetd restart4.允许登录:echo 'pts/0' >>/etc/securettyecho 'pts/1' >>/etc/securetty“/etc/securetty”文件允许你规定“root”用户可以从那个TTY设备登录。pts是pesudo tty slave,是伪终端的slave端。5.开启防火墙端口。请先确保已经关闭SElinux。在防火墙配置文件/etc/sysconfig/iptables中,复制22端口那行粘贴在其下面,开启23端口,保存并重启iptables。-A INPUT -m state --state NEW -m tcp -p tcp --dport 23 -j ACCEPTservice iptables restart登录telnet登录有很多方式:方式一:Xshell不登录服务器,直接打开一个标签,输入telnet + IP即可。Xshell直接登录方式二:服务器安装telnet,也通过telnet + IP登录。yum install -y telnettelnet 127.0.0.1    #技巧,可以本机测试方式三:通过Windows的CMD命令行登录。WIN+R键输入cmd,回车进入cmd命令行终端。也是输入telnet + IP即可登录。Windows登录问题有时候登录时,即使密码输入正确,也提醒login incorrect(登录错误),如上图。这种问题可能是telnet登录的伪终端pts正好不在你写的/etc/securetty里面。这时候可以在服务器端通过查看日志,确定使用的是哪个pts。tail -f /var/log/secure查看日志上图可以看到,红框中显示“tty 'pts/2' is not secure(tty的'pts/2'是不安全的)”,所以只需要将'pts/2'加入到/etc/securetty即可。echo 'pts/2' >>/etc/securetty关闭论安全,还是OpenSSH更为安全,所以在对OpenSSH操作完后,一定记得关闭telnet与防火墙23端口。chkconfig telnet offservice xinetd restartsed -i '/23/ s/^/#/' /etc/sysconfig/iptablesservice iptables restart偷懒如果不想一步一步的操作安装telnet-server的话,可以把下面的命令复制,到服务器上粘贴等待完成即可。也可以写成脚本。yum install -y telnet-serverchkconfig telnet onecho 'pts/0' >>/etc/securettyecho 'pts/1' >>/etc/securettyservice xinetd restartsed -i 's/^-A\(.*\)22 \(.*\)/&\n-A\123 \2/' /etc/sysconfig/iptablesservice iptables restartiptables -L -n

WordPress Begin主题一个图片加参数无法打开的问题解决

经验杂笔WordPress Begin主题一个图片加参数无法打开的问题解决

标签:, | 2 条评论 | 2016-11-10

先森用腾讯云搭建了一个“刘某某博客”,使用的是Begin主题,结果发现前台的缩略图有些无法打开,一个大叉叉在那,很不好看。图片无法打开查看链接,是在图片后面加了参数,目测是裁剪图片宽高的。直接打开这个图片链接,显示以下错误:图片错误The following error(s) occured:GD Library Error: imagecreatetruecolor does not exist - please contact your webhost and ask them to install the GD library英语不好,百度翻译一看,什么GD库错误,需要安装GD库。解决百度了一下什么是GD库,知道了是和PHP有关的。最后一番搜索之后,找到了解决方法:yum install -y php-gdservice php-fpm restart也就是安装php-gd,然后重启PHP即可。php的配置倒是不需要修改了。

Nginx出现413 Request Entity Too Large错误解决方法

WordPress技巧Nginx出现413 Request Entity Too Large错误解决方法

标签:, | 2 条评论 | 2016-10-28

先森托女票的福,得到一枚腾讯云的服务器,在服务器上用的web服务器是nginx,结果在WordPress后台上传主题的时候直接报错413,有点懵。百度了下解决办法,这里做个记录。解决办法打开nginx主配置文件nginx.conf,一般在/usr/local/nginx/conf/nginx.conf这个位置,找到http{}段,修改或者添加client_max_body_size 2M;默认配置文件中没有该字段,需要添加。记得分号一定要添加。nginx.conf添加字段平滑重新加载Nginx配置文件:./sbin/nginx -s reload

官方微信
返回顶部