安装Typecho

虽然并不喜欢写作,但是喜欢瞎折腾。为了以后方便,写下文章记录一下我的博客搭建历程。

0.相关要素

  • 阿里ECS服务器,Ubuntu操作系统
  • Docker
  • Typecho安装包
  • Nginx

我的服务器是阿里ECS服务器,预装的是ubuntu-server系统,并且安装了docker和nginx。考虑到对PHP并不熟悉,所以计划用docker搭建一个php的运行环境。同时,由于服务器的配置很低,所以就没在本机上安装mysql,而是采用了docker方式运行一个mysql。
这几年伴随着微服务、DevOps等的兴起,docker也快速发展,并且在此也推荐大家使用docker。

1.安装PHP环境

我的PHP环境是在官方镜像php:7.2-fpm的基础上安装常用组件后生成的。

创建一个目录,用来存放Dockerfile和其他相关文件:

mkdir typecho-php

在typecho-php中创建Dockerfile,内容如下:

FROM php:7.2-fpm

COPY ./sources.list.stretch /etc/apt/sources.list

# Extensions: ctype, dom, fileinfo, ftp, hash, iconv, json, pdo, pdo_sqlite, session,
# tokenizer, simplexml, xml, xmlreader, xmlwriter and phar are bundled and compiled into
# PHP by default. If missing, install them directly by `docker-php-ext-install extension_name`

# Notice:
# 1. Mcrypt was DEPRECATED in PHP 7.1.0, and REMOVED in PHP 7.2.0.
# 2. opcache requires PHP version >= 7.0.0.
# 3. soap requires libxml2-dev.
# 4. xml, xmlrpc, wddx require libxml2-dev and libxslt-dev.
# 5. Line `&& :\` is just for better reading and do nothing.
RUN apt-get update \
    && apt-get install -y libfreetype6-dev libjpeg62-turbo-dev libpng-dev \
    && docker-php-ext-configure gd --with-freetype-dir=/usr/include/ --with-jpeg-dir=/usr/include/ \
    && docker-php-ext-install gd \
    && :\
    && apt-get install -y libicu-dev \
    && docker-php-ext-install intl \
    && :\
    && apt-get install -y libxml2-dev \
    && apt-get install -y libxslt-dev \
    && docker-php-ext-install soap \
    && docker-php-ext-install xsl \
    && docker-php-ext-install xmlrpc \
    && docker-php-ext-install wddx \
    && :\
    && apt-get install -y libbz2-dev \
    && docker-php-ext-install bz2 \
    && :\
    && docker-php-ext-install zip \
    && docker-php-ext-install pcntl \
    && docker-php-ext-install pdo_mysql \
    && docker-php-ext-install mysqli \
    && docker-php-ext-install mbstring \
    && docker-php-ext-install exif \
    && docker-php-ext-install bcmath \
    && docker-php-ext-install calendar \
    && docker-php-ext-install sockets \
    && docker-php-ext-install gettext \
    && docker-php-ext-install shmop \
    && docker-php-ext-install sysvmsg \
    && docker-php-ext-install sysvsem \
    && docker-php-ext-install sysvshm \
    && docker-php-ext-install opcache
    #&& docker-php-ext-install pdo_firebird \
    #&& docker-php-ext-install pdo_dblib \
    #&& docker-php-ext-install pdo_oci \
    #&& docker-php-ext-install pdo_odbc \
    #&& docker-php-ext-install pdo_pgsql \
    #&& docker-php-ext-install pgsql \
    #&& docker-php-ext-install oci8 \
    #&& docker-php-ext-install odbc \
    #&& docker-php-ext-install dba \
    #&& docker-php-ext-install interbase \
    #&& :\
    #&& apt-get install -y libmcrypt-dev \
    #&& docker-php-ext-install mcrypt \
    #&& :\
    #&& apt-get install -y curl \
    #&& apt-get install -y libcurl3 \
    #&& apt-get install -y libcurl4-openssl-dev \
    #&& docker-php-ext-install curl \
    #&& :\
    #&& apt-get install -y libreadline-dev \
    #&& docker-php-ext-install readline \
    #&& :\
    #&& apt-get install -y libsnmp-dev \
    #&& apt-get install -y snmp \
    #&& docker-php-ext-install snmp \
    #&& :\
    #&& apt-get install -y libpspell-dev \
    #&& apt-get install -y aspell-en \
    #&& docker-php-ext-install pspell \
    #&& :\
    #&& apt-get install -y librecode0 \
    #&& apt-get install -y librecode-dev \
    #&& docker-php-ext-install recode \
    #&& :\
    #&& apt-get install -y libtidy-dev \
    #&& docker-php-ext-install tidy \
    #&& :\
    #&& apt-get install -y libgmp-dev \
    #&& ln -s /usr/include/x86_64-linux-gnu/gmp.h /usr/include/gmp.h \
    #&& docker-php-ext-install gmp \
    #&& :\
    #&& apt-get install -y postgresql-client \
    #&& apt-get install -y mysql-client \
    #&& :\
    #&& apt-get install -y libc-client-dev \
    #&& docker-php-ext-configure imap --with-kerberos --with-imap-ssl \
    #&& docker-php-ext-install imap \
    #&& :\
    #&& apt-get install -y libldb-dev \
    #&& apt-get install -y libldap2-dev \
    #&& docker-php-ext-configure ldap --with-libdir=lib/x86_64-linux-gnu \
    #&& docker-php-ext-install ldap \

# Composer
#RUN curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/bin/ --filename=composer \

