Nginx обратный SSL-прокси docker -составить - PullRequest
0 голосов
/ 09 января 2020

Я пытаюсь настроить nginx в качестве обратного прокси на моем сервере Ubuntu 18.04.

Я настроил то, что мне показалось правильным ниже, но нажатие http://web.service.com приводит меня к экран приветствия по умолчанию nginx (тогда как он должен перенаправить на https:// и перейти к https://web.service.com. Я получаю экран ошибки 404.

У меня есть следующая docker-compose.yml конфигурация:

version: "3"
services:
    web_service:
        image: "test/webservice"
        container_name: "webservice"
        hostname: "webservice"

    mysql:
        image: "mysql:5.7"
        container_name: "mysql"
        hostname: "mysql"

    nginx:
        build:
            context: .
            dockerfile: "Dockerfile"
        image: "nginx"
        container_name: "nginx"
        hostname: "nginx"
        ports:
            - "80:80"
            - "443:443"
        volumes:
            - "/var/nginx/data/certs:/etc/nginx/certs"

Примечание: web_service размещает веб-страницу на порту 8080

И у меня по умолчанию nginx.conf

user  nginx;
worker_processes  1;

error_log  /var/log/nginx/error.log warn;
pid        /var/run/nginx.pid;


events {
    worker_connections  1024;
}


http {
    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;

    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

    access_log  /var/log/nginx/access.log  main;

    sendfile        on;
    #tcp_nopush     on;

    keepalive_timeout  65;

    #gzip  on;

    include /etc/nginx/conf.d/*.conf;
}

И мой пользовательский web_service.conf, который встроено в новый nginx образ.

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

server {
    listen 443 ssl default_server;

    server_name www.web.server.com web.server.com;

    ssl_session_cache  builtin:1000  shared:SSL:10m;
    ssl_protocols  SSLv3 TLSv1;
    ssl_ciphers ALL:!aNULL:!ADH:!eNULL:!LOW:!EXP:RC4+RSA:+HIGH:+MEDIUM;

    access_log /var/log/nginx/access.log;
    error_log  /var/log/nginx/error.log info;

    keepalive_timeout 75 75;

    ssl_certificate /etc/nginx/certs/web_server.com.crt;
    ssl_certificate_key /etc/nginx/certs/web_server.com.key;
    ssl_session_timeout 5m;

    add_header Strict-Transport-Security "max-age=7200";

    location / {

      proxy_set_header        Host $host;
      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 $scheme;

      proxy_pass          http://webservice:8080;
      proxy_read_timeout  90;
      proxy_redirect      http://webservice:8080 https://web.service.com;
    }
}

Ранее я просто web_service и mysql в файле compose и выставил port 80:8080 для web_server.

Есть мысли по поводу вопроса?

Ответы [ 3 ]

0 голосов
/ 10 января 2020

Из-за того, что в вашем образе вам не хватает конфигурации сертификата, вам необходимо добавить ca-сертификат к docker системным сертификатам, чтобы использовать https (вы можете проверить его по inte rnet). Еще одна вещь о риске безопасности в вашем конфигурационном файле - SSLv3. Вы должны удалить его, чтобы избежать атаки POODLE .

0 голосов
/ 13 января 2020

Мне удалось решить мою проблему, используя следующую конфигурацию:

upstream docker-webapp {
    server webapp:8080;
}

server {
    listen 80;

    server_name _;

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

server {
    listen 443 ssl default_server;
    listen [::]:443 ssl default_server;    

    server_name www.example.com example.com;

    ## Access and error logs.
    access_log /var/log/nginx/access.log;
    error_log  /var/log/nginx/error.log info;

    ## Keep alive timeout set to a greater value for SSL/TLS.
    keepalive_timeout 75s;

    ## Server certificate and key.
    ssl_certificate         /etc/ssl/certs/certificate.crt;
    ssl_certificate_key     /etc/ssl/certs/certificate.key;
    ssl_dhparam             /etc/ssl/certs/dhparam.pem; 

    ssl_protocols TLSv1.2 TLSv1.3;               
    ssl_prefer_server_ciphers on; 
    ssl_ciphers EECDH+AESGCM:EDH+AESGCM;
    ssl_ecdh_curve secp384r1;               
    ssl_session_timeout  10m;
    ssl_session_cache shared:SSL:10m;
    ssl_session_tickets off;                
    ssl_stapling on;                        
    ssl_stapling_verify on;                  
    add_header Strict-Transport-Security "max-age=63072000; includeSubDomains; preload";
    add_header X-Frame-Options DENY;
    add_header X-Content-Type-Options nosniff;
    add_header X-XSS-Protection "1; mode=block";

    location / {
        proxy_pass         http://docker-webapp;
        proxy_redirect     off;
        proxy_set_header   Host $host;
        proxy_set_header   X-Real-IP $remote_addr;
        proxy_set_header   X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header   X-Forwarded-Host $server_name;
    }
}

, а также информацию, найденную здесь: https://cipherli.st/

В качестве примечания, Развернутое мной веб-приложение необходимо для проверки работоспособности, поэтому мне нужно было установить сертификат publi c в хранилище ключей контейнера веб-приложения. Кроме того, он поддерживает только до TLSv1.2, поэтому я добавил TLSv1.2 в строку ssl_protocols.

0 голосов
/ 09 января 2020

Это не дает прямого ответа на ваш вопрос, но вы можете попробовать этот Nginx контейнер; это действительно делает автоматическую обработку SSL прогулкой в ​​парке.

https://hub.docker.com/r/linuxserver/letsencrypt

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...