[应用/笔记]Typecho博客搭建
侧边栏壁纸
  • 累计撰写 65 篇文章
  • 累计收到 3 条评论

[应用/笔记]Typecho博客搭建

x1n
x1n
2021-08-31 / 0 评论 / 76 阅读 / 正在检测是否收录...

2021083103.png

引言

​ 高中时代OI博客选择的是Wordpress,当时是阿里云服务器+宝塔面板,一键配置。大学之后打算和OI生活Say Bye,同时又觉得Wordpress过于厚重,不是我喜欢的风格。加之CTF使我入门使用Linux,决定从零开始自己一步步搭建环境配置网站。CMS在Hexo和Typecho中纠结了一会,还是选择了内容发布更方便的Typecho。本文偏向记录而非教学向,可能存在一些走弯路或者描述不清楚、不准确的问题,在运维过程中遇到的问题也会持续更新。

对于新手,还是比较建议使用宝塔一键部署+Wordpress这种,非常方便,不需要什么计算机知识。手动安装的优势在于知道自己每个参数、每个命令都做了什么,是不是有其他命令需要加载

0

​ 记录在这里的是之前就完成好了的工作:

  1. 购买一个域名,我一开始是在namesilo上买的,便宜,后来转到了阿里云
  2. 购买一个ECS/CVM/轻量应用服务器,我用的是一台2c4g的腾讯云CVM学生机
  3. 域名备案,要么选择做ICP备案,要么选择国外VPS,推荐高中生选择后者,备案需要成年。但是备案也不算很麻烦
  4. 域名解析,百度上有很多相关资料,只需要用比如阿里云的免费云解析DNS即可。或者还可以选用Cloudflare的免费套餐
  5. 我购买了一个SQL服务器,这样LNMP中的M就可以外置

1 环境配置

1.1 环境配置 —— Linux

​ 不必多说,云主机服务提供商都提供了一键还原镜像的功能,我这里选择的是CentOS 7.9,因为CentOS 8即将停止支持,而暂时不想使用Stream。其他Linux发行在配置上大同小异,主要是软件包管理器的区别。

​ 重置好镜像之后,通过ssh连接服务器

ssh root@AAA.BBB.CCC.DDD 其中AAA.BBB.CCC.DDD是VPS的IP,会提示无法验证fingerprint,yes即可

​ 然后输入你的root密码,在我的印象中,阿里云主机的默认用户不是root,那就把ssh @前面的用户名改成自己的用户名即可。输入密码全程密码是不可见的,不用担心没输入进去

​ 镜像往往有一定的延迟更新,所以在CentOS上,我第一步选择了yum update更新本机系统以及软件包

1.2 环境配置 —— Nginx

​ Nginx我选择了编译安装的方式,一方面是比快速部署稳定,另一方面是可以自己添加组件

​ 第一步安装一些编译安装需要依赖的库(zlib/brotli都是为了压缩,gzip和brotli二选一即可):

yum -y install make gcc-c++ libtool git

​ 在安装Nginx之前,先要安装PCRE,这是Nginx的Rewrite的依赖,安装的时候还不知道Rewrite是干嘛的,于是查了一下

​ URL Rewrite即URL重写,就是把传入Web的请求重定向到其他URL的过程。URL Rewrite最常见的应用是URL伪静态化,是将动态页面显示为静态页面方式的一种技术。比如http://www.123.com/news/index.asp?id=123 使用UrlRewrite转换后可以显示为http://www.123.com/news/123.html

​ rewrite还能一定程度上的隐藏开发语言标记,提升安全性。在页面改扩展名后保持Pagerank

​ 所以我们先来安装PCRE,同样选择编译安装,本文选择PCRE 8.45而非最新的PCRE 2 10.37

cd /usr/local/src
# 下载安装包
wget http://downloads.sourceforge.net/project/pcre/pcre/8.45/pcre-8.45.tar.gz
# 解压安装包
tar -xzvf pcre-8.45.tar.gz
cd pcre-8.45
# 编译安装
./configure
make && make install
pcre-config --version

2021083101

