Go, sudo и apache порт 80
Я использую пакет gorilla/mux в golang, но есть некоторые проблемы. Во-первых, у меня нет прав на использование порта 80 в моем приложении, потому что я не могу запустить приложение из sudo как $GOPATH
не устанавливается при использовании sudo.
Вот ошибка, которую я получаю из моей программы:
$ go run app.go
2014/06/28 00:34:12 Listening...
2014/06/28 00:34:12 ListenAndServe: listen tcp :80: bind: permission denied
exit status 1
Я не уверен, будет ли это работать, даже когда я исправлю проблему sudo, потому что apache уже использует порт 80, и я не уверен, что и мое приложение, и apache могут "хорошо играть" вместе.
Любой совет, как решить эту проблему, был бы великолепен. Спасибо.
2 ответа
Цитирую комментарий Элитар,
У вас есть два варианта: либо отключить Apache (потому что только один сервис может связываться с портом), либо (лучше!) Использовать Apache ProxyPass, чтобы проксировать любые входящие запросы на конкретное имя хоста на ваш сервер Go, работающий на порту (например) 8000. Второй метод очень популярен, надежен, и вы можете использовать Apache для обработки регистрации запросов и SSL для вас.
Обратный прокси
Использование Apache на порту 80 таким способом называется обратным прокси. Он получает все входящие соединения через порт 80 (и / или порт 443 для https) и передает их, как правило, в незашифрованном виде только через внутренние локальные соединения, в вашу программу Go, запущенную на любом выбранном вами порту. 8000 и 8080 часто используются. Трафик между Apache и вашим сервером сам по себе является HTTP-трафиком.
Поскольку ваша программа Go не запускается от имени пользователя root, она не может изменять важные функции на сервере. Поэтому это дает дополнительную степень безопасности, если ваша программа когда-либо будет содержать недостатки безопасности, потому что любой злоумышленник получит только ограниченный доступ.
FastCGI
Вы можете улучшить общую производительность обратного прокси, не используя HTTP для соединения Apache с сервером Go. Это делается с помощью протокола FastCGI, первоначально разработанного для сценариев оболочки, Perl и PHP, но также хорошо работает с Go. Чтобы использовать это, вы должны изменить свой сервер Go для прослушивания с использованием API fcgi. Apache FastCGI также требуется. Трафик от Apache к вашему серверу использует более компактный формат (не HTTP), и это снижает нагрузку на каждый конец.
Выбор типа сокета также открыт: вместо обычных TCP-сокетов можно использовать Unix-сокеты, которые еще больше снижают нагрузку на обработку. Я сам не делал этого в Go, но API поддерживает необходимые биты (см. Связанный вопрос).
Nginx
Хотя все вышеперечисленное описывает использование Apache, существуют и другие серверные продукты, которые также могут предоставлять обратный прокси-сервер. Наиболее заметным является Nginx ( пример обратного прокси-сервера Nginx), который даст вам небольшие, но полезные преимущества в производительности и масштабируемости. Если у вас есть эта опция на ваших серверах, ее стоит изучить и развернуть.
Основываясь на этом предыдущем ответе о переменных среды, я смог легко решить проблему sudo.
/questions/43469632/kak-sohranit-peremennyie-okruzheniya-pri-ispolzovanii-sudo/43469642#43469642
sudo visudo
добавил эти строки:
Defaults env_keep +="GOPATH"
Defaults env_keep +="GOROOT"
Кстати, используя Ubuntu 12.04. Я думаю, что предыдущий ответ о прокси для использования порта 80 является правильным выбором, потому что после исправления проблемы sudo мне выдали эту ошибку о порте 80 вместо этого:
$ sudo go run app.go
2014/06/28 01:26:30 Listening...
2014/06/28 01:26:30 ListenAndServe: listen tcp :80: bind: address already in use
exit status 1
Это означает, что команда sudo была исправлена, но привязка прокси не будет работать с другой службой, уже использующей порт 80 (apache).