httpd.service Невозможно подключиться к базе данных Centos 7

Я пытаюсь подключиться к сокету домена PostgreSQL Unix из веб-приложения Python с mod_wsgi. Соответствующие компоненты системы:

  • CentOS 7 x64
  • Python 2.7.5
  • SELinux отключен

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.

3 ответа

Вы не можете использовать /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

Другие вопросы по тегам