​ 下载brotli包,brotli在速度和gzip基本相同的情况下,压缩率表现要比gzip更好

# github 上 不 去, 只好fastgit了
git clone https://hub.fastgit.org/google/ngx_brotli.git
cd ngx_brotli
# 把config里面的submodule里的github也改成fastgit
vim .git/config
git submodule update --init

​ 接下来安装OpenSSL,为了启用TLS 1.3 final,使用较新版本的OpenSSL, 这里使用的是OpenSSL 1.1.1l

wget https://www.openssl.org/source/openssl-1.1.1l.tar.gz
tar -xzvf openssl-1.1.1l.tar.gz
mv openssl-1.1.1l openssl

​ 接下来下载并编译Nginx

wget https://nginx.org/download/nginx-1.20.1.tar.gz
tar -xzvf nginx-1.20.1.tar.gz
cd nginx-1.20.1/
# 如果需要支持 IE8 还需要在openssl-opt中添加enable-weak-ssl-ciphers
# 这里还遇到了 recipe commences before first target的错误,查证后发现是configure的时候少了一个空格
./configure --add-module=../ngx_brotli --with-openssl=../openssl --with-openssl-opt='enable-tls1_3' --with-http_v2_module --with-http_ssl_module --with-http_gzip_static_module --with-pcre=/usr/local/src/pcre-8.45 --prefix=/usr/local/webserver/nginx

​ 使用systemd管理Nginx,主要是方便自启、开启关闭之类的

vim /lib/systemd/system/nginx.service
# 注意pid之类的文件位置是自己设置的
[Unit]
Description=The NGINX HTTP and reverse proxy server
After=syslog.target network.target remote-fs.target nss-lookup.target

[Service]
Type=forking
PIDFile=/usr/local/webserver/nginx/logs/nginx.pid
ExecStartPre=/usr/local/webserver/nginx/sbin/nginx -t
ExecStart=/usr/local/webserver/nginx/sbin/nginx
ExecReload=/usr/local/webserver/nginx/sbin/nginx -s reload
ExecStop=/bin/kill -s QUIT $MAINPID
PrivateTmp=true

[Install]
WantedBy=multi-user.target
systemctl start nginx.service
#开机自启
systemctl enable nginx.service

2021083102.png

此时访问ip应当可以看到nginx的欢迎页面

接下来要配置Nginx配置文件

vim /usr/local/webserver/nginx/conf/nginx.conf

user  nginx nginx;
worker_processes  2;

error_log  logs/error.log crit;
#error_log  logs/error.log  notice;
#error_log  logs/error.log  info;
pid        logs/nginx.pid;
events {
    accept_mutex on;
    multi_accept on;
    worker_connections  1024;
}
http {
    include       mime.types;
    default_type  application/octet-stream;
    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';
    #access_log  logs/access.log  main;
    sendfile        on;
    #tcp_nopush     on;
    server_names_hash_bucket_size 128;
    client_header_buffer_size 32k;
    large_client_header_buffers 4 32k;
    client_max_body_size 8m;

    fastcgi_intercept_errors on;
    #keepalive_timeout  0;
    keepalive_timeout  65;

    charset UTF-8;
    gzip_vary on;
    gzip_comp_level 6;
    gzip_buffers 16 8k;
    gzip_min_length 1000;
    gzip_http_version 1.0;
    gzip_types text/plain text/css application/json text/xml application/x-javascript application/xml+rss text/javascript application/javascript;
    #gzip  on;
    brotli on;
    brotli_comp_level 6;
    brotli_types text/plain text/css application/json text/xml application/x-javascript application/xml+rss text/javascript application/javascript;
    include /www/mysite/conf/httpd.conf;
}

主要是配置了一下压缩

1.3 环境配置 —— PHP

在选择php版本的时候,我纠结了很久。Typecho的stable版本已经是17年的事情了,不支持php8.0,而时隔四年,终于在本文写的前一周作者决定大幅更新Typecho,使其支持php7.2-8.0,并且不向下兼容。但是开发版公布时间太短,安全性能难以得到保证。所以我还是选择用Stable版+php7.4的组合

