我在Ubuntu服务器上使用mod_wsgi
和apache2
运行FlaskApp。我尝试在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
虽然数据库文件在localhost
上具有644权限但在ubuntu服务器上没有正常工作。
我还检查了目录的权限以及/var
/var/www
/var/www/mywebsite
/var/www/mywebsite/appfolder
等,所有人都有www-data:www-data
作为其所有者的用户名和群组。
除了改变文件/目录权限的建议之外,我尝试使用谷歌搜索,但没有正确的解决方案,我已经尝试过了。
为什么不能读取/访问数据库文件?
请建议。
答案 0 :(得分:7)
解决了这个问题。这是由于数据库文件权限冲突。
答案 1 :(得分:0)
此问题与文件权限管理有关,主要与在Apache配置文件(*.conf
)中选择用于保存应用程序进程的用户有关。简而言之:写入权限需要与此用户匹配。
大多数情况下,sqlite数据库文件是由特定用户(例如您当前的用户)创建的,并且站点应用程序在Apache默认用户 www-data (如果未在指令user
中指定参数WSGIDaemonProcess
)。在这种情况下,可以读取数据库,但如果您尝试修改任何内容,则会抛出此错误:
(OperationalError)尝试编写只读数据库......
因为 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
然后检查读取 / 写权限是否设置良好(使用ls -l site_database.db
)
其他解决方案:添加特定用户以保留申请流程
这可以通过在Apache配置中的指令WSGIDaemonProcess
中提供user
and group
parameters来完成。
它将使Apache在特定用户下启动子进程。
例如:
...
WSGIDaemonProcess main user=myuser group=myuser threads=3 python-home=/path/to/the/virtualenv/
WSGIProcessGroup main
WSGIApplicationGroup %{GLOBAL}
...
此用户将管理所有操作,包括对任何文件的读/写操作,因此请检查它是否具有对每个相关文件的所有必需权限。
出于安全考虑,您可能无法使用特权用户。
有些评论可以在this post中提供帮助。
注意:如果您在Apache配置中使用ErrorLog
等指令管理自己的日志文件,请务必小心,这些文件将遵循相同的权限逻辑。对于可由应用程序更改的任何文件,也是如此。
答案 2 :(得分:0)
在IIS 7.5 / Windows 2008 Server上托管Django Rest Framework时解决了此问题。在本地主机上运行良好。我添加了新功能来处理文件上传功能以及“文件名”。文件已正确上传,但数据库似乎不接受“文件名”字符串中的文本。
解决方案: 转到您的关注数据库。 (如果尚未分配任何特定的数据库,请考虑基本文件夹中的文件 db.sqlite3 )
右键单击 db.sqlite3->属性->安全->编辑->添加
在文本框中输入所有人->姓名->确定
在IIS上刷新服务器,然后尝试运行该应用程序。
答案 3 :(得分:0)
只需为您的项目和数据库提供www-data权限
sudo chown www-data:www-data ProjectPath
sudo chown www-data:www-data dbPath