Featured image of post [Tech] LNMP-typecho-建站过程(上)

[Tech] LNMP-typecho-建站过程(上)

2020年 typecho博客搭建过程

本文记叙我搭建博客的经历,分为上下两篇。上篇介绍环境搭建,下篇介绍博客搭建。
接下来是上篇内容:域名购买、服务器搭建、LNMP环境安装以及Typecho安装。

域名

建一个私人博客,先要有一个域名。关于域名是什么,相信读者早就了解了。简单来说,一个域名对应着一个ip地址。网上已经有很多关于域名的知识了,我不在此赘述。

关于域名相关的知识,我从柏吃支醉的一篇博文学到不少内容。这篇博文对域名相关的知识讲得十分透彻,值得一看。

我第一次买域名还是在上一年搭建科学上网的时候买的,照着教程一步一步走。很多域名都是“首年x元,次年xx元”,即首年的价格可能不到10软,但是后面要续费就很贵。因为科学上网对域名要求不高,随便买一个,第二年换一个便宜的也没所谓。后来建站前认真挑选了一个.com域名,每年都是9美刀,价格还能接受。遂买下了域名。
注意:如果你也想建一个私人博客,不建议国内购买域名。因为需要备案才能用。我是从 namesilo 家买的域名,有些域名的首年价格没有狗爹便宜,但续年价格比狗爹便宜。同时.com域名价格比较香,还带 whois 保护。

namesilo的价格 GoDaddy的价格

注意到同为.com域名价格的不同,还有续年价格的区别。namesilo是每年都是9刀。godaddy是首年12刀续费18刀。
到了0202年,微信号终于可以修改了,但是一年只能改一次。微信开放改微信号的功能后,很多人都试着争抢一个好的微信号,有些有寓意的微信号(例如:yeahtiger)就被别人抢注了。其实买域名跟抢注微信号有点像,具有唯一性。微信号还能一年改一次,域名就不建议一年换一个了,会带来很多后续的麻烦。所以整一个好听的域名也是见麻烦事(起名字什么的真是太难了)。
最终我敲定了这个域名:"hanriri.com"。 域名有很多玩法,最基本就是自定义A记录指向一个ip地址。这个在买域名后域名提供商的控制面板能进行DNS管理。例如:

  • A记录: @ .example.com-> 10.10.10.1
  • A记录: www .example.com -> 10.10.10.1
  • A记录: abc .example.com -> 10.10.10.2
  • AAAA记录:@ .example.com -> fd00::00aa
  • CNAME: baidu .example.com -> www.baidu.com

“A记录"让域名指向一个ipv4地址,第一条相当于example.com指向10.10.10.1这个ip地址,让ip地址与域名相对应。此时ping example.com 就会出现 ping 10.10.10.1,在浏览器输入example.com与输入10.10.10.1的效果是一样的。同理,AAAA记录让域名指向一个ipv6地址。@相当于留空。如果是输入其他字符,可以指向其他ip地址,例如第三条,输入abc.example.com 等效于输入10.10.10.2。除了A记录,还有常用的CNAME记录,让一个域名指向另一个域名。所以租一个二级域名,能玩出许多功能,例如指向不同的服务器,指向图床,或者用作ddns……当浏览器输入"www.bilibili.com"时,发生了什么?这个过程有点复杂,理解了这些对DNS和互联网也就多了一份认识,关于域名与DNS,网上有相当多的文章,这里就不赘述了。

另外,我从namesilo服务商买了域名,设置用cloudflare家的DNS服务器。很简单,去cloudflare注册一个账号,输入你的域名,按照提示一步步走就行了。之后域名的DNS解析设置也就在cloudflare家的控制面板进行了。这里注意一下这个小云朵:

小云朵

proxy-status表示走不走CDN,点亮为橙色表明走Cloudflare的CDN网络,在国内访问会非常的慢…如果是灰色的表明直接解析到目标地址。“TTL"不是数字电路的那个TTL电平…也不是什么同性恋…(/ω\)

