Digital Ocean / Nginx / MySQL / MVC 部署

Digital Ocean / Nginx / MySQL / MVC deployment

我正在尝试使用 Nginx、MySQL 和 dotnet-core 通过 Digital Ocean droplet 部署和托管网站。我能够将整个项目转移到 Digital Ocean Droplet,但现在我在更新数据库时遇到了问题,并收到“使用服务器 'localhost' 上的数据库连接时发生错误”和“访问被拒绝”用户 'root'@'localhost'。我相信我没有正确传输用户机密,但老实说我不确定。我通过 GIT 传输了整个项目,因此我不得不使用命令 'dotnet user-secrets set "SecretKey" "SecretValue"' 手动添加所有连接字符串。我已经在我的数字海洋水滴上安装了 dotnet-core、MySQL、Nginx 和所有这些好东西。

提前致谢!!

'Access denied for user 'root'@'localhost' - 我在 Linux 虚拟机上遇到了同样的问题。在我的例子中,数据库用户在连接到数据库时访问被拒绝。

检查您用于连接到 Mysql 数据库的数据库用户帐户是否设置了正确的访问权限。通过以下查询 shell 和 运行 连接到 mysql 数据库:

select user, host from mysql.user;

输出将是这样的:

+----------+-----------+
| user     | host      |
+----------+-----------+
| cron     | %         |
| custom   | %         |
| abc      | %         |
| slave    | %         |
| root     | 127.0.0.1 |
| root     | ::1       |
|          | localhost |
| cron     | localhost |
| abcuser  | localhost |
| root     | localhost |
|          | aaaaabox  |
| root     | aaaaabox  |
+----------+-----------+

如您所见,root 拥有 localhost, ::1, 127.0.0.1 的访问权限。都是本地域。

在您的情况下,如果缺少任何一个,请使用以下命令添加缺少的那些:

GRANT ALL PRIVILEGES ON DBNAME.* TO 'root'@'localhost';

其中 DBNAME 是您的数据库名称,root 是数据库用户名,localhost 是域。

请注意:您不应使用 root 帐户连接到 mysql 数据库。您可以创建一个单独的帐户,该帐户的访问权限仅限于应用程序数据库。

以下是创建新数据库用户帐户并从您的应用程序连接到数据库的方法:

CREATE USER 'appuser'@'localhost' IDENTIFIED BY 'appuserpass';
GRANT ALL PRIVILEGES ON DBNAME.* TO 'appuser'@'localhost';

GRANT ALL ON DBNAME.* TO 'appuser'@'localhost' IDENTIFIED BY 'appuserpass';
GRANT ALL ON DBNAME.* TO 'appuser'@'127.0.0.1' IDENTIFIED BY 'appuserpass';
GRANT ALL ON DBNAME.* TO 'appuser'@'::1' IDENTIFIED BY 'appuserpass';

这是连接字符串:

  "ConnectionStrings": {
    "DefaultConnection": "server=127.0.0.1;user=appuser;password=appuserpass;port=3306;database=DBNAME;"
  },

更新:

如果您尝试从机器外部连接到 MySql 数据库,那么您需要确保:

不要忘记在完成调试后关闭远程访问。否则这将产生额外的安全隐患。

为了解决我的问题,我采取了稍微不同的方法。

我正在使用 F1(免费层)Azure 应用服务实际托管网站。然而,我仍然会使用我的 Digital Ocean droplet 来托管我的数据库。然后我将使用 Cloudflare 将我的名称服务器指向。那是我可以为网站使用我的个人域,而不是使用 Azure 应用程序服务域。我知道这并不是真正的 'answer',但它提供了实现我的目标的更简单途径。谢谢大家的指点!