Nginx代理传递SSL不考虑侦听URL

时间:2018-10-19 05:25:35

标签: node.js express nginx

我目前正在尝试设置nginx虚拟服务器块,我绝对想把它弄乱。

从本质上讲,我在DigitalOcean的Droplet上运行了一个NodeJS实例。此应用程序的重点是同时托管网站和api。我希望它们都在相同的液滴上运行。

我已经用express设置了我的NodeJS应用程序以创建路由等,然后使用express应用程序创建了一个http服务器。由于我的解释可能会引起混乱,因此我将以下代码的要点包括在内:

const API_PORT = 8080;
const WEB_PORT = 8081;

const api = express();
const web = express();

web.use(express.static(path.join(__dirname, '../build')));

web.get('//', (req, res) => {
    res.sendFile(path.join(__dirname, '../build', 'index.html'));
})

api.use((req, res, next) => {
    const ip = (req. headers['x-forwarded-for'] || '').split(',').pop()
    || req.connection.remoteAddress
    || req.socket.remoteAddress
    || req.connection.socket.remoteAddress

    if (req.headers.auth !== AUTHCODE) {
        httpError(400, 'Validation failed');
        console.warn('Bad Auth Code');
        console.warn(req.headers.auth);
        console.warn(ip);
        return (res.json('Validation failed'));
    }

    res.setHeader('Access-Control-Allow-Origin', '*');
    res.setHeader('Access-Control-Allow-Methods', '*');
    res.setHeader('Access-Control-Allow-Headers', '*');
    next();
});

Graph.route(api);

const apiServer = http.createServer(api);
const webServer = http.createServer(web);

apiServer.listen(WEB_PORT, '127.0.0.1', () => {
    console.log(`API Server is running on port ${API_PORT}`);
});
webServer.listen(API_PORT, '127.0.0.1', () => {
    console.log(`WEB Server is running on port ${WEB_PORT}`);
});

上面的代码显示了我想要实现的目标,但是本质上,我试图让我的api服务器监听端口8080,而我的网站服务器监听端口8081。

有人告诉我可以使用nginx为此创建一个proxy_pass,尽管我没有设法使其按预期工作。在下面,您可以看到两个我尝试做的例子! 任何能够帮助我的人将永远成为我的英雄!

server {
       listen lace.guide:443 ssl;
       server_name lace.guide www.lace.guide;
       ssl_certificate /var/my-server/ssl/myapp.crt;
       ssl_certificate_key /var/my-server/ssl/myapp.key;
       ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
       location / {
                proxy_pass http://127.0.0.1:8080/$request_uri;
                proxy_http_version 1.1;
                proxy_set_header Upgrade $http_upgrade;
                proxy_set_header Connection 'upgrade';
                proxy_set_header Host $host;
                proxy_cache_bypass $http_upgrade;
        }
}

server {
       listen api.lace.guide:443 ssl default_server;
       server_name api.lace.guide www.api.lace.guide;
       ssl_certificate /var/my-server/ssl/myapp.crt;
       ssl_certificate_key /var/my-server/ssl/myapp.key;
       ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
       location / {
                proxy_pass http://127.0.0.1:8081/$request_uri;
                proxy_http_version 1.1;
                proxy_set_header Upgrade $http_upgrade;
                proxy_set_header Connection 'upgrade';
                proxy_set_header Host $host;
                proxy_cache_bypass $http_upgrade;
        }
}

我还遇到另一个非常特殊的错误,这意味着如果我访问api.lace.url/something/somethingElse,它实际上会在服务器上命中//something/somethingElse(来自req.url的console.log)

enter image description here

1 个答案:

答案 0 :(得分:0)

这里是一个示例,说明服务器和客户端如何在一个服务器上运行并通过nginx进行管理(为简单起见,省略了SSL设置)。所有前缀为/api的请求都会路由到服务器,其余的路由到客户端。

upstream client {
    server client:3000;
}

upstream api {
    server api:5000;
}

server {
    listen 80;

    location / {
        proxy_pass http://client;
    }

    location /api {
        proxy_set_header X-Forwarded-For $remote_addr;
        rewrite /api/(.*) /$1 break;
        proxy_pass http://api;
    }    
}