Windows Server系统的服务器虽然入门容易,但是后期维护特别麻烦,于是就想将网站转移至方便维护的Linux系统。
本文主要包括Docker的安装,Docker下Wordpress及MySQL的建立,Https证书的申请,Nginx的反向代理设置。
Docker
Dokcer Engine的安装
如果你的服务器位于非中国大陆地区(港澳台及海外),你可以参考官方文档进行安装。如果你是国内用户,请参照清华源的docker-ce文档进行安装,以获取更快的配置速度。这里以Debian x64系统为例,其他系统或其他Debian请自行参考官方文档进行安装。
0.卸载旧版本
Docker的旧版本被称为docker,docker.io或docker-engine,如果已安装,请卸载它们。如果之前从未安装过Docker请忽略这一步。
apt-get remove docker docker-engine docker.io containerd runc
1.设置Docker仓库
更新apt,并允许使用HTTPS来获取仓库。
apt-get update apt-get install \ apt-transport-https \ ca-certificates \ curl \ gnupg-agent \ software-properties-common
2.添加Docker官方GPG密钥
注意命令结尾有连词符‘-’。
curl -fsSL https://download.docker.com/linux/debian/gpg | sudo apt-key add -
验证密钥9DC8 5822 9FC7 DD38 854A E2D8 8D81 803C 0EBF CD88
的最后8位,来判断是否成功安装密钥。(这一步非必要)
apt-key fingerprint 0EBFCD88
你会得到类似下面结果。
pub 4096R/0EBFCD88 2017-02-22 Key fingerprint = 9DC8 5822 9FC7 DD38 854A E2D8 8D81 803C 0EBF CD88 uid Docker Release (CE deb)sub 4096R/F273FCD8 2017-02-22
3.添加Docker稳定版仓库
add-apt-repository \ "deb [arch=amd64] https://download.docker.com/linux/debian \ $(lsb_release -cs) \ stable"
如果你确定你的Debian 10的发行版本为buster。你也可以执行下面的命令,两者等效。
add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/debian buster stable"
4.安装Docker
自此,在更新apt后直接安装即可。
apt-get update apt-get install docker-ce docker-ce-cli containerd.io
Docker Engine的卸载
如果不再使用Docker可以按照下面的命令进行卸载。
1.卸载有关包。
apt-get purge docker-ce docker-ce-cli containerd.io
2.清除容器和镜像。
rm -rf /var/lib/docker rm -rf /var/lib/containerd
数据库部分
Docker下MySQL的安装
安装最新的MySQL(MySQL 8)即可,即使你原先Wordpress的数据库为MySQL 5也可以成功导入。
1.获取最新的MySQL镜像
docker pull mysql
2.启动MySQL
docker run --restart=always --name mysql -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 -d mysql
相关参数:--restart=always
代表开机启动。--name
为容器重命名。-p
端口映射,格式为本机端口:容器端口,3306为MySQL默认监听端口。MYSQL_ROOT_PASSWORD=123456
代表MySQL的root账户密码为123456,建议设置一个复杂的密码,或者配置完成后进入容器内修改。
MySQL数据备份
Docker下MySQL数据备份可参考下面的命令:
docker exec -it mysql mysqldump -uroot -p123456 --all-databases > all.sql
此命令可以将所有数据库内所有信息备份到当前目录下的all.sql
,-u
后面接数据库用户名root,无空格即可。-p
后面接数据库密码123456。实际情况根据个人自行调整。--all-databases
代表全部数据库,如果想导出某一数据库,输入数据库名称即可。mysql
代表运行MySQL的Docker容器的名称。
非Docker下(运行在本机)MySQL导出参考下面这个命令:
mysqldump -uroot -p123456 --all-databases > all.sql
MySQL用户创建及数据导入
如果你搭建的Wordpress直接使用MySQL的root账号,且为新建站点,可忽略这一环节。
1.将备份的数据导入容器(新建站点忽略这一步)
进入备份数据存放的目录,执行下面的命令,将备份数据导入容器。wordpress.sql
为备份文件的名称。
docker cp wordpress.sql mysql:wordpress.sql
2.进入容器,连接数据库
docker exec -it mysql bash mysql -u root -p123456
3.创建Wordpress数据库
新建站点的话创建数据库名称随意。如果是旧站迁移,请参考wordpress目录下wp-config.php
文件,里面包括原有的数据库名称DB_NAME
、数据库用户DB_USER
、数据库用户密码DB_PASSWORD
等信息。旧站迁移,建议尽量与原有信息保持一致。
在MySQL中执行下面语句完成数据库创建。wordpress
为数据库名称。注意MySQL语句结尾有分号’;’。
create database wordpress;
4.创建wordpress数据库用户并授权。
# 创建wordpress用户wordpressuser,密码为password。 @'%'表示允许任意地址登录。 CREATE USER 'wordpressuser'@'%' IDENTIFIED WITH mysql_native_password BY 'password'; # 授权,将数据库wordpress的权限全部授予wordpressuser GRANT ALL PRIVILEGES ON wordpress.* TO 'wordpressuser'@'%'; # 刷新权限 flush privileges; # 退出数据库连接。 exit;
5.导入数据库(新建站点忽略这一步)
-D
后面为数据库名称
mysql -uwordpressuser -ppassword -D wordpress < wordpress.sql
6.检查数据是否导入成功,并修改站点信息。(新建站点忽略这一步)
# 登录数据库 mysql -uwordpressuser -ppassword -A # 选择数据库 use wordpress; # 检查是否有数据,如果返回有关信息则表示导入成功。 show tables; # 修改域名重定向,根据个人情况自行修改。(如果域名没变则忽略这一步骤) update wp_options set option_value='https://wp.for-get.com' where option_name='siteurl'; update wp_options set option_value='https://wp.for-get.com' where option_name='home'; # 退出数据库 exit;
7.退出容器
执行exit
即可。
WordPress部分
Docker下Wordpress安装
1.获取最新的wordpress镜像
docker pull wordpress
2.网站迁移(新建站点忽略这一步)
进入到原先网站根目录,将原有网站打包压缩。
cd /var/www/wp_for-get/ tar -cvf wp_for-get.tar *
解压至新目录
tar -xvf wp_for-get.tar -C /var/www/wp_for-get
2.5设置权限(新建站点可忽略这一步)
cd /var/www chown -R www-data:www-data /var/www/wp_for-get chmod -R 775 /var/www/wp_for-get chmod -R 777 /var/www/wp_for-get/wp-content/
3.启动Wordpress容器。
docker run --restart=always -d -p 7000:80 --name wp_for-get -v /var/www/wp_for-get/:/var/www/html/ wordpress
相关参数:--restart=always
代表开机启动。--name
为容器重命名。-p
端口映射,格式为本机端口:容器端口,这里是将容器内80也就是容器的http默认端口映射到宿主机的7000端口,为什么不直接映射80端口,这里是为后面多网站及https配置做准备。-v
表示容器挂载宿主机的一个目录到容器。值得注意的是,如果这里宿主机目录为空,则wordpress会执行全新安装。到此你可以通过访问http://公网ip:7000/来进行访问wordpress。手动完成数据库配置。(由于数据库映射到了宿主机的3306,则数据库地址为172.17.0.1:3306,此地址有效的条件是你没有修改默认的docker网络配置)。
注:
1.如果更新提示填写FTP信息则在wp-config.php
里添加如下代码:
define(FS_METHOD, direct); define(FS_CHMOD_DIR, 0777); define(FS_CHMOD_FILE, 0777);
2.如果下载插件失败可以在wp-config.php
里添加如下代码:
define('WP_TEMP_DIR', ABSPATH . 'wp-content/plugins');
3.修改数据库连接地址,修改wp-config.php
中的define('DB_HOST', 'mysql');
为define('DB_HOST', '172.17.0.1');
HTTPS部署
Https只需要部署在最外层的Nginx即可,无需对docker容器进行操作。保证客户端到服务端(Nginx)加密就足够了,服务器内部Nginx到Docker再进行加密,会显得有些多余。
HTTPS证书申请
这里以申请免费的let's encrypt为例。
1.acme.sh下载
直接使用git clone到本地就行了。
git clone https://github.com/acmesh-official/acme.sh.git cd acme.sh
2.获取DNS api
这里以cloudflare为例。在cloudflare右上角-我的个人资料。选择API令牌标签,创建令牌。在API 令牌模板中找到编辑区域 DNS的模板,选择使用此模板。其配置情况如图。
继续显示摘要,创建令牌。最后你就会到一串字符串,那就是Cloudflare API token。
3.申请证书。
继将刚刚得到的token导入变量。xxxxx
为刚刚得到的token。
export CF_Token="xxxxx"
其他DNS服务商的api token导入方法可以参考acme.sh的说明文档。
然后利用acme.sh申请证书即可
./acme.sh --issue --dns dns_cf -d for-get.com -d wp.for-get.com
-d
参数后面为要申请证书的域名。多域名申请多添加参数-d xxx.xx
即可,支持*泛解析。顺利的话一分钟内就可成功申请证书。
注
1.证书默认保存在~/.acme.sh/
。这里是使用root执行,故保存路径为/root/.acme.sh/
。导入的token信息也将保存在此目录下的account.conf
。
2.使用dnsapi申请证书,默认情况下会60天自动续期。如果想要取消自动续订可以执行
./acme.sh --upgrade --auto-upgrade 0
恢复自动续订执行
./acme.sh --upgrade --auto-upgrade
Nginx反向代理及HTTPS证书部署
这一步解决域名绑定等问题。
1.安装Nginx
直接apt安装即可。
apt update apt install nginx
启动并添加开机启动Nginx
systemctl enable nginx systemctl start nginx
2.获取默认配置
执行nginx -t
会得到如下信息
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok nginx: configuration file /etc/nginx/nginx.conf test is successful
/etc/nginx/nginx.conf
就是nginx的配置文件。去掉ssl_protocols后面的TLSv1.0 TLSv1.1,并加上TLSv1.3以获取更高的安全性。
#ssl_protocols TLSv1.0 TLSv1.1 TLSv1.2; # Dropping SSLv3, ref: POODLE ssl_protocols TLSv1.2 TLSv1.3; # Dropping SSLv3, ref: POODLE
3.创建站点配置文件,完成反向代理及证书部署
创建站点配置文件
touch /etc/nginx/sites-available/wp_for-get ln -s /etc/nginx/sites-available/wp_for-get /etc/nginx/sites-enabled/wp_for-get
编辑配置文件/etc/nginx/sites-available/wp_for-get
内容如下
# 将80端口(http)访问301重定向至https server { listen 80; listen [::]:80; # server_name为绑定的域名 server_name wp.for-get.com; return 301 https://$server_name$request_uri; } server { listen 443 ssl http2; listen [::]:443 ssl http2; # 证书文件位置,根据个人情况自行修改。 ssl_certificate /root/.acme.sh/wp.for-get.com/wp.for-get.com.cer; ssl_certificate_key /root/.acme.sh/wp.for-get.com/wp.for-get.com.key; server_name wp.for-get.com; # 禁止纯ip访问。 if ($host ~ "\d+\.\d+\.\d+\.\d") { return 400; } # 反向代理 location / { # 照抄就行,注意下面是http,端口号为wordpress映射到宿主机的端口号 proxy_pass http://172.17.0.1:7000; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; } }
执行nginx -s reload
保存配置,如果没有报错,则站点https配置全部完成。新站点需要在后台修改站点地址、wordprerss地址。为了防止恶意访问,你需要在服务器运营商的防火墙禁用wordpress映射到宿主机的端口,比如我这里配置的7000端口。
现在,你可以通过访问https://你的域名/来访问wordpress了。
如果本文有错误的地方,欢迎在评论中指出。