2017-09-29 6 views
1

J'essaie d'exécuter SSL pour Docker en utilisant le domaine. J'utilise ce qui suit docker-compose.yml pour mon projet:Docker SSL pour le domaine

web: 
    build: /Users/marcin/docker/definitions/php-nginx/php-7.1-ubuntu 
    volumes: 
    - /c/Users/marcin/docker/projects/newdocker.app/html/:/usr/share/nginx/html/ 
    - /c/Users/marcin/docker/projects/newdocker.app/nginx/conf.d/:/etc/nginx/conf.d/ 
    - /c/Users/marcin/docker/projects/newdocker.app/nginx/log/:/var/log/nginx/  
    - /c/Users/marcin/docker/projects/newdocker.app/php/config/:/usr/local/etc/php/ 
    - /c/Users/marcin/docker/projects/newdocker.app/supervisor/conf.d/:/etc/supervisor/conf.d/ 
    - /c/Users/marcin/docker/projects/newdocker.app/supervisor/log/:/var/log/supervisor/ 
    - /c/Users/marcin/docker/local_share/:/root/.local_share/ 
    working_dir: /usr/share/nginx/html/ 
    links: 
    - db 
    container_name: newdocker.php 
    hostname: newdocker.app 
    ports: 
    - "280:22" 
    - "8300:80" 
    - "18300:443" 
    environment: 
    - VIRTUAL_HOST=newdocker.app 
    - VIRTUAL_PORT=443  
    - VIRTUAL_PROTO=https 
db: 
    build: /Users/marcin/docker/definitions/mysql/5.7 
    environment: 
    - MYSQL_ROOT_PASSWORD=pass 
    - MYSQL_DATABASE= 
    - MYSQL_USER= 
    - MYSQL_PASSWORD= 
    expose: 
    - 3306 
    volumes: 
    - /c/Users/marcin/docker/projects/newdocker.app/mysql/data/:/var/lib/mysql/ 
    - /c/Users/marcin/docker/projects/newdocker.app/mysql/conf.d/:/etc/mysql/conf.d/source 
    - /c/Users/marcin/docker/projects/newdocker.app/mysql/log/:/var/log/mysql/ 
    ports: 
    - "33200:3306" 
    container_name: newdocker.db 
    hostname: newdocker.app 

et j'utilise également jwilder/nginx-proxy avec le fichier docker-compose.yml suivant:

proxy: 
    image: jwilder/nginx-proxy 
    restart: always 
    volumes: 
    - /var/run/docker.sock:/tmp/docker.sock:ro 
    - ./nginx/conf.d/proxy.conf:/etc/nginx/conf.d/proxy.conf:ro  
    - ./certs/default.crt:/etc/nginx/certs/default.crt:ro 
    - ./certs/default.key:/etc/nginx/certs/default.key:ro  
    ports: 
    - "80:80"  
    - "443:443"  
    container_name: proxy 

Et le problème est comme ceci:

http://192.168.99.100:8300/ - is working fine 
https://192.168.99.100:18300/ - is working fine 
https://192.168.99.100/ - I'm getting 503 (this is probably fine - this port is not used for this container) 
http://newdocker.app/ - is working fine 
https://newdocker.app:18300/ - is working fine 
https://newdocker.app/ - I'm getting 500 

mon fichier de configuration nginx ressemble à ceci:

server { 
    listen  80; 
    listen  443 default ssl; 
    server_name localhost; 

    ssl_certificate_key /etc/ssl/private/ssl-cert-snakeoil.key; 
    ssl_certificate  /etc/ssl/certs/ssl-cert-snakeoil.pem; 
    ssl_protocols  TLSv1 TLSv1.1 TLSv1.2; 
    ssl_ciphers   HIGH:!aNULL:!MD5; 

    # set maximum request size to 20M 
    client_max_body_size 20M; 

    root /usr/share/nginx/html/public/; 

    location/{ 
     root /usr/share/nginx/html/public/; 
     index index.php index.html index.htm; 
     try_files $uri $uri/ /index.php?$args; 
    } 

    sendfile off; 

    error_page 500 502 503 504 /50x.html; 
    location = /50x.html { 
     root /usr/share/nginx/html/public/; 
    } 


    location ~ \.php$ { 
     fastcgi_pass 127.0.0.1:9000; 
     fastcgi_index index.php; 
     fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; 
     include  fastcgi_params; 
     fastcgi_param SERVER_NAME $host; 
    } 
} 

Comment est-ce que je peux placer ceci pour le faire fonctionner avec https://newdocker.app/ donc sans port?

+1

généralement dans le bloc de serveur de configuration nginx vous séparez le port 80 du port 443 si vous souhaitez qu'il envoie le HTTP entrant à votre https de façon transparente ... si vous voulez ce comportement créer le bloc serveur pour 80 simplement envoyer la connexion à 443 ... alors la majeure partie de votre logique réside dans le bloc de serveur pour le port 443 ... ou pas? laisse savoir ... je peux poster un exemple concret ... suite à votre question oui l'url ne contient jamais de numéro de port mais la config fait acheminer le trafic vers votre serveur sous-jacent et son port en fonction du chemin url donné –

+0

@ScottStensland Remerciements vous pour votre commentaire. Je voudrais utiliser le même schéma pour tous les types de sites, donc je voudrais travailler http et https sans aucune redirection. –

+0

Dans votre configuration nginx avez-vous essayé de tout rediriger vers https/443? – Sergiu

Répondre

0

Après enquête mon dossier config nginx était bien mais je devais mettre à jour mon docker-composer.yaml comme ceci:

web: 
    build: /Users/marcin/docker/definitions/php-nginx/php-7.1-ubuntu 
    volumes: 
    - /c/Users/marcin/docker/projects/newdocker.app/html/:/usr/share/nginx/html/ 
    - /c/Users/marcin/docker/projects/newdocker.app/nginx/conf.d/:/etc/nginx/conf.d/ 
    - /c/Users/marcin/docker/projects/newdocker.app/nginx/log/:/var/log/nginx/  
    - /c/Users/marcin/docker/projects/newdocker.app/php/config/:/usr/local/etc/php/ 
    - /c/Users/marcin/docker/projects/newdocker.app/supervisor/conf.d/:/etc/supervisor/conf.d/ 
    - /c/Users/marcin/docker/projects/newdocker.app/supervisor/log/:/var/log/supervisor/ 
    - /c/Users/marcin/docker/local_share/:/root/.local_share/ 
    working_dir: /usr/share/nginx/html/ 
    links: 
    - db 
    container_name: newdocker.php 
    hostname: newdocker.app 
    ports: 
    - "280:22" 
    - "8300:80" 
    - "18300:443" 
    environment: 
    - VIRTUAL_HOST=newdocker.app 
    - CERT_NAME=default 
    - HTTPS_METHOD=noredirect 

db: 
    build: /Users/marcin/docker/definitions/mysql/5.7 
    environment: 
    - MYSQL_ROOT_PASSWORD=pass 
    - MYSQL_DATABASE= 
    - MYSQL_USER= 
    - MYSQL_PASSWORD= 
    expose: 
    - 3306 
    volumes: 
    - /c/Users/marcin/docker/projects/newdocker.app/mysql/data/:/var/lib/mysql/ 
    - /c/Users/marcin/docker/projects/newdocker.app/mysql/conf.d/:/etc/mysql/conf.d/source 
    - /c/Users/marcin/docker/projects/newdocker.app/mysql/log/:/var/log/mysql/ 
    ports: 
    - "33200:3306" 
    container_name: newdocker.db 
    hostname: newdocker.app 

La chose la plus importante est ici l'ajout d'- CERT_NAME=default pour le faire fonctionner (mes certificats partagés dans jwilder/nginx- proxy a les noms default.crt et default.key comme vous pouvez le voir dans le 2ème docker-compose.yaml mis en question) et parce que je voulais avoir à la fois http et https fonctionnant, j'ai dû ajouter - HTTPS_METHOD=noredirect aussi. Après le redémarrage de nginx maintenant, je peux utiliser https://newdocker.app sans aucun port ajouté et http://newdocker.app fonctionne aussi.