把博客从drupal转移到wordpress上来以及开始用Digital Ocean的VPS

14年一整年,我把博客基本都放在教研室的那台ubuntu上面跑,但是学校这边的DNS常常出现问题导致网站不太稳定,而且教研室是办公环境供电+网络常常断掉,所以一直想有空搬一搬。12月份的时候以服务器被黑为契机,我终于开始打算搬了。

本来打算购买Linode的日本机房VPS的,无奈Linode本身只支持信用卡,而我还是研究生没法申请双币卡。借了前辈的信用卡充值了50USD之后,发现还要上传证件啥的,觉得太麻烦了,于是转向购买Digital Ocean的旧金山机房的vps。我用的Digital Ocean的1Gx1核的VPS外加自动备份,每个月十多刀吧,速度肯定没有Linode快。连ssh的话输入命令可以明显感觉到延迟,网页访问速度也算是一般吧,我试过网页批量浏览图片的速度在150K左右,总体来说我还是比较满意的。把nginx的服务器一套装下来内存维持在500M以下,所以内存还是够用的,总体来说我还是比较满意的。

然后继续说一说我把博客从drupal转移到wordpress的原因吧。最主要的原因还是wordpress是专门为博客定做的,而drupal主要面向cms,而且wordpress更轻量级。在数据库里,基本的wordpress只有11张表,这是drupal远远达不到的简洁。而且还有各种丰富的插件,主题和小工具,我把wordpress改成现在这个简洁的样子只花了一天时间,基本上能想到的功能都能找到现有解决方案。而原来为了在drupal下弄出一个基本的blog效果的界面,费了我很长时间+精力,折腾了很长时间。

于是接下来我就把我搭建wordpress遇到的问题和解决方法写一写吧。

1、nginx下做防盗链

        location ~* \.(jpg|gif|png|swf|flv|sma|wmv|asf|mmf|zip|rar|7z|doc|psd|jpeg|docx|pdf|ppt|pptx|bt|torrent|txt|sql|mp3)$
        {
          root /home/qsalg;
          valid_referers none blocked *.qsalg.com qsalg.com;
          if ( $invalid_referer )
          {
                rewrite ^/ http://qsalg.com/hotlink.png last;
          }
        }

我把提示盗链的图像hotlink.png放在了根目录,nginx的location写法里,~*表示不区分大小写的正则匹配,上面的规则应该是不言自明的。需要注意的是在location里面一定要加上root,否则来自自己网站的合法资源请求会无法找到对应的资源位置。

但是这样做还是不够,因为盗链的url被rewrite到了http://qsalg.com/hotlink.png之后,它还是会再一次的进入上面的location中,如此循环。我们显然不想这样,于是针对hotlink.png资源我们专门做一个=的location规则,这是最优先级别的。

 location =/hotlink.png
{
root /home/qsalg;
}

这样如果别的网站非法引用本站的资源就会被从定向到下面的图片了:

2、数据库上传以及安全
我使用的是phpMyAdmin来管理数据库的,针对本站点建立一个新的用户,新用户的密码要随机生成(写到wp-config.php中即可,并不用记住),只给自己的数据库权限,绝对不使用root来访问数据库。
安装好phpMyAdmin时访问提示:Cannot start session without errors。这个原因stackoverflow上说了是php.ini里面的session.save_path = “/var/lib/php/session”,但是我去/var/lib/php下却没有session目录,于是建立了一个session目录,chmod 777之,问题解决。
在phpMyAdmin里面上传sql数据时遇到了上传大小的限制,在/etc/php.ini中的post_max_size和upload_max_filesize两个都要改大即可解决这个问题。
上传完sql数据后把phpMyAdmin移除,为了在http头中隐藏nginx版本号,在/etc/nginx/nginx.conf中把server_tokens设置为off。另外虚拟主机配置中把auto_index on注释掉,和Apache不同nginx是默认不遍历文件的,另外把nginx默认的404.html和50x.html里面包含的版本信息删掉。
但是后来发现在wordpress上传附件时如果附件大了仍然会上传失败,这个参数在/etc/nginx/nginx.conf中的client_max_body_size控制,改大该参数这个问题就消失了。
配置完成后发现passwd里面的默认的mysql用户有登录有默认shell,这里改成/sbin/nologin。
然后netstat发现默认的mysql在监听0.0.0.0:3306,这显然是不够安全的,于是在/etc/my.cnf中[mysqld]段添加bind-address = 127.0.0.1,从而不允许非本地连接。然后netstat发现mysqld在监听127.0.0.1:3306了。

