Вопрос или проблема
У меня есть сервер GitLab рядом с моим веб-сервером, работающим в домашней сети. На моем веб-сервере работает Apache2 с несколькими доменами. Один из них – example.com. Теперь моя цель состоит в том, чтобы пользователь получал страницу входа в GitLab, посещая что-то вроде example.com/gitlab или gitlab.example.com. На самом деле, мне не важно, происходит ли перенаправление с определенного URL или подсайта. Я уже попробовал довольно много, но ничего из этого не сработало для меня (возможно, я всегда делал это неправильно).
Я также читал некоторые связанные сообщения в форумах, такие как
- Используйте виртуальный хост Apache для перенаправления подсайта на внутренний IP, сохраняя переданный порт
- Используйте основанный на имени виртуальный хост Apache для перенаправления на внутренний IP
- https://www.linuxquestions.org/questions/linux-server-73/apache-redirect-to-internal-server-919321/
- …
Но у меня не получилось ничего запустить.
Мой default.conf настроен так, что он всегда перенаправляет порт 80 на порт 443 (HTTPS).
<VirtualHost *:80>
ServerName example.com
ServerAlias www.example.com
Redirect permanent / https://www.example.com/
[...]
</VirtualHost>
Итак, вот мой example.com.conf до:
<VirtualHost *:443>
ServerName example.com
ServerAlias www.example.com
DocumentRoot /var/www/html/example.com
SSLEngine on
<FilesMatch "\.(cgi|shtml|phtml|php)$">
SSLOptions +StdEnvVars
</FilesMatch>
<Directory /usr/lib/cgi-bin>
SSLOptions +StdEnvVars
</Directory>
Include /etc/letsencrypt/options-ssl-apache.conf
SSLCertificateFile /etc/letsencrypt/live/www.example.com/fullchain.pem
SSLCertificateKeyFile /etc/letsencrypt/live/www.example.com/privkey.pem
</VirtualHost>
Сначала я попробовал перенаправление с определенного URL. Я добавил:
ProxyRequests Off
ProxyPass /gitlab http://192.168.0.115:80/
ProxyPassReverse /gitlab http://192.168.0.115:80/
Это не сработало полностью, но если я ввожу URL, я получаю “404 Запрашиваемый URL /users/sign_in не найден на этом сервере”. ‘/users/sign_in’ – это путь к странице входа на моем сервере GitLab, так что, по крайней мере, что-то, кажется, работает. Странно, что это работает, если я перенаправляю корневую директорию на мой внутренний IP:
ProxyRequests Off
ProxyPass / http://192.168.0.113:80/
ProxyPassReverse / http://192.168.0.113:80/
Это работает, но теперь я больше не могу получить доступ к своему фактическому сайту.
Затем я попробовал перенаправление с подсайта. Я добавил:
<VirtualHost *:443>
ServerName gitlab.example.com
ProxyPass / http://192.168.0.113/
ProxyPassReverse / http://192.168.0.113/
</VirtualHost>
Но я получаю “Вебсайт недоступен”. Я даже не могу запустить подсайт.
Возможно, нужно использовать mod_rewrite, чтобы убрать часть /gitlab. Что-то вроде:
rewriteBase "/gitlab"
rewriteRule "^gitlab/(.*)" "http:/192.168.0.113/$1" [P]
Смотрите https://httpd.apache.org/docs/2.4/rewrite/proxy.html
Ответ или решение
Чтобы перенаправить определённый URL или поддомен на внутренний IP-адрес вашего GitLab сервера в Apache, вам нужно уверенно настроить прокси и, возможно, использовать модуль mod_rewrite
, чтобы корректно обработать пути. Вот пошаговое руководство по реализации вашего запроса.
Шаг 1: Убедитесь, что у вас включены необходимые модули
Для работы прокси необходимо включить следующие модули Apache:
sudo a2enmod proxy
sudo a2enmod proxy_http
sudo a2enmod rewrite
После этого перезапустите Apache:
sudo systemctl restart apache2
Шаг 2: Настройка перенаправления через определённый URL
Если вы хотите перенаправить пользователей на example.com/gitlab
, добавьте следующий фрагмент к вашему конфигу example.com.conf
:
<VirtualHost *:443>
ServerName example.com
ServerAlias www.example.com
DocumentRoot /var/www/html/example.com
SSLEngine on
Include /etc/letsencrypt/options-ssl-apache.conf
SSLCertificateFile /etc/letsencrypt/live/www.example.com/fullchain.pem
SSLCertificateKeyFile /etc/letsencrypt/live/www.example.com/privkey.pem
# Настройка прокси для gitlab
ProxyRequests Off
ProxyPass /gitlab http://192.168.0.115/ # IP вашего GitLab сервера
ProxyPassReverse /gitlab http://192.168.0.115/
# Дополнительно, для корректной работы путей
RewriteEngine On
RewriteRule ^/gitlab/(.*) http://192.168.0.115/$1 [P,L]
</VirtualHost>
Данная конфигурация сообщает Apache перенаправлять запросы, которые начинаются с /gitlab
, на внутренний сервер GitLab по IP-адресу 192.168.0.115
.
Шаг 3: Настройка перенаправления через поддомен
Если вы хотите использовать поддомен, например, gitlab.example.com
, созданные для него настройки в вашем конфиге Apache могут выглядеть так:
<VirtualHost *:443>
ServerName gitlab.example.com
# Настройка прокси для поддомена
ProxyRequests Off
ProxyPass / http://192.168.0.115/ # IP вашего GitLab сервера
ProxyPassReverse / http://192.168.0.115/
RewriteEngine On
RewriteRule ^/(.*) http://192.168.0.115/$1 [P,L]
</VirtualHost>
Шаг 4: Перезагрузка Apache
Не забудьте перезапустить Apache после внесения изменений:
sudo systemctl restart apache2
Полезные советы
-
Проверка конфигурации: После редактирования конфигурационных файлов всегда полезно проверять их на ошибки:
sudo apachectl configtest
-
Логи ошибок: Если что-то не работает, проверьте логи ошибок Apache, чтобы получить дополнительную информацию.
tail -f /var/log/apache2/error.log
-
Проверка доступности: Убедитесь, что сервер с IP
192.168.0.115
доступен из сети, где находится ваш веб-сервер. -
HTTPS: Убедитесь, что всё корректно работает по HTTPS, особенно, если вы используете Let’s Encrypt.
Следуя этим шагам, вы сможете успешно настроить перенаправление на ваш GitLab сервер, независимо от того, используете ли вы определённый URL или поддомен.