对不起,走错了

TTL是"Time To Live"的意思,“DNS生存时间”,意味着DNS服务器解析缓存时间。例如:在t0时刻设置了一条A记录,让@.example.com -> 10.10.10.1,TTL设置为1hour,并解析生效。在半小时后,因为更换ip地址的缘故,要改变这条A记录,使其指向10.10.10.111 并设置生效,此时访问example.com依然会跳到10.10.10.1而不是新设置的ip地址,因为DNS仍在缓存中。等半个小时过去了,再访问 example.com ,这时才会跳到10.10.10.111。TTL设置得过短,经常要让DNS服务器从上级服务器寻找解析,用户等待时间加长;TTL设置得过长,如果ip发生了变动,就要等多一段时间才能正常访问域名。

买好了域名,接下来就要买一个"服务器”。

服务器

    刚才就提到域名指向ip地址,这个ip地址是网络中唯一的,意味着门牌号。你有这个地址,才能顺着地址访问到某一户人家,这个"人家"就是服务器。
    这里就不讨论网上那些大站的服务器了,就谈谈小站要怎么买服务器。建wordpress、typecho这类的小站可以买“虚拟空间”,也可以买“虚拟服务器”。这些在各个商家又有五花八门的说法。“虚拟空间”我还没接触过,貌似有一个面板可以很简单地搭建,不需要手动敲linux命令,适合建站,但是比起VPS(虚拟专用服务器)功能少很多,例如不能用来越过网络长城…因为我没接触过,我就不吹水了,我用的是VPS。VPS可以理解为有一台大的实体服务器,通过虚拟机划分成很多小的服务器,可以通过ssh或VNC连上去操作它。通常叫“VPS”,在阿里云等一些厂商没有"VPS”,叫“ECS”,功能比较接近,又有点区别…AWS(Amazon Web Service)的"lightsail"是"VPS",“EC2"比较接近阿里云的"ECS”…我买的是某个小主机商的VPS,入门配置一核,一G,20G足够用了。
    先谈谈动态博客和静态博客的区别吧。网上很流行的"Hexo"就是静态博客,每一个页面都是静态文件,html+css+JavaScript铁三角呈现网页的内容,不需要后端与数据库交互。这类博客甚至不需要买什么虚拟主机、VPS,白嫖Gayhub的空间也可以搭起来(白嫖的快乐)。编写的方式是本地生成一堆静态文件,然后pull上网,就可以访问了。高中、高校的网页设计课程就是围绕HTML+CSS开展的,写出来的就是静态网页,在电脑可以直接打开。静态页面对搜索引擎更友好,资源消耗也低,好处还是挺多的,尤其是Hexo,网上很容易找到相关的教程。不过我还是选择了动态博客。动态博客相对于静态博客,需要后端与数据库交互,再把内容呈现在页面上。现在互联网上大多都是动态网站,什么淘宝、微博、教务系统……这些需要一个服务器运行一些软件才能把网站搭建出来,“虚拟主机”、“虚拟服务器”等可以用来搭建动态网站,当然也可以搭静态网站。动态网站的交互性会更好,前提懂后端、数据库……(留下了不学无术的泪水.jpg)
    动态博客最流行的是wordpress,现在非常成熟,教程多,主题、插件多,不仅可以搭博客,甚至搭一个企业网站、网络商城……搭博客做出来的效果也是不错的,完全不懂代码也可以弄出很好看的博客,相应的用起来感觉比较臃肿,已经不像一个单纯的博客了。Typecho是国内出的一个比较简洁的博客软件,“type+echo"构成,“type”是打字,“echo"的故事很凄美,当然"echo"也是php中最常用的函数。Typecho的背后跟wordpress一样是 php+数据库,相对wordpress功能少,用起来感觉很简洁,而且自己修改主题比wordpress简单,高校通识课学的一点点html+css知识就够用了。用的大多是国人,也有一些精美的主题(当然比不过wordpress几千个),也有插件库,比起能搭网络商城和企业网站的wordpress,Typecho更像是一个纯粹的博客。所以我搭了wordpress没多久,试试typecho,感觉很爽。萝卜青菜各有所爱,条件允许就都试试,自己感觉哪个好用就用哪个。typecho最妙的是原生支持markdown编辑,我可不想写文时用鼠标点这点那的。
    买网络服务(域名、对象储存、虚拟主机、虚拟服务器等)最好不要在国内购买。国内不备案是不能用的,还有种种限制,说不定哪天把骨灰都给你扬了。但是国内的访问速度跟国外是没得比的,这个看个人需要了。我是选择了国外机,省点事,但是访问速度慢。对了,还有一种操作是"AWS serverless"服务,就是用serverless搭建的,据说费用很低,不过这个建站操作我不懂。
    租VPS除了价格、性能、储存空间,还有一点重要的是线路。好的线路国内访问速度也不错,差一点的线路访问速度就很慢。访问速度比较好的线路都很高贵,收费要高人一等。这些内容网上也有很多介绍和测评,但非常零散,可以上网冲浪找找,就会有些基本的认识。
    买完域名和服务器,接下来就是上机实操搭网站了。

