解决Django部署Apache时OperationalError:尝试写入只读数据库
解决Django+Apache下SQLite "attempt to write a readonly database" 错误
以下是针对你问题的有效解决步骤:
1. 确保数据库所在目录的权限与属主正确
SQLite不仅需要db.sqlite3文件的写入权限,还需要其所在目录的写入权限(因为SQLite会在目录内创建临时日志文件):
- 递归修改数据库所在目录的属主为Apache运行用户:
sudo chown -R apache:apache /myproject/myapp/ - 设置目录与文件的合理权限:
(注:755权限确保Apache用户能进入目录并读取/写入文件,其他用户仅有读取权限)sudo chmod -R 755 /myproject/myapp/
2. 确认Apache实际运行用户
部分Linux发行版(如Debian/Ubuntu)中,Apache的运行用户是www-data而非apache,你可以通过以下命令确认:
ps aux | grep apache
如果输出显示用户是www-data,则将上述命令中的apache:apache替换为www-data:www-data。
3. 检查SELinux限制(CentOS/RHEL系服务器适用)
DigitalOcean的CentOS默认启用SELinux,即使文件权限正确,SELinux也可能阻止Apache写入目录:
- 临时关闭SELinux测试:
测试登录功能,如果恢复正常,说明是SELinux的问题。sudo setenforce 0 - 永久添加SELinux上下文规则:
这会允许Apache读写该目录下的所有文件。sudo semanage fcontext -a -t httpd_sys_rw_content_t "/myproject/myapp(/.*)?" sudo restorecon -Rv /myproject/myapp/
4. 验证权限设置
执行以下命令确认权限是否正确配置:
# 查看数据库文件权限 ls -l /myproject/myapp/db.sqlite3 # 查看数据库所在目录权限 ls -ld /myproject/myapp/
确保输出中db.sqlite3和目录的属主为Apache运行用户,且用户组有写入权限。
内容的提问来源于stack exchange,提问作者Tornike k
相关产品推荐
相关产品推荐

