将 www-data 添加到某个组后,仍然无法让 apache 服务器访问数据库
Posted
技术标签:
【中文标题】将 www-data 添加到某个组后,仍然无法让 apache 服务器访问数据库【英文标题】:still cannot get the apache server get access to database after added www-data to certain group 【发布时间】:2020-04-11 21:02:52 【问题描述】:这是将 sqlalchemy 会话连接到数据库文件的代码
from sqlalchemy.orm import sessionmaker
from DB_setup_alchemy import Base,User,Visitor,VisitRecord
from os import getcwd
# link to the DB we are using
# pay attention to this part, if without check_same_thread=false, there will be lots of errors
# but what is going on behind this part of code
# what does engine and session really means
db_path='sqlite:///'+getcwd()+'/data.db'
print(db_path)
engine = create_engine(db_path,connect_args='check_same_thread': False)
Base.metadata.bind = engine
DBSession = sessionmaker(bind=engine)
session = DBSession()
我项目的所有文件都在 flaskapp 文件夹中
drwxrwxr-x 9 ubuntu ubuntu 4096 Apr 11 20:09 .
drwxr-xr-x 3 root root 4096 Apr 11 04:11 ..
drwxrwxr-x 2 ubuntu ubuntu 4096 Apr 11 04:31 .aws
drwxrwxr-x 5 ubuntu ubuntu 4096 Apr 11 20:38 flaskapp
drwx------ 2 root ubuntu 4096 Apr 11 20:11 test
flaskapp 文件夹中的文件:
drwxrwxr-x 5 ubuntu ubuntu 4096 Apr 11 20:38 .
drwxrwxr-x 9 ubuntu ubuntu 4096 Apr 11 20:09 ..
-rw-rw-r-- 1 ubuntu ubuntu 345 Apr 11 16:37 AWS_API.py
drwxrwxr-x 2 ubuntu ubuntu 4096 Apr 11 17:37 __pycache__
-rw-rw-r-- 1 ubuntu ubuntu 296 Apr 11 16:23 app.wsgi
-rwxrwxr-x 1 ubuntu ubuntu 20480 Apr 11 17:37 data.db
-rw-rw-r-- 1 ubuntu ubuntu 7426 Apr 11 20:38 flaskapp.py
-rw-rw-r-- 1 ubuntu ubuntu 6 Apr 11 04:34 index.html
drwxrwxr-x 2 ubuntu ubuntu 4096 Apr 11 16:46 templates
drwxrwxr-x 4 ubuntu ubuntu 4096 Apr 11 16:13 venv
data.db 和文件夹flask 都对ubuntu 组中的用户有权限,我可以看到用户www-data 也在ubuntu 组中:
(venv) ubuntu@ip-172-31-24-93:~/flaskapp$ groups ubuntu
ubuntu : ubuntu adm dialout cdrom floppy sudo audio dip www-data video plugdev lxd netdev
但如果我输入:groups www-data
(venv) ubuntu@ip-172-31-24-93:~/flaskapp$ groups www-data
www-data : www-data
这是错误信息:
(venv) ubuntu@ip-172-31-24-93:~/flaskapp$ cat /var/log/apache2/error.log
[Sat Apr 11 20:57:03.891126 2020] [wsgi:error] [pid 26861:tid 140079813093120] [client 209.6.74.140:53631] ERROR:flaskapp:Exception on / [GET]
[Sat Apr 11 20:57:03.891160 2020] [wsgi:error] [pid 26861:tid 140079813093120] [client 209.6.74.140:53631] Traceback (most recent call last):
..............
[Sat Apr 11 20:57:03.891568 2020] [wsgi:error] [pid 26861:tid 140079813093120] [client 209.6.74.140:53631] sqlalchemy.exc.OperationalError: (sqlite3.OperationalError) unable to open database file
[Sat Apr 11 20:57:03.891574 2020] [wsgi:error] [pid 26861:tid 140079813093120] [client 209.6.74.140:53631] (Background on this error at: http://sqlalche.me/e/e3q8)
[Sat Apr 11 20:57:03.891581 2020] [wsgi:error] [pid 26861:tid 140079813093120] [client 209.6.74.140:53631]
这是来自浏览器的错误:
Internal Server Error
The server encountered an internal error and was unable to complete your request. Either the server is overloaded or there is an error in the application.
我尝试了简单的打印你好网络应用程序,它正在工作。 所以,我想知道我应该如何更改所有者或文件权限以使我的烧瓶应用程序正常工作?
【问题讨论】:
把data.db文件和flaskapp文件夹的权限改成777还是不行 【参考方案1】:您向我们展示了$ groups ubuntu
和$ groups www-data
的输出。
它表示ubuntu
具有组写入权限,例如附加
到www-data
组中的664
文件。
但是您的网络服务器是以www-data
而不是ubuntu
用户身份运行的,
所以这不相关。 重要的是www-data
想要
属于ubuntu
组以写入当前数据库文件,
但它不在该组中。您可以编辑 /etc/groups
来解决这个问题。
或者你可能想要$ sudo chgrp www-data data.db
(或chown)
授予 apache 网络用户对该文件的访问权限。
【讨论】:
非常感谢。但是我将 www-data 添加到 ubuntu 然后如果我键入组 www-data,则响应变为 www-data: www-data ubuntu。我认为这表明 www-data 已添加到组 ubuntu 中,但是在我重新启动 apache 后它仍然不起作用。【参考方案2】:终于自己弄清楚了问题所在: 这个问题背后的错误是 apache 用户与 ubuntu 不同。所以当 apache 运行我的 web 应用程序时,它是从不同的工作目录运行的,当然找不到数据库文件。
所以,我首先在代码中更改了数据库 .db 文件的路径以更正绝对路径,如下所示:
engine = create_engine('sqlite:////home/ubuntu/flaskproject/data.db',connect_args='check_same_thread': False)
然后将项目文件夹和数据库文件的所有者更改为 www-data(apache 用户):
sudo chown www-data .
sudo chown www-data data.db
并确保所有者对项目文件夹和 data.db 文件具有读写权限(在我的情况下已经满足)
解决权限问题的另一种方法是将用户 www-data 添加到 ubuntu 组,因此我们不需要更改项目文件夹和 data.db 文件的所有者(但要确保 ubuntu 组中的用户已阅读并写权限)
usermod -a -G ubuntu www-data
所以总的来说,只要数据库的路径正确(建议绝对路径)并且用户 www-data 对项目文件夹和数据库文件有权限,一切都应该正常。
【讨论】:
以上是关于将 www-data 添加到某个组后,仍然无法让 apache 服务器访问数据库的主要内容,如果未能解决你的问题,请参考以下文章
将项目添加到 Django 中的元组元组后是不是可以重新启动服务器?
将 [(ngModel)] 添加到单选按钮组后,默认的 [checked] 不再起作用