自建网站统计系统部署指南(PHP + MySQL / SQLite)
小葱计数器是原生 PHP 程序,零框架依赖。下面按真实部署顺序走一遍,Windows 与 Linux 的关键差异单独标注。
一、环境要求
| 项 | 要求 | 说明 |
|---|---|---|
| PHP | 8.0+ | 需 pdo_mysql 或 pdo_sqlite、mbstring |
| 数据库 | MySQL 5.7+ / MariaDB 10.6+,或 SQLite | 日 PV 一万以内 SQLite 足够 |
| Redis | 可选 | 没有则自动降级文件缓存/队列 |
| Web 服务器 | nginx / Apache / IIS | IIS 需 PHP FastCGI 模块 |
| 目录权限 | data/ 与 config/ 可写 | 缓存、队列、日志、IP 库都在 data/ |
二、安装
- 上传代码:把程序放到站点根目录,确保
data/与config/可写。 - 跑安装向导:浏览器访问
/install.php,按提示填数据库信息,向导自动建库建表并创建管理员。 - 删掉安装文件:装完立即删除或重命名
install.php,避免被重复执行。 - 登录面板:访问
/login.php,用向导里设置的管理员账号登录,进「站点」页创建第一个站点。
三、定时任务(必配)
埋点接口只负责入队,落库与预聚合由定时任务完成。不配这一步,面板永远是空的。
# 每分钟消费埋点队列(Linux crontab)
* * * * * php /路径/scripts/消费.php 500 >> /路径/data/消费日志.log 2>&1
# 每小时维护(清实时表 / 失败队列 / 分区)
0 * * * * php /路径/scripts/计划任务.php >> /路径/data/计划任务日志.log 2>&1
Windows 用任务计划程序建两个任务,程序填 php.exe,参数填脚本路径,起始目录填站点根目录,触发频率同上。
Windows 上务必把"起始于"填成站点根目录,否则脚本里的相对路径会解析到系统目录,表现为任务显示执行成功但队列不动。
四、HTTPS 与反向代理
SDK 通过 HTTPS 加载,如果计数器站点是 HTTPS,客户站点是 HTTP,浏览器会把上报当作混合内容拦截。两个做法:
- 计数器站点也上 HTTPS(推荐,Let's Encrypt 免费证书即可)
- 确实只能用 HTTP 时,确认 SDK 与上报接口同协议
反向代理场景(nginx → IIS / php-fpm)要透传真实 IP,否则地域统计全变成代理地址:
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;
五、安全加固清单
| 项 | 做法 |
|---|---|
| 安装文件 | 部署后删除 install.php |
| 敏感目录 | app/ config/ core/ data/ docs/ scripts/ 禁止直接访问 |
| 数据库文件 | 禁止下载 *.db *.sqlite *.log |
| 后台入口 | 面板与登录页加 noindex,避免被搜索引擎收录 |
| 密钥 | 站点密钥只在服务端使用,不进前端、不进 Git |
六、备份
要备份的只有两处:数据库文件(SQLite 的 data/计数器.db,或 MySQL 的库导出)和 config/config.php。IP 库和缓存都能重新生成。
# SQLite 每日备份示例
0 3 * * * cp /路径/data/计数器.db /备份目录/计数器-$(date +\%F).db
七、性能调优
- 预聚合优先:面板读的是每日汇总表,不查明细,所以明细表可以按月分区、按保留天数清理
- 队列批量消费:消费脚本一次取 500 条,批量写库比逐条快一个量级
- 开启 gzip 与静态资源缓存:SDK 文件设
max-age=300,既能缓存又能在发新版后较快生效 - IP 库放内存:内置库优先,qqwry 外挂作为兜底,避免每次请求都读大文件