Apache2部署Django项目提示root@localhost访问MySQL被拒绝错误
问题根因
报错本质是MySQL本地root@localhost用户默认采用auth_socket认证机制,而非密码认证:只有系统root用户(sudo执行命令时的身份)可以通过socket方式免密/带密码登录MySQL root用户,普通系统用户(包括Apache运行时的默认身份www-data)即使输入正确密码也会被拒绝访问。
解决方案
步骤1:修改MySQL root用户认证方式为密码认证
- 以系统root身份登录MySQL
sudo mysql -u root
- 执行命令修改认证插件,将
你的MySQL root密码替换为你settings.py中配置的DATABASES字段下的PASSWORD值:
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '你的MySQL root密码'; FLUSH PRIVILEGES; exit;
- 验证修改生效:不加sudo执行登录命令,输入密码后能正常进入MySQL即为成功
mysql -u root -p
步骤2:调整Apache WSGI进程配置(可选,规避文件权限问题)
你当前的Apache配置中WSGI进程未指定运行用户,默认以www-data身份运行,容易出现项目文件读取权限问题。修改000-default.conf中的WSGIDaemonProcess配置项,添加运行用户和组参数:
WSGIDaemonProcess WhiteBoard python-path=/home/chunao/WhiteBoard/Backend/WhiteBoardBackEnd python-home=/home/chunao/WhiteBoard/Backend/WhiteBoardBackEnd/Backend user=chunao group=chunao
步骤3:重启Apache生效配置
sudo systemctl restart apache2
完成后访问Django服务即可正常连接数据库,普通用户执行python3 manage.py runserver也不会再抛出权限错误。
安全建议
生产环境不要直接用MySQL root用户对接业务服务,可单独创建专用数据库用户并仅授予对应库权限,操作示例:
CREATE USER 'django_user'@'localhost' IDENTIFIED BY '自定义安全密码'; GRANT ALL PRIVILEGES ON django_data_base.* TO 'django_user'@'localhost'; FLUSH PRIVILEGES;
修改settings.py中DATABASES的USER、PASSWORD参数为新创建的用户信息即可。
内容的提问来源于stack exchange,提问作者De Santa Michell
相关产品推荐
相关产品推荐