安装LNMP

Linux-Nginx-Mysql-PHP

1.服务器初始配置

    LNMP 是什么?LNMP 就是 Linux-Nginx-Mysql-PHP 的首字母组合,很多动态网站都需要这些运行环境。在国外,LNMP 一般称为 LEMP,因为"Nginx"跟"Engine"同音,是一个高性能的 HTTP 和反向代理 web 服务器软件。我头铁才用 Nginx,小站用 Caddy 替代也是可以的,而且配置文件更加简单好写,还能自动帮你续免费 ssl 证书,另外还有一个叫"Apache"服务器软件也可以替代 nginx。买了 VPS,商家提供一个ip地址和22端口可以ssh上去进行操作。这里建议在搭网站前,对vps做一些基本的设置,例如更换ssh端口、建立非root用户、开启防火墙、设置ssh密钥登录等安全操作,增加服务器的安全性。网络上一大堆人在扫22端口,以root身份用暴力的方式撞进去,不做一些小小的配置非常危险。     我习惯了ubuntu系统,接下来的操作都是基于ubuntu18.04的(20.04与18.04的php和mysql命令有些不一样,建议18.04) 更换ssh端口:

1
vi /etc/ssh/sshd_config

用 vi 编辑器编辑文件,当然vim、nano也行。

1
#Port 22

改成

1
Port 你的端口(1~65535)

端口的常识有吧,不要把常用的443、80这些端口占了就行。保存退出后重启,就要换刚才设置的ssh端口进入了。 ubuntu系统有个比iptables简单很多的防火墙软件ufw,它可以简单地开放、关闭一些端口。(所以都说ubuntu简单) 以下命令以root身份执行,非root要在命令的开头加sudo空格

1
2
3
4
5
6
ufw allow 80
ufw allow 443
ufw allow (ssh端口)
ufw allow (VNC端口)
ufw enable
ufw status

接下来会输出已经开放的端口。注意不要把ssh和服务商的VNC端口给关了,不然连不上去,只能重装系统了。(我试过一次)

1
ufw default deny

还有建立非root用户、禁止root用户ssh登入,设置密钥登录、禁止密码登录这些,操作有点多,网上找。

安装LNMP

接下来是LNMP安装,参考这篇文章:digitalocean-LNMP installation digitalocean上的一篇文章,教安装LNMP的,过程非常详细,照着输入就好了。当然有一些命令是不用敲的,例如刚才已经开放了80端口,就不用敲: sudo ufw allow Nginx HTTP 中间有一步设置mysql root用户的,直接 skip 到step3 就行。后面配置nginx和php的过程一样。

安装Let’s encrypt证书

