У меня запущен док-контейнер Sonatype Nexus, и вместе с ним я использую nginx в качестве обратного прокси. После того, как все настроили и пытаемся подключиться с помощью команды docker login
. Я получаю 401 в моем журнале
docker login -u test -p test123 https://nexux.mydomain.net:28080
Вывод из консоли
Get "https://nexus.mydomain.net:28080/v2/": error parsing HTTP 404 response body: invalid character '<' looking for beginning of value: "\n<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n <title>404 - Nexus Repository Manager</title>\n <meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\"/>\n\n\n <!--[if lt IE 9]>\n <script>(new Image).src=\"../favicon.ico?3.38.1-01\"</script>\n <![endif]-->\n <link rel=\"icon\" type=\"image/png\" href=\"../favicon-32x32.png?3.38.1-01\" sizes=\"32x32\">\n <link rel=\"mask-icon\" href=\"../safari-pinned-tab.svg?3.38.1-01\" color=\"#5bbad5\">\n <link rel=\"icon\" type=\"image/png\" href=\"../favicon-16x16.png?3.38.1-01\" sizes=\"16x16\">\n <link rel=\"shortcut icon\" href=\"../favicon.ico?3.38.1-01\">\n <meta name=\"msapplication-TileImage\" content=\"../mstile-144x144.png?3.38.1-01\">\n <meta name=\"msapplication-TileColor\" content=\"#00a300\">\n\n <link rel=\"stylesheet\" type=\"text/css\" href=\"../static/css/nexus-content.css?3.38.1-01\"/>\n</head>\n<body>\n<div class=\"nexus-header\">\n <a href=\"..\">\n <div class=\"product-logo\">\n <img src=\"../static/rapture/resources/icons/x32/nexus-white.png?3.38.1-01\" alt=\"Product logo\"/>\n </div>\n <div class=\"product-id\">\n <div class=\"product-id__line-1\">\n <span class=\"product-name\">Nexus Repository Manager</span>\n </div>\n <div class=\"product-id__line-2\">\n <span class=\"product-spec\">OSS 3.38.1-01</span>\n </div>\n </div>\n </a>\n</div>\n\n<div class=\"nexus-body\">\n <div class=\"content-header\">\n <img src=\"../static/rapture/resources/icons/x32/exclamation.png?3.38.1-01\" alt=\"Exclamation point\" aria-role=\"presentation\"/>\n <span class=\"title\">Error 404</span>\n <span class=\"description\">Not Found</span>\n </div>\n <div class=\"content-body\">\n <div class=\"content-section\">\n Not Found\n </div>\n </div>\n</div>\n</body>\n</html>\n\n"
вывод лога из nginx
192.168.10.200 - - [05/Apr/2022:09:09:15 +0000] "GET /v2/ HTTP/1.1" 401 113 "-" "Docker-Client/20.10.14 (linux)"
192.168.10.200 - test [05/Apr/2022:09:09:15 +0000] "GET /v2/token?account=test&client_id=docker&offline_token=true&service=https%3A%2F%2Fnexus.mydomain.net%2Fv2%2Ftoken HTTP/1.1" 404 730 "-" "Docker-Client/20.10.14 (linux)"
Конфигурация виртуального хоста nginx
server {
listen 443 ssl;
server_name nexus.mydomain.net;
ssl_certificate /etc/nginx/certs/nexus.crt;
ssl_certificate_key /etc/nginx/certs/nexus.key;
# allow large uploads of files
client_max_body_size 1G;
location / {
# Internal host name/FQDN
proxy_pass http://10.0.0.4:8081;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-Host $server_name;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
server {
listen 28080 ssl;
server_name nexus.mydomain.net;
ssl_certificate /etc/nginx/certs/nexus.crt;
ssl_certificate_key /etc/nginx/certs/nexus.key;
# allow large uploads of files
client_max_body_size 1G;
location / {
# Internal host name/FQDN
proxy_pass http://10.0.0.4:18080;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-Host $server_name;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
У меня включена область Docker Bearer Token и область RUT.
Что еще мне здесь не хватает?
Вам нужно установить порт в заголовке хоста, чтобы ответ, отправленный Nexus, включал его:
proxy_set_header Host $host:$server_port
Я также предлагаю пересылать напрямую в репозиторий, нет необходимости использовать порт коннектора в репозитории докеров.
proxy_pass http://10.0.0.4:8081/repository/docker-repo-name;
Создание портов коннектора значительно увеличивает нагрузку на экземпляр, и в данном случае в этом нет необходимости.
Все, что вам нужно сделать, это использовать конфигурацию ниже
http {
proxy_send_timeout 120;
proxy_read_timeout 300;
proxy_buffering off;
proxy_request_buffering off;
keepalive_timeout 5 5;
tcp_nodelay on;
server {
listen 443 ssl;
server_name project.example.com
ssl on;
ssl_certificate /path/to/ssl/server.crt;
ssl_certificate_key /path/to/ssl/server.key;
# Docker /v2 and /v1 (for search) requests
location /v2 {
proxy_set_header Host $host:$server_port;
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 "https";
proxy_pass http://nexus.example.com:8081/repository/docker-repo/$request_uri;
}
location /v1 {
proxy_set_header Host $host:$server_port;
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 "https";
proxy_pass http://nexus.example.com:8081/repository/docker-repo/$request_uri;
}
# Regular Nexus requests
location / {
proxy_set_header Host $host:$server_port;
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 "https";
proxy_pass http://nexus.example.com:8081;
}
}}
как мне вытащить и нажать изображение в этом случае?