DigitalOcean Linux虚拟机上Nginx+PHP文件系统数据库技术问询
基于文件夹文件系统的Nginx+PHP用户数据存储方案实践
我之前在DigitalOcean的Linux虚拟机上也做过类似的轻量数据存储方案,这种用文件夹+JSON文件替代数据库的方式,在用户规模不大、需求简单的时候确实高效又省心。结合你的场景,我分享几个关键的实践细节和优化点:
一、Nginx限制Users目录公共访问的关键配置
要彻底杜绝外部直接访问Users目录的可能,在Nginx的站点配置里加上这段规则就行:
location /Users/ { deny all; return 403; }
这样不管是浏览器直接输入路径,还是爬虫扫描,都没法直接触及用户的JSON文件,所有读写操作只能通过你的PHP脚本完成,安全性有保障。
二、登录时批量读取JSON文件的优化
你现在用file_get_contents()逐个读取60个文件,其实可以用glob()先批量获取用户目录下的所有JSON文件路径,再统一处理,代码更简洁也更易维护:
// 替换成实际的用户目录路径 $userDir = '/var/www/Users/User1/'; // 获取目录下所有.json文件 $jsonFiles = glob($userDir . '*.json'); $userData = []; foreach ($jsonFiles as $file) { $fileContent = file_get_contents($file); $data = json_decode($fileContent, true); // 跳过解析失败的损坏文件 if ($data !== null) { // 用文件名(去掉后缀)作为数据键,方便前端处理 $key = basename($file, '.json'); $userData[$key] = $data; } } // 将整理好的用户数据返回给浏览器 echo json_encode($userData);
另外要注意权限问题:给Users目录设置www-data(Nginx/PHP默认运行用户)的读权限,执行chown -R www-data:www-data /var/www/Users/,权限设为750就足够,避免其他系统用户随意访问。
三、保存文件时的原子性与安全性
用file_put_contents()写文件时,一定要加上LOCK_EX参数,避免多个请求同时写入同一个文件导致数据冲突或损坏:
$filePath = '/var/www/Users/User1/file1.json'; // 编码时加上格式化和中文不转义参数,方便排查问题 $jsonContent = json_encode($newData, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE); // 加LOCK_EX确保写入时独占文件 $writeSuccess = file_put_contents($filePath, $jsonContent, LOCK_EX); if ($writeSuccess === false) { // 处理写入失败的情况,比如返回错误信息给前端 http_response_code(500); echo json_encode(['error' => '保存数据失败']); }
同样,用户目录需要给www-data设置写权限,权限建议设为750,绝对不要用777,避免权限泄露。
四、未来扩展性的小建议
目前每个用户60个JSON文件的规模,这个方案完全够用,但如果以后用户量或文件数量大幅增长,可能会遇到批量读取慢、文件锁冲突频繁的问题。到时候可以考虑:
- 把常用用户数据缓存到Redis,登录时优先读缓存,缓存失效再读文件;
- 逐步迁移到轻量数据库(比如SQLite),再过渡到MySQL/PostgreSQL等关系型数据库。
内容的提问来源于stack exchange,提问作者Shawn Cooke
相关产品推荐
相关产品推荐

