0%

使用Docker安装配置Apache和PHP环境(微擎环境)

前言

《在CentOS7上配置PHP运行环境》一文中学习了安装配置LNMP环境,《CentOS安装Apache和PHP环境》一文中学习了安装配置Apache和PHP环境。

本文学习使用Docker安装配置Apache和PHP,与Mysql结合,搭建一个容器化的LAMP环境,部署微擎服务。

前置条件是安装配置好了docker环境,安装方法参考《Docker入门》。已知docker宿主机IP为192.168.56.130。

安装Mysql

参考《使用Docker安装配置Mysql》,安装好mysql server和mysql client。

1、登录mysql server
mysql -h 127.0.0.1 -u root -p

2、创建数据库

1
create database `w7` default character set utf8 collate utf8_general_ci;

安装PHP

1、登录dockerhub查看需要的PHP - Docker Official Images

2、下载php镜像(以7.2-apache为例)
docker pull php:7.2-apache

选择带有apache的版本,省去了安装apache的步骤。

3、启动php和apache服务

1
2
3
4
docker run --name vk-php -d \
-p 8080:80 \
-v /opt/php/w7:/var/www/html \
php:7.2-apache

以上命令:

  • 命名容器为vk-php,后台运行
  • 映射宿主机8080端口到容器的80端口
  • 挂载宿主机目录/opt/php/w7到容器目录/var/www/html

更多启动命令参数可以参考How to use this image

4、创建测试文件
vim /opt/php/w7/index.php,内容为:

1
2
3
<?php
echo 'hello php7.2';
?>

5、验证安装
curl localhost:8080,可以看到hello php7.2。
浏览器访问 http://192.168.56.130:8080 ,可以看到hello php7.2。

以上,apache和php环境安装配置完成。

安装微擎

初始尝试

主要参考《微擎系统搭建》微擎linux服务器安装
1、下载微擎安装引导文件

1
2
3
cd /opt/php/w7
wget https://cdn.w7.cc/download/WeEngine-Laster-Online.zip
unzip WeEngine-Laster-Online.zip

2、浏览器访问安装页面
http://192.168.56.130:8080/install.php

填入用户名密码后,点击验证后安装微擎。没有通过验证,如下图:

由报错看,主要是目录权限问题和缺少扩展问题。

重做镜像

1、修改sources.list
在容器中查看/etc/apt/sources.list,发现镜像版本是debian buster,因此新建一个sources.list为:

1
2
3
4
5
6
7
8
deb http://mirrors.aliyun.com/debian/ buster main non-free contrib
deb-src http://mirrors.aliyun.com/debian/ buster main non-free contrib
deb http://mirrors.aliyun.com/debian-security buster/updates main
deb-src http://mirrors.aliyun.com/debian-security buster/updates main
deb http://mirrors.aliyun.com/debian/ buster-updates main non-free contrib
deb-src http://mirrors.aliyun.com/debian/ buster-updates main non-free contrib
deb http://mirrors.aliyun.com/debian/ buster-backports main non-free contrib
deb-src http://mirrors.aliyun.com/debian/ buster-backports main non-free contrib

2、编写Dockerfile

1
2
3
4
5
6
FROM php:7.2-apache

COPY sources.list /etc/apt/sources.list
RUN apt-get update && apt-get install -y libpng-dev libzip-dev \
&& docker-php-ext-install zip gd pdo pdo_mysql
RUN chmod 777 /var/www/html

3、生成新镜像
docker build -t voidking/w7:v1.0 .

再次尝试

1、删除原有容器

1
2
docker stop vk-php
docker rm vk-php

2、启动新的容器

1
2
3
4
docker run --name vk-php -d \
-p 8080:80 \
-v /opt/php/w7:/var/www/html \
voidking/w7:v1.0

3、再次安装,再次验证

可以看到,这次还剩一个问题:外网不可访问。这就奇怪了,在容器内明明是可以正常访问外网的,为啥报这个错?既然没错,那就忽略它好了。但是这个错存在,就无法进行下一步,因此这里我们换一种安装方式:源码安装。

源码安装

1、下载源码

