Ошибка перенаправления Jenkins из-за неправильного маппинга порта Docker nginx, который не на 80 порту

Вопросы и ответы

Я использовал 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-адресом, включая порт.

Вот шаги, которые помогут вам устранить эту проблему:

  1. Настройка переменной окружения 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/
  2. Обновите конфигурацию 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 блоки...
    }
  3. Проверка конфигурации Jenkins:

    После внесения изменений убедитесь, что вы перезапустили контейнеры Docker. Для этого выполните:

    docker-compose down
    docker-compose up -d
  4. Тестирование:

    Теперь попробуйте получить доступ к Jenkins через http://ci.xxx.com:10086. Попробуйте войти и убедитесь, что редиректы теперь работают правильно (с включённым :10086 в URL).

  5. Проверка SSL (при необходимости):

    Если вы планируете использовать HTTPS, убедитесь, что ваш Nginx также сконфигурирован для работы с SSL, и обновите JENKINS_URL на https://ci.xxx.com:10087/, если вы настроили его на 443 порт.

Таким образом, правильная настройка JENKINS_URL и корректная конфигурация проксирования на Nginx должны устранить исключение переадресации в Jenkins.

Оцените материал
Добавить комментарий

Капча загружается...