Проблема рукопожатия SSL на docker с использованием Nginx и Socketio - PullRequest
0 голосов
/ 01 марта 2020

Я не специалист по серверным процессам, поэтому постараюсь сделать свой вопрос очень простым. Я использую Socket.io + Nginx + Vuejs + LetsEncrypt и хочу разместить несколько сайтов на docker. Но у меня проблема с socket.io SSL. У меня есть два контейнера, один для внутреннего интерфейса, а другой для внешнего интерфейса. Я могу делиться данными из бэкэнда во внешний интерфейс, используя socket.io с HTTP. Однако проблема заключается в использовании HTTPS. Потому что я должен использовать файлы, которые являются ключами для сертификации от LetsEncrypt в бэкэнд-контейнере для рукопожатия с внешним интерфейсом.

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

это nginx составной файл

version: '3'

services:
  nginx:
    image: nginx:1.13.1
    container_name: nginx-proxy
    ports:
      - "80:80"
      - "443:443"
    volumes:
      - conf:/etc/nginx/conf.d
      - vhost:/etc/nginx/vhost.d
      - html:/usr/share/nginx/html
      - certs:/etc/nginx/certs
    labels:
      - "com.github.jrcs.letsencrypt_nginx_proxy_companion.nginx_proxy=true"

  dockergen:
    image: jwilder/docker-gen:0.7.3
    container_name: nginx-proxy-gen
    depends_on:
      - nginx
    command: -notify-sighup nginx-proxy -watch -wait 5s:30s /etc/docker-gen/templates/nginx.tmpl /etc/nginx/conf.d/default.conf
    volumes:
      - conf:/etc/nginx/conf.d
      - vhost:/etc/nginx/vhost.d
      - html:/usr/share/nginx/html
      - certs:/etc/nginx/certs
      - /var/run/docker.sock:/tmp/docker.sock:ro
      - ./nginx.tmpl:/etc/docker-gen/templates/nginx.tmpl:ro

  letsencrypt:
    image: jrcs/letsencrypt-nginx-proxy-companion
    container_name: nginx-proxy-le
    depends_on:
      - nginx
      - dockergen
    environment:
      NGINX_PROXY_CONTAINER: nginx-proxy
      NGINX_DOCKER_GEN_CONTAINER: nginx-proxy-gen
    volumes:
      - conf:/etc/nginx/conf.d
      - vhost:/etc/nginx/vhost.d
      - html:/usr/share/nginx/html
      - certs:/etc/nginx/certs
      - /var/run/docker.sock:/var/run/docker.sock:ro

volumes:
  conf:
  vhost:
  html:
  certs:

# Do not forget to 'docker network create nginx-proxy' before launch, and to add '--network nginx-proxy' to proxied containers. 

networks:
  default:
    external:
      name: nginx-proxy

сервер. js в бэкэнд-контейнере

var fs = require('fs');
var app = require('express')();
var https   = require('https');
var io = require('socket.io')(https);
var HTTPSOptions = {
    cert: fs.readFileSync('./certs/cert.pem'), // i have to reach certs files from nginx container
    key: fs.readFileSync('./certs/key.pem'),
    ca: fs.readFileSync('./certs/chain.pem'),
    requestCert: false,
    rejectUnauthorized: false,
};
HTTPSOptions.agent = new https.Agent(HTTPSOptions);
var httpsServer = https.createServer(HTTPSOptions, app);
io = io.listen(httpsServer, {
    log: false
});
httpsServer.listen(4001, "0.0.0.0",() =>{
  console.log('Listening on Port 4001');
});

добавил их в nginx файл конфигурации

upstream upstream-nodejs {
        server  0.0.0.0:4001;
}



  }
        location /socket.io/ {
                proxy_pass              http://upstream-nodejs;
                proxy_redirect off;

                proxy_http_version      1.1;

                proxy_set_header        Upgrade                 $http_upgrade;
                proxy_set_header        Connection              "upgrade";

                proxy_set_header        Host                    $host;
                proxy_set_header        X-Real-IP               $remote_addr;
                proxy_set_header        X-Forwarded-For         $proxy_add_x_forwarded_for;
        }

Заранее спасибо!

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