1
2
3
4
cd /opt/php/w7
rm -rf ./*
cd ..
git clone https://gitee.com/we7coreteam/pros.git w7

2、再次安装,再次验证

nice,完美跳过了外网不可访问这个坑。然后,data目录权限报错。

修改data目录权限,chmod 777 /opt/php/w7/data/,问题解决。

3、填入数据库连接信息,以及管理员用户名密码

4、然后,安装完成。

5、测试访问
浏览器访问首页 http://192.168.56.130:8080/index.php ,即会跳转到微擎登录页。

以上,微擎系统安装配置完成,可以愉快地使用了。

百度云解析

备案失败

百度智能云年终盛典,全场云服务器一折起,于是151块钱入手了一台1C2G2M的百度云BCC主机。但是,没有想到的是,网站需要新增接入备案,否则无法使用域名!!!这个不怪百度,如果使用百度云备案成功,以后想要接入阿里云或者腾讯云,也需要新增接入备案。

不过百度云比较坑的有两点:第一点是备案期间域名不能解析,而阿里云备案期间可以正常解析。第二点是无法通过百度云的备案审核,提交备案后百度云给出了六条不符合审核条件的理由,而同样的审核材料,一个月前在阿里云通过了备案审核。

真的是没有对比就没有伤害,第一个念头是退货,然而退货失败。不能退货,那该怎样使用这台服务器呢?那该怎样在这台服务器上部署服务,然后通过域名访问呢?

在github找到了一些项目,awesome-selfhosted,想要部署一些不需要域名的服务,好歹给利用起来了。但是,依然不甘心,想要给这些服务加上域名!然后,真的找到了办法!前提是你还有一台可以进行域名接入的主机,无论是备案过的阿里云主机,还是不需要备案的海外主机,都可以。

解析方案

已知两台主机:可以域名接入的主机(主机A),百度云主机(主机B)。
我们在主机B上部署好了微擎服务,想要给这个服务添加一个域名:w7.voidking.com

1、安装frp
参考《使用frp进行内网穿透》,在主机A上安装配置好frp server,在主机B上安装配置好frp client。主机B上的8080端口,映射为主机A上的3480端口。

2、nginx配置
在主机A上,添加nginx解析 w7.voidking.com.conf ,内容为:

1
2
3
4
5
6
7
8
server {
server_name w7.voidking.com;
listen 80;
location / {
proxy_pass http://127.0.0.1:3480/;
proxy_set_header X-Real-IP $remote_addr;
}
}

注意,不用多加其他参数,不然会出现502等错误。

3、域名解析
在dnspod上添加A记录解析到主机A。

以上,可以通过域名访问百度云上的微擎服务了。

微擎后续问题

站点URL问题

确实可以通过域名访问微擎服务了,但是站点的很多请求地址为 127.0.0.1:3480 ,因为微擎服务使用proxy_pass里的URL作为了站点URL。我们想让微擎服务把域名作为站点URL,解决办法很简单,添加:

1
proxy_set_header Host $http_host;

但是,添加完这个参数,就会出现502错误,尴尬了吧。。。
nginx层没法进行修复,看来这个问题只能通过修改微擎源码来修复了。
编辑/opt/php/w7/framework/bootstrap.inc.php,如下修改:

1
2
3
# line 90, change
// $_W['siteroot'] = htmlspecialchars($_W['sitescheme'] . (isset($_SERVER['HTTP_HOST']) ? $_SERVER['HTTP_HOST'] : '') . $sitepath);
$_W['siteroot'] = 'w7.voidking.com';

然后,请求地址就全部变成 w7.voidking.com ,nice。

跨域问题

但是,一些请求报错:

1
Access to XMLHttpRequest at 'javascript:;' from origin 'http://w7.voidking.com' has been blocked by CORS policy: Cross origin requests are only supported for protocol schemes: http, data, chrome, chrome-extension, https.

明明都是同一个url,居然还是跨域错误,没有找到解决办法。

重装微擎

既然自己安装微擎问题这么多,那就使用官网给的docker镜像好了,参考docker安装微擎

1、删除原有环境

1
2
docker stop vk-php
docker rm vk-php

2、启动新的容器

1
2
3
4
5
6
7
docker run -it --name vk-php -d \
-p 8080:80 \
-v /opt/w7/mysql:/var/lib/mysql \
-v /opt/w7/html:/var/www/html \
-e MYSQL\_ROOT\_PASSWORD=123456 -d \
--restart=always \
ccr.ccs.tencentyun.com/weiqing/nginxphpmysql:1.0

3、重新安装微擎
http://ip:8080/install.php

4、设置用户名密码

5、同样修改微擎源码,修改站点URL。

然后,同样有跨域问题,但是站点已经可以正常使用了,就先这么滴吧。