ssl证书让网站从"http://“变成"https://",多了个s表示传输是加密的,例如在网络上输入支付密码之类的就肯定是加密传输。chrome浏览器上http网站提示不安全,证书错误的https网站直接就报危险,为了多一把小锁看起来更舒服,就折腾一下弄个证书吧。一般申请ssl证书是收费的,Let`s encrypt是免费的,但是只有90天,也就是时不时要更换一次。网上搜LNMP环境wordpress建站教学一般都用certbot这个python软件做自动ssl证书申请和nginx配置,这里我用的是acme.sh。

安装acme.sh

1
2
3
apt update
apt-get install openssl cron socat curl
curl  https://get.acme.sh | sh

acme.sh 会安装到 ~/.acme.sh 目录下。 acme.sh命令请参考官方文档:acme.sh(有中文!)

生成证书

1
acme.sh --issue -d mydomain.com -d www.mydomain.com --keylength ec-256 --webroot /var/www/html/

跟官方文档有些差别,最后面的/var/www/html/是nginx默认的网站根目录。acme.sh会通过80端口访问这个网站:mydomain.com,也就是你在浏览器看到的"Welcome to nginx!” nginx的设置…是蛮头疼的,没有能直接复制的教程,最好是看自己的配置是怎样的,理解配置文件的意思,自己做一些modification,不然就会出错。

安装

1
2
3
4
acme.sh --install-cert -d example.com \
--key-file       /path/to/keyfile/in/nginx/key.pem  \
--fullchain-file /path/to/fullchain/nginx/cert.pem \
--reloadcmd     "service nginx force-reload"

中间的/path/to/keyfile/in/nginx/自己定义一个地方,例如/home/keyfile/,/etc/nginx/ssl/等。key.pem和cert.pem可以放在同一个目录。

写nginx配置

这里默认已经按照上面链接提到的方法进行nginx的配置。

1
vim /etc/nginx/sites-available/example.com
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
#重定向http到https
server {
    listen 80;
    server_name example.com www.example.com;
    return 301 https://example.com$request_uri;
}
#https
server{
    listen 443 ssl http2;
    listen [::]:443 ssl http2;
    root /var/www/html;
    index index.php;
    server_name example.com www.example.com;
#www重定向至无www
    if ($host != "example.com") {
        return 301 https://example.com$request_uri;
    }
#ssl配置
    ssl_certificate       /home/keyfile/cert.pem;
    ssl_certificate_key   /home/keyfile/key.pem;
    ssl_session_timeout 1d;
    ssl_session_cache shared:MozSSL:10m;
    ssl_session_tickets off;
    ssl_protocols         TLSv1.2 TLSv1.3;
    ssl_ciphers           ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384;
    ssl_prefer_server_ciphers off;

    location / {
        try_files $uri $uri/ =404;
    }

    location ~ \.php$ {
        include snippets/fastcgi-php.conf;
        fastcgi_pass unix:/var/run/php/php7.2-fpm.sock;
    }

    location ~ /\.ht {
        deny all;
    }

    location = /favicon.ico { log_not_found off; access_log off; }
    location = /robots.txt { log_not_found off; access_log off; allow all; }
    location ~* \.(css|gif|ico|jpeg|jpg|js|png)$ {
        expires max;
        log_not_found off;
    }
}

检查nginx配置

1
sudo nginx -t

重启nginx

1
service nginx restart

这时候浏览器输入 “http://www.example.com” “http://example.com” “https://www.example.com” “https://example.com” 看看正不正常,其中前三条都会重定向到第四条。 最后到https://www.ssllabs.com/ssltest/index.html验证下证书安装效果。
至此,完成 ssl 证书安装。

安装typecho

终于要安装 typecho 了。前面的过程如果你不想跟我一样折腾,上网找找LNMP一键安装脚本或者宝塔什么的,不过我对那些有点洁癖,还是喜欢自己手动装一次,自己更加了解 LNMP 是怎样的,nginx 配置文件怎么写,而不是当成一个黑箱。了解 nginx 的配置是怎么写,就可以用 nginx 做反代,这台服务器要做其他事也是可以的。

