Docker nginx Отказ в обратном прокси-соединении - PullRequest
0 голосов
/ 14 апреля 2020

У меня есть 2 проекта, один из которых называется defaultWebsite, а другой nginxProxy.

Я пытаюсь настроить следующее:

в / etc / hosts У меня есть настройка 127.0.0.1 default.local, * Контейнеры 1048 * работают для всех. Я не добавил контейнер php -fpm для reverseProxy (Должен ли я?)

nginxReverseProxy default.config

#sample setup
upstream default_local {
    server host.docker.internal:31443;
}

server {
    listen 0.0.0.0:80;
    return 301 https://$host$request_uri;
}

server {
    listen      0.0.0.0:443 ssl;
    server_name default.local;

    ssl_certificate        /etc/ssl/private/localhost/default_dev.crt;
    ssl_certificate_key    /etc/ssl/private/localhost/default_dev.key;
    #ssl_verify_client     off;

    ssl_session_cache  builtin:1000  shared:SSL:10m;
    ssl_protocols  TLSv1 TLSv1.1 TLSv1.2;
    ssl_ciphers HIGH:!aNULL:!eNULL:!EXPORT:!CAMELLIA:!DES:!MD5:!PSK:!RC4;
    ssl_prefer_server_ciphers on;

    index index.php index.html index.htm index.nginx-debian.html;

    location / {
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header Host $proxy_host;
        proxy_set_header X-NginX-Proxy true;
        proxy_pass  https://default_local;
    }
}

defaultWebsite config:

server {
    listen 0.0.0.0:80;
    server_name default.local;

    location / {
        return 301 https://$host$request_uri;
    }
}

server {
    listen 0.0.0.0:443 ssl;
    server_name default.local;
    root /app/public;

    #this is for local. on production this will be different.
    ssl_certificate      /etc/ssl/default.local/localhost.crt;
    ssl_certificate_key  /etc/ssl/default.local/localhost.key;

    location / {
        try_files $uri /index.php$is_args$args;
    }

    location ~ ^/index\.php(/|$) {
        fastcgi_pass php-fpm:9000;
        fastcgi_split_path_info ^(.+\.php)(/.*)$;
        include fastcgi_params;

        fastcgi_param  SCRIPT_FILENAME $realpath_root$fastcgi_script_name;
        fastcgi_param DOCUMENT_ROOT $realpath_root;
        internal;
    }



    # return 404 for all other php files not matching the front controller
    # this prevents access to other php files you don't want to be accessible.
    location ~ \.php$ {
        return 404;
    }

    error_log /var/log/nginx/default_error.log;
    access_log /var/log/nginx/default_access.log;
}

docker -compose.yml для defaultWebsite:

службы:

nginx:
    build: DockerConfig/nginx
    working_dir: /app
    volumes:
        - .:/app
        - ./log:/log
        - ./data/nginx/htpasswd:/etc/nginx/.htpasswd
        - ./data/nginx/nginx_dev.conf:/etc/nginx/conf.d/default.conf
    depends_on:
        - php-fpm
        - mysql
    links:
        - php-fpm
        - mysql
    ports:
        - "31080:80"
        - "31443:443"
    expose:
        - "31080"
        - "31443"

    environment:
        VIRUAL_HOST: "default.local"
        APP_FRONT_CONTROLLER: "public/index.php"
    networks:
        default:
            aliases:
                - default

php-fpm:
    build: DockerConfig/php-fpm
    working_dir: /app
    volumes:
        - .:/app
        - ./log:/log
        - ./data/php-fpm/php-ini-overrides.ini:/etc/php/7.3/fpm/conf.d/99-overrides.ini
    ports:
        - "30902:9000"
    expose:
        - "30902"
    extra_hosts:
      - "default.local:127.0.0.1"
    networks:
        - default
    environment:
        XDEBUG_CONFIG: "remote_host=172.29.0.1 remote_enable=1 remote_autostart=1 idekey=\"PHPSTORM\" remote_log=\"/var/log/xdebug.log\""
        PHP_IDE_CONFIG: "serverName=default.local"

docker -compose.yml для nginxReverseProxy:

