nodejs&使用NGINX表达https服务器

时间:2015-06-28 10:40:20

标签: node.js express nginx https

我正在尝试使用https设置nodejs服务器以进行REST调用。 通过http直接连接到ip +端口工作正常。当使用https与ip和端口我的Android应用程序抱怨“主机名xx.xx.xx.xx未经验证”。所以我想我应该为它设置一个域来使我的证书匹配。

使用NGINX,我做了以下内容:

server {
  listen 80;

  server_name rest-ssl.mydomain.com;

  location / {
    proxy_pass         https://xx.xx.xx.xx:4443;
    proxy_set_header   X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header   Host $http_host;
    proxy_set_header   X-Forwarded-Proto $scheme;
    proxy_buffering off;
  }
}

server {
  listen 80;

  server_name rest-normal.mydomain.com;

  location / {
    proxy_pass         http://xx.xx.xx.xx:4080;
    proxy_set_header   X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header   Host $http_host;
    proxy_set_header   X-Forwarded-Proto $scheme;
    proxy_buffering off;
  }
}

重新启动我的nginx服务。在这个配置文件中,我有两个其他服务器配置监听端口80工作正常。

我的nodejs应用程序如下所示:

var express =          require('express'),
    http =             require('http'),
    https =            require('https'),
    fs =               require('fs'),
    Security =         require('./security.js'),
    json =             require('express-json'),
    stylus =           require('stylus'),
    nib =              require('nib'),
    path =             require('path'),
    bodyParser =       require('body-parser');

var app = express();

app.use(bodyParser.urlencoded({extended:true}));
app.use(bodyParser.json());
app.use(json());
app.use(authChecker);
app.use(stylus.middleware({
        src: __dirname + '/public',
        compile: compile,
        keepExtensions: true,
        uploadDir: __dirname + '/public/images'}));
app.use(express.static(path.join(__dirname, 'public')));

require('./routes-v1.js')(app);
require('./routes-v2.js')(app);

var hskey = fs.readFileSync('certificates/key.pem');
var hscert = fs.readFileSync('certificates/key-cert.pem');

var options = {
    key: hskey,
    cert: hscert
};

http.createServer(app).listen(4080);
console.log('Listening on port 4080...');

https.createServer(options, app).listen(4443);
console.log('Listening on port 4443...');

function authChecker(req, res, next) {
    console.log("authChecker");
    res.setHeader('Content-Type', 'application/json');
    if (!Security.checkHMAC(req)) {
        res.json({unauthorized:true});
    } else {
        next();
    }
}

function compile(str, path) {
    return stylus(str).set('filename', path).use(nib());
}

我的问题是NGINX中新定义的网址不起作用。知识产权的工作正常。我在这里错过了什么?它是NGINX还是节点中的东西?通过NGINX我的其他子域完美无缺。

0 个答案:

没有答案