后端开发语言:php
后端开发框架:yii2
前端开发语言: react
环境要求:
服务器一台:【配置】
系统:Linux Centos 7.9
cpu:8核
内存:16G
硬盘:200G
资源服务器:阿里云【使用公司账号】
服务器4台:(mysql,redis,api和web端,ftp)【最低配置】
系统:Linux Centos 7.9
cpu:4核
内存:8G
硬盘:200G
资源服务器:需本地搭建FTP 服务
shell脚本文件说明:【DockerScript: docker 环境安装脚本】
1.docker 环境安装脚本【先安装Python3】
2.ftp 服务器安装脚本【配置文件conf】
安装过程:
1.每台服务器都要进行 docker环境安装,先执行docker安装脚本shell【ftp服务器需要执行 ftp-install脚本】
2.服务器导入 相关环境 docker 镜像【注意:阿里云镜像下载不下来,则使用 dockerHub 镜像进行拉取】
3.镜像上传完成后,docker logout 退出自己账号
4.上传 相关docker-compose.yam 文件 和配置文件 压缩包,本地服务器解压
5.修改 docker-compose.yam 的配置参数,挂载路径,host,环境变量等相关配置【msyql和redis 需先执行 相关shell 脚本,进行配置文件复制,数据持久化】
6.执行 docker-compose.yam,容器镜像安装完成
#容器映射端口:
- "8080:80" #apif
- "8081:80" #apib
- "80:80" #pc端端口
- "81:80" #admin端端口
- "82:80" #pad端端口
- "83:80" #h5端端口
- "84:80" #tv端端口
- "6379:6379" #Redis 端口
- "3306:3306" #mysql 端口
7.数据库文件导入:
#导入数据库
##把sql 复制到容器里面
docker cp ./woc_school_nwpu.sql mysql:/
##进入MySQL 容器
mysql -u root -proot
#修改root密码
mysql > use mysql;
mysql > update mysql.user set authentication_string = password("123456") where user="root";
mysql > flush privileges;
#新建数据库
mysql > CREATE DATABASE IF NOT EXISTS woc_school DEFAULT CHARSET utf8mb4 COLLATE utf8mb4_general_ci;
mysql > use woc_school;
#然后使用source命令,后面参数为脚本文件(如这里用到的.sql)
mysql > source /woc_school.sql;
#清空所有数据库表【谨慎操作】
select CONCAT('truncate TABLE ',table_schema,'.',TABLE_NAME, ';') from INFORMATION_SCHEMA.TABLES where table_schema in ('dbname')
#导出sql
mysqldump -uroot -p common_site bl_site > bl_site.sql
8.代码,sql相关:
通用:【数据库初始化】
1.ip白名单限制【去掉白名单验证】
2.oss 静态资源防盗链 ,白名单添加
3.代码,param.php 配置修改:
[
1)环境改成prod,关掉debug 【index.php 】
2)是否使用ftp上传模式
3)mysql,redis 配置都改用 本地服务器配置
4)param-local.php 复制正式服配置
]
4.文件权限【web/upload 权限777,runtime/权限】
chmod -R 777 apib/web/upload/
chmod -R 777 apif/runtime/
chmod -R 777 apib/runtime/
chmod -R 777 console/runtime/
rm -rf composer.lock
composer install
5.代码加密【自定义HOST】
6.数据库 初始化【需要新建站点】
7.定时任务配置
8.nohup 配置
9.ftp 上传模式 UploadForm.php 去掉最大上传限制
不使用阿里云服务的部署:
1.手机号验证码登录,改成手机号+学号登录
2.去掉直播回放相关功能
3.params.php去掉相关 oss配置【账号密码信息】
9.上传代码【前后端代码服务器 需,上传加密过后的 代码压缩包,解压后 放到nginx 容器挂载的目录下】
10.容器相关注意:
nginx_php 容器:【vim /etc/nginx/sites-enabled/apif.conf】
(1) 进入容器内 更改 nginx 和 php.ini 的配置 【注意重启nginx 和 php-fpm,重启docker 容器】(通用)
注意:【后端服务器】
(1)定时任务配置
(2)nohup 命令配置 /etc/init.d/nohup.sh
(3)ftp 大文件上传配置
(4)源代码加密扩展开启
redis和mysql容器:
(1)注意数据持久化,数据备份功能【进行 重启容器,重启docker,重启服务器 测试数据持久性】
ftp-nginx 对外访问容器:
(1)注意防盗链开启
注意:最后 清除docker 登录信息【rm -rf /root/.docker/config.json】,重启 服务器,验证容器运行状态 和 数据
注意:POST 和 DELETE 请求 被限制时 web/index.php 要添加以下配置,转发请求;apif/main.php 和 apib/main.php 新增 X-Client-Action 【跨域规则设置】
apib/web/index.php
//POST 和 DELETE 请求 被限制时,根据header 里面的 X-Client-Action 参数,重置请求方式
$httpActionHeader = isset($_SERVER['HTTP_X_CLIENT_ACTION']) ? strtoupper($_SERVER['HTTP_X_CLIENT_ACTION']) : '';
if(in_array($httpActionHeader, ['PUT', 'DELETE'])) {
$_SERVER['REQUEST_METHOD'] = $httpActionHeader;
}
unset($_SERVER['HTTP_X_CLIENT_ACTION']);
Swoole Compiler 自定义信息加密验证:
//Swoole Compiler 自定义信息加密验证
exec('cat /etc/hosts |grep -C 0 "dockerhost"',$output);
$swoole = swoole_get_license();
if ($output && trim(explode('dockerhost',$output[0])[0]) == $swoole['imnc']['dockerhost']){
(new yii\web\Application($config))->run();
}else{
echo 'host 不合法';die;
}
遇到的问题及解决方案:
MySQL内网连接慢问题:
## my.conf
#禁用DNS docker MySQL连接慢问题解决[内网]
skip-name-resolve
php源码加密问题:Segmentation fault (core dumped)
加密 后 php 执行加密文件 报 Segmentation fault (core dumped)
解决方案:
重新下载 swoole_loader.so 文件
mysql 报错:Access denied for user ‘root‘@‘localhost‘ (using password: YES):
1.修改/data/mysql/my.cnf文件,添加:skip-grant-tables
[mysqld]
skip-host-cache
skip-name-resolve
skip-grant-tables
2.退出,重启mysql容器
docker restart mysql
3.再次进入容器mysql -uroot -p进入mysql后
mysql> use mysql;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A
Database changed
mysql> update mysql.user set authentication_string = password("root1234") where user="root";
Query OK, 2 rows affected, 1 warning (0.00 sec)
Rows matched: 2 Changed: 2 Warnings: 1
mysql> exit
4.删除/etc/mysql/conf.d/docker.cnf文件中添加的skip-grant-tables,在重启容器