当前位置: 首页 > 知识库问答 >
问题:

在AWS上的nginx后面部署https docker注册表

盖锐
2023-03-14
  1. 我从AWS控制台创建了一个EC2实例,通过安全组选项打开HTTP端口(例如8080)
  2. 我创建了一个新的负载均衡器,使用HTTPS将其连接到实例的HTTP端口。
  3. 我使用此配置创建了docker-compose.yml文件(我使用verdaccio作为npm私有注册表,使用registry:2作为docker注册表:

    version: '3'
    services:
      nginx:
        image: nginx:alpine
        container_name: nginx
        restart: always
        ports:
          - "80:80"
        volumes:
          - ./nginx:/etc/nginx/conf.d/
          - ./nginx/nginx.conf:/etc/nginx/nginx.conf:ro
        links:
          - verdaccio:verdaccio
          - docker:docker

      verdaccio:
        image: verdaccio/verdaccio:latest
        container_name: verdaccio    
        restart: always
        ports:
          - "4873:4873"
        volumes:
          - ./registry:/verdaccio/conf
          - ./database/verdaccio:/verdaccio/storage 

      docker:
        image: registry:2
        container_name: docker
        restart: always
        ports:
          - "5000:5000"
        volumes:
          - ./database/docker:/var/lib/registry


    events {
        worker_connections  1024;
    }

    http {
        upstream docker-registry {
            server docker:5000;
        }

        upstream npm-registry {
            server verdaccio:4873;
        }

        ## Set a variable to help us decide if we need to add the
        ## 'Docker-Distribution-Api-Version' header.
        ## The registry always sets this header.
        ## In the case of nginx performing auth, the header will be unset
        ## since nginx is auth-ing before proxying.
        map $upstream_http_docker_distribution_api_version     $docker_distribution_api_version {
            '' 'registry/2.0';
        }

        # Healtcheck
        server {
            listen 80;
            location /healthcheck {
                access_log off;
                return 200;
            }
        }

        server {
            # Server options
            listen 80;
            charset utf-8;
            client_max_body_size 0;

            server_name registry.mydomain.org;

            # Proxy settings
            location / {
                access_log /var/log/nginx/verdaccio.log;
                proxy_pass http://npm-registry;
                proxy_set_header Host $host;
                proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
                proxy_set_header X-NginX-Proxy true;
                proxy_ssl_session_reuse off;
                proxy_redirect off;
            }
        }

        server {
            # Server options
            listen 80;
            charset utf-8;
            client_max_body_size 0;

            # required to avoid HTTP 411: see Issue #1486 (https://github.com/moby/moby/issues/1486)
            chunked_transfer_encoding on;

            server_name docker.mydomain.org;

            # Authentication
            auth_basic "Registry realm";
            auth_basic_user_file /etc/nginx/conf.d/nginx.htpasswd;

            # Proxy settings
            location / {

                if ($http_user_agent ~ "^(docker\/1\.(3|4|5(?!\.[0-9]-dev))|Go ).*$" ) {
                    return 404;
                }

                ## If $docker_distribution_api_version is empty, the header will not be added.
                ## See the map directive above where this variable is defined.
                add_header 'Docker-Distribution-Api-Version' $docker_distribution_api_version always;

                access_log /var/log/nginx/docker.log;
                proxy_pass http://docker-registry;
                proxy_read_timeout 900;
            }
        }
    }

现在,注册表运行良好。因此,如果访问https://registry.mydomain.org,我就可以看到它,并且可以通过npm login--registry=https://registry.mydomain.org--scope=@myscope将npm包推送到它

然而,关于docker注册表,虽然我可以使用docker login-u user-p password登录到它,但是当我试图向它推送一个映像时,docker客户端进入无限循环,并继续尝试上载映像(没有成功)。在服务器端,docker注册表的日志并没有显示关于正在发生什么的有用信息,因为所有请求都以202个HTTP状态结束。

有什么关于如何解决的提示吗?

共有1个答案

穆睿才
2023-03-14

我想出来了。nginx代理配置中缺少proxy_set_header Host$Host;

这样做:

server {
        # Server options
        listen 80;
        charset utf-8;
        client_max_body_size 0;

        # required to avoid HTTP 411: see Issue #1486 (https://github.com/moby/moby/issues/1486)
        chunked_transfer_encoding on;

        server_name docker.cubbit.net;

        # Authentication
        auth_basic "Registry realm";
        auth_basic_user_file /etc/nginx/conf.d/nginx.htpasswd;

        # Proxy settings
        location / {
            # Do not allow connections from docker 1.5 and earlier
            # docker pre-1.6.0 did not properly set the user agent on ping, catch "Go *" user agents
            if ($http_user_agent ~ "^(docker\/1\.(3|4|5(?!\.[0-9]-dev))|Go ).*$" ) {
                return 404;
            }

            ## If $docker_distribution_api_version is empty, the header will not be added.
            ## See the map directive above where this variable is defined.
            add_header 'Docker-Distribution-Api-Version' $docker_distribution_api_version always;

            access_log /var/log/nginx/docker.log;
            proxy_pass http://docker-registry;
            proxy_set_header Host $host;
            proxy_read_timeout 900;
        }
    }

它开始运作得很好。希望这能帮助到某个人。我花了两天时间在这上面。

 类似资料:
  • 本文介绍了如何在 AWS EKS (Elastic Kubernetes Service) 上部署 TiDB 集群。 环境配置准备 部署前,请确认已完成以下环境准备: 安装 Helm:用于安装 TiDB Operator。 完成 AWS eksctl 入门 中所有操作。 该教程包含以下内容: 安装并配置 AWS 的命令行工具 awscli 安装并配置创建 Kubernetes 集群的命令行工具 e

  • 我按照本教程使用aws Corda AMI在aws上部署节点。 但在注册步骤之后, (< code > Java-jar corda . jar initial-registration-p PASSWORD _ FOR _ NETWORK _ ROOT _ TRUSTORE ), 它抛出此错误: [错误]10:14:31 0000[主]内部。NodeStartupLogging.invoke -

  • 本文向大家介绍在Nginx上部署ThinkPHP项目教程,包括了在Nginx上部署ThinkPHP项目教程的使用技巧和注意事项,需要的朋友参考一下 前段时间用Apache配合TP开发了一个小型网站,也算是我使用TP的第一次实战。我习惯使用pathinfo模式,本地运行一切正常,然而部署到服务器上时,由于对方使用的是Nginx,默认是不支持ThinkPHP的pathinfo模式,所以导致路径错误,出

  • 我们可以在单独的docker容器中部署apache和php,然后将它们链接起来。 但是有没有办法在docker容器中本地安装apache(使用apt get install apache2)和php fpm,然后链接它们? 谢谢

  • 问题内容: 我已经在一个docker容器中运行了一个gitlab服务器,并在另一个docker容器中运行了一个外部nginx服务器,因此gitlab nginx服务器被停用了。现在我想使用gitlab服务器中包含的docker注册表。 我尝试从管理手册中获取信息:https : //docs.gitlab.com/ee/administration/container_registry.html

  • 我是云提供商的初学者,我有一个网站要部署。该网站使用PHP、HTML、CSS和Javascript创建,并使用在NodeJS上开发的API访问数据库。 有没有办法在一个AWS弹性豆茎应用程序上部署所有这些(Inteface+NodeJS API)?或者我应该只在AWS Elastic Beanstalk上部署API,而将网站的界面与其他AWS解决方案一起部署,例如Amazon S3上的静态网站。