最近闲起来了(约稿的可以约起来
同时有朋友也想自己搭建一个博客玩玩,所以就做了这个教程供大家参考
如果按照步骤来,顺利的话半天之内就能搭建完成
0.申请域名(可选)
详细步骤看2.1
如果申请的是免费的域名,那么建议先注册好域名再进行操作,因为本文用到的免费域名申请时间不确定(本次是1个多小时就申请上了);而直接用花钱的域名则没有这个问题,先买vps或先买域名都可以
1.服务器 vps
第一步就是要有自己的服务器,大家可以根据自己的需求选取合适的vps。
不同的CPU数量、运行内存、存储大小、带宽的价格也不同;有些是按小时、月、年进行收费,这也是需要注意的;此外,有些提供免费更换ip功能,有些则需要付费更换,这一点也比较重要。
现在假设大家已经有自己的vps,默认操作系统是CentOS7或CentOS8系列,如果是更低的版本还是先升级一下吧
这次我用5美元月费的vps进行演示,1G运行内存+30G存储空间+每月1T流量(不打广告所以就不说是哪个vps商
有时候分配的服务器ip不可用(被中国大陆防火墙屏蔽了),所以要先检测一下,进入tool大全的ip可用性检测网站,输入自己服务器的ip和端口(默认ssh一般是22)
如果检测结果如上图所示,说明不可用,则需要更换ip;如果显示均为可用,则可以进入下一步
既然ip可用,我们就可以开始工作了。首先要有ssh工具,这里我用xshell进行演示(它有免费版本,输入邮箱就能下载)。ssh工具是连接到服务器的工具,即从我们自己的设备上(电脑、手机等)连接到服务器并对其进行操作的一种工具),类似于远程控制,不过在这里我们控制的不是其他人的设备,而是自己的服务器
下载安装好以后,点击新建会话,在主机那里输入你的服务器ip,然后点击连接
用户名默认为root,密码则是复制粘贴服务器的密码
若想服务器不被破解或入侵,就要做好安全性设置
①及时安装安全更新
什么系统都很可能会有漏洞,而及时安装更新能够降低被入侵的风险,这里启动自动更新,输入以下这行命令并回车(下同)
yum install yum-cron -y && sed -i 's/download_updates = no/download_updates = yes/g' /etc/yum/yum-cron.conf && sed -i 's/apply_updates = no/apply_updates = yes/g' /etc/yum/yum-cron.conf && systemctl enable yum-cron.service && systemctl start yum-cron.service
②安装防火墙服务(有些CentOS系统连防火墙都没有……),如果自带firewalld的也无妨,该命令不会影响已有的功能
yum install firewalld -y && systemctl enable firewalld && systemctl start firewalld
③修改ssh端口(可选):因为默认是22端口,为避免其他人尝试破解,可以改成其他端口,这里设置为404,你也可以设置为你想要的其他端口(除80、443以外的都行,这两个端口是建站要用的)
sed -i 's/#Port 22/Port 404/g' /etc/ssh/sshd_config && sed -i 's/Port 22/Port 404/g' /etc/ssh/sshd_config && service sshd restart && firewall-cmd --zone=public --add-port=404/tcp --permanent && firewall-cmd --reload && exit
④将端口改成你修改后的端口(有③才有④,即404),重新进行连接进入服务器,这时候你再用22端口进行ssh连接是连不上的
⑤创建密钥并只允许密钥登录(可选)
一般来说,做完以上三步以后服务器就比较安全了,想更安全,就禁止用密码登录,而只能用密钥
ⅰ建立密钥对(可用shift+insert键粘贴密码,或右键粘贴
ⅱ安装密钥,设置好密钥权限,修改sshd设置并重启服务
cat .ssh/id_rsa.pub >> .ssh/authorized_keys && chmod 600 .ssh/authorized_keys && chmod 700 ~/.ssh && sed -i 's/RSAAuthentication no/RSAAuthentication yes/g' /etc/ssh/sshd_config && sed -i 's/PubkeyAuthentication no/PubkeyAuthentication yes/g' /etc/ssh/sshd_config && systemctl restart sshd
ⅲ下载私钥到本地
yum install lrzsz -y && sz .ssh/id_rsa && exit
ⅳ重新连接服务器,这次用密钥来登录,从本地里导入刚刚下载的文件,密码与之前创建时的相同,无密码则直接确定进行连接
ⅴ成功进入服务器,这时可以取消密码登录,只允许密钥登录(请保存好自己的密钥
sed -i 's/PasswordAuthentication yes/PasswordAuthentication no/g' /etc/ssh/sshd_config && systemctl restart sshd && exit
这时再重新登录,就会发现已经无法用密码登录,而只能用密钥登录,非常安全!
安装面板,其实是为了更方面操作,大家应该都习惯了可视化的系统,对于要成天输入命令的终端可能并不太喜欢,在这里用的是aaPanel
yum install -y wget && wget -O install.sh http://www.aapanel.com/script/install_6.0_en.sh && echo -e "y"| bash install.sh && rm -rf install.sh
运行成功后选取面板登录地址,用ctrl+insert快捷键进行复制,或右键复制,然后粘贴到浏览器进行访问
浏览器会提示网站不安全,这是正常的,照样访问就好(因为其设置的ssl证书是自带的,跟ip服务器不符,会提示不安全,后面的步骤会教大家怎么使面板绑定域名并设置对应的ssl证书)
输入帐号和密码登入面板
进入面板后,会让我们安装一些软件,我们只选nginx即可
可以直接关掉不管它,它会继续安装;我们打开左侧的App Store,搜索docker,安装Docker Manager
继续关掉不管它,打开左侧的Security,删掉没在用的端口号,如22、21等等,添加443端口,并备注https。同时可以打开顶部的Turn on to Block ICMP,减少黑客破解的风险
打开左侧的Setting,随自己心意修改一些东西,非常建议修改面板端口,默认的端口总是不那么安全(除80、443(跟网站相关),25、110、143、465、995、993、587(跟邮箱功能有关,如自己不用可不考虑),和自己的ssh端口外,其他端口都能选
修改完成后面板的访问地址就会变成 https://你的ip:面板端口/面板路径,如果忘记了,也没关系,在ssh里输入bt 14则可看到面板地址、帐号和密码
需要监控和记录服务器运行情况的,可以打开左侧的Monitork开启监控(一般没什么必要,只会稍稍影响服务器性能以及需要一些存储资源为储存记录)
然后我们就等插件安装好,点击左上角ip旁边的小红框看目前进度如何
ⅰ.安装Linux Tools插件,与前面安装docker的方式相同
打开该工具的设置,可修改虚拟内存大小、服务器时区、服务器密码等
其中修改时区比较重要,方便自己在对文件操作时查看文件修改时间时不需要转换成自己当地的时间
ⅱ.安装Nginx free firewall,可以降低网站被侵入、注入漏洞或病毒的风险
ⅲ.安装Log cleanup,可以用来清理系统日志
每次要对插件进行操作的时候,都需要打开面板的App Store找到对应的插件,这样很麻烦,因此将它们都显示到面板主页上就方便很多了
首先打开面板的App Store,选择上方的Installed,将Display on dashboard的按钮打开
这样我们回到面板的Home,就可以在左下方看到安装的插件,点击插件就可以对其进行操作
2.建站
大家在建站的时候需要提前考虑好自己想用的是什么平台,不同的平台特色和功能不尽相同,而跨平台之间的无缝迁移的难度很大。因此一般人都是建一次之后就不会换平台,除非是从很简单、朴素的平台迁移到功能较多、显示可以很花里胡哨的平台。
这里介绍两种平台的搭建方法。分别是ghost和wordpress
说说它们各自的特点吧。
ghost:较轻型,响应速度快,比较简洁,整体设计就是主要为了写作,没有太多玩出花来的东西;因此功能也不太全,如果希望有的就得自己动手加,比如说添加评论区、添加站内搜索等等
wordpress:相对比较成熟和大型,可以将网站设计得很好看,文章的布置也是如此,它可以用到的功能和插件有很很多;但也因为较大型,所以响应速度会差一些,很多功能用不上;以及需要有数据库配合使用
我个人比较推荐用ghost,虽然功能是少了点,也没法把文章排版之类的弄得很好看,但搭建和备份起来很方便。或者你自己有看到其他比较好的平台也可以推荐推荐
当域名可用后(购买之后的那一秒,或申请免费域名有邮件通知时),可以进行域名跟服务器的绑定
访问cloudflare,注册或登录帐号,输入你的域名
添加A记录或AAAA记录:绑定服务器ip地址
name名称随自己所想
举例来说,如果填@,则绑定的域名就是independently.eu.org
如果填www,则绑定的域名就是www.independently.eu.org
其他以此类推,没绑定的域名是不会自动生效的。比如说我没有填@,填了其他,那么independently.eu.org这个域名是没有跟我的服务器ip绑定在一起的
value内容填ip地址(A记录填服务器ipv4地址,AAAA记录则填服务器ipv6地址,可以都绑定,这样会根据情况选择通过哪一个地址进行解析)
一定要是自己的服务器ip地址!初始默认的可能是域名商自己的ip地址
然后根据cloudflare的提示回到自己的域名商那里(Godaddy、Name、EU.org或其他)更改ns服务器
修改完后等待ns服务器解析和DNS解析生效,可以先去完成建站的工作,我自己大概半个小时左右就可以了(在cloudflare那里刷新看网站是否已经active激活)
cloudflare的更多进阶功能可自行摸索
打开面板左侧Website,点击Add site,输入域名,如ghost.independently.eu.org(需要提前添加好对应的A记录或AAAA记录),申请ssl证书,然后提交,然后就创建成功
如果发现网站没有申请上SSL证书,即显示Not Set(如上图所示),则点开这个Not Set进行申请
记得不要勾选强制https,否则可能会出现异常,网站循环重定向
(另外需要注意,如果在cloudflare SSL安全策略里选择了严格,是无法申请SSL证书的,需要换成弹性才行)
①拉取或更新镜像
打开面板主页左下角的Docker Manager(如果前面跳过了1.4,可以回去看看怎么设置)
按下图拉取或更新ghost镜像
②创建容器
按下图创建容器
2368, /var/lib/ghost/content不能改,填好Port Mapping和Dir mapping记得要按右边的+号才可以
数据卷路径/var/lib/docker/volumes/ghostdata ghostdata可以改成其他名称
需要注意的是确保数据卷路径内没有数据,否则将会覆盖复制,原有的数据就会被初始化(尤其是在更新容器的时候)
再重复一次,需要注意的是确保数据卷路径内没有数据,否则将会覆盖复制,原有的数据就会被初始化
创建成功,可修改容器名称方便管理(可选,单纯个人看着初始化设置的名称很长很不爽……
③新创建的平台,则正常设置信息即可
(如果绑定的是域名而不是ip,则需要完成2.4反向代理之后才能进行访问)
对于绑定的是ip:在面板security处开放端口后,用http://服务器ip:容器端口号/ghost可以进入ghost后台
对于绑定的是域名:https://域名/ghost可以进入ghost后台
有域名的好处对比明显,连接安全与否的区别!
④ghost文件和博客数据在哪?
打开ssh工具(如xshell),输入docker inspect 容器id或容器名(blog)
容器配置文件路径、ghost文件路径、博客数据路径都能看得到(把ghost文件路径复制下来)
⑤修改博客地址为对应域名或ip地址
这个是ghost的一个被诟病很久的问题:如果不指定,它会默认网站域名为http://localhost:2368,影响博客页首和页尾的跳转
打开面板左侧的Files,在上方地址栏填入ghost文件路径/var/lib/ghost,打开config.production.json进行编辑
将第2行的url修改成https://域名或http://ip:容器映射端口(跟前面创建容器时的保持一致)
改好后保存文件
⑥修改ghost主题,默认的主题应该不会太合意,因此可以根据自己的需求进行修改
打开面板左侧的Files,在上方地址栏填入ghost文件路径,上右侧搜索栏填入casper,勾选subdir,进行搜索
在搜索得到的文件夹右键添加至favorite
进入该文件夹,就可以对ghost主题进行修改了
在这里也提供我自己现在用着的主题,那么你就可以进入casper的文件夹,选择Upload上传,或Remote download直接输入下载链接下载,接着右键Unzip解压覆盖即可,可以根据自己的需求再做一些修改
⑦重启容器(修改了ghost文件后需要重启才会生效
打开面板的Docker Manager,在对应容器的Status连点两次(先停止容器,再运行容器)
或者在Docker Manager的docker status点击重启docker
ghost不像wordpress一样将自己的文件放在数据文件中,所以没办法直接在容器内更新,因此只能先更新镜像,然后创建一个新的容器,再把原有的主题和数据迁移回来
需要注意的是,如果想继续使用相同的端口号,则需要先将当前运行的容器停掉
①前两步跟2.31相同。而如果端口号和原来的不一样
(ghost文件路径、容器配置路径、数据卷路径等的获取与2.31的④相同
②主题迁移
很简单,就是将原容器的casper文件复制到新容器里
③数据迁移
有两种方法,一种是将原容器的挂载数据复制到新容器里
第二种是,直接修改新容器的挂载路径,因为已经创建完成,不用担心数据会被覆盖
首先要停止docker服务,打开ssh工具输入:systemctl stop docker.service
通过面板打开新容器的配置文件路径的config.v2.json
拉到底部,修改两处的Source为原容器的数据卷路径,如改为/var/lib/docker/volumes/ghost
接着重新启动docker服务:systemctl start docker.service
如果新旧容器用到的是同一个端口号,则由于端口号冲突,只会运行其中的一个,因此需要确认运行的是新容器(在面板上的Docker Manager里看到容器的运行情况,下同)
确认修改生效后,可删掉旧容器(容器右边的Del)
并删除新容器原来的数据路径:rm -rf /var/lib/docker/volumes/ghost2(也可以在面板的Files上删除,会保险一些,因为会先进回收站防止误删)
①拉取或更新镜像
打开面板主页左下角的Docker Manager(如果前面跳过了1.4,可以回去看看怎么设置)
按下图拉取wordpress和nginx镜像
②配置容器专属子网络
打开ssh工具,输入:docker network create --subnet 172.18.0.0/16 mynetwork
③创建nginx容器
需要注意的是确保数据路径内没有数据,否则将会覆盖复制,原有的数据就会被初始化(尤其是在更新容器的时候)
输入docker run -d --name 容器名称 --restart=always -e MYSQL_ROOT_PASSWORD=mysql密码 -e MYSQL_DATABASE=wordpress -e MYSQL_USER=wordpress -e MYSQL_PASSWORD=数据库密码 --net mynetwork --ip 172.18.0.10(从172.18.0.(5~254)可选) -v mysql数据路径l:/var/lib/mysql mysql
如docker run -d --name mysql --restart=always -e MYSQL_ROOT_PASSWORD=somewordpress -e MYSQL_DATABASE=wordpress -e MYSQL_USER=wordpress -e MYSQL_PASSWORD=wordpress123 --net mynetwork --ip 172.18.0.10 -v /var/lib/docker/volumes/mysql:/var/lib/mysql mysql
④创建wordpress容器
输入docker run -d --name 容器名称 --restart=always --net mynetwork -e WORDPRESS_DB_HOST=mysql容器ip(跟上面保持一致):3306 -e WORDPRESS_DB_USER=wordpress -e WORDPRESS_DB_PASSWORD=数据库密码--volume 容器数据路径:/var/www/html -p 容器端口号:80 wordpress
如docker run -d --name wordpress --restart=always --net mynetwork -e WORDPRESS_DB_HOST=172.18.0.10:3306 -e WORDPRESS_DB_USER=wordpress -e WORDPRESS_DB_PASSWORD=wordpress123 --volume /var/lib/docker/volumes/wordpress:/var/www/html -p 8088:80 wordpress
再次强调!需要注意的是确保数据路径内没有数据,否则将会覆盖复制,原有的数据就会被初始化
然后在Security开放对应的容器端口号(跟创建容器用到的端口号保持一致,即8088),用http://服务器ip:容器端口号 访问进行安装
或在完成2.4设置反向代理后,用https://域名 访问进行安装
⑤修改上传限制
因为默认上传图片、视频、文件、主题文件、插件等的限制是2M,非常小,所以要修改
打开ssh,输入docker inspect 容器id或容器名(wordpress)
例如 docker inspect wordpress
将wordpress文件路径复制,打开面板的File栏,输入地址:wordpress文件路径/usr/local/etc/php
如/var/lib/docker/overlay2/63078dbe5cafa54600632b179e9da09fc88f0adf229ffc583b0c22ca976db63d/merged/usr/local/etc/php
在当前文件夹下将php.ini-production重命名为php.ini,并将里面的内容做修改:
修改upload_max_filesize = 2M为合适的值,如256M;
post_max_size = 8M为合适的值,如256M;
⑥对主题的修改,提升网站安全性和性能
面板打开file,输入地址 你的wordpress数据路径/wp-content/themes/最新的那个
/var/lib/docker/volumes/wordpress/wp-content/themes/twentytwentytwo,打开functions.php
将这里面的全部内容,复制粘贴到第一个function的前面,然后保存
⑦重启容器
修改后重启了才会生效
docker restart wordpress
⑧一些插件推荐
ⅰ Easy Hide Login,可以修改后台的登录地址(默认是wp-admin),可增加网站安全
ⅱ Elementor,写文章的编辑器,功能众多,搭配Elementor Pro使用效果更佳(Pro需付费,或自寻破解版)
但因为Elementor用到了googleapi的一些服务,所以为了提升中国大陆网民的访问速度,可以替换成其他的节点
sed -i "s/fonts.gstatic.com/gstatic.loli.net/g" `grep fonts.gstatic.com -rl /var/lib/docker/volumes/wordpress/wp-content/plugins`
sed -i "s/ajax.googleapis.com/ajax.loli.net/g" `grep ajax.googleapis.com -rl /var/lib/docker/volumes/wordpress/wp-content/plugins`
sed -i "s/cdnjs.cloudflare.com/cdnjs.loli.net/g" `grep cdnjs.cloudflare.com -rl /var/lib/docker/volumes/wordpress/wp-content/plugins`
sed -i "s/fonts.googleapis.com/fonts.loli.net/g" `grep fonts.googleapis.com -rl /var/lib/docker/volumes/wordpress/wp-content/plugins`
ⅲ WP Rocket,可以加快网站加载速度,需付费或自寻破解版,而且它内置可以配合cloudflare一起使用
与ghost的更新相类似,不再重复。即把mysql和wordpress的原容器数据复制到新容器里,或修改新容器的数据卷路径,详情可见2.31.1
点击新增的网站,或者点击右方的conf进入设置界面
点击Reverse proxy,添加新的反向代理
现在,就可以通过网站进行访问啦!不需要记ip也不需要记住端口号了
如果前面有在Security开放容器端口的,建议删掉,这样可以防止外部扫描服务器端口
大功告成!但是,浏览器提示我们网站不安全?那就请看后面吧
前面创建网站那步我们申请得到的SSL证书有效期只有90天,过期后又会被认为不安全。则需要更新证书。虽然面板会自动更新,但因为我们是一直运行着反向代理的,所以还是需要手动更新的(在证书过期前一个月内可进行手动更新)
(另外需要注意,如果在cloudflare SSL安全策略里选择了严格,是无法申请的,需要换成弹性才行)
①首先先暂停运行网站的反向代理(运行着反向代理时不允许申请证书
②然后点击网站配置的SSL的Renew,即可进行更新(在30天内过期的都可以申请成功)
③最后重新运行网站的反向代理,大功告成
……………………
或者像我一样比较懒的,也有提供懒人包服务(可选,即自动定期更新证书)
ⅰ 下载这个压缩包到/www/server/panel/vhost/nginx/proxy并解压(进入面板中对应的文件夹,选择Upload上传,或Remote download直接输入下载链接下载
ⅱ点击面板左侧的Cron,Edit下方Task中的Renew Let's Encrypt Certificate,在原有脚本的基础上一前和一后分别加入以下脚本
前:cd /www/server/panel/vhost/nginx/proxy
python stop_RP.py
nginx -s reload
后:cd /www/server/panel/vhost/nginx/proxy
python start_RP.py
nginx -s reload
执行周期可改可不改,我自己是改成了每29天执行一次
另外需要注意,如果在cloudflare SSL安全策略里选择了严格,是无法更新证书的,需要换成弹性才行
担心自己误操作或被黑客入侵之后服务器数据没了?那么你可能需要备份功能,一般的服务器供应商也会提供这项服务,不过需要钱(有钱请随意)。而我们可以自己利用google drive来备份服务器数据
ⅰ 首先我们需要安装google drive并授权登录google帐号:
yum install go -y && go install github.com/prasmussen/gdrive@latest && cp go/bin/gdrive /usr/bin/gdrive && chmod +x /usr/bin/gdrive && rm -rf go && gdrive about
在浏览器中复制粘贴链接,登录google帐号并授权
授权之后以后就不需要再授权了,免费套餐有15G的空间,一般是够用的(如果不够,可以搞几个帐号,将压缩包分片传到不同的帐号空间里,反正我自己是够用的,服务器占用26G,压缩后压缩包大小11G。看看什么时候能到15G)
ⅱ将服务器数据备份至根目录下的backup.tgz文件中(用screen来运行,可以随时断开ssh连接而不担心被中断:
yum install screen -y && screen -S backupprocess
cd / && tar cvpzf backup.tgz --exclude=/proc --exclude=/dev --exclude=/backup.tgz --exclude=/mnt --exclude=/sys --exclude=/www/swap --exclude=/tmp /
exit
(断开了再重连ssh可通过这个命令看当前的进度:screen -r backupprocess)
ⅲ获取当前绑定google帐号有权修改的google drive文件链接
在浏览器中打开google drive,如果里面空空如也,可以自己上传一个文件上去;或选取一个没用的文件
右键该文件,获取链接,保持受限模式,复制链接如https://drive.google.com/file/d/fileID/view?usp=sharing,把这串fileID复制下来
将备份压缩包上传至google drive:
gdrive update fileID /backup.tgz
顺带一提,google drive提供版本管理,你可以恢复一个月内且是近100个版本的文件。所以完全可以设置为每日备份
上传完成后,可自行选择是否删除该压缩包(留着也无妨):rm -rf /backup.tgz
懒人包?
每天都自己运行一遍命令就太麻烦了,所以肯定是有懒人包的。首先要完成前面的ⅰ和获取文件id
打开面板的Cron,新建task
把下面的命令输入进去
screen -S backupprocess
cd /
tar cvpzf backup.tgz --exclude=/proc --exclude=/dev --exclude=/backup.tgz --exclude=/mnt --exclude=/sys --exclude=/www/swap --exclude=/tmp /
gdrive update fileID /backup.tgz
exit
备份讲完了,我们可以讲讲怎么还原
如果本地没有压缩包,则需要从google drive下载:
cd / && gdrive download fileID
还原:
screen -S restore
tar xvpfz /backup.tgz -C /
默认是通过ip地址来访问,ssl证书不吻合,因此会提示不安全。可改成用https协议的域名来访问
首先需要添加A或AAAA记录,注意这里不能使用代理,否则没法定位到服务器ip
点击面板的Settings,如果顶部启动了ssl,则先关闭。
然后绑定你设置的域名
此时会跳转说找不到,因为面板路径是错的,它跳转到login,你要改成自己的面板路径,不记得的可以在ssh输入bt 14查询
(如果绑定错了,在ssh输入bt 12取消绑定域名,这时可以重新用ip来登录)
登入后,接着打开面板的Setting,勾选顶部的Panel SSL,选择Let's Encrypt,填入自己的邮箱,然后就大功告成,现在面板也是安全连接啦!而且可以看到在Website那里是自动帮你建好对应的网站的
感谢好兄弟的帮忙!这篇文章的多次修改补充全赖他按照教程做下来遇到的问题所归纳整理完成的,结果呢,当然是超过半天了。希望后续的朋友没有遇到大问题,半天之内就把它搞出来
若有其他疑问,可以在底下评论区留言