【问题标题】:Connect laravel jenssegers to mongodb atlas cluster将 laravel jensegers 连接到 mongodb atlas 集群
【发布时间】:2017-12-12 06:32:43
【问题描述】:

我从 Mongodb atlas 开始,我尝试将我的 laravel/jenssegers 项目连接到我配置我的 conf/数据库的集群

'mongodb' => [
  'driver'   => 'mongodb',
  'host'     => env('DB_HOST'),
  'port'     => env('DB_PORT', '27017'),
  'database' => env('DB_DATABASE'),
  'username' => env('DB_USERNAME'),
  'password' => env('DB_PASSWORD'),
  'options'  => [
      'database' => 'admin' // sets the authentication database required by mongo 3
  ]
  ],

还有我的 .env 文件

DB_HOST="xxxx-shard-00-00-uggj0.mongodb.net"
DB_PORT=27017
DB_DATABASE=xxx
DB_USERNAME=xxx
DB_PASSWORD=xxx

我得到了这个错误

找不到合适的服务器(serverSelectionTryOnce 设置):[连接关闭调用 ismaster on 'xxxx-shard-00-00-uggj0.mongodb.net:27017'

我用 Mongodb Compass 冷连接没有问题。

我的 Atlas Ip 白名单已打开 (0.0.0.0/0)。

我错过了什么吗?

【问题讨论】:

  • 您需要来自 Atlas 的整个连接字符串,其中包含所有副本集节点。另外,顺便说一句:由于最近发生的所有 mongodb 黑客攻击,以及 Atlas 设置了强制性 IP 白名单这一事实,我很惊讶您只是将其开放给所有流量。
  • 我需要把图集字符串放在哪里?好吧,我先尝试获取连接,然后再保护集群
  • 尝试将整个主机字符串放入DB_HOST - 请记住,每个 Atlas 部署都在一个副本集上 - 您需要所有主机。
  • 我得到 >(1/1) AuthenticationException 身份验证失败。但是密码和数据库是正确的。

标签: php mongodb laravel jenssegers-mongodb mongodb-atlas


【解决方案1】:

在 Laravel 中,使用 config/database.php 中的 'dsn' 键,如下所示提及完整的集群 url。

'mongodb_conn' => [
        'driver' => 'mongodb',
        'dsn'=>'mongodb://username:password@host1,host2/database?ssl=true&replicaSet=replicaSet&authSource=admin',
        'database' => 'my_data',
    ]

【讨论】:

  • 您需要在您的服务器上启用 SSL 才能使其工作。
  • 在迁移到 Atlas 之前,这对我们来说是不必要的。我们使用 Mlab 多年,.env 文件中的设置就足够了。切换到 Atlas 后,Laravel 项目不会写入 Atlas 集群中的 MongoDB 表——直到我在 config/database.php 文件中使用这些设置。谢谢!
  • @RandallClintsman 您的意思是 mongodb 服务器或应用程序服务器上的 ssl。 ?
【解决方案2】:
 'mongodb' => [
        'driver'   => 'mongodb',
        'host'     => [
                       'abc-00-00.mongodb.net',
                        'abc-00-01.mongodb.net',
                        'abc-00-02.mongodb.net'
                    ],
        'port'     => env('MONGO_DB_PORT', 27017),
        'database' => env('MONGO_DB_DATABASE'),
        'username' => env('MONGO_DB_USERNAME'),
        'password' => env('MONGO_DB_PASSWORD'),
        'options'  => [
            'ssl'        => 'true',
            'replicaSet' => 'abc-0',
            'authSource' => 'admin',
            'retryWrites' => 'true', 
           'w' => 'majority'
       ]
    ],

这适用于 laravel 6 和 MongoDB 1.2 或更高版本的 MongoDB atlas

【讨论】:

    【解决方案3】:

    以下对我有用,MongoDB Atlas 和 Laravel 5.7:

    更新config/database.php:

    'mongodb' => [
                'driver' => 'mongodb',
                'dsn' => 'mongodb+srv://<username>:<password>@cluster0.kxxi7.mongodb.net/mydatabase?retryWrites=true&w=majority',
                'database' => 'mydatabase',
            ],
    

    将连接字符串设置为dsn,将数据库名称设置为database

    【讨论】:

      【解决方案4】:

      默认情况下,组装连接字符串时,Jensegers\Mongodb 包组装一个以 mongodb:// 开头的 DSN。为了连接mongoDB atlas实例,DSN需要以mongodb+srv://开头。

      处理此问题的最简单和最灵活的方法是将以下条目添加到您的 .env 中:

      MONGO_DB_BASE_URI=mongodb+srv://
      

      然后,在您的 database.php 中,您的 mongodb 条目应如下所示:

          'mongodb' => [
              'driver' => 'mongodb',
              'host' => env('MONGO_DB_HOST', 'localhost'),
              'port' => env('MONGO_DB_PORT', 27017),
              'database' => env('MONGO_DB_DATABASE'),
              'username' => env('MONGO_DB_USERNAME'),
              'password' => env('MONGO_DB_PASSWORD'),
              'options' => [],
              'dsn' => env('MONGO_DB_BASE_URI','mongodb://').env('MONGO_DB_HOST', 'localhost')
          ],
      

      这使您可以控制是否连接到本地实例 - 在这种情况下,您可以使用 mongodb:// 的 DSN 或 Atlas 等云实例 - 在这种情况下,您可以使用 mongodb+ 的 DSN srv://。

      【讨论】:

      • 我没想到这会起作用,因为我不知道我正在使用 mongoDB atlas 实例。但它确实奏效了!
      猜你喜欢
      • 2018-03-05
      • 1970-01-01
      • 1970-01-01
      • 2019-06-10
      • 2020-01-15
      • 2021-03-09
      • 2019-01-28
      • 2019-12-30
      • 2019-08-19
      相关资源
      最近更新 更多