# 回到src目录下
cd /usr/local/src
wget https://www.php.net/distributions/php-7.4.23.tar.gz
# 虽说wget可以,但是我在下的时候比较慢,我选择本地梯子下好之后再sftp上传至服务器,ftp管理器使用的是filezilia,不需要使用ftp服务,直接sftp即可
tar -xzvf php-7.4.23.tar.gz
cd php-7.4.23/
# 编译php
# 这个配置来源于CSDN,这里面大部分的选项都是默认的选项,不过作者写了一遍,我也查了一遍。
yum -y install libxml2 libxml2-devel openssl openssl-devel curl-devel libjpeg-devel libpng-devel freetype-devel libmcrypt-devel libzip-devel sqlite-devel
./configure --prefix=/usr/local/php7 \
--with-config-file-path=/usr/loacl/php7/etc \
--with-config-file-scan-dir=/usr/local/php7/etc/php.d \
--with-pdo-mysql \
--with-mysqli \
--enable-mysqlnd \
--enable-fpm \
--with-iconv \
--with-zlib \
--enable-mbregex \
--with-fpm-user=nginx \
--with-fpm-group=nginx \
--enable-mbstring \
--enable-session \
--with-curl \
--with-jpeg \
--with-freetype \
--enable-xml \
--with-openssl \
--with-xmlrpc \
# 提示没有noniguruma
yum install -y epel-release
yum install -y oniguruma oniguruma-devel
make
make test
make install 

接下来要配置php-fpm

/usr/local/php7/sbin/php-fpm
[31-Aug-2021 14:06:22] ERROR: failed to open configuration file '/usr/local/php7/etc/php-fpm.conf': No such file or directory (2)
[31-Aug-2021 14:06:22] ERROR: failed to load configuration file '/usr/local/php7/etc/php-fpm.conf'
[31-Aug-2021 14:06:22] ERROR: FPM initialization failed

提示没有配置文件,去网上扒一个改改

告诉我只需要把default复制一份就可以了

cd /usr/local/php7/etc
cp php-fpm.conf.default php-fpm.conf
cd php.conf.d
cp www.conf.default www.conf

再加一个systemctl

vim /usr/lib/systemd/system/php-fpm.service

内容

[Unit]
Description=The PHP FPM
After=syslog.target network.target

[Service]
Type=forking
PIDFile=/usr/local/php7/var/run/php-fpm.pid
ExecStart=/usr/local/php7/sbin/php-fpm
ExecReload=/bin/kill -USR2 $MAINPID
PrivateTmp=true

[Install]
WantedBy=mutil-user.target
systemctl daemon-reload
systemctl start php-fpm

1.4 环境测试

用phpinfo测一下环境

mkdir /www/mysite
vim /www/mysite/conf/httpd.conf
server {
    listen 80;
    listen [::]:80;
    index index.php index.html index.htm index.nginx-debian.html;
    root /www/mysite;

    location ~ .*\.php(\/.*)*$ {
            include fastcgi.conf;
            fastcgi_pass unix:/run/php/php7.2-fpm.sock;
            include fastcgi_params;
    }
}
vim /www/mysite/index.php
<?php
    phpinfo();
?>

配置完毕后,访问ip仍然502。

查看log

cat /usr/local/webserver/logs/error.log
2021/08/31 15:55:42 [crit] 18073#0: *39 connect() to unix:/run/php/php7.2-fpm.sock failed (2: No such file or directory) while connecting to upstream, client: 119.51.71.221, 
server: , request: "GET / HTTP/1.1", upstream: "fastcgi://unix:/run/php/php7.2-fpm.sock:"

一看这php7.2,发现是nginx配置有问题,把http部分(在网站目录中)的fast-cgi目录改掉,改成这样

server {
    listen 80;
    listen [::]:80;
    index index.php index.html index.htm index.nginx-debian.html;
    root /www/mysite;

    location ~ .*\.php(\/.*)*$ {
            include fastcgi.conf;
            fastcgi_pass unix:/run/php-fpm.sock;
            include fastcgi_params;
    }
}