3、wordpress访问瓶颈
首先肯定就是引用fonts.googleapis.com的问题,因为GFW国内是无法访问该资源的,所以用一个Disable Google Fonts的插件搞定了。(个人认为把网站的可访问性依赖到别的站点是很不好的)
然后发现登录后台速度也很卡,在chrome里面调试发现admin的头像引用了gravatar.com的资源,又来了……解决这个问题的办法是修改/wp-includes/pluggable.php,备份之,然后找到这一段改成:

if ( !function_exists( 'get_avatar' ) ) :
/**
 * Retrieve the avatar for a user who provided a user ID or email address.
 *
 * @since 2.5.0
 *
 * @param int|string|object $id_or_email A user ID,  email address, or comment object
 * @param int $size Size of the avatar image
 * @param string $default URL to a default image to use if no avatar is available
 * @param string $alt Alternative text to use in image tag. Defaults to blank
 * @return false|string `<img>` tag for the user's avatar.
*/

function get_avatar( $id_or_email, $size = '96', $default = '', $alt = false ) {
if ( ! get_option('show_avatars') )
return false;
if ( false === $alt)
$safe_alt = '';
else
$safe_alt = esc_attr( $alt );
if ( !is_numeric($size) )
$size = '96';
$default = includes_url('images/avatar.png');
$avatar = "";
return apply_filters('get_avatar', $avatar, $id_or_email, $size, $default, $alt);
}
endif;

这样wordpress引用第三方的资源问题就解决了,速度恢复正常。

4、定制一些小地方
我用的wordpress自带的Twenty Thirteen主题,把所有不简洁的地方去掉了,然后装了7、8个大众喜闻乐见的插件,把侧边栏的功能定制了一下,基本就算完工了。但是我无论如何都想在每个文章标题那里显示该文章的浏览次数是多少,这个似乎只能自己手动改,我找了一下这个功能是可以由WP-PostViews提供。在chrome下查看了一下html发现该处应该在

<div class="entry-meta">...</div>

里面,那么就去主题里面找这个地方咯。最后在Twenty Thirteen的content.php里面找到了,立马改成了:

                <div class="entry-meta">
                        <?php twentythirteen_entry_meta(); ?>
<?php /*modified by gouchaoer--20150117*/ ?>
<?php if(function_exists('the_views')) {echo "<strong>"; the_views(); echo "</strong>"; } ?>
                        <?php edit_post_link( __( 'Edit', 'twentythirteen' ), '<span class="edit-link">', '</span>' ); ?>
                </div><!-- .entry-meta -->

这样文章的浏览次数问题就解决了。

5、footer的修改
原来的footer里面的“自豪的使用WordPress”字又大又不好看,在chrome看了一下应该在

<div class="site-info">...</div>

里面。当我正准备去网站源码里找对应的php文件时,我惊奇的发现原来后台里“外观”——>“编辑”里面可以直接修改php源代码,上面的修改content.php可以不用ssh里面vim改这里就行了,真是方便……我马上找到footer.php改成了:

			<div class="site-info">
				<?php do_action( 'twentythirteen_credits' ); ?>
<?php
/** 另外设置footer
*				<a href="<?php echo esc_url( __( 'http://wordpress.org/', 'twentythirteen' ) ); ?>" title="<?php esc_attr_e( 'Semantic Personal Publishing *Platform', 'twentythirteen' ); ?>"><?php printf( __( 'Proudly powered by %s', 'twentythirteen' ), 'WordPress1' ); ?></a>
*/
?>
<div style="text-align:center">
博主ID:gouchaoer</br>
学校:电子科技大学(研究生在读)</br>
专业:计算机视觉</br>
Email: gouchaoer(a.t.)gmail.com</br>
powered by <a href="http://wordpress.org/">wordpress</a></br>
<div>
			</div><!-- .site-info -->

现在看起来效果还不错。

6、列一下自己使用的插件吧
a,Baidu Sitemap Generator,SEO不解释
b,Disable Google Fonts,禁止访问google fonts
c,SyntaxHighlighter Evolved,插入代码高亮,很好用,完爆drupal
d,W3 Total Cache,比起WP Super Cache哪个好我也不知道
e,WP-PostViews,统计页面访问次数的,前面定制每篇文章访问次数用到的
f,WP-UTF8-Excerpt,wordpress的首页默认会把文章显示完,但是我只需要他摘取几行就行了
g,WP Statistics,详细的统计网站访问数据的插件,然后数据库里多了好几张MyISAM的表
h,多说,用来支持第三方登录的,直接通过qq登录admin

把博客从drupal转移到wordpress上来以及开始用Digital Ocean的VPS》有1个想法

发表评论

电子邮件地址不会被公开。 必填项已用*标注