# 系统运维
# 系统运行过程产生的新数据
默认运行情况下,除了数据库,会在文件系统产生以下新数据:
目录 | 描述 |
---|---|
/public/data/ | 上传的文件数据(如果启用了云存储,文件是直接存储在云存储中,忽略本条) |
/.env | 系统基本配置文件 |
/storage/install.lock | 系统安装锁定文件 |
/module/Xxx/ | 新安装的模块代码 |
# 系统运行过程所有缓存文件目录位置
目录 | 描述 |
---|---|
/public/data_temp/ | 文件上传的临时文件,可以全部删除 |
/public/data_chunk/ | 文件上传的临时文件,可以全部删除 |
/public/temp/ | 系统处理临时文件 |
/bootstrap/cache/ | 配置项等缓存文件,可以全部删除 |
/storage/framework/cache/ | 系统缓存文件,可以全部删除 |
/storage/framework/sessions/ | 会话缓存文件,可以全部删除 |
/storage/framework/views/ | 视图缓存文件,可以全部删除 |
/storage/logs/ | 系统日志文件,可以全部删除 |
注意:以上所有目录在清理过程中注意不要删除目录本身。
# 系统服务器间迁移网站和数据
1)复制整个网站目录到新的服务器
2)在新的服务器上配置系统,参照「安装入门」中的说明文档,保证访问可达
配置好新系统后,保证访问 http://example.com/install/ping 返回 ok 文本
如果有异常信息请参照「使用常见问题」解决。
3)修改必要的配置信息 /.env
文件
4)清理系统缓存
php artisan cache:clear
php artisan view:clear
2
5)访问新的系统
# 文件存储类型变更如何迁移
举例说明
- 原存储
- 类型:阿里云
OSS
- 访问URL:
https://xxx.oss-cn-hangzhou.aliyuncs.com/data/xxxx.jpg
- 类型:阿里云
- 新存储
- 类型:腾讯云
COS
- 访问URL:
https://xxx.cos.ap-guangzhou.myqcloud.com/data/xxxx.jpg
- 类型:腾讯云
操作步骤
第一步,修改系统配置
安装新的存储模块,在后台完成新的文件上传存储配置。
本例需要安装 腾讯云COS云存储 (opens new window),在后台配置腾讯云
COS
上传模块,停用阿里云OSS
上传模块。
第二步,迁移已上传的文件到新的存储
上传的文件位于 /public/data/
目录,变更存储类型时需要转移所有已上传的文件到新的存储中。
迁移文件时,建议讲云存储 mount
到服务器本地,使用 rsync
等工具进行文件迁移。
本例需要将阿里云
COS
和腾讯云COS
挂载到本地,然后使用rsync
工具将文件从阿里云COS
迁移到腾讯云COS
。
第三步,修复数据库中的文件路径
下载并安装 文件路径迁移助手 (opens new window),在后台勾选表中包含路径的字段,处理预览
后 开始处理
,完成数据库中路径的修复。
程序会自动识别处理富文本、单图路径、多图路径字段。
本例中原路径为
https://xxx.oss-cn-hangzhou.aliyuncs.com
,新路径为https://xxx.cos.ap-guangzhou.myqcloud.com
。
# 如何为网站强制增加 www
Nginx 参考配置
server {
listen 80;
server_name modstart.com;
location / {
rewrite ^/(.*)$ http://www.modstart.com/$1 permanent;
}
}
2
3
4
5
6
7
# 网站如何强制跳转为 https
Nginx 参考配置
server {
listen 80;
server_name www.modstart.com;
location / {
rewrite ^/(.*)$ https://www.modstart.com/$1 permanent;
}
}
2
3
4
5
6
7
# 为网站开通CDN加速
通过CDN可以将动态请求、静态资源分离,加速网站的访问。我们推荐如下的CDN加速方式
CDN静态资源更新问题
系统内置了静态资源自动计算Hash的问题来避免缓存,静态资源加载的路径格式为
https://example.com/xxx.js?<Hash数字>
,当静态资源发生更新时,Hash数字
会发生变化,从而让CDN加速节点感知资源的变化,拉取最新的静态资源。
部分CDN加速可能会忽略请求参数,在配置CDN加速服务时,请勿忽略请求的参数(即静态资源请求链接
?
后的Hash数字
参数)
# 如何开启Redis作为缓存驱动
系统已经默认安装了 predis/predis
扩展,只需要以下简单配置即可完成缓存驱动切换。
## 切换缓存驱动为 redis
CACHE_DRIVER=redis
## 设置 Redis 连接信息
REDIS_HOST=127.0.0.1
REDIS_PASSWORD=xxxxx
REDIS_PORT=6379
2
3
4
5
6
7
配置完成后清除系统缓存
更详细的配置参考
config/cache.php
和config/database.php
文件
# 如何优化网站打开速度
# 1. 优化静态资源加载速度
网络传输会很大程度影响加载速度,服务器的带宽再大同时访问的人数增多带宽也会打满。
使用 CDN 优化静态资源加载速度,如七牛、网易、百度、阿里云等,具体方法可网上自行查找。
# 2. 优化后端服务响应速度
第一步,安装并开启 OPCache ,可以让网站加载速度提升。
修改 php.ini
[opcache]
opcache.enable=1
; 可用内存, 酌情而定, 单位为:Mb
opcache.memory_consumption=528
; Zend Optimizer + 暂存池中字符串的占内存总量.(单位:MB)
; opcache.interned_strings_buffer=8
; 对多缓存文件限制, 命中率不到 100% 的话, 可以试着提高这个值
opcache.max_accelerated_files=10000
; Opcache 会在一定时间内去检查文件的修改时间, 这里设置检查的时间周期, 默认为 2, 定位为秒
; 生产环境,代码不变可以关闭0
opcache.revalidate_freq=1
2
3
4
5
6
7
8
9
10
11
第二步,使用Laravel优化命令优化系统加载流程
## 缓存路由
php artisan route:cache
## 缓存配置
php artisan config:cache
## 类映射加载优化
php artisan optimize
2
3
4
5
6
对应的清空缓存
## 清除缓存路由
php artisan route:clear
## 清除缓存配置
php artisan config:clear
## 清除类映射加载优化
php artisan clear-compiled
2
3
4
5
6
我们强烈推荐使用 Linux 部署 PHP 服务,性能会比 Windows 提升不少。
# git常用命令
## git忽略文件权限变更
git config --add core.filemode false
## 清空git历史
git checkout --orphan temp_branch
git add -A
git commit -am "init"
git branch -D master
git branch -m master
## 修改最近一次提交信息
git commit --amend -m "some msg"
## 存储用户名密码信息
git config --global credential.helper store
## 从HEAD往前打1个patch
git format-patch -1 HEAD
## 根据 commit 打 patch,指从 commit 往后将每一个 commit 打成一个 patch 文件
git format-patch <commit>
## 根据 commit 打 patch,指从 commit 往前只打一个 patch 文件
git format-patch -1 <commit>
## 将暂存区中的修改保存为一个 patch 文件,对于新增加文件可使用 git add -N xxx 加入暂存区
git diff > 0001-xxx.patch
## 应用一个patch到当前分支,合并失败的文件生成 rej 文件
git apply --reject 0001-xxx.patch
## 交互式部分提交
# ① 进入交互式
git add -i
# ② 按p进入patch模式
# ③ 按*进入选择模式
# ④ 按y/n表示接受/拒绝
# ⑤ 按q退出
# ⑥ 提交
git commit -m "some msg"
## 暂存区
git stash push
git stash apply
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
# 压缩与解压缩
# 压缩目录
zip -r /path/to/your/zip.zip /path/to/your/folder
# 解压缩
unzip /path/to/your/zip.zip -d /path/to/your/folder
2
3
4
# linux常用命令
# 使用sed替换所有文件内容
cd /path/to/your/folder
sed -i 's/foo/bar/g' *
# 在BSD系统上,你需要提供一个备份扩展名,比如 -i '.bak',否则可能会损坏或者部分内容。
cd /path/to/your/folder
sed -i '.bak' 's/foo/bar/g' *
# 使用echo写入文件
## 覆写
echo 'xxx' > /path/to/file
## 追加
echo 'xxx' >> /path/to/file
# 使用tee+sudo写入文件
## 覆写
sudo tee /path/to/file <<-'EOF'
xxx
EOF
## 追加
echo 'xxx' | sudo tee -a /path/to/file
# 其他命令
bash
unset HISTFILE
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
# docker-compose 常用配置
# 修改 Docker 的 IP
修改 /etc/docker/daemon.json
{
// ...
"bip":"198.18.0.0/16"
// ...
}
2
3
4
5
完成后重启 docker 服务
sudo systemctl daemon-reload
sudo systemctl restart docker
2
# nginx常用命令
# https证书
配置HTTP证书,除了基础的服务器配置外,还需额外增加以下配置信息,打开 443 端口,配置证书路径。
server {
listen 443 ssl;
server_name example.com;
ssl_certificate /xxx/cert.pem;
ssl_certificate_key /xxx/key.pem;
# ...
}
2
3
4
5
6
7
# 反向代理
server {
server_name old.example;
location / {
proxy_pass http://xx.xx.xx.xx:8080;
proxy_set_header Host $host;
}
}
2
3
4
5
6
7
# openresty
# 每秒每个IP最多一个请求限流
作用域 http
limit_req_zone $binary_remote_addr zone=limit_by_ip:64m rate=1r/s;
作用域 http, server, location
limit_req zone=limit_by_ip burst=10;
# php
# 查看php-fpm执行状态
## 端口方式
curl http://localhost:9000/status
## sock方式
SCRIPT_NAME=/status SCRIPT_FILENAME=/status REQUEST_METHOD=GET cgi-fcgi -bind -connect /sock/php-fpm.sock
2
3
4
# docker
# 清除无用镜像
docker images | awk '{print $3}' | xargs docker rmi
# Linux运维
# 创建和启用Swap交换区
如果你的服务器的总是报告内存不足,并且时常因为内存不足而引发服务被强制kill的话,在不增加物理内存的情况下,启用swap交换区作为虚拟内存是一个不错的选择,如果硬盘使用的是 SSD,正常读写速度都在 300MB/s 以上,启用 swap 后性能提高了不少,特别是在处理消耗大内存的脚本方面。
创建交换区原则:
- 创建的swap交换区大小应该大于实际物理内存的容量大小,但是不要过大,以免造成硬盘空间浪费。
- 如果内存IO请求频繁,而单一swap交换区IO队列等待时间过长的话,可以多创建几个swap交换区。
- 原则上优先在IO速度最快的设备上创建。
(1)创建swap交换区硬盘存储用的空白文件。
通常创建物理内存2~2.5倍大小的文件作为交换区。
# 创建一个1个G的SWAP交换区空白文件
dd if=/dev/zero of=/swap bs=1M count=1024
2
(2)使用mkswap格式化文件为swap文件系统
# -f 使用文件作为swap交换区
mkswap -f /swap
# 设定为推荐的 0600 权限
chmod 0600 /swap
2
3
4
(3)启用刚才创建的Swap文件
swapon /swap
(4)如果有必要可以设置开机自动启用swap文件交换区,修改/etc/fstab,增加一行
# 启动即启用swap
/swap swap swap defaults 0 0
2
(5)如果不需要启用swap或需要调整swap大小,可以使用swapoff命令关闭swap。
# 关闭swap
swapoff /swap
2
关闭swap后删除对应的swap文件即可删除swap交换区,如需要调整swap交换区大小,从第一部开始重新创建即可。
# 工具推荐
pt-online-schema-change
:MySQL 在线 DDL 工具
# 其他工具
# lrzsz
yum install -y lrzsz
# 持续集成
使用专业的代码管理工具(git
或 svn
)是一个不错的选择,通过专业的代码管理工具+部署脚本,可以让系统实现持续开发集成,加速迭代。
# 自动部署PHP脚本参考
专业的 CI
固然好,在早期通过简单的脚本实现持续集成也是个不错的选择。
在服务端通过脚本拉取最新的仓库代码,实现持续集成功能。
<?php
echo "\n\n";
set_time_limit(0);
$type = @$_GET['type'];
if ('schedule' == $type) {
$ret = shell_exec("php ../artisan schedule:run 2>&1");
echo 'OK';
return;
}
$ret = shell_exec("git pull origin master 2>&1");
$lines = explode("\n", $ret);
if (isset($lines[0])) {
unset($lines[0]);
}
echo "=== Deploy Code ===\n" . join("\n", $lines) . "\n";
echo "=== Clear Bootstrap Cache ===\n" . $ret . "\n";
$ret = shell_exec("rm -rfv ../bootstrap/cache/* 2>&1");
echo "=== Clear Storage Cache ===\n" . $ret . "\n";
$ret = shell_exec("rm -rfv ../storage/framework/cache/* 2>&1");
$ret = shell_exec("php ../artisan cache:clear 2>&1");
echo "=== Clear System Cache ===\n" . $ret . "\n";
$ret = shell_exec("php ../artisan view:clear 2>&1");
echo "=== Clear View Cache ===\n" . $ret . "\n";
$ret = shell_exec("php ../artisan migrate 2>&1");
echo "=== Migrate ===\n" . $ret . "\n";
$ret = shell_exec("php ../artisan modstart:module-install-all 2>&1");
echo "=== ModStart ModuleInstallAll ===\n" . $ret . "\n";
$ret = shell_exec("php ../artisan config:cache 2>&1");
echo "=== Optimize Config Cache ===\n" . $ret . "\n";
$ret = shell_exec("php ../artisan optimize 2>&1");
echo "=== Optimize Code ===\n" . $ret . "\n";
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
# 计算自安装模块包
在老的项目中计算
<?php
if (count($argv) < 2) {
echo __FILE__ . " <new_dir>";
exit(-1);
}
$newDir = $argv[1];
$moduleConfig = require(__DIR__ . '/config/module.php');
$systemModules = array_keys($moduleConfig['system']);
$localModules = array_values(array_filter(array_map(function ($o) {
if (preg_match('/\/module\/(.*?)\/$/', $o, $mat)) {
if (strpos($mat[1], '_delete_.') === 0) {
return null;
}
return $mat[1];
}
return null;
}, glob(__DIR__ . '/module/*/'))));
$userInstalledModules = array_values(array_filter(array_map(function ($m) use ($systemModules) {
return in_array($m, $systemModules) ? null : $m;
}, $localModules)));
$commands = [];
foreach ($userInstalledModules as $m) {
$commands[] = "cp -av module/$m ../$newDir/module/";
}
echo "# 用户自安装模块迁移命令\n";
echo join("\n", $commands) . "\n";
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32