1

Я написал простой файл PHP, который вызывает приложение Java.

Он работает на Cli без проблем, но я не могу запустить его в браузере.

Выход:

"Java HotSpot(TM) 64-Bit Server VM warning: INFO:os::commit_memory(0x00007ff590053000, 2555904, 1) failed; error='Permission denied' (errno=13) 
# # There is insufficient memory for the Java Runtime Environment to continue. 
# Native memory allocation (malloc) failed to allocate 2555904 bytes for committing reserved memory. 
# An error report file with more information is saved as: # /tmp/hs_err_pid14930.log "

Как я могу это исправить?

2 ответа2

1

В случае, если кто-то еще ищет способ решить эту проблему без явного отключения SELinux, вики-страница centos.org помогла мне понять, что происходит.

По умолчанию контекст безопасности, в котором Java запускается при вызове из Apache, не позволяет такие вещи, как чтение файла, выделение памяти, доступ к сети и т.д. Самый простой способ устранить эти ошибки - использовать приложения semodule и audit2allow. По сути, проверьте журнал аудита SELinux (это может быть /var/logs/audit/audit.log, но я использовал /var /log /messages и извлек ошибки avc). В журнале вы должны увидеть такие вещи, как

avc: denied {getattr} для pid = 21415 comm = "java"

а также

avc: запрещен {open} для pid = 21319 comm = "java"

Фактически, вы увидите довольно много о выполнении, распределении памяти и ряде других политик, которые вы нарушаете, поскольку SELinux настроен на принудительное выполнение и остановку работы приложения.

С вашим журналом аудита запустите aud2allow, как показано ниже:

audit2allow -M myapppolicy <audit.log

Где myapppolicy - это имя политики, которую вы хотите создать, которая разрешит все, что было отклонено в журнале, а audit.log - это имя файла журнала, описанного выше. После выполнения этой команды должны быть созданы два файла. Первым является myapppolicy.te, который представляет собой текстовое представление политики на основе журнала аудита. Вы можете открыть это в текстовом редакторе и убедиться, что ваша политика не слишком широка. Второй файл - это файл myapppolicy.pp, который представляет собой скомпилированный пакет политик, который вы можете включить.

Запустите следующее, чтобы активировать пакет политики, а затем повторите попытку. У вас может быть несколько попыток, чтобы все работало так, как ожидалось, поскольку ваше Java-приложение может нарушить какую-то другую политику после того, как оно получит доступ к первой. Я выполняю эти шаги около пяти раз для серии Java-приложений, которые я запускал через скрипт через php.

semodule -i myapppolicy.pp

1

Похоже, вы достигли максимального предела памяти: Java запрашивает около 2,5 Мб и не может его получить. Странно, что это не так уж и много, но, скорее всего, не включает само изображение JRE, поэтому оно будет намного больше.

Проверьте и / или увеличьте лимит памяти PHP (/etc/php.ini), например:

memory_limit = 128M

В зависимости от конфигурации вы можете сделать это также в самом .php:

ini_set('memory_limit', '128M');

В случае публикации /tmp/hs_err_pid14930.log ошибка, на которую ссылается ошибка, будет очень полезна!

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .