несколько доменов ssl на одном сервере - PullRequest
0 голосов
/ 09 октября 2018

Я использую digitalocean, чтобы разместить 2 приложения node.js, одно из которых является промежуточным, а другое - производственным.Оба нужны ssl, у меня есть сертификат на моем сервере.Но у меня проблема с запуском https для обоих.

//socket io config
const server = require('http').createServer(app)
let io = require('socket.io')(server)
 if (process.env.NODE_ENV === 'production' || process.env.NODE_ENV === 'staging') {

      let api_domain, https_port
      if (process.env.NODE_ENV === 'production') {
        api_domain = "api.example.co"
        https_port = 443
      } else if(process.env.NODE_ENV === 'staging') {
        api_domain = "api-staging.example.co"
        https_port = 4431 //this is not working
      }

      const credentials = {
        key: fs.readFileSync(
          '/etc/letsencrypt/live/' + api_domain + '/privkey.pem',
          'utf8'
        ),
        cert: fs.readFileSync(
          '/etc/letsencrypt/live/' + api_domain + '/cert.pem',
          'utf8'
        ),
        ca: fs.readFileSync(
          '/etc/letsencrypt/live/' + api_domain + '/chain.pem',
          'utf8'
        )
      }

      const httpsServer = https.createServer(credentials, app)
//socket io config
  io = require('socket.io')(httpsServer)
  httpsServer.listen(https_port, () => {
    console.log('HTTPS Server started on: ' + port)
  })
    } else {
      //localhost
      server.listen(port, () => {
        console.log('HTTP Server started on: ' + port)
      })
}

Как правильно настроить порт?

Ответы [ 2 ]

0 голосов
/ 10 октября 2018

Я предлагаю не обслуживать HTTPS, использовать NodeJS.Используйте nginx в качестве обратного прокси и предоставьте поддержку https.

Просто создайте два vhost в nginx с ssl сертификатом и proxy_pass для вашего приложения nodejs.

0 голосов
/ 10 октября 2018

Несколько экземпляров (с другим портом)

В NodeJS вы не можете запускать несколько серверов с одним экземпляром узла.

Вам потребуется запустить несколько экземпляров узла с разными NODE_ENV, чтобы иметьоба сервера работают одновременно.

Порт 3000 и 3001 являются портом по умолчанию, который использовался NodeJS.Убедитесь, что вы правильно указали NODE_ENV.

//socket io config
const server = require('http').createServer(app)
let io = require('socket.io')(server)
if (process.env.NODE_ENV === 'production' || process.env.NODE_ENV === 'staging') {

  let api_domain, https_port
  if (process.env.NODE_ENV === 'production') {
    api_domain = "api.example.co"
    https_port = 443
  } else if (process.env.NODE_ENV === 'staging') {
    api_domain = "api-staging.example.co"
    https_port = 4431 //this is not working
  }

  const credentials = {
    key: fs.readFileSync(
      '/etc/letsencrypt/live/' + api_domain + '/privkey.pem',
      'utf8'
    ),
    cert: fs.readFileSync(
      '/etc/letsencrypt/live/' + api_domain + '/cert.pem',
      'utf8'
    ),
    ca: fs.readFileSync(
      '/etc/letsencrypt/live/' + api_domain + '/chain.pem',
      'utf8'
    )
  }

  const httpsServer = https.createServer(credentials, app)
  //socket io config
  io = require('socket.io')(httpsServer)
  httpsServer.listen(https_port, () => {
    console.log('HTTPS Server started on: ' + https_port)
  })
} else {
  //localhost
  server.listen(port, () => {
    console.log('HTTP Server started on: ' + port)
  })
}

Затем вы хотите запустить 2 отдельных экземпляра, вот так. Предполагая, что файл выше - index.js

$ NODE_ENV=production node index.js
HTTPS Server started on: 443

$ NODE_ENV=staging node index.js
HTTPS Server started on: 4431

После этого вы сможете получить доступ к серверам с URL-адресами ниже.

Не забудьте иметь эти доменыразрешить правильные IP-адреса.

Производство - https://api.example.co

Постановка - https://api -staging.example.co:4431


Одиночный экземпляр (тот же порт)

Если вы хотите дифференцировать среду по имени хоста, вы можете использовать request.headers.host, чтобы определить, куда поступил запросот и оттуда.

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

Ниже приведен один из способов достижения этой цели.

const path = require('path')
const fs = require('fs')
const https = require('https')

let app = function(req, res) {
  res.writeHead(200, { 'Content-Type': 'text/plain' })
  if (req.headers.host === 'prod.dev.localhost') {
    res.write('Welcome to Production server.')
  } else if (req.headers.host === 'stg.dev.localhost') {
    res.write('Welcome to Staging server.')
  } else {
    res.write('Welcome!')
  }
  res.end()
}

const credentials = {
  key: fs.readFileSync(
    path.join(path.dirname(__filename), 'cert', 'wildcard.dev.localhost.pem'),
    'utf8'
  ),
  cert: fs.readFileSync(
    path.join(path.dirname(__filename), 'cert', 'wildcard.dev.localhost.crt'),
    'utf8'
  )
}

const httpsServer = https.createServer(credentials, app)
let io = require('socket.io')(httpsServer)

httpsServer.listen(443, () => {
  console.log('HTTPS Server started on: ' + 443)
})
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...