services:
  reverse_proxy:
    build: DockerConfig/nginx
    hostname: reverseProxy
    ports:
      - 80:80
      - 443:443
    extra_hosts:
      - "host.docker.internal:127.0.0.1"
    volumes:
      - ./data/nginx/dev/default_dev.conf:/etc/nginx/conf.d/default.conf
      - ./data/certs:/etc/ssl/private/

docker ps вывод:

CONTAINER ID        IMAGE                 COMMAND                  CREATED             STATUS                  PORTS                                                                 NAMES
6e9a8479e6f8        default_nginx         "nginx -g 'daemon of…"   12 hours ago        Up 12 hours             31080/tcp, 31443/tcp, 0.0.0.0:31080->80/tcp, 0.0.0.0:31443->443/tcp   default_nginx_1
5e1df4d6f1f5        default_php-fpm       "/usr/sbin/php-fpm7.…"   12 hours ago        Up 12 hours             30902/tcp, 0.0.0.0:30902->9000/tcp                                    default_php-fpm_1
f3ec76cd7148        default_mysql         "/entrypoint.sh mysq…"   12 hours ago        Up 12 hours (healthy)   33060/tcp, 0.0.0.0:31336->3306/tcp                                    default_mysql_1
d633511bc6a8        proxy_reverse_proxy   "/bin/sh -c 'exec ng…"   12 hours ago        Up 12 hours             0.0.0.0:80->80/tcp, 0.0.0.0:443->443/tcp                              proxy_reverse_proxy_1

Если я получаю доступ сразу default.local:31443 я вижу, как работает страница.

Когда я пытаюсь получить доступ к http://default.local, он перенаправляет меня на https://default.local, но в то же время я получаю эту ошибку:

reverse_proxy_1  | 2020/04/14 15:22:43 [error] 6#6: *4 connect() failed (111: Connection refused) while connecting to upstream, client: 192.168.80.1, server: default.local, request: "GET / HTTP/1.1", upstream: "https://127.0.0.1:31443/", host: "default.local"

Ответы [ 2 ]

0 голосов
/ 23 апреля 2020

ок, похоже, docker ip следует использовать на linux машинах, потому что эта переменная "host. docker .internal" еще не существует (будет добавлена ​​в будущей версии)

для получения docker ip в linux должно быть достаточно для запуска ip addr | grep "docker"

, поэтому окончательная конфигурация должна выглядеть примерно так для reverse_proxy default.conf:

upstream default_name {
    server 172.17.0.1:52443;
}

#redirect to https
server {
    listen 80;
    return 301 https://$host$request_uri;
}

server {

    server_name default.localhost;
    listen      443 ssl http2;

    large_client_header_buffers 4 16k;

    ssl_certificate        /etc/ssl/private/localhost/whatever_dev.crt;
    ssl_certificate_key    /etc/ssl/private/localhost/whatever_dev.key;

    ssl_session_cache  builtin:1000  shared:SSL:10m;
    ssl_protocols  TLSv1 TLSv1.1 TLSv1.2;
    ssl_ciphers HIGH:!aNULL:!eNULL:!EXPORT:!CAMELLIA:!DES:!MD5:!PSK:!RC4;
    ssl_prefer_server_ciphers on;

    index index.php index.html index.htm index.nginx-debian.html;

    location / {
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header Host $proxy_host;
        proxy_set_header X-NginX-Proxy true;
        proxy_pass  https://default_name;
    }
}
0 голосов
/ 15 апреля 2020

Не уверен, что это ответ, но запись слишком длинна для комментария.

На вашем nginx conf у вас есть:

upstream default_local {
    server host.docker.internal:31443;
}

и, как я вижу это (может быть неправильно здесь;), у вас есть другой контейнер, обращающийся к нему:

    extra_hosts:
      - "host.docker.internal:127.0.0.1"

, но вы устанавливаете имя хоста на 127.0.0.1, если это не docker хост ip. Так как он подключается к другому контейнеру?

В общем, убедитесь, что docker host ip используется во всех контейнерах, когда им нужно подключиться к другому контейнеру / снаружи.

...