csxiaoyao.com整站第二次迁移记录
文章目录
Write By CS逍遥剑仙
我的主页: www.csxiaoyao.com
GitHub: github.com/csxiaoyaojianxian
Email: sunjianfeng@csxiaoyao.com
QQ: 1724338257
1. 缘起
csxiaoyao的主页( csxiaoyao.com / csxiaoyao.cn / victorsun.cn / sunshinestudio.cn )从阿里云迁移到腾讯云已经稳定运行了一年多,搭建了博客、云盘、git私有仓库、shadowsocks梯子、图床、FTP、db节点、git仓库、webconsole等服务。由于https服务使用的是Let’s Encrypt证书,而最近的一次系统环境升级导致证书自动升级失败,加上腾讯云给力的优惠活动和提供的免费https证书,本人将整站迁移到上海区的更高配置的腾讯云vps,主要的变化为更换ssl证书和博客系统使用docker封装为独立服务,下文记录最终的迁移方案。
2. 配置nginx和https
Step1: 腾讯云官网申请免费1年证书
Step2: 下载证书文件,拷贝nginx目录下的cert和pem密匙文件到服务器nginx目录下,如/etc/nginx/cert/
Step3: 配置 nginx server
nginx配置文件路径 /etc/nginx/sites-enabled/default
配置监听80和443端口
server {
error_page 404 /src/page/404.html;
error_page 500 502 503 504 /src/page/50x.html;
listen 80 default_server;
listen [::]:80 default_server;
server_name csxiaoyao.com csxiaoyao.cn *.csxiaoyao.com *.csxiaoyao.cn;
location / {
root /var/www/html;
index index.php index.html index.htm;
try_files $uri $uri/ =404;
}
# php
location ~ \.php?.*$ {
root /var/www/html;
include snippets/fastcgi-php.conf;
fastcgi_pass 127.0.0.1:9000;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
}
server {
error_page 404 /src/page/404.html;
error_page 500 502 503 504 /src/page/50x.html;
listen 443;
listen [::]:443;
server_name csxiaoyao.cn *.csxiaoyao.cn;
ssl on;
root /var/www/html;
index index.php index.html index.htm;
ssl_certificate cert/1_www.csxiaoyao.cn_bundle.crt;
ssl_certificate_key cert/2_www.csxiaoyao.cn.key;
ssl_session_timeout 5m;
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_prefer_server_ciphers on;
location / {
root /var/www/html;
index index.php index.html index.htm;
try_files $uri $uri/ =404;
}
# php
location ~ \.php?.*$ {
root /var/www/html;
include snippets/fastcgi-php.conf;
# fastcgi_pass unix:/run/php/php7.0-fpm.sock;
fastcgi_pass 127.0.0.1:9000;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
location ~ ^/(data|config|\.ht|db_structure\.xml|README) {
deny all;
}
}
配置域名转发和反向代理:
由于内容较敏感,此处略
Step4: 重新加载nginx配置
$ sudo service nginx reload
3. docker构建wordpress博客
迁移过程中如果重新搭建服务器环境会比较麻烦,而且在站点服务器运行过程中难免涉及到系统环境的升级,而一台机器部署多种服务(博客、云盘、git私库、webconsole等),升级很容易带来软件兼容问题,导致程序不能正常运行,而微服务架构能够很好解决上述问题。微服务架构是一种将单应用程序作为一套小型服务开发的方法,每种应用程序都在其自己的进程中运行,使用HTTP协议的API进行通信,可以通过全自动部署机制进行独立部署。由于精力和能力有限,csxiaoyao.com站点仅进行服务隔离,不涉及自动化单元测试、部署、监控告警等。
3.1 docker vs 虚拟机(virtual machine)
开发过程中的机器环境配置是一项繁琐的工作,尤其是当不同应用依赖不同环境时,环境切换尤为繁琐,目前的解决方案主要是虚拟机和docker两种。
虚拟机可以在一个操作系统里运行另一种操作系统,而应用程序对此无感知,对主体系统而言,虚拟机是一个普通文件,不会对系统环境造成影响。虚拟机实现了还原软件原始环境,但存在两个致命缺点:(1)资源占用多,虚拟机需要运行整个系统,往往一个应用只占用几Mb内存,却要花费几百Mb内存来运行;(2)启动慢,虚拟机需要完整启动一个操作系统,因此启动速度会很慢。
Docker 是一个开源的应用容器引擎,是对linux容器对封装。Linux容器不是模拟一个完整的操作系统,而是对进程进行隔离,因此比虚拟机性能要好很多。docker让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上,容器是完全是沙箱机制,相互之间不会有影响。
具体的docker的使用说明可以参考docker中文社区:http://www.docker.org.cn/book/
wordpress博客的搭建需要两个镜像,mysql数据库镜像和wordpress镜像。
3.2 docker-mysql搭建
Step1: pull image 拉取镜像 mysql:5.7
$ docker pull mysql:5.7
Step2: run image 运行镜像
参数说明:
# -p53306:3306 将容器3306端口映射到主机53306端口
# -v$PWD/xxx:/var/lib/mysql 将主机目录挂载到容器的/var/lib/mysql
# -e MYSQL_ROOT_PASSWORD=password 初始化root用户密码
# --name 容器命名
# -d 容器后台运行
# mysql:5.7 image名
Run
$ docker run -p 53306:3306 -v $PWD/mysql:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=19931128 --name mysql-wp -d mysql:5.7
Step3: docker exec 从终端进入mysql服务
参数说明:
# -t docker分配伪终端,并绑定到容器的标准输入上
# -i 让容器的标准输入保持打开
Run
$ docker exec -it mysql-wp bash
Step4: 设置远程访问
$ mysql -uroot -p
mysql> grant all privileges on *.* to root@"%" identified by "19931128" with grant option;
mysql> flush privileges;
Step5: 本地客户端导入sql
客户端连接地址 localhost:53306
3.3 docker-wordpress搭建
$ docker run --name wordpress -d -p 80:80 --env WORDPRESS_DB_PASSWORD=19931128 --link mysql-wp:mysql -v "$PWD/wordpress":/var/www/html wordpress
拷贝原服务器下的wordpress文件夹到当前目录下的wordpress文件夹($PWD/wordpress),并修改wordpress数据库连接配置文件wp-config.php
define('DB_USER', 'root');
define('DB_HOST', 'mysql');
3.4 优化:使用 docker-compose
由于wordpress镜像依赖于mysql镜像,如果每次部署启动单独执行很可能出错,使用docker-compose.yml文件则能够统一管理服务以来的镜像。
新建docker-compose.yml文件如下:
version: '2'
services:
db:
image: mysql:5.7
ports:
- "53306:3306"
volumes:
- db_data:/var/lib/mysql
restart: always
environment:
MYSQL_ROOT_PASSWORD: 19931128
MYSQL_DATABASE: wordpress
MYSQL_USER: blog
MYSQL_PASSWORD: 19931128
wordpress:
depends_on:
- db
image: wordpress:latest
ports:
- "80:80"
- "443:443"
volumes:
- /Users/sunshine/Workspace/apache2:/etc/apache2
- $PWD/wordpress:/var/www/html
restart: always
environment:
WORDPRESS_DB_HOST: db:3306
WORDPRESS_DB_USER: blog
WORDPRESS_DB_PASSWORD: 19931128
volumes:
db_data:
执行启动
$ docker-compose up
同样适用stop命令可以全部停止容器执行,但是不会删除,使用rm才能删除。
3.5 部署
服务器端端系统环境是ubuntu16.04,首先安装docker,安装完成后启动服务
$ sudo service docker start
由于默认镜像国内访问很慢,需要使用加速镜像,新建/etc/docker/daemon.json来配置Daemon,加入registry-mirrors。
{
"registry-mirrors": ["http://hub-mirror.c.163.com"]
}
执行 docker-compose up 时会报错:
ERROR: Couldn’t connect to Docker daemon at http+docker://xxxx If it’s at a non-standard location, specify the URL with the DOCKER_HOST environment variable.
需要将当前用户加入docker组
$ sudo gpasswd -a ${USER} docker
再执行 up 即可
$ docker-compose up -d
3.6 phpmyadmin搭建
同样使用docker镜像能够快速实现phpmyadmin的搭建
$ docker run -d -p 8080:80 \
--name phpmyadmin \
--link mysql-wp \
phpmyadmin/phpmyadmin
4. 其他
其他的环境配置和从阿里云迁移到腾讯云时的步骤大体相同,可以参考前面的文章,此处不再赘述。