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.

Однако, когда я останавливаю апача с остановкой 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.

1
задан 31 March 2015 в 17:45
3 ответа

Вы не можете использовать / tmp для хранения сокетов для межпроцессного взаимодействия в этом сценарии, потому что Apache использует частные / tmp каталоги , безопасность функция, которая гарантирует, что процесс может видеть только свой собственный каталог / tmp; он не может видеть, что другие процессы записывают в / tmp, потому что эти другие процессы фактически записывают в разные каталоги.

Это означает, что Apache не может видеть сокет PostgreSQL.

Вам нужно будет продолжить использование локального TCP-соединения.

Вы также должны не отключать SELinux, а использовать правильное логическое значение, чтобы разрешить веб-серверу взаимодействовать с базой данных .

3
ответ дан 3 December 2019 в 17:05

Я в основном поклонник использования локальных TCP-соединений, как указал Майкл Хэмптон, однако вы можете вручную указать другой каталог и / или символически связать его с другим местом, которое ' Буду работать над этой проблемой.

Например:

mkdir /var/pgsql_socket/ 
ln -s /tmp/.s.PGSQL.5432 /var/pgsql_socket/

И укажите Apache в / var / pgsql_socket

1
ответ дан 3 December 2019 в 17:05

Решено путем редактирования /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

1
ответ дан 3 December 2019 в 17:05

Теги

Похожие вопросы