虽然并不喜欢写作,但是喜欢瞎折腾。为了以后方便,写下文章记录一下我的博客搭建历程。
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 将出现初始化页面,按照自己的配置逐一填写,完成安装即可!