安装 typecho 跟安装 wordpress 有点像,参考这篇文章:digitalocean-在ubuntu18.04安装wordpress

创建database

1
2
3
4
5
sudo mysql
mysql > CREATE DATABASE database名字 DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci;
mysql > GRANT ALL ON database名字.* TO `你的database用户`@`localhost` IDENTIFIED BY `密码`;
mysql > FLUSH PRIVILEGES;
mysql > EXIT;

记住,在 mysql 里面执行命令末端要加一个分号,漏了的话会出现这样的情况:

1
2
mysql > 命令
    ->

不要慌,补充一个分号就行

1
   -> ;

安装php补充

    其实我一开始跟着这篇教程在服务器上装 wordpress,后来直接在原有的环境装 typecho 然后删掉 wordpress,所以这些 php 补充要不要安装我是不知道的)。

1
2
sudo apt update
sudo apt install php-curl php-gd php-intl php-mbstring php-soap php-xml php-xmlrpc php-zip

重启php

1
sudo systemctl restart php7.2-fpm

注意:在 ubuntu20.04 上,默认装的是 php7.4,写配置有些不同,mysql 的命令也有些不同。

配置nginx

编辑 nginx 配置文件

1
sudo vim /etc/nginx/sites-available/example.com
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
...(前面的server块不用改
server {
    listen 443 ssl http2;
    listen [::]:443 ssl http2;
    root /var/www/typecho; #这里改了
    index index.php;
    server_name example.com www.example.com;

    if ($host != "example.com") {
        return 301 https://example.com$request_uri;
    }

...
    location / {
        #try_files $uri $uri/ =404;
        try_files $uri $uri/ /index.php$is_args$args;
        #if (-f $request_filename/index.html){
        #    rewrite (.*) $1/index.html break;
        #}
        #if (-f $request_filename/index.php){
        #    rewrite (.*) $1/index.php;
        #}
        #if (!-f $request_filename){
        #    rewrite (.*) /index.php;
        #}
    }

    location ~ \.php$ {
        include snippets/fastcgi-php.conf;
        fastcgi_pass unix:/var/run/php/php7.2-fpm.sock;
    }

    location ~ /\.ht {
        deny all;
    }
    location = /favicon.ico { log_not_found off; access_log off; }
    location = /robots.txt { log_not_found off; access_log off; allow all; }
    location ~* \.(css|gif|ico|jpeg|jpg|js|png)$ {
        expires max;
        log_not_found off;
    }
}

主要改了 https 的 root 和下面的一些 location,照抄可能会出错,注意大括号和配置文件的结构。 location /{}里面有一些被注释掉的 rewrite 规则,暂时保留,以后有用。 检查配置文件并重启 nginx:

1
2
sudo nginx -t
sudo service nginx restart

安装typecho

1
2
cd /tmp
curl -LO https://typecho.org/downloads/1.1-17.10.30-release.tar.gz

注意:上面的安装链接是1.1-17.10.30版本的,建议自己去找下载链接确保是最新的安装包:Typecho官方下载地址 解压:

1
tar xzvf 1.1-17.10.30-release.tar.gz

安装:

1
sudo cp -a /tmp/build/* /var/www/typecho

设置权限:

1
sudo chown -R www-data:www-data /var/www/typecho

最后,访问你的网址:https://example.com/ 看看是否进入安装界面
或者试试:https://example.com/install.php

至此,LNMP环境下 Typecho 安装完成。

预告:建站过程(下)

记录安装 Typecho 后进行的一些操作,例如改主题、安装插件,伪静态 rewrite,图床搭建,还有各种设置……
改主题花的时间最多,对着 /usr/themes/default/ 里面的 .php 文件和 .css 文件一点一点地改,还在本地开了个虚拟机查看更改的效果。如果实在不想自己改主题、外观的,找一款好看的主题直接套就行了。(奈何我喜欢自己动手 modify)

码字辛苦,请勿转载!

Built with Hugo
主题 StackJimmy 设计