# Install extension using pecl
# Notice: if pecl install get error
#    `No releases available for package "pecl.php.net/xxx"`
# or
#    `Package "xxx" does not have REST xml available`
# Please turn on proxy (The proxy IP may be docker host IP or others):
#RUN pear config-set http_proxy http://10.0.75.1:1080

RUN pecl install redis-3.1.4 \
    && docker-php-ext-enable redis \
    && :\
    && pecl install xdebug-2.6.0alpha1 \
    && docker-php-ext-enable xdebug \
    && :\
    && apt-get install -y libmagickwand-dev \
    && pecl install imagick-3.4.3 \
    && docker-php-ext-enable imagick \
    && :\
    && apt-get install -y libmemcached-dev zlib1g-dev \
    && pecl install memcached-3.0.4 \
    && docker-php-ext-enable memcached

在typecho-php中创建sources.list,可以根据当前状况更新,案例中的内容为:

deb http://mirrors.163.com/debian/ stretch main non-free contrib
deb http://mirrors.163.com/debian/ stretch-updates main non-free contrib
deb http://mirrors.163.com/debian/ stretch-backports main non-free contrib
deb http://mirrors.163.com/debian-security/ stretch/updates main non-free contrib

deb-src http://mirrors.163.com/debian/ stretch main non-free contrib
deb-src http://mirrors.163.com/debian/ stretch-updates main non-free contrib
deb-src http://mirrors.163.com/debian/ stretch-backports main non-free contrib
deb-src http://mirrors.163.com/debian-security/ stretch/updates main non-free contrib

在typecho-php中build镜像:

docker build -t typecho-php .

启动该镜像:

docker run --name=typecho-php --restart=always -d -p 19000:9000 -v /data/www/html:/var/www/html typecho-php

至此,php运行环境初始化完成!

2.Nginx配置

建议在安装期间,使用http协议,在安装完毕后,升级为https。

http访问方式:

server {
    listen 80;
    server_name psicmi.cc;
    server_name www.psicmi.cc;
    server_tokens off;

    access_log /var/log/nginx/psicmi.cc.access.log main;
    error_log /var/log/nginx/psicmi.cc.error.log debug;

    location / {
      root /var/www/html;
      index index.php index.html index.htm;
    }

    location ~ .php$ {
      root /var/www/html;
      fastcgi_pass   127.0.0.1:19000;
      fastcgi_index  index.php;

      ## /var/www/html 是docker 容器里面的目录
      fastcgi_param  SCRIPT_FILENAME /var/www/html/$fastcgi_script_name;
      include        fastcgi_params;
    }

    ##匹配nginx需要交给php-fpm执行的URI,先要允许pathinfo格式的URL能够被匹配到
    ##所以要去掉$
    ##nginx文档中的匹配规则为:^(.+\.php)(.*)$
    ##还有~ \.php这种写法 和 ~ \.php($|/)这种写法
    ##都是差不多意思没啥严格区别
    ##唯一区别就是有多个匹配php的location的话需要留意权重差异
    location ~ ^(.+\.php)(.*)$ {
         root /var/www/html;
         fastcgi_pass   127.0.0.1:19000;
         fastcgi_index  index.php;

         ##增加 fastcgi_split_path_info指令,将URI匹配成PHP脚本的URI和pathinfo两个变量
         ##即$fastcgi_script_name 和$fastcgi_path_info
         fastcgi_split_path_info  ^(.+\.php)(.*)$;

         ##PHP中要能读取到pathinfo这个变量
         ##就要通过fastcgi_param指令将fastcgi_split_path_info指令匹配到的pathinfo部分赋值给PATH_INFO
         ##这样PHP中$_SERVER['PATH_INFO']才会存在值
         fastcgi_param PATH_INFO $fastcgi_path_info;

         ##在将这个请求的URI匹配完毕后,检查这个绝对地址的PHP脚本文件是否存在
         ##如果这个PHP脚本文件不存在就不用交给php-fpm来执行了
         ##否者页面将出现由php-fpm返回的:`File not found.`的提示
         ## 代码在Docker里面,无需判断!!!
         ##if (!-e /var/www/html/$fastcgi_script_name) {
             ##此处直接返回404错误
             ##你也可以rewrite 到新地址去,然后break;
             # return 404;
         #}

         fastcgi_param  SCRIPT_FILENAME  /var/www/html/$fastcgi_script_name;
         include        fastcgi_params;
    }

}



3.下载Typecho安装包

在/var/www/html目录下载安装包,例如:

wget http://typecho.org/downloads/1.1-17.10.30-release.tar.gz

下载完成后解压至当前文件夹,并移除原压缩包

tar -xvf 1.1-17.10.30-release.tar.gz
rm 1.1-17.10.30-release.tar.gz



4.配置MySQL

拉取docker镜像,例如:

docker pull mysql:5.7.23

起一个服务,注意指定字符集为utf8mb4

docker run -d -p 3307:3306 --name db --restart=always 、 
-v /data/db/:/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=MYSQL_ROOT_PASSWORD \
-d mysql:5.7.23 \
--character-set-server=utf8mb4 \
--collation-server=utf8mb4_unicode_ci

进入容器内,初始化数据库:

docker exec -it db /bin/bash

创建用户和数据库,并完成授权:

create user typecho identified by 'your-passwd';
create database typecho default character set utf8mb4 collate utf8mb4_unicode_ci;
grant all privileges on typecho.* to typecho@localhost identified by 'your-passwd';
grant all privileges on typecho.* to 'typecho'@'%'identified by 'your-passwd';
flush privileges;

至此,数据库配置完毕!

5.初始化Typecho

浏览器访问域名 http://psicmi.cc 将出现初始化页面,按照自己的配置逐一填写,完成安装即可!