Не удается скрутить связанный контейнер в Docker

У меня нет сложной настройки. 2 контейнера, один для моего приложения и один для моего API.

CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                           NAMES
8f07c240bee2        nginx               "nginx -g 'daemon off"   13 hours ago        Up 13 hours         443/tcp, 0.0.0.0:7010->80/tcp   simtp_front_1
ae4296bd51d8        simtp_engine        "php-fpm"                13 hours ago        Up 13 hours         9000/tcp                        simtp_engine_1
4ae15fcba793        nginx               "nginx -g 'daemon off"   6 days ago          Up 40 hours         443/tcp, 0.0.0.0:7011->80/tcp   simtpapi_front_1
cf04c9567201        simtpapi_engine     "php-fpm"                6 days ago          Up 40 hours         9000/tcp                        simtpapi_engine_1
3da782cca9b0        mysql:5.6           "docker-entrypoint.sh"   6 days ago          Up 40 hours         0.0.0.0:3308->3306/tcp          simtpapi_db_1

Я хочу использовать Guzzle в моем приложении для вызова моего API, поэтому я связал два моих контейнера вместе, но когда я тестирую curl, он возвращает мне:

curl: (7) Failed to connect to simtpapi port 7011: Connection refused

Я могу без проблем проверить связь с контейнером:

root@ae4296bd51d8:/var/www/simtp# ping simtpapi
PING simtpapi (172.17.0.3): 56 data bytes
64 bytes from 172.17.0.3: icmp_seq=0 ttl=64 time=0.064 ms
64 bytes from 172.17.0.3: icmp_seq=1 ttl=64 time=0.054 ms
64 bytes from 172.17.0.3: icmp_seq=2 ttl=64 time=0.056 ms
^C--- simtpapi ping statistics ---
3 packets transmitted, 3 packets received, 0% packet loss
round-trip min/avg/max/stddev = 0.054/0.058/0.064/0.000 ms

Вот файл docker-compose из моего приложения:

front:
    image: nginx
    ports:
        - "7010:80"
    links:
        - "engine:engine"
    volumes:
        - ".:/var/www/simtp:ro"
        - "./docker/front/default.conf:/etc/nginx/conf.d/default.conf:ro"

engine:
    build: ./docker/engine/
    external_links:
        - "simtpapi_engine_1:simtpapi"
    volumes:
        - ".:/var/www/simtp:rw"
        - "./docker/engine/php.ini:/usr/local/etc/php/conf.d/custom.ini:ro"
    working_dir: "/var/www/simtp"

И из моего API:

front:
    image: nginx
    ports:
        - "7011:80"
    links:
        - "engine:engine"
    volumes:
        - ".:/var/www/simtp-api:ro"
        - "./docker/front/default.conf:/etc/nginx/conf.d/default.conf:ro"

db:
    image: mysql:5.6
    ports:
      - "3308:3306"
    environment:
      - "MYSQL_ROOT_PASSWORD=password"

engine:
    build: ./docker/engine/
    volumes:
        - ".:/var/www/simtp-api:rw"
        - "./docker/engine/php.ini:/usr/local/etc/php/conf.d/custom.ini:ro"
    links:
        - "db:db"
    working_dir: "/var/www/simtp-api"

Curl version

curl 7.38.0 (x86_64-pc-linux-gnu) libcurl/7.38.0 OpenSSL/1.0.1t zlib/1.2.8 libidn/1.29 libssh2/1.4.3 librtmp/2.3
Protocols: dict file ftp ftps gopher http https imap imaps ldap ldaps pop3 pop3s rtmp rtsp scp sftp smtp smtps telnet tftp
Features: AsynchDNS IDN IPv6 Largefile GSS-API SPNEGO NTLM NTLM_WB SSL libz TLS-SRP

Docker, Docker-machine и docker-compose

PS C:\working_directory\simtp> docker -v
Docker version 1.12.3, build 6b644ec, experimental
PS C:\working_directory\simtp> docker-machine -v
docker-machine.exe version 0.8.2, build e18a919
PS C:\working_directory\simtp> docker-compose -v
docker-compose version 1.8.1, build 004ddae

Я действительно использую Docker для Windows (Windows 10, режим разработчика и Hyper -V контейнер включен). com / checkout там написано

404 Not Found
nginx/1.8.1

Не уверен, что мне здесь не хватает ....

0
задан 13 April 2017 в 15:13
3 ответа

Во-первых, я бы сам не стал делать такую ​​конфигурацию. Смешивание http и https на одном сайте снижает безопасность https и делает ваш сайт уязвимым для атак типа «злоумышленник посередине».

Однако, вот вам должна быть рабочая конфигурация, если вы действительно хотите настроить такую ​​вещь.

Основная проблема в вашей конфигурации - это отсутствие определений PHP для вашего URI / checkout .

I сделал бы такую ​​конфигурацию. Это также содержит оптимизацию для вашей конфигурации:

upstream examplecombackend {
    server unix:/var/run/php-fcgi-examplecom.sock;
}

server {
    listen 111.11.111.111:80;

    server_name example.com *.example.com;

    access_log /home/www/vhosts/example.com/logs/access.log;
    error_log /home/www/vhosts/example.com/logs/error.log;
    root /home/www/vhosts/example.com/httpdocs;

    location / {
        index index.html index.php;
        try_files $uri $uri/ /index.php;
        expires 30d;
    }

    location /checkout {
        rewrite ^ https://$host$request_uri? permanent;
    }

    location ~ (.+\.php)/ {
        rewrite ^ $1 last;
    }

    location ~ \.php$ {
        expires        off;
        fastcgi_pass   examplecombackend;
        fastcgi_param  HTTPS $fastcgi_https;
        fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
        include        fastcgi_params;
    }
}

server {
    listen 111.11.111.111:443 ssl;
    ssl_certificate      /etc/nginx/ssl/example.com.crt;
    ssl_certificate_key  /etc/nginx/ssl/example.com.key;
    ssl_protocols        TLSv1 TLSv1.1 TLSv1.2;

    server_name example.com *.example.com;

    root /home/www/vhosts/example.com/httpdocs;

    location /checkout {
        rewrite ^ /index.php;
    }

    location ~ \.php$ {
        expires        off;
        fastcgi_pass   examplecombackend;
        fastcgi_param  HTTPS $fastcgi_https;
        fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
        include        fastcgi_params;
    }

    location / {
        rewrite ^ http://$host$request_uri? permanent;
    }
}

Изменения, которые я сделал:

location / {
    index index.html index.php;
    try_files $uri $uri/ /index.php;
    expires 30d;
}

Я удалил расположение @handler , потому что оно такое же, как если бы index.php был последним элемент директивы try_files .

location ~ .php/ {
    rewrite ^(.*.php)/ $1 last;
}

Я изменил захват регулярного выражения, чтобы он происходил на уровне местоположения , поэтому при каждом запросе, соответствующем этому местоположению, происходит на одно совпадение регулярного выражения меньше, поскольку мы можем используйте простой ^ в качестве условия соответствия в директиве rewrite .

    location ~ \.php$ {
        if (!-e $request_filename) {
            rewrite / /index.php last;
        }

Я добавил обратную косую черту к условию регулярного выражения location , потому что без обратной косой черты оно будет соответствовать пример / путь / к / aphp . сам по себе соответствует любому символу.

Я также удалил тест if , показанный выше, из блока, потому что тот же тест уже выполняется ранее в директиве try_files .

И, наконец, , исправление вашей реальной проблемы:

В вашем блоке сервера для https-файлов я изменил блоки location следующим образом:

    location /checkout {
        rewrite ^ /index.php;
    }

    location ~ \.php$ {
        expires        off;
        fastcgi_pass   examplecombackend;
        fastcgi_param  HTTPS $fastcgi_https;
        fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
        include        fastcgi_params;
    }

Итак, location / checkout Блок сообщает nginx о необходимости перезаписать все запросы в /index.php , как в серверном блоке http . Кроме того, местоположение обработки PHP такое же, как и в блоке http .

Однако могут возникнуть проблемы со ссылками, которые создает Magento, и с тем, как запросы перенаправляются между ] http и https . Настройки безопасности файлов cookie - это то, что может вызвать проблемы.

2
ответ дан 4 December 2019 в 16:26

Попробуйте это небольшое изменение. ~ * Должен указать Nginx, что регистр нечувствителен к совпадению с любым URL-адресом с / checkout / в нем, а не только с точным URL-адресом /checkout/.

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

location ~* /checkout/ {
0
ответ дан 4 December 2019 в 16:26

В вашем случае может помочь условная перезапись:

server {
    listen 111.11.111.111:80;
    listen 111.11.111.111:443 ssl;   

    ssl_certificate /etc/nginx/ssl/example.com.crt;
    ssl_certificate_key  /etc/nginx/ssl/example.com.key;
    ssl_protocols   TLSv1 TLSv1.1 TLSv1.2;

    server_name example.com *.example.com;

    access_log /home/www/vhosts/example.com/logs/access.log;
    error_log /home/www/vhosts/example.com/logs/error.log;

    root /home/www/vhosts/example.com/httpdocs;

    location / {
        if ($scheme = "https") {
            return 301 http://$server_name$request_uri;
            break;
        }
        index index.html index.php;
        try_files $uri $uri/ @handler;
        expires 30d;
    } 

    location /checkout/ {
        if ($scheme = "http") {
            return 301 https://$server_name$request_uri;
            break;
        }
    }

    location @handler {
        rewrite / /index.php;
    }

    location ~ .php/ {
        rewrite ^(.*.php)/ $1 last;
    }

    location ~ .php$ {
        if (!-e $request_filename) { rewrite / /index.php last; }
        expires        off;
        fastcgi_pass   examplecombackend;
        fastcgi_param  HTTPS $fastcgi_https;
        fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
        include        fastcgi_params;
    }
}
-1
ответ дан 4 December 2019 в 16:26

Теги

Похожие вопросы