*Original Date: April 8th,2019

经过两三天的折腾,从 Linux 结构及指令,到 LNMP 框架搭建,再到数据库的配置,最后端口转发 + 内网穿透,博客终于成功上线!在此将部署过程及踩过的坑记录下来,一方面是纪念,另一方面希望能够后来人提供一点帮助。

从想法到实现

第一代博客采用树莓派 3B + 构建。当初作为寒假的练手项目,入手了树莓派 3B + 以及智能小车所需的配件。由于时间没有规划好,最后在寒假前匆匆完成了小车硬件的组装,智能控制部分(wifi 遥控、红外循迹等)没能够完成。开学只带了树莓派的板子。闲置良久,想利用起来,刚好又有搭建大学生竞赛信息服务网站及公众号的想法,就开始着手构建基于树莓派的服务器,先从 Wordpress 搭建博客开始。

LNMP+Wordpress 框架搭建

L=Linux
N=Nginx
M=MySQL
P=PHP

LNMP 架构是广泛使用的服务器架构。与此类似的还有 LAMP,A=Apache。Nginx 与 Apache 作为目前市场上高度流行的两种服务器程序,网络上已经有非常多的相关的文档和教程。
关于 Nginx 与 Apache 的选择,这里只简单做个介绍:
Nginx:资源占用低,性能好,配置简洁,功能有限。
Apache:相对 Nginx 占用资源要多一点,不过插件和文档更丰富,设置某些功能的时候会方便一点。
具体两者的区别和测试可自行百度。刚开始考虑到树莓派的配置以及访问量,我选择使用 Nginx。具体部署过程此处不再赘述。
设置好 Nginx,开始配置 MySQL 和 PHP。安装 php 的时候开始遇到了一些小波折:网络上大部分教程都是基于 php5.0,安装包的时候都是类似于

sudo apt-get install php5-fpm

这样的,但在实际安装过程中会报错,说找不到这个名字的包。这个还算好解决,又搜索了几个教程,发现最新的版本为 php7.0,根据新版本 php 的教程按部就班做就基本 OK 了。

WordPress 部署比较简单,但是对于新手而言,需要熟悉 Linux 基本指令:cd 目录切换,wget 文件下载,tar\zip 解压等。但是相对于有很多依赖项的或者配置繁琐的程序,Wordpress 安装其实已经算很简单了。

第一个大坑:MySQL

安装 MySQL 一马平川,配置数据库,创建账户的时候也没有任何问题。然而第二次开始使用时,却发现刚刚设置的账户登不上去了?!! 翻来覆去又重装了几遍 MySQL,排除了账户密码错误、屏蔽了远程连接等可能性。最后一直停留在报错说登陆失败。无论是测试用户还是 root,有密码还是无密码,统统失败。Wordpress 里面连接数据库也一直失败

这时怀疑不是数据库的问题,开始怀疑是 Nginx 或者 php。简单看了一下 Nginx 竟然无法启动?根据报错查了下日志发现与 php 的什么 fpm 和 fastcgi 通信有问题,又百度来百度去,改了下配置文件,把 fastcgi 通信的问题解决了。重启 nginx 服务又发现 80 端口被占用,又是一通百度。。。网上的解决方案无非两种:一种是 nginx 服务已经启动,直接另外用命令启动 nginx 服务必然会导致上述的问题。另外一种就是其他程序占用 80 端口,找到进程 kill 掉即可。然而我的问题并不是上面两种,无限郁闷 ing。。。

但是测试网页的时候却发现网页可以正常显示??? 又细查了一遍发现不知道什么时候又装了 Apache。。。又比 Nginx 先启动,自然会占用做网络服务器会用到的 80 端口。突然想起来安装 MYSQL 的时候好像弹出了个窗口。。。一阵哭笑不得。

然而经过一晚上折腾,MySQL 这个问题依然没有解决。迫不得已,决定第二天尝试 SQlite。

第二个大坑:PDO Driver

在决定弃用 MySQL 后,毅然卸载了 MySQL 并删除了残留,全新安装 SQLite。这里简单介绍一下两者的区别:

MySQL:功能强,效率高,支持多用户,安全性好,但是占用资源较多

SQLite:精简版的 SQL,没有多用户概念,文件方式存储,方便迁移,占用资源少,运行快。

满怀期待装好了 Sqlite,配置好了数据库,以及 Wordpress 配置文件 wp-config.php,没想到进去 Wordpress 报错。

PHP PDO Extension is missing

百度了下,说是 php 对 sqlite 的支持没有打开。需要到 php.ini 把对应属于 sqlite 的扩展启用,把被注释的部分提出来。

一顿操作过后,进 Wordpress,又报

PHP PDO Extension is not loaded

又是一顿猛肝,身心俱疲(无限查百度,查必应,查 StackOverflow,查官方文档)。一开始是看到有人说 php 扩展的目录默认是被注释的,看了下的却如此,就把改掉了。没想还是出错

;extension path= ../

当时的代码大致如此。改了之后还是没效果,又继续查。查到晚上两点困了累了,遂罢。

第二天起床继续肝。早上起来和熬夜的效果就是不一样,没两下就突然想起来,被我解除注释的,php 扩展路径的那一行,它代表的是配置文件所在目录的父文件夹。但是他那个父文件夹底下根本就!!没有!!扩展名为 so 的扩展库文件!!!

所以!是扩展目录问题了。

但是他的扩展目录又到底在哪儿呢?百度的结果是说不同机子不一样。采用源代码编译安装的时候可以指定路径,但是我是用 apt 安装的。接下来是疯狂的找 php 扩展所在目录了。把百度的几个目录找了一遍,,又在其他地方又 php 字样的目录找了一遍,可算给我找到了。回去把 php.ini 一改,重启。哈!终于成了!

第三个大坑:外网访问

博客能够在内网正常访问了,折腾了两天总算有了成果。但是作为一个服务器只能在内网访问就没多大意思了。最终要做成的网站是要给人看的嘛。于是开始找树莓派外网访问的方案。大概有四种:

  1. 使用路由器做端口转发 + 花生壳做动态域名解析。但是我手头用的不是路由器,是手机热点。放弃。
  1. 树莓派安装花生壳 + 花生壳内网穿透服务。内网穿透付费且评价不是很好,放弃。
  1. 使用 frp 内网穿透。但是需要有另外一台有公网 IP 的 VPS。这还不如直接买一台阿里云的服务器呢。放弃。
  1. 使用 Ngrok 做内网转发。Ngrok 免费且评价还不错,就决定是你了!

Ngrok 的安装部署不难,简单来说就是注册账号,树莓派上安装 Ngrok,然后在树莓派上启动,与账号绑定。他会给你分配一个二级域名,打开这个域名,虽然有点慢,因为服务器在美国,但是成功地跳转到了我的博客主页!

但是接下来的测试中发现,通过那个二级域名会指向我博客的主页,这时候点击页面上的任何连接都会跳转到我的树莓派的内网 IP。很明显,网站的博客的页面上的链接都是绝对地址,这也是为什么 Wordpress 的设置里面有一项是让你填写自己的网站的域名。这个比较好办,用相对路径就可以了。Wordpress 插搜索 Relative URL,就可以找到将全站链接转换为相对链接的插件。

考虑到树莓派性能有限,网站在内网访问已经有点慢了,通过外网访问会更慢。于是就对站点进行了一些优化,速度大幅提升,外网访问的速度也可以接受了。具体教程可参见另一篇博文。

大功告成

至此,FXZ‘s Blog 部署完成,正式上线!

所谓努力与收获成正比自有它的道理,非常庆幸,也非常感谢自己坚持了下来。在这短短的两三天时间里,克服了众多困难,拒绝了数次开黑邀请。所幸结果是令人欣慰的,特此写下这第一篇博文。2019 年 4 月 8 日晚于重庆