2013-11-20 3 views
2

Я пытаюсь развернуть в удобное время на приложении Azure my nodejs.Node server HTTPS и HTTP на Azure

Я начинаю два сервера:

// public server 
    publicServer.listen(publicServerPort, function() { 
    console.log('Public server started and listening on port ' + publicServerPort); 
    }); 

    // API server 
    var credentials = { 
    key : fs.readFileSync(key, 'utf8'), 
    cert: fs.readFileSync(cert, 'utf8') 
    }; 

    https 
    .createServer(credentials, serverAPI) 
    .listen(serverAPIPort, function(){ 
     console.log('API server started and listening on port ' + serverAPIPort); 
    }); 

Я прочитал, что Azure обрабатывает себя перенаправление на HTTPS, а также я не могу иметь два сервера, потому что только один порт открыт.

Если я использую как для process.env.PORT, я получаю (логически):

Unaught exception: Error: listen EADDRINUSE 

Если я использую для публичного process.env.PORT и для HTTPS 443:

Unaught exception: Error: listen EACCES 

Могу ли я иметь два сервера? Если нет, как правильно обрабатывать маршрутизацию (разные для http и https)? Через обнаружение протокола, например?

Благодарим за помощь.

+0

Было бы очень полезно, если вы могли бы обеспечить по крайней мере часть вашего Azure службы (как вы настраиваете «Время выполнения»> «Среда» и «Конечные точки»). Также вы используете Azure Website или Azure Cloud Service? – Tom

ответ

4

Я запускаю облачную службу Azure (используя Node.js) с конечными точками HTTP и HTTPS. Хитрость заключается в том, чтобы позволить IIS обработать SSL-соединение для вас, чтобы ваше приложение Node.js прослушивало только HTTP (используя process.env.PORT).

Я загрузил свой сертификат на портал Windows Azure, а затем мой файл ServiceDefinition.csdef выглядит примерно так:

<?xml version="1.0" encoding="utf-8"?> 
<ServiceDefinition xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" name="my-cloud-service-name" xmlns="http://schemas.microsoft.com/ServiceHosting/2008/10/ServiceDefinition"> 
    <WebRole name="my-cloud-service-name" vmsize="Small"> 
    <Imports /> 
    <Startup> 
     <Task commandLine="setup_web.cmd &gt; log.txt" executionContext="elevated"> 
     <Environment> 
      <Variable name="EMULATED"> 
      <RoleInstanceValue xpath="/RoleEnvironment/Deployment/@emulated" /> 
      </Variable> 
      <Variable name="RUNTIMEID" value="node;iisnode" /> 
      <Variable name="RUNTIMEURL" value="http://az413943.vo.msecnd.net/node/0.8.4.exe;http://az413943.vo.msecnd.net/iisnode/0.1.21.exe" /> 
     </Environment> 
     </Task> 
     <Task commandLine="node.cmd ..\startup.js" executionContext="elevated" /> 
    </Startup> 
    <Endpoints> 
     <InputEndpoint name="Web" protocol="http" port="80" /> 
     <InputEndpoint name="WebSSL" protocol="https" port="443" certificate="my-certificate-name" /> 
    </Endpoints> 
    <Certificates> 
     <Certificate name="my-certificate-name" storeLocation="LocalMachine" storeName="CA" /> 
    </Certificates> 
    <Sites> 
     <Site name="Web"> 
     <Bindings> 
      <Binding name="Web" endpointName="Web" /> 
      <Binding name="WebSSL" endpointName="WebSSL" /> 
     </Bindings> 
     </Site> 
    </Sites> 
    </WebRole> 
</ServiceDefinition> 

Тогда в iisnode элемент моего файла Web.cloud.config я удостоверился содействовать переменной сервера HTTPS:

<iisnode debuggingEnabled="false" devErrorsEnabled="false" loggingEnabled="false" node_env="production" promoteServerVars="HTTPS" /> 

Это позволило мне установить заголовок х-пересылаются-прото используя немного Express.js промежуточного слоя, который является стандартом де-факто для идентификации протокола БЕРУЩИХ из запроса HTTP: http://en.wikipedia.org/wiki/List_of_HTTP_header_fields

exports.xForwardedProto = function(req, res, next) { 
    if(!req.headers['x-forwarded-proto']) { 
     if(req.headers['x-arr-ssl'] || req.headers['x-iisnode-https'] === 'on') { 
      req.headers['x-forwarded-proto'] = 'https'; 
     } 
    } 

    next(); 
}; 

Затем, когда я хочу, чтобы перенаправить HTTP запросы HTTPS я использую этот бит Express.js промежуточного слоя:

exports.httpsOnly = function(req, res, next) { 
    if(req.protocol === 'http' && process.env.NODE_ENV && process.env.NODE_ENV != 'development') { 
     return res.redirect(301, 'https://' + req.get('host') + req.url); 
    } 

    next(); 
}; 
+0

Это старый ответ. Просто чтобы добавить. Существует лучший способ для обеспечения HTTPS на лазурных веб-сайтах, как уже упоминалось [здесь] (http://stackoverflow.com/questions/20578283/how-do-you-force-express-on-node-js-in-azure- сайты в использовании-HTTPS) –

Смежные вопросы