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_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.
Я в недоумении относительно того, что решение. Я не уверен, связано ли это просто с правами доступа к каталогам или безопасностью Fedin SELinux.
Любая помощь будет оценена. Благодарю.
5 ответов
Я сделал то же самое, что и Фред, за исключением того, что вместо одной ошибки за раз:
- Войдите в разрешительный режим, запустив
setenforce 0
- Перезапустите apache, зайдите на свой сайт и используйте его на некоторое время, как обычно
- Бежать
grep httpd /var/log/audit/audit.log | audit2allow -M passenger
semodule -i passenger.pp
- Вернитесь в принудительный режим, запустив
setenforce 1
- Перезапустите apache и протестируйте свой сайт - надеюсь, все должно работать как прежде!
Обратите внимание, что это в основном конкретный пример процедуры в справке Centos SELinux - посмотрите ее.
Вам нужно больше, чем просто разрешение httpd_sys_content_t. Я использую следующую технику, чтобы начать работу:
- начать хвост в журнале аудита:
tail -f /var/log/audit/audit.log
- перезагрузите apache:
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 вида разрешений)
У меня та же проблема в 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 есть некоторые полезные мысли, но, похоже, они не решают проблему полностью.
Бег setenforce 0
перед запуском проверим, если это SELinux. Не забудь бежать setenforce 1
после этого.
Я попробовал то, что предложили Дэн Скетчер и Фред Эпплман, то есть повторил следующее:
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