最近打算搭个论坛,看了一圈最后决定用好看开源又轻量,且社区比较活跃的Flarum。因为我的机子是跟朋友合租的,也为了图方便,所以打算安到OneinStack开的虚拟主机里。不过Flarum的官方文档并没有给出相关的说明,网上有针对性的教程也不太好找,而我在安装过程中也确实遇到了部分问题,所以写了这篇文章记录一下安装和配置的过程,并附上自己觉得比较好用的插件,一来给以后的自己提供参考,二来也希望能给遇到同样问题的人以帮助。

部署环境准备

安装OninStack

因为朋友之前已经装过了,所以我没有经历过这一步。OneinStack可以选择用apt或者yum直接安或者通过wgettar下载并解压后用./install.sh进行交互安装,第二种方式可以在官网上按需生成命令,复制粘贴就好了。按照官方文档你需要Nginx、7.1以上的PHP(包含curl,dom,gd,json,mbstring,openssl,pdo_mysql,tokenizer,zip扩展)和5.6以上的MySQL。此外,尽管官网没说,但你大概率还需要一个叫做fileinfo的PHP扩展。

安装Composer

Flarum使用Composer进行包管理,所以需要提前准备好。

1
2
3
4
5
php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');"
php -r "if (hash_file('sha384', 'composer-setup.php') === '哈希值') { echo 'verified'; } else { echo 'corrupt'; unlink('composer-setup.php'); } echo PHP_EOL;" #这个地方建议加一步哈希值校验,哈希值请查阅composer.github.io/pubkeys.html
php composer-setup.php --install-dir=bin --filename=composer	#后面的两个两个参数都是可选项,用来指定安装目录
php -r "unlink('composer-setup.php');"
mv composer.phar /usr/local/bin/composer	#可选步骤,移动composer.phar实现全局安装

Composer的服务器在国外,可以考虑换个镜像来提速。我个人比较推荐这个。 官方推荐直接改全局配置:

1
composer config -g repo.packagist composer https://packagist.phpcomposer.com

不过我只改了当前项目的,进入项目根目录然后:

1
composer config repo.packagist composer https://packagist.phpcomposer.com

安装Flarum

OneinStack默认应该装在root目录,运行:

1
~/oneinstack/vhost.sh

按照自己的需求添加一个虚拟主机。域名要记得提前解析不然SSL证书签发会出错。至于伪静态选不选无所谓,因为之后给Flarum配伪静态的时候根本用不到它生成的那个文件。 Beta期间Flarum只能创建完成后进入网站目录,执行:

1
composer create-project flarum/flarum . --stability=beta

如果在更新依赖时进程被杀(killed),可能是因为内存不足,最省事的解决方案时重启主机✓。

配置与运行

Flarum核心的本体已经安完了,不过想要建站还得再配置一下。

创建数据库

没什么特别的,注意一下字符集选utf8mb4来保证中文的显示就行了。登录MySQL执行:

1
create database 数据库名 character set utf8mb4 collate utf8mb4_bin;

Nginx配置

由于是OneinStack开出来的主机,对应的Nginx配置文件应该会在/usr/local/nginx/conf/vhost目录下,文件名默认是网站域名.conf。用你喜欢的文本编辑器打开它,做两处修改:

  1. root:需要在原有路径后面加上/public,这是因为Flarum的页面全都位于这个文件夹下。
  2. 伪静态(rewrite):从不知道哪个版本开始,Flarum预置了包含伪静态规则的.nginx.conf文件,只需要在Nginx配置文件的server块中的任意位置把它include进去就行,比之前人工手写方便到不知哪里去了。

配置完成的文件大概长这样:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
#以我的配置文件为例

