Я использовал Docker для развертывания Jenkins и Nginx, но не хочу экспортировать 80 (по соображениям безопасности), поэтому я использую следующий Docker Compose:
services:
jenkins:
image: jenkins/jenkins:lts
volumes:
- ./jenkins_home:/var/jenkins_home
ssh-agent:
image: jenkins/ssh-agent
nginx:
image: nginx:latest
ports:
- "10086:80"
- "10087:443"
volumes:
- ./nginx/conf.d:/etc/nginx/conf.d
depends_on:
- jenkins
А вот конфигурационный файл Nginx:
server {
listen 80;
server_name ci.xxx.com;
location / {
proxy_pass http://jenkins:8080;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_redirect off;
}
location /ws/ {
proxy_pass http://jenkins:8080/ws/;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection 'upgrade';
}
location /static/ {
proxy_pass http://jenkins:8080/static/;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
location /api/ {
proxy_pass http://jenkins:8080/api/;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
Затем я установил jenkins_url
в http://ci.xxx.com:10086/
в конфигурации Jenkins и перезапустил контейнер. После этого я успешно получил доступ к http://ci.xxx.com:10086
и был перенаправлен на http://ci.xxx.com:10086/login
. Но когда я нажал кнопку входа, меня перенаправило на http://ci.xxx.com
(без :10086
), и в результате произошла ошибка.
Ответ
Для решения вашей проблемы с настройкой Docker, Jenkins и Nginx, следует учесть, что Jenkins использует свойство JENKINS_URL
для формирования URL-адресов в интерфейсе пользователя. Поскольку вы используете непрямую публикацию портов, необходимо настроить Jenkins для работы с правильным URL-адресом, включая порт.
Вот шаги, которые помогут вам устранить эту проблему:
-
Настройка переменной окружения
JENKINS_URL
:Вам нужно указать
JENKINS_URL
в вашемdocker-compose.yml
для сервиса Jenkins. Это можно сделать, добавив следующие строки в конфигурацию Jenkins:jenkins: image: jenkins/jenkins:lts volumes: - ./jenkins_home:/var/jenkins_home environment: JENKINS_URL: http://ci.xxx.com:10086/
-
Обновите конфигурацию Nginx:
Убедитесь, что ваш конфиг Nginx правильно настроен и обрабатывает запросы. Ваша текущая конфигурация корректна с точки зрения проксирования, но убедитесь, что у вас есть следующие значения в заголовках:
server { listen 80; server_name ci.xxx.com; location / { proxy_pass http://jenkins:8080; proxy_set_header Host $http_host; # Изменено на $http_host proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; proxy_redirect http:// https://; # Если вы используете SSL } # Остальные location блоки... }
-
Проверка конфигурации Jenkins:
После внесения изменений убедитесь, что вы перезапустили контейнеры Docker. Для этого выполните:
docker-compose down docker-compose up -d
-
Тестирование:
Теперь попробуйте получить доступ к Jenkins через
http://ci.xxx.com:10086
. Попробуйте войти и убедитесь, что редиректы теперь работают правильно (с включённым:10086
в URL). -
Проверка SSL (при необходимости):
Если вы планируете использовать HTTPS, убедитесь, что ваш Nginx также сконфигурирован для работы с SSL, и обновите
JENKINS_URL
наhttps://ci.xxx.com:10087/
, если вы настроили его на 443 порт.
Таким образом, правильная настройка JENKINS_URL
и корректная конфигурация проксирования на Nginx должны устранить исключение переадресации в Jenkins.