OperationalError:尝试在ubuntu服务器中编写只读数据库

Man*_*lue 7 python apache ubuntu mod-wsgi flask

我在Ubuntu服务器上使用mod_wsgi和运行FlaskApp apache2.我尝试localhost成功运行烧瓶应用程序,然后将其部署在ubuntu服务器上.

但是当我尝试更新数据库时,它给出了错误: Failed to update model. (OperationalError) attempt to write a readonly database u'UPDATE mysongs SET songurl=? WHERE songid.id = ?' (u'www.site.com/I_wanna_dance', 1)

现在我试着寻找数据库文件权限,这是: -rwxr-xr-x 1 www-data www-data 10240 Jul 14 15:35 /var/www/mywebsite/appfolder/appdata.db

当我尝试将权限更改为777,755,644等时,它显示另一个错误:unable to open database file尽管数据库文件在644权限上正常工作localhost但在ubuntu服务器上没有.

此外,我检查了目录和/var /var/www /var/www/mywebsite /var/www/mywebsite/appfolder等的许可,所有都拥有www-data:www-data其所有者用户名和组.

我试过谷歌搜索,但没有适当的解决方案,除了建议更改文件/目录权限,我自己尝试过.

为什么不能读取/访问数据库文件?

请建议.

Man*_*lue 6

解决了这个问题.这是由于数据库文件权限冲突造成的.

  • 您能否使用您的解决方案更新您的问题,以便将来搜索SO的人可以看到您做了什么? (11认同)
  • 修复:您需要在系统中查找数据库文件并授予写入权限。(例如,git全部访问:sudo chmod a + w file.db) (2认同)

PRM*_*reu 5

此问题与文件权限管理有关,主要与在*.conf定义为保存应用程序进程的 Apache 配置文件 ( ) 中选择的用户有关。简而言之:写权限需要与此用户匹配。

大多数情况下,sqlite 数据库文件是由特定用户(例如您的当前用户)创建的,并且站点应用程序在 Apache 默认用户www-data启动的子进程下运行(如果user未在其中指定参数)指令WSGIDaemonProcess)。在这种情况下,可以读取数据库,但如果您尝试修改任何内容,它将抛出此错误:

(OperationalError) 尝试写一个只读数据库...

因为www-data对该文件(或父文件夹)没有权限


第一种方式:对用户 www-data 应用权限

您可以设置对数据库文件及其父文件夹的写入权限。

如果文件夹包含其他文件,您可以对其添加写权限,并将数据库文件的所有权更改为用户www-data,例如:

sudo chmod o+w db_directory
sudo chown www-data:  db_directory/site_database.db 
Run Code Online (Sandbox Code Playgroud)

或者如果文件夹只包含数据库文件,您可以尝试直接更改文件夹所有者:

sudo chown -R www-data: db_directory
Run Code Online (Sandbox Code Playgroud)

然后检查/权限是否设置好(使用ls -l site_database.db

这篇文章中提供更多帮助


其他解决方案:添加一个特定用户来保存应用程序进程

这可以通过在 Apache 配置中的指令中提供usergroup参数来完成WSGIDaemonProcess。它将使 Apache 在特定用户下启动子进程。

例如 :

...
WSGIDaemonProcess main user=myuser group=myuser threads=3 python-home=/path/to/the/virtualenv/
WSGIProcessGroup main
WSGIApplicationGroup %{GLOBAL}
...
Run Code Online (Sandbox Code Playgroud)

该用户将管理所有操作,包括对任何文件的读/写,因此请检查它是否对每个相关文件具有所有所需的权限。

出于安全考虑,您可能不会使用具有广泛权限的用户。

一些评论可以帮助这篇文章


注意:如果您使用ErrorLogApache 配置中的指令管理自己的日志文件,小心,这些文件将遵循相同的权限逻辑。对于可由应用程序更改的任何文件也是如此。

  • 对于 SQLite,您还需要拥有数据库对运行代码的用户可写的目录,否则它无法创建数据库锁定文件。所以改变数据库文件的所有权是不够的。 (2认同)