然后要更改php-fpm的配置文件,把www.conf中 listen = 127.0.0.1:9000改为listen=/run/php-fpm.sock

systemctl reload php-fpm
systemctl reload nginx

崩溃,还是502,继续看log

*47 connect() to unix:/run/php-fpm.sock failed (13: Permission denied) while connecting to upstream, 
client: 119.51.71.221, server: , request: "GET / HTTP/1.1", upstream: "fastcgi://unix:/run/php-fpm.sock

权限没给,去chmod一下

chmod 777 /run/php-fpm.sock

phpinfo正常显示了

2021083103.png

2. 站点配置

2.1 DNS解析

​ 当我们有域名之后,需要找一个解析服务提供商,随便找阿里云、腾讯云或者Cloudflare啥的都行,现在都是免费的,这一部分我不是本次操作的,不加以赘述。

2.2 HTTPS证书

​ 都2021年了,自然是要HTTPS的。小户人家用不起商业证书,还是得搞个自动续签的Let's Encrypt。我选择使用certbot来自动续签

按照Certbot的官方指南,第一步要安装snapd


分割线内是我踩过的坑

​ 在前文中我们已经安装过epel,可以直接安snapd了

yum install snapd
systemctl start snapd.service
snap install core
ln -s /var/lib/snapd/snap /snap
snap install --classic certbot
ln -s /snap/bin/certbot /usr/bin/certbot

​ 因为我的Nginx安装在/usr/local/webserver下,certbot找不到可执行文件,所以要加到PATH里

vim ~/.bashrc

加一行

export PATH=/usr/local/webserver:$PATH

没好用,加个软连接

ln -s /usr/local/webserver/nginx/sbin /usr/bin/nginx
ln -s /usr/local/webserver/nginx/conf /etc/nginx

还是没好用,好好看了看报错,有一句

The nginx plugin is not working; there may be problems with your existing configuration.

看上去少个插件,pip3 install certbot-nginx

然后是一个手动包管理的过程,也不知道pip抽什么风,无法解决依赖问题

pip3 install wheel
pip3 install setuptools_rust
yum install rust
yum install cargo

到最后这都不好用,气的我直接把snapd卸载,还是yum香

yum install certbot
yum install python-certbot-nginx
ln -s /usr/local/webserver/nginx/sbin /usr/bin/nginx
ln -s /usr/local/webserver/nginx/conf /etc/nginx
certbot --nginx

中间会让你填邮箱域名什么的,按c取消

之后会生成一个chain和一个key,至此,证书申请完毕,我们要到conf中补充上,就可以用了

测试一下,在Chrome访问,域名左侧会有一把小锁,是https的提示

2.3 站点Nginx配置

更改之前写的httpd.conf如下,大部分都是certbot自动的

server {
    index index.php index.html index.htm index.nginx-debian.html;
    server_name mysite;
    root /www/mysite;

    location ~ .*\.php(\/.*)*$ {
            include fastcgi.conf;
            fastcgi_pass unix:/run/php-fpm.sock;
            include fastcgi_params;
    }

    listen [::]:443 ssl ipv6only=on; # managed by Certbot
    listen 443 ssl; # managed by Certbot
    ssl_certificate /etc/letsencrypt/live/mysite/fullchain.pem; # managed by Certbot
    ssl_certificate_key /etc/letsencrypt/live/mysite/privkey.pem; # managed by Certbot
    include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot

}server {
    if ($host = mysite) {
        return 301 https://$host$request_uri;
    } # managed by Certbot


    listen 80;
    listen [::]:80;
    server_name mysite;
    return 404; # managed by Certbot


}

2.4 下载部署Typecho

在Typecho上下载官方正式版的包到/www/mysite

因为是zip,我选择解压好用sftp直接上传

访问mysite/install, 开始图形化安装

需要提前在数据库中建好数据库和适当权限的账号,我选择的是腾讯云TDSQL-C。当然,不想用云数据库的也可以本地安装MySQL配置

1

评论

博主关闭了当前页面的评论