Я пытаюсь подключиться к сокету домена PostgreSQL Unix из веб-приложения на Python с помощью mod_wsgi. Соответствующие компоненты системы:
PostgreSQL прослушивает стандартный порт 5432, и у меня нет проблем с его использованием через TCP / IP на 127.0.0.1:5432, но когда я пытаюсь подключиться к его сокету домена Unix, у меня появляется следующая ошибка:
Cannot connect to database: could not connect to server: No such file or directory
Is the server running locally and accepting
connections on Unix domain socket "/tmp/.s.PGSQL.5432"?*
файл /tmp/.s.PGSQL.5432
существует, и я могу подключиться, используя psql
.
Однако, когда я останавливаю apache с помощью systemctl, остановите httpd.service и снова перезапустите его с помощью /usr/sbin/httpd -DFOREGROUND
, все работает нормально, включая страницы, требующие доступа к базе данных
При отключенном SELinux я не понимаю, почему возникают проблемы при запуске httpd с systemctl start httpd.service
.
РЕДАКТИРОВАТЬ:
Я изменился unix_socket_directories = '/tmp,/var/pgsql_sock'
в /var/lib/pgsql/9.3/data/postgresql.conf. Я также изменил конфигурацию в setting.py
в моем приложении django HOST='/var/pgsql_sock'
. Теперь он отлично работает с httpd.service.
Вы не можете использовать /tmp
для хранения сокетов для межпроцессного взаимодействия в этом сценарии, потому что Apache использует частный / tmp каталоги, функция безопасности, которая гарантирует, что процесс может видеть только свой собственный каталог / tmp; он не может видеть, что другие процессы записывают в / tmp, потому что эти другие процессы фактически записывают в разные каталоги.
Это означает, что Apache не видит сокет PostgreSQL.
Вам нужно будет продолжить использование локального TCP-соединения.
Вам также следует не отключить SELinux и используйте правильное логическое значение, чтобы позволить веб-серверу взаимодействовать с базой данных.
Решено редактированием /var/lib/pgsql/9.3/data/postgresql.conf
unix_socket_directories = '/tmp/var/pgsql_sock'
Затем выдано:
mkdir /var/pgsql_sock/
chown postgres:postgres /var/pgsql_sock
отредактировал setting.py в моем приложении django .....HOST='/var/pgsql_sock'
Теперь он отлично работает с httpd.service
Я в основном поклонник использования локальных TCP-соединений, как указал Майкл Хэмптон, однако вы жестяная банка вручную укажите другой каталог и / или символически ссылку на другое место, которое поможет обойти эту проблему.
Например:
mkdir /var/pgsql_socket/
ln -s /tmp/.s.PGSQL.5432 /var/pgsql_socket/
И укажите Apache в / var / pgsql_socket