Django / Pyodbc / Apache - Ошибка подключения при использовании Apache

Я пытаюсь подключиться к серверной части SQL Server из приложения Django с помощью пакета django-pyodbc-azure.

Я могу подключаться и возвращать данные с помощью оболочки Django manage.py (запросы ORM и pyodbc) и сервера разработки (HttpResponse в функции просмотра), но когда я пытаюсь использовать Apache и mod_wsgi, я получаю сообщение об ошибке:

('08S01', '[08S01] [unixODBC][FreeTDS][SQL Server]Unable to connect: Adaptive Server is unavailable or does not exist (20009) (SQLDriverConnect)')

Я использую Red Hat Enterprise Linux 7, Python 3.3.5, Pyodbc 3.0.7, Django 1.7, Apache 2.4.6, Mod_WSGI 4.4.5, SQL Server 2014, FreeTDS 0.91 (с использованием dsn-less) и Django-Pyodbc -Azure 1.2.0


Modwsgi.conf:

<VirtualHost *:80>
    WSGIDaemonProcess xxx.xxx.xxx.xxx python-path=/path/to/mysite.com:/path/to/virtualenv/lib/python3.3/site-packages processes=2 threads=15
    WSGIProcessGroup xxx.xxx.xxx.xxx

    WSGIScriptAlias / /path/to/mysite.com/mysite/wsgi.py

    <Directory /path/to/mysite.com/mysite>
    <Files wsgi.py>
        Require all granted
    </Files>
    </Directory>
</VirtualHost>


wsgi.py:

"""
WSGI config for mysite project.

It exposes the WSGI callable as a module-level variable named ``application``.

For more information on this file, see
https://docs.djangoproject.com/en/1.7/howto/deployment/wsgi/
"""

import os

os.environ.setdefault("DJANGO_SETTINGS_MODULE", "mysite.settings")

from django.core.wsgi import get_wsgi_application
application = get_wsgi_application()


В settings.py:

DATABASES = {
    'default': {
        'ENGINE': 'sql_server.pyodbc',
        'HOST': 'hostname',
        'NAME': 'dbname',
        'USER': 'dbuser',
        'PASSWORD': 'dbpassword',
        'PORT': '1433',
        'OPTIONS': {
            'driver': 'FreeTDS',
            'host_is_server': True,
            'unicode_results': True,
            'extra_params': 'tds_version=7.4'
        }
    }
}


При использовании runserver manage.py я могу просматривать данные в браузере.

С помощью переводчика я также могу:

In [1]: import pyodbc
In [2]: conn = pyodbc.connect('DRIVER=FreeTDS;SERVER=servername;PORT=1433;DATABASE=dbname;UID=dbuser;PWD=dbpassword')
In [3]: cursor = conn.cursor()
In [4]: cursor.execute("select top 5 test_names from test_table;").fetchone()
Out[4]: ('John', )


Но по какой-то причине первоначальная попытка подключения к базе данных pyodbc терпит неудачу, когда я пытаюсь использовать Apache.
Любая помощь по этому поводу очень ценится.


person clank    schedule 18.03.2015    source источник
comment
Я не уверен, что это поможет (я сомневаюсь в этом), но ваша версия TDS должна быть 7.2, а не 7.4. Хотя 7.4 является последней версией в спецификации Microsoft, FreeTDS поддерживает только до 7.2: freetds.org/userguide /choosingtdsprotocol.htm   -  person FlipperPA    schedule 18.03.2015
comment
@FlipperPA Изначально у меня была версия 7.2, когда я столкнулся с проблемой и изменил ее на 7.4 в надежде, что это может помочь, но спасибо за предложение.   -  person clank    schedule 18.03.2015
comment
RedHat часто включает SELinux, который накладывает ограничения на то, что код, работающий под Apache, действительно может делать. Возможно, вам потребуется настроить политики SELinux. Для подтверждения попробуйте сначала временно отключить SELinux.   -  person Graham Dumpleton    schedule 19.03.2015
comment
@GrahamDumpleton Это исправило! Я следил за этим link и установите SELINUX=passive в / etc / selinux / config, но в / var / log / messages нет записей, поэтому я не совсем уверен, что было заблокировано. Знаете ли вы, как я могу это выяснить, не оставляя SELinux полностью отключенным? Спасибо за помощь.   -  person clank    schedule 19.03.2015
comment
Извините. Очень мало знаю о SELinux, за исключением того, где указать людям, чтобы временно отключить его, чтобы определить, является ли это причиной проблем.   -  person Graham Dumpleton    schedule 19.03.2015


Ответы (1)


Вы пробовали бегать

sudo setsebool -P httpd_can_network_connect=1

на машине?

person Erez A. Korn    schedule 24.06.2015
comment
В итоге я просто отключил SELinux и оставил все как есть. Но спасибо за ваше предложение, это кажется намного безопаснее. - person clank; 25.06.2015