此问题与文件权限管理有关,主要与 Apache 配置文件中选择的用户有关(*.conf
)定义为保存应用程序进程。简而言之:写权限需要匹配该用户。
大多数时候,sqlite 数据库文件是由特定用户(例如您当前的用户)创建的,并且站点应用程序在 Apache 默认用户启动的子进程下运行www-data(如果参数user
指令中未指定WSGIDaemonProcess
)。在这种情况下,可以读取数据库,但如果您尝试修改任何内容,则会抛出此错误:
(操作错误)尝试写入只读数据库...
because www-data对文件(或父文件夹)没有权限
第一种方式:向用户 www-data 申请权限
您可以设置write对数据库文件及其父文件夹的权限。
如果该文件夹包含其他文件,可以为其添加写权限,仅将数据库文件的所有权更改为用户www-data, 例如 :
sudo chmod o+w db_directory
sudo chown www-data: db_directory/site_database.db
或者,如果该文件夹仅包含数据库文件,您可以尝试直接更改文件夹所有者:
sudo chown -R www-data: db_directory
然后检查一下read/write权限设置得很好(ls -l site_database.db
)
更多帮助这个帖子。 https://askubuntu.com/questions/6723/change-folder-permissions-and-ownership
其他解决方案:添加特定用户来保存应用程序进程
这可以通过给出user and group参数 http://modwsgi.readthedocs.io/en/develop/configuration-directives/WSGIDaemonProcess.html在指令中WSGIDaemonProcess
在 Apache 配置中。
它将使 Apache 在特定用户下启动子进程。
例如 :
...
WSGIDaemonProcess main user=myuser group=myuser threads=3 python-home=/path/to/the/virtualenv/
WSGIProcessGroup main
WSGIApplicationGroup %{GLOBAL}
...
该用户将管理所有操作,包括对任何文件的读/写,因此请检查它是否对每个相关文件拥有所有所需的权限。
出于安全考虑,您不得使用具有广泛权限的用户。
一些评论可以帮助这个帖子 https://serverfault.com/questions/294101/wsgidaemonprocess-specifying-a-user.
Note:如果您使用以下指令管理自己的日志文件,请小心ErrorLog
在Apache配置中,这些文件将遵循相同的权限逻辑。对于应用程序可以更改的任何文件也是如此。