Executar java no php apache2

1

Eu escrevi um arquivo PHP simples que chama um aplicativo java.

Ele roda no cli sem problemas, mas não posso executá-lo no navegador.

Saída:

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

Como posso corrigir isso?

    
por monkey 14.02.2014 / 08:00

2 respostas

1

Parece que você está atingindo o limite máximo de memória: o Java solicita cerca de 2,5 MB e não consegue obtê-lo. Estranho, não é muito, mas muito provavelmente não inclui a própria imagem do JRE, então será muito mais.

Verifique e / ou aumente o limite de memória do PHP (/etc/php.ini), algo como:

memory_limit = 128M

Dependendo da configuração, você também pode fazer isso no .php:

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

No caso de postar o /tmp/hs_err_pid14930.log, o erro está sendo refeito também seria muito útil!

    
por 14.02.2014 / 08:23
1

Caso alguém mais esteja procurando uma maneira de resolver isso sem desabilitar explicitamente o SELinux, a página wiki do centos. org me ajudou a entender o que estava acontecendo.

Por padrão, o contexto de segurança em que o Java está sendo executado quando chamado do Apache não permite coisas como ler um arquivo, alocar memória, acessar a rede, etc. A maneira mais fácil de resolver esses erros é usando os aplicativos semodule e audit2allow. . Essencialmente, verifique o log de auditoria do SELinux (pode ser /var/logs/audit/audit.log, mas usei / var / log / messages e extraí os erros avc). No log você deve ver coisas como

avc: denied { getattr } for pid=21415 comm="java"

e

avc: denied { open } for pid=21319 comm="java"

Na verdade, você verá muito sobre execução, alocação de memória e uma série de outras políticas que você está violando, já que o SELinux está configurado para impor e impedir a execução do aplicativo.

Com seu registro de auditoria, execute o audit2allow como abaixo:

audit2allow -M myapppolicy < audit.log

Onde myapppolicy é o nome da política que você deseja criar que permitirá todas as coisas que foram negadas no log e audit.log é o nome do arquivo de log descrito acima. Depois de executar este comando, dois arquivos devem ser criados. O primeiro é myapppolicy.te, que é uma representação de texto da política baseada no log de auditoria. Você pode abrir isso em um editor de texto e garantir que sua política não seja muito ampla. O segundo arquivo é o arquivo myapppolicy.pp, que é o pacote de políticas compilado que você pode ativar.

Execute o seguinte para ativar o pacote de políticas e repita o processo. Você pode ter várias tentativas para fazer tudo funcionar conforme o esperado, pois seu aplicativo Java pode violar alguma outra política depois que tiver acesso ao primeiro. Eu executo essas etapas cerca de cinco vezes para uma série de aplicativos Java que eu estava executando via script via php.

semodule -i myapppolicy.pp

    
por 08.10.2014 / 16:44