server{
	listen 80;
	listen 443 ssl http2;
	#……省略n行
	root /data/wwwroot/forum.pony4us.com/public;	#这是第一处改动
	if ($ssl_protocol = "") { return 301 https://$host$request_uri; }
	if ($host != forum.pony4us.com) {  return 301 $scheme://forum.pony4us.com$request_uri; }
	include /usr/local/nginx/conf/rewrite/flarum.conf;	#这是OneinStac自动生成的伪静态规则不用管(开虚拟主机的时候如果选了伪静态就会有,删了也行
	
	#……省略n行
	
	include /data/wwwroot/forum.pony4us.com/.nginx.conf;    #这是第二处改动
}

修改完毕后检查配置是否有误并重载:

1
2
3
nginx -t
#确认无误后执行
nginx -s reload

引导初始化

在浏览器里访问你的网站地址,并根据引导初始化你的论坛。建议给填一个表前缀方便日后管理。 第一次访问大概率会因为权限不足而遇到错误提示你文件夹写入权限不足,只需要加权即可:

1
2
3
chmod -R /data/wwwroot/目录/public/assets /data/wwwroot/目录/storage
#可能还需要更改用户
chown -R www:www /data/wwwroot/目录/public/assets /data/wwwroot/目录/storage

注意因为是OneinStack开的虚拟主机,改用户的话一定要改www:www,官方文档的www-data:www-data不适用(我主要就是在这里被坑了

论坛优化

论坛搭建已经结束了,不过还可以做几处改动来优化体验。

中文搜索

Flarum本身没有对中文搜索做优化也不支持标题搜索,之前国人开的中文版或者中文搜索插件也都已经弃坑,不过还好MySQL从5.7开始支持中文全文索引(FULLTEXT),只需要重建索引即可。 首先修改my.cnf(有的是mysql.cnf),加入:

1
2
[mysqld]
ngram_token_size=2

之后重建全文索引:

1
2
3
4
5
6
7
--forum_是我的表前缀
ALTER TABLE flarum_posts DROP INDEX content;
CREATE FULLTEXT INDEX content ON `forum_posts` (`content`) WITH PARSER ngram;

--下面这两行新增了对标题的搜索
ALTER TABLE flarum_discussions DROP INDEX title;
CREATE FULLTEXT INDEX title ON `forum_discussions` (`title`) WITH PARSER ngram;

Done!

添加插件

Flarum仅仅只提供了一个基本的“脚手架”,很多功能都需要社区插件的支持,你可以到官方论坛Flagrow寻找你需要的插件。我目前正在使用的有三十个左右,此外还有许多正在测试以观察它在我的论坛内的运作效果,我计划把我的composer配置以及针对Flarum的各种hack扔到GitHub上。 这里姑且贴出几个(我觉得)比较基础,一定要上的:

1
2
3
4
5
6
csineneo/lang-simplified-chinese	//台湾老哥的简中语言包(有很多台湾习惯用法)
csineneo/lang-traditional-chinese	//台湾老哥的繁中语言包(台湾正体)
flagrow/sitemap	//sitemap生成器,需要改nginx配置,稍后会讲
squeevee/flarum-ext-fancybox	//fancybox插件
clarkwinkelmann/flarum-ext-emojionearea	//Emoji选择器
fof/links	//用于在导航栏添加链接

Flarum插件也同样使用Composer进行包管理,你可以通过composer require 插件包来安装插件,通过composer remove 插件包来卸载插件。卸载插件前记得先在后台关闭插件并单击卸载来清楚插件在数据库和本地的数据与缓存。 与此同时,Flarum正在测试一个叫做Bazaar的市场插件,期望未来通过插件市场进行插件的安装与卸载。这个插件现在已经可以试用了,不过我总感觉它不靠谱,所以一直在用Composer,如果你胆子比较大可以尝试一下。

Sitemap配置

把比较特殊的Sitemap插件单独提出来写一下。在使用Nginx作为网页服务器时,访问/sitemap.xml可能会收到来自Nginx的404报错,这一般是托管规则配置有误导致的。可以尝试在.nginx.conflocation / {}块下加上一行location = /sitemap.xml { try_files $uri $uri/ /index.php?$query_string; }来解决这个问题。 更改后的文件大概长这样:

1
2
3
4
location / {
	try_files $uri $uri/ /index.php?$query_string;
}
location = /sitemap.xml { try_files $uri $uri/ /index.php?$query_string; }

修改后检查配置无误并重载使配置生效即可。

其他优化

还有一些不是必须但也很有用的优化方法,大部分都需要更改Flarum的核心文件,如果有时间(高考完以后吧)我会整理一下扔到GitHub上。 希望我不会咕~

尾声

我的第一篇迫真技术博文到这也就结束了,实在惭愧,实力所限并没有写多么深入的东西,不过真正独立完成一篇技术文的我还是挺自豪的。如果上面的某几行文字给你带来了帮助,那这篇文章的价值也便经由你我而被具现了,我想这大概就是技术类文章的意义之一吧。最后臭不要脸地推介一下我的Pony4us Forum,一个为马迷而生的MLP同人论坛。有谁会不喜欢小马呢!