CentOS7下Django+Apache连接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里找到User和Group配置:User 你的本地用户名 Group 你的本地用户组重启Apache后再访问管理页,如果正常了,那就是用户权限或环境变量的问题,再针对性调整回去即可。
查看Apache错误日志获取细节
页面上的错误信息太笼统,直接去看Apache的错误日志,CentOS里通常是/var/log/httpd/error_log,里面会有更具体的报错,比如驱动找不到、权限不足等,能帮你精准定位问题:sudo tail -f /var/log/httpd/error_log
我之前就是因为Apache用户读不到ODBC驱动的文件,改了权限就解决了,按上面的步骤一步步排查,应该能搞定。
内容的提问来源于stack exchange,提问作者Sebastian




