Несколько экземпляров (с другим портом)
В 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)
})