在 php apache2 中运行 java

在 php apache2 中运行 java

我编写了一个调用 Java 应用程序的简单 PHP 文件。

它在 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 "

我该如何修复它?

答案1

看起来您已经达到了最大内存限制:Java 要求大约 2.5mb 的内存,但无法获得。奇怪的是,内存并没有那么多,但很可能不包括 JRE 映像本身,因此内存会更多。

检查和/或增加 PHP 内存限制(/etc/php.ini),例如:

内存限制 = 128M

根据配置,您也可以在 .php 本身中执行此操作:

ini_set('内存限制'​​,'128M');

如果发布错误所指的 /tmp/hs_err_pid14930.log 也会非常有帮助!

答案2

如果其他人正在寻找一种无需明确禁用 SELinux 即可解决此问题的方法,维基页面centos.org 帮助我了解发生了什么。

默认情况下,当从 Apache 调用 Java 时,Java 所运行的安全上下文不允许执行诸如读取文件、分配内存、访问网络等操作。解决这些错误的最简单方法是使用 semodule 和 audit2allow 应用程序。本质上,检查 SELinux 审计日志(可能是 /var/logs/audit/audit.log,但我使用了 /var/log/messages 并提取了 avc 错误)。在日志中,您应该看到类似以下内容

avc: 拒绝 pid=21415 comm="java" 的 { getattr }

avc: 拒绝 pid=21319 comm="java" 的 { 打开 }

事实上,您将看到很多有关执行、内存分配和许多其他您违反的政策,因为 SELinux 被设置为强制执行和停止应用程序运行。

使用您的审计日志运行 audit2allow 如下:

audit2allow -M myapppolicy < audit.log

其中,myapppolicy 是您要创建的策略的名称,该策略将允许日志中被拒绝的所有内容,audit.log 是上述日志文件的名称。运行此命令后,应创建两个文件。第一个是 myapppolicy.te,它是基于审计日志的策略的文本表示。您可以在文本编辑器中打开它并确保您的策略不太宽泛。第二个文件是 myapppolicy.pp 文件,它是您可以启用的编译策略包。

运行以下命令使策略包处于活动状态,然后重试您的进程。您可能需要多次尝试才能使一切按预期运行,因为您的 Java 应用程序在获得第一个策略的访问权限后可能会违反其他策略。对于通过 php 脚本运行的一系列 Java 应用程序,我执行了这些步骤大约五次。

semodule-i myapppolicy.pp

相关内容