我有一个CentOS服务器,我有Apache,Django,Django CMS和mod_wsgi。我的Django项目文件存储在/srv
目录中,出于安全原因我打开了SELinux。
我成功地将Django-CMS集成到Django中,当我访问本地IP时,我看到了我的页面。但是,当我尝试访问/ admin(我可以开始使用CMS功能)时,我得到DatabaseError at /admin/ attempt to write a readonly database
。
好。
所以,由于我的项目文件夹中有一个.sqlite
文件,我在其上运行了ls -l
,返回了:
-rw-r--r--. 1 root root 133120 Jan 5 11:53 DATABASE.sqlite
好的,所以我认为由于某些权限原因,Apache可能无法读取该文件,所以在对Stackoverflow上的类似问题进行了大量研究后,我跑了:
> chmod 664 DATABASE.sqlite
> chown apache /srv/mysite
> chown apache /srv/mysite/DATABASE.sqlite
现在,ls -l
输出显示为:
-rw-rw-r--. 1 apache root 133120 Jan 5 11:53 DATABASE.sqlite
不幸的是,在我的Django应用程序上尝试访问/ admin时,我仍然遇到同样的错误。任何帮助将不胜感激!可能与SELinux权限有关,但我不知道从哪里开始诊断正在进行的权限问题。
编辑:
我跑了
> chown apache:apache /srv/mysite
> chown apache:apache /srv/mysite/DATABASE.sqlite
快速ls -l
显示mysite
目录和.sqlite
文件的所有者现在是apache
。但是,在尝试访问/admin
页面时仍然出现错误。我chmod
将/srv/mysite
目录编辑为757,将DATABASE.sqlite
文件编辑为756,因为这是我可以做的最好的工作来获取权限。我被告知这是一个安全风险,但我似乎无法弄清楚如何减少权限并通过unable to read/open database file
错误。是因为SELinux吗?
仅供参考,我需要在CentOS和sudo的常规用户帐户下操作,只要我需要提升:
[noblerare@localhost ]$
答案 0 :(得分:57)
您必须为存储sqlite数据库的目录添加写入权限。因此,运行chmod 664 /srv/mysite
会有所帮助。
这是一个安全风险,因此更好的解决方案是将数据库的所有者更改为www-data
:
chown www-data:www-data /srv/mysite
chown www-data:www-data /srv/mysite/DATABASE.sqlite
答案 1 :(得分:7)
此问题是由SELinux引起的。像你一样设置文件所有权后,我遇到了这个问题。 audit2why(1)
工具可用于从日志中诊断SELinux拒绝:
(django)[f22-4:www/django/demo] ftweedal% sudo audit2why -a
type=AVC msg=audit(1437490152.208:407): avc: denied { write }
for pid=20330 comm="httpd" name="db.sqlite3" dev="dm-1" ino=52036
scontext=system_u:system_r:httpd_t:s0
tcontext=unconfined_u:object_r:httpd_sys_content_t:s0
tclass=file permissive=0
Was caused by:
The boolean httpd_unified was set incorrectly.
Description:
Allow httpd to unified
Allow access by executing:
# setsebool -P httpd_unified 1
果然,正在运行sudo setsebool -P httpd_unified 1
解决了这个问题。
查看httpd_unified
的用途,我遇到fedora-selinux-list post,其中解释说:
默认情况下,此布尔值处于关闭状态,将其打开将允许所有httpd 可执行文件,可以完全访问标有http文件的所有内容 上下文。离开它可以确保一个httpd服务不能 干扰他人。
因此启用httpd_unified
可以绕过阻止同一服务器上多个httpd
实例的默认行为 - 所有这些实例都以用户apache
运行 - 弄乱彼此的内容。
在我的情况下,我只运行一个httpd
,因此我可以打开httpd_unified
。如果你不能这样做,我想一些更精细的标签是必要的。
答案 2 :(得分:4)
简而言之,当写入sqlite数据库的应用程序没有写入权限时,就会发生这种情况。
这可以通过三种方式解决:
db.sqlite3
) chown username db.sqlite3
文件及其父目录的所有权(从而也可以写访问权限)
sudo -i
或django gunicorn
之前运行命令runserver
) chmod 777 db.sqlite3
(危险选项) 除非您在本地计算机上运行网络服务器,否则永远不会选择第三个选项,或者数据库中的数据对您来说并不重要。
也不建议使用第二个选项。但是,如果您确定您的应用程序不容易受到代码注入攻击,那么您可以继续使用它。
答案 3 :(得分:2)
我在Ubuntu服务器上也遇到了同样的问题。 因此,在为django激活虚拟环境然后运行django服务器之前,我所做的全部更改为超级用户。 对我来说很好。
第一次复制粘贴
sudo su
如果有,请激活虚拟环境。
source myvenv/bin/activate
最后运行您的django服务器。
python3 manage.py runserver
希望,这会对您有所帮助。
答案 4 :(得分:1)
我遇到了类似的问题。要检查SELinux是否存在问题,可以使用
检查其运行状态sestatus
并暂时禁用
setenforce 0
这至少可以帮助缩小问题范围。
答案 5 :(得分:0)
您可以更改 acl ,而无需更改文件/目录的所有权和权限。
使用以下命令:
setfacl -m u:www-data:rwx /home/user/website
setfacl -m u:www-data:rw /home/user/website/db.sqlite3
答案 6 :(得分:0)
我遇到了这个问题,我通过在mysite文件夹中创建一个目录来保存db.sqlite3文件来解决此问题。所以我做了/home/user/src/mysite/database/db.sqlite3
。在我的Django设置文件中,我更改了
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': "/home/user/src/mysite/database/db.sqlite3" ,
}}
我这样做是为了让Django知道我将数据库存储在基本目录的子目录中,在本例中为mysite。现在,您需要授予apache权限以能够读写数据库。
chown user:www-data database/db.sqlite3
chown user:www-data database
chmod 755 database
chmod 755 database/db.sqlite3
这解决了我的问题。这是不同权限的列表。您可以选择适合自己的一种 但避免使用777和666
-rw -------(600)-仅用户具有读写权限。
-rw-r--r--(644)-仅用户具有读写权限;小组和其他人只能阅读。
-rwx ------(700)-仅用户具有读取,写入和执行权限。
-rwxr-xr-x(755)-用户具有读取,写入和执行权限;该小组和其他人只能读取和执行。
-rwx--x--x(711)-用户具有读取,写入和执行权限;该小组和其他人只能执行。
-rw-rw-rw-(666)-每个人都可以读写文件。好主意。
-rwxrwxrwx(777)-每个人都可以读取,写入和执行。另一个坏主意。
以下是目录的一些常见设置:
drwx ------(700)-只有用户可以在此目录中读写。
drwxr-xr-x(755)-每个人都可以读取目录,但是目录的内容只能由用户更改。
这里是文章链接,可[了解更多] [1]
[1]:http://ftp.kh.edu.tw/Linux/Redhat/en_6.2/doc/gsg/s1-navigating-chmodnum.htm#:~:text=%2Drwxr%2Dxr%2Dx %20(和%20others%20可以%20仅执行%20。
答案 7 :(得分:0)
您可以将数据库文件的所有者及其文件夹更改为 ø
:
django
这项工作适用于 DigitalOcean 的 1-Click Django Droplet
答案 8 :(得分:-8)
这是我的解决方案:
root@fiq:/home/django/django_project# chmod 777 db.sqlite3
root@fiq:/home/django/django_project# cd ..
root@fiq:/home/django# chmod 777 *
转到<'your_website/admin'>
输入用户名和密码..那就是它。