【问题标题】:Weird MySQL Python mod_wsgi Can't connect to MySQL server on 'localhost' (49) problem奇怪的 MySQL Python mod_wsgi Can't connect to MySQL server on 'localhost' (49) 问题
【发布时间】:2009-11-24 21:05:57
【问题描述】:

StackOverflow 上有类似的问题,但我没有发现完全相同的情况。这是在使用 MySQL 的 OS X Leopard 机器上

一些起始信息:

MySQL Server version        5.1.30
Apache/2.2.13 (Unix)
Python 2.5.1
mod_wsgi 3

mysqladmin 也将 skip-networking 列为 OFF

我可以从 python 命令行连接到 mysql。但是当我尝试通过 mod_wsgi 使用复制和粘贴的代码或通过 Django 执行此操作时,我收到了通用连接拒绝

OperationalError: (2003, "Can't connect to MySQL server on 'localhost' (49)")

我查看了 mysql 手册并尝试了它的故障排除技巧,例如

telnet localhost 3306

我确实建立了联系。

我也没有尝试以 root 身份连接。

关于我还能检查什么的任何想法? 提前致谢!

【问题讨论】:

    标签: python mysql django mod-wsgi mysql-error-2003


    【解决方案1】:

    我遇到了这个错误,这是由于 SELinux 拒绝。 /usr/bin/httpd 没有权限连接到端口 3306。我更正了这个问题:

    setsebool httpd_can_network_connect_db on
    

    似乎工作得很好,应该比仅仅禁用 SELinux 更安全。正如 Avinash Meetoo 在下面指出的,您可以使用:

    setsebool -P httpd_can_network_connect_db
    

    使 selinux 更改在重新启动后持续存在。

    【讨论】:

    • 非常感谢。我在 CentOS Linux 6 上使用 MySQL,SELinux 以强制模式运行。 setsebool 完美地解决了这个问题。
    • setsebool -P httpd_can_network_connect_db on 更好,因为它是持久的。如果没有-P,setsebool 不会在重新启动后持续存在。
    【解决方案2】:

    我在 Django 中得到了完全相同的错误消息:

    OperationalError: (2003, "Can't connect to MySQL server on 'localhost' (49)")
    

    要修复它,我必须在 django 设置文件中将 mysql 端口显式设置为 3306。

    【讨论】:

      【解决方案3】:

      在这方面并没有太多。只是一个随机猜测,但尝试使用:

      DATABASE_HOST = '本地主机' 而不是 127.0.0.1

      和/或尝试在您的 my.ini 中注释掉:

      绑定地址 127.0.0.1

      值得一试。

      【讨论】:

        【解决方案4】:

        telnet 连接工作有点奇怪。也许还有更多的方法来解决问题:

        shell> perror 49
        OS error code  49:  Can't assign requested address
        

        我会先检查 localhost 接口,检查它是否有 IPv4 地址。也许有些牵强,但当我启用 IPv6 时我遇到了麻烦。

        shell> ifconfig lo0
        

        也许名称解析在 Apache/mod_wsgi/etc 中无法正常工作。

        import python
        print socket.gethostbyname('localhost')
        print socket.gethostbyaddr('127.0.0.1')
        

        也许为了让你继续前进(我为 Django 做出的贡献)尝试 Django 中的 UNIX Socket,它可以将数据库主机设置为路径(以正斜杠开头):

        DATABASE_HOST = '/tmp/mysql.sock'
        

        或者你的套接字文件在哪里。

        最后,检查 MySQL 错误日志是否有任何奇怪的消息,例如绑定 IP 地址或端口失败。

        希望这会有所帮助。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2016-04-08
          • 2016-06-06
          • 1970-01-01
          • 1970-01-01
          • 2019-11-04
          • 2021-12-16
          • 2020-02-21
          相关资源
          最近更新 更多