Uruchom Java w PHP Apache2

1

Napisałem prosty plik PHP, który wywołuje aplikację Java.

Działa bez problemu na cli, ale nie mogę uruchomić go w przeglądarce.

Wynik:

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

Jak mogę to naprawić?

małpa
źródło
Dodaj kod do swojej aplikacji PHP
Anton Dozortsev
Rozwiązałem problem. Jest to ochrona pamięci przez SELINUX.
małpa

Odpowiedzi:

1

Wygląda na to, że osiągasz maksymalny limit pamięci: Java prosi o około 2,5 MB i nie może go uzyskać. Dziwne, że nie jest tak wiele, ale najprawdopodobniej nie zawiera samego obrazu JRE, więc będzie o wiele więcej.

Sprawdź i / lub zwiększ limit pamięci PHP (/etc/php.ini), coś w stylu:

limit_pamięci = 128 mln

W zależności od konfiguracji możesz to zrobić również w samym pliku .php:

ini_set („memory_limit”, „128M”);

W przypadku publikowania pliku /tmp/hs_err_pid14930.log błąd, do którego się odwołuje, byłby bardzo pomocny!

fede.evol
źródło
Ustawiam jak ty. Ale nadal ma problem. I mam 2 GB darmowej i 4 GB wymiany w systemie. Może być to ograniczenie Apache.
małpa
Nie chodzi o darmową pamięć RAM / Swap, ale o ograniczenie liczby osób, które spawnują Twój proces. Spróbuj z wyższym równym limitem w przypadku wątpliwości (wstaw 256 lub 512). Pamiętaj, aby ponownie uruchomić apache za każdym razem na wszelki wypadek. Wyślij również ten login / tmp na wypadek, abyśmy mogli pomóc więcej.
fede.evol
Dziękuję Ci. Widzę, że dziennik jest taki sam jak ten komunikat. Przełączam się na komputer z systemem Windows. Skonfiguruj wszystkie z domyślnymi opcjami (WAMPP, Java ...) -> Działa. Spróbuję to naprawić w Linuksie (może to być wersja java, ulimit lub coś innego)
małpa
1

W przypadku, gdy ktoś inny szuka sposobu na rozwiązanie tego problemu bez wyraźnego wyłączenia SELinux, strona wiki w centos.org pomogła mi zrozumieć, co się dzieje.

Domyślnie kontekst bezpieczeństwa, w którym działa Java, gdy jest wywoływany z Apache, nie pozwala na takie rzeczy, jak czytanie pliku, przydzielanie pamięci, dostęp do sieci itp. Najłatwiejszym sposobem na rozwiązanie tych błędów jest użycie aplikacji semodułu i audit2allow. Zasadniczo sprawdź dziennik kontroli SELinux (może to być /var/logs/audit/audit.log, ale użyłem / var / log / messages i wyodrębniłem błędy avc). W dzienniku powinieneś zobaczyć takie rzeczy

avc: odmowa {getattr} dla pid = 21415 comm = "java"

i

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

W rzeczywistości zobaczysz sporo na temat wykonywania, przydzielania pamięci i wielu innych zasad, które naruszasz, ponieważ SELinux jest ustawiony na wymuszanie i zatrzymywanie działania aplikacji.

W dzienniku kontroli uruchom audit2allow jak poniżej:

audit2allow -M myapppolicy <audit.log

Gdzie myapppolicy to nazwa zasady, którą chcesz utworzyć, która zezwoli na wszystkie rzeczy, które zostały odrzucone w dzienniku, a audit.log to nazwa pliku dziennika opisanego powyżej. Po uruchomieniu tego polecenia należy utworzyć dwa pliki. Pierwszy to myapppolicy.te, który jest tekstową reprezentacją zasad na podstawie dziennika kontroli. Możesz to otworzyć w edytorze tekstu i upewnić się, że Twoje zasady nie są zbyt szerokie. Drugi plik to plik myapppolicy.pp, który jest skompilowanym pakietem zasad, który można włączyć.

Uruchom następujące polecenie, aby aktywować pakiet zasad, a następnie ponów proces. Być może masz wiele prób, aby wszystko działało zgodnie z oczekiwaniami, ponieważ aplikacja Java może naruszać inne zasady po uzyskaniu dostępu do pierwszej. Kroki te wykonuję około pięć razy dla serii aplikacji Java, które uruchomiłem za pomocą skryptu za pośrednictwem php.

semodule -i myapppolicy.pp

Christopher Ottley
źródło