Passenger/mod_rails не инициализируется в Fedora 12 при запуске Apache

Я нахожусь в процессе настройки сервера для запуска приложения Ruby on Rails в Fedora 12 с использованием Passenger.

Я нахожусь на этапе, когда я установил Passenger, настроил его, как предписано, но при перезапуске Apache получаю следующие ошибки:

[Wed Jan 13 15:41:38 2010] [notice] caught SIGTERM, shutting down
[Wed Jan 13 15:41:40 2010] [notice] SELinux policy enabled; httpd running as context unconfined_u:system_r:httpd_t:s0
[Wed Jan 13 15:41:40 2010] [notice] suEXEC mechanism enabled (wrapper: /usr/sbin/suexec)
[Wed Jan 13 15:41:40 2010] [error] *** Passenger could not be initialized because of this error: Cannot create FIFO file /tmp/passenger.25235/.guard: Permission denied (13)
[Wed Jan 13 15:41:40 2010] [notice] Digest: generating secret for digest authentication ...
[Wed Jan 13 15:41:40 2010] [notice] Digest: done
[Wed Jan 13 15:41:40 2010] [error] *** Passenger could not be initialized because of this error: Cannot create FIFO file /tmp/passenger.25235/.guard: Permission denied (13)
[Wed Jan 13 15:41:40 2010] [error] python_init: Python version mismatch, expected '2.6', found '2.6.2'.
[Wed Jan 13 15:41:40 2010] [error] python_init: Python executable found '/usr/bin/python'.
[Wed Jan 13 15:41:40 2010] [error] python_init: Python path being used '/usr/lib/python26.zip:/usr/lib/python2.6/:/usr/lib/python2.6/plat-linux2:/usr/lib/python2.6/lib-tk:/usr/lib/python2.6/lib-old:/usr/lib/python2.6/lib-dynload'.
[Wed Jan 13 15:41:40 2010] [notice] mod_python: Creating 4 session mutexes based on 256 max processes and 0 max threads.
[Wed Jan 13 15:41:40 2010] [notice] mod_python: using mutex_directory /tmp 
[Wed Jan 13 15:41:40 2010] [notice] Apache/2.2.14 (Unix) DAV/2 Phusion_Passenger/2.2.9 PHP/5.3.0 mod_python/3.3.1 Python/2.6.2 mod_ssl/2.2.14 OpenSSL/1.0.0-fips-beta3 mod_perl/2.0.4 Perl/v5.10.0 configured -- resuming normal operations

Как видите, при инициализации Passenger возникает проблема с правами доступа:

[Wed Jan 13 15:41:40 2010] [error] *** Passenger could not be initialized because of this error: Cannot create FIFO file /tmp/passenger.25235/.guard: Permission denied (13)

Когда Apache запускается, он создает файл в /tmp:

d-ws--x--x. 2 root  root  4096 2010-01-13 16:04 passenger.26117

Если вместо этого я запущу приложение, запустив mongrel напрямую с помощью mongrel_rails start -e production, я увижу следующее:

ActiveRecord::StatementInvalid (Mysql::Error: Can't create/write to file '/tmp/#sql_5d3_0.MYI' (Errcode: 13): SHOW FIELDS FROM `users`):

Ошибка снова указывает на проблемы с правами доступа к каталогу /tmp.

Я в недоумении, каково решение. Я не уверен, связано ли это просто с правами доступа к каталогам или с безопасностью Fedora SELinux.

Любая помощь будет оценена по достоинству. Спасибо.


person Diego Barros    schedule 13.01.2010    source источник


Ответы (5)


Я сделал то же самое, что и Фред, за исключением того, что вместо того, чтобы делать это по одной ошибке за раз:

  1. Перейдите в разрешительный режим, запустив setenforce 0
  2. Перезапустите apache, зайдите на свой сайт и используйте его некоторое время как обычно.
  3. Беги grep httpd /var/log/audit/audit.log | audit2allow -M passenger
  4. semodule -i passenger.pp
  5. Вернитесь в принудительный режим, запустив setenforce 1
  6. Перезапустите apache и проверьте свой сайт — надеюсь, все будет работать как прежде!

Обратите внимание, что это в основном конкретный пример процедуры в справке Centos SELinux — проверить это.

person Dan Sketcher    schedule 12.03.2010

У меня такая же проблема в CentOS 5.4, SELinux мешает Passenger.

Установка PassengerTempDir в /var/run/passenger просто дает вам те же ошибки разрешений в новом каталоге вместо /tmp :

[Mon Feb 22 11:42:40 2010] [error] *** Passenger could not be initialized because of this error: Cannot create directory '/var/run/passenger/passenger.3686'

Затем я могу изменить контекст безопасности /var/run/passenger, чтобы обойти эту ошибку:

chcon -R -h -t httpd_sys_content_t /var/run/passenger/

... и это позволяет Passenger создавать временный каталог, но не файлы в этом каталоге:

[Mon Feb 22 12:07:06 2010] [error] *** Passenger could not be initialized because of this error: Cannot create FIFO file /var/run/passenger/passenger.3686/.guard: Permission denied (13)

Как ни странно, повторный запуск рекурсивного chcon снова не устраняет эту ошибку, он продолжает умирать в этот момент, и именно здесь мои знания SELinux становятся туманными.

Разделы 6.3.5 и 6.3.7 Phusion Passenger содержат некоторые полезные мысли, но они, похоже, не решают проблему полностью.

person Ert    schedule 22.02.2010
comment
Ert: По сути, я тоже был там. В конце концов, я отключил SELinux, чтобы все заработало. Не идеально, но пока сойдет. - person Diego Barros; 23.02.2010
comment
Я пришел к точно такому же выводу. - person Ert; 08.03.2010

Вам нужно больше, чем просто разрешение httpd_sys_content_t. Для начала я использую следующую технику:

  • начать хвост в журнале аудита: tail -f /var/log/audit/audit.log
  • перезагрузить апач: apachectl restart
  • Перейдите в каталог /tmp/: cd /tmp
  • Если добавляется только 1 строка, используйте команду: tail -1 /var/log/audit/audit.log | audit2allow -M httpdfifo
  • Обратите внимание, что имя «httpdfifo» — это просто имя, выбранное для отражения типа наблюдаемой ошибки.
  • Это создаст файл с именем «httpdfifo.pp». Чтобы разрешить Apache создавать FIFO с этого момента после того, как вы должны выполнить команду: semodule -i httpdfifo.pp
  • Продолжайте делать это до тех пор, пока все ошибки аудита не будут устранены (в моей системе с Centos 5.4 потребовалось 4 разных разрешения)
person Fred Appelman    schedule 10.03.2010

Запуск setenforce 0 перед запуском позволит вам проверить, является ли это SELinux. Не забудьте потом запустить setenforce 1.

person Ignacio Vazquez-Abrams    schedule 13.01.2010
comment
Спасибо. Похоже, это SELinux. Запуск setenforce 0 перед перезапуском Apache привел к запуску приложения. Есть ли что-то, на что я могу обратить внимание, чтобы не отключать SELinux, что, как я полагаю, не рекомендуется отключать, но запустить мое приложение с включенным? - person Diego Barros; 13.01.2010
comment
audit2why и audit2allow могут помочь вам разработать политику SELinux для разрешения доступа, но я бы рассмотрел возможность размещения файлов в другом месте, например. /var/run/passenger, а также. - person Ignacio Vazquez-Abrams; 13.01.2010
comment
Вы предлагаете установить PassengerTempDir в VirtualHost приложения в конфигурации Apache на /var/run/passenger? - person Diego Barros; 13.01.2010
comment
Я полагаю. Я на самом деле не знаю Пассажира :P - person Ignacio Vazquez-Abrams; 13.01.2010

Я попробовал то, что предложили Дэн Скетчер и Фред Эпплман, то есть повторил следующее:

yum install setroubleshoot
echo > /var/log/audit/audit.log # clear irrelevant errors
cd ~
service httpd restart # try booting passenger -- audit.log now shows the relevant permission errors
tail -f /var/log/httpd/error_log # check that passenger is still failing due to permission errors
sealert -a /var/log/audit/audit.log > selinux-diag.txt # translate the permission errors
# read and check that you are happy with selinux-diag.txt 
# and either follow its specific advice, or if it just wants you to grep into audit2allow, then:
cat /var/log/audit/audit.log | audit2allow -M mypol  # grant everything just denied
semodule -i mypol.p # commit new permissions

Но после того, как я сделал это 5 или 6 раз, я продолжал сталкиваться с новыми ошибками, и некоторые из тех же ошибок появлялись даже после того, как я пытался разрешить их с помощью «audit2allow».

В конце концов я просто отключил SELinux с помощью:

echo 0 >/selinux/enforce
person Rich    schedule 20.09.2012