Я использую программу под названием OpenTripPlanner и хочу запустить ее на своем сервере nginx. OpenTripPlanner работает так, что он запускает сервер Grizzly и делает веб-интерфейс доступным через браузер через указанный порт. При локальном запуске это не проблема, я просто запускаю эту команду
java -Xmx1G -jar otp.jar --build graphs/graph --inMemory --port 1010
и я могу получить доступ к веб-интерфейсу через http://localhost:1010
, Но когда я попробовал его на своем сервере, я не смог сделать его доступным из внешнего браузера. Я исправил эту проблему с помощью обратного прокси-сервера, и теперь я могу выполнить приведенную выше командную строку и получить доступ к веб-интерфейсу через otp.****.ca/port1010/
, Основная проблема в том, что мне сейчас нужно добавить sudo
перед командной строкой (вероятно, из-за обратного прокси). Это проблема, потому что я хочу запустить эту командную строку с PHP exec
функция и так как он будет выполняться как пользователь www-data
(сервер на Ubuntu), он не имеет sudo
разрешение.
Когда я пробую скрипт PHP, командная строка считается действительной, но jar
файл выводит следующее сообщение об ошибке
OpenTripPlanner 1.3.0 0b4a0906f372d597ee1ee6cf90e63a7117f33cc9
19:39:28.175 ERROR (OTPMain.java:76) Parameter error: : port 1010 is not available. Permission denied (Bind failed).
Я изменил владельца каждой папки внутри public_html
в www-data
но это все еще не работает.
Я думал о некоторых решениях, но хотя я уверен, что они оба могут работать, они оба выглядят довольно ужасно.
Первое, чтобы дать root
разрешение www-data
, Это был бы мой самый последний выбор из-за всех проблем безопасности, которые это включает.
Второй — не заставлять PHP выполнять командную строку. Что бы PHP сделал, просто написал бы в текстовом файле порт, на котором должен запускаться сервер, и путь к графику (graphs/graph
в приведенной выше командной строке) и будет Cronjob с root
разрешение на запуск сервера, проверяющего файл каждые 2 секунды или около того и запускающего командную строку выше с заданными параметрами. Затем cronjob возвращает PID и выходные данные в PHP, чтобы он мог выполнять свои задачи. Мне это не нравится, потому что в этом процессе может произойти столько ошибок (повреждение файлов, перестал работать cronjob и т. Д.), Что я не думаю, что он может быть эффективно реализован.
Итак, если у кого-то есть какие-либо идеи о том, как решить мою проблему или если вы считаете, что мне следует использовать одно из двух решений, которые я придумала, пожалуйста, дайте мне знать.
Задача ещё не решена.
Других решений пока нет …