У меня есть машина Ubuntu 16.04 с Apache2 и Docker (сам докер запускает GitLab из концентратора Docker). В этом ящике также находится экземпляр Phabricator, поэтому я поместил GitLab в отдельный Docker, чтобы разделять вещи.
Также важно отметить, что я могу получить доступ к серверу двумя разными способами: в частной сети моей компании через частный IP-адрес (10.10.XY) или через имя хоста "gitlab.example.com", которое указывает на общедоступный IP-адрес. .
Изнутри частной сети, если я перейду к «10.10.X.Y: 10080», я смогу получить доступ к GitLab во всей его красе. Если я перейду на «gitlab.example.com:10080» за пределы сети (и открою 10080 в брандмауэре), я все равно смогу получить доступ к GitLab без проблем.
Однако я хочу избежать открытия 10080; Я также предпочел бы, чтобы моим разработчикам нужно было вводить только имя хоста и не указывать номер порта.
Я пытался сделать это несколькими способами, но безрезультатно ...
Apache2 ProxyPass (пробовали использовать localhost и IP-адрес докера для ProxyPass / ProxyReverse). Я проверил, что mod_proxy включен. Доступ к URL-адресу дает мне сообщение об ошибке, указывающее, что для сайта нет конфигурации. Если я закомментирую всю информацию о прокси ниже, то будет обслуживаться страница успеха Apache2 по умолчанию (предположительно, потому что она возвращается к корню основного документа, поскольку у меня нет такой, определенной ниже).
<VirtualHost *:80>
ProxyPreserveHost On
ProxyRequests On
ServerName gitlab.example.com
ProxyPass / http://172.17.0.2:80/
ProxyPassReverse / http://172.17.0.2:80/
<Proxy *>
Order deny,allow
Allow from all
</Proxy>
</VirtualHost>
iptables PREROUTING. Я не эксперт по iptables, и большая часть моей сетевой маршрутизации выполняется через Barracuda, но я читал в Интернете, что вы должны иметь возможность маршрутизировать с одного порта на другой из одного окна. Я пробовал несколько команд, как показано ниже, но все равно не повезло. Я так растерялся, когда дело доходит до iptables, что приведенные ниже команды могут быть недоступны.
sudo iptables -A PREROUTING -t nat -s gitlab.example.com -p tcp --dport 80 -j DNAT --to-destination 172.17.0.2:10080
sudo iptables -t nat -A OUTPUT -d 172.17.0.2 -p tcp --dport 80 -j REDIRECT --to-port 10080
sudo iptables -A PREROUTING -t nat -s gitlab.example.com -p tcp --dport 80 -j REDIRECT --to-port 10080
Ринетд. Это звучало многообещающе, но не работает так, как я ожидал. Я только действительно попробовал команду ниже, а затем двинулся дальше. Возможно, я неправильно понял команду или то, как скомпилировать ее для работы.
sudo rinetd gitlab.example.com 80 172.17.0.2 10080
Я также пробовал кое-что с iproute2 и socat, но я очень плохо задокументировал эти попытки и не совсем уверен, что я пробовал с этими двумя. Я знаю, что все, что я пробовал, явно не сработало!
Я чувствую, что должен быть какой-то другой метод, который мне не хватает, и теперь я бьюсь головой о стену, пытаясь заставить это работать. Любое понимание будет очень признательно.
Я нашел решение своей проблемы. Во время первых попыток это была ошибка пользователя с моей стороны.
Мой VHost:
<VirtualHost *:80>
ServerName gitlab.example.com
ProxyPreserveHost On
<Proxy *>
Order allow,deny
Allow from all
</Proxy>
ProxyPass / http://172.17.0.2:80/
ProxyPassReverse / http://172.17.0.2:80/
</VirtualHost>
ПРИМЕЧАНИЕ. 172.17.0.2 - это IP-адрес моего контейнера gitlab.
Что я упустил в своих первых попытках, так это ... подождите ... Я не включил мод proxy_http !! Так что неудивительно, что это никогда не работало. Этого никогда не было бы.
После настройки VHost обязательно выполните следующие действия:
sudo a2enmod proxy
sudo a2enmod proxy_http
sudo service apache2 reload
И вуаля! Теперь я могу получить доступ к своему экземпляру gitlab с gitlab.example.com в браузере, и он будет автоматически перенаправлять на порт 10080, но оставить URL-адрес в браузере как есть.
РЕДАКТИРОВАТЬ: У меня возникла проблема с моей исходной конфигурацией, когда я запретил трафик на порт 10080 через брандмауэр, потому что я пытался прокси-сервер обратно на сервер, используя имя хоста. Вместо этого я переключился на IP-адрес докера: PORT в VHost, чтобы решить эту проблему.
rinetd
использует файл конфигурации для запуска. Вы можете просто поместить эту строку в файл с именем rinetd.conf
:
gitlab.example.com 80 172.17.0.2 10080
А затем запустите rinetd, как вы планировали (-f
работает в режиме переднего плана; иначе он перейдет в фоновый режим, как традиционный демон):
sudo rinetd -f -c rinetd.conf