You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多
文档控制台
免费开始使用

CentOS7下Django+Apache连接MS SQL Server超时问题求助

解决CentOS 7下Apache mod_wsgi部署Django连接MS SQL Server的登录超时问题

这种情况我之前碰到过好几次,核心原因基本都是Apache运行环境和你本地测试环境的差异——毕竟python manage.py runserver是用你当前登录用户的权限、环境变量跑的,而Apache默认是以apache用户的身份运行的,两者的ODBC配置、文件权限或者环境变量完全不是一回事儿。下面是我整理的排查和解决步骤:

  • 检查Apache用户对ODBC驱动的访问权限
    ODBC Driver 17的安装文件通常在/opt/microsoft/msodbcsql17/路径下,你需要确保apache用户能读取这些文件:

    sudo chown -R root:apache /opt/microsoft/msodbcsql17/
    sudo chmod -R 750 /opt/microsoft/msodbcsql17/
    

    同时还要确认ODBC配置文件/etc/odbcinst.ini的权限,保证apache能读取:

    sudo chmod 644 /etc/odbcinst.ini
    
  • 给Apache添加ODBC相关的环境变量
    有时候ODBC驱动的路径没有被Apache的环境变量加载,导致驱动找不到。你可以在Apache的主配置文件(httpd.conf)或者你的虚拟主机配置文件里添加:

    SetEnv LD_LIBRARY_PATH /opt/microsoft/msodbcsql17/lib64:$LD_LIBRARY_PATH
    

    添加完成后记得重启Apache生效:

    sudo systemctl restart httpd
    
  • 修正数据库连接字符串配置
    别依赖本地用户的认证配置(比如Trusted_Connection=yes,这个在Apache环境下需要Kerberos,配置起来很麻烦),尽量用SQL Server的账号密码直接登录,settings.py里的数据库配置改成类似这样:

    DATABASES = {
        'default': {
            'ENGINE': 'sql_server.pyodbc',
            'NAME': '你的数据库名',
            'USER': 'SQL Server账号',
            'PASSWORD': '账号密码',
            'HOST': 'SQL Server地址',
            'PORT': '1433',
            'OPTIONS': {
                'driver': 'ODBC Driver 17 for SQL Server',
                'extra_params': 'Encrypt=yes;TrustServerCertificate=yes',
            },
        }
    }
    

    另外如果SQL Server是远程的,确认一下防火墙是否允许Apache所在服务器访问1433端口(虽然runserver能访问,但Apache可能受不同的防火墙规则限制)。

  • 临时切换Apache运行用户验证问题
    为了快速确认是不是用户权限/环境变量的问题,可以临时把Apache的运行用户改成你本地跑runserver的用户,在httpd.conf里找到UserGroup配置:

    User 你的本地用户名
    Group 你的本地用户组
    

    重启Apache后再访问管理页,如果正常了,那就是用户权限或环境变量的问题,再针对性调整回去即可。

  • 查看Apache错误日志获取细节
    页面上的错误信息太笼统,直接去看Apache的错误日志,CentOS里通常是/var/log/httpd/error_log,里面会有更具体的报错,比如驱动找不到、权限不足等,能帮你精准定位问题:

    sudo tail -f /var/log/httpd/error_log
    

我之前就是因为Apache用户读不到ODBC驱动的文件,改了权限就解决了,按上面的步骤一步步排查,应该能搞定。

内容的提问来源于stack exchange,提问作者Sebastian

火山引擎 最新活动