Nodejsを用いてProxyを構築しています。
domain.com
やtest.domain.com
など、複数のドメインよりアクセスを受け付けたいです。
そこで下記の様にコードを組みました。しかし、サブドメイン毎にSSLを別に読み込まなければならない為うまくいきません。
js
1let https = require('https'), 2 httpProxy = require('http-proxy'), 3 fs = require('fs'); 4 5var ssl = { 6 key: fs.readFileSync('../ssl/privkey.pem', 'utf8'), 7 cert: fs.readFileSync('../ssl/fullchain.pem', 'utf8') 8}; 9 10 11let HomepageProxy = new httpProxy.createProxyServer({ 12 target: {host: 'localhost', port: 3000} 13}); 14 15 16let TestApiProxy = new httpProxy.createProxyServer({ 17 target: {host: 'localhost', port: 3000} 18}); 19 20 21let wsProxy = new httpProxy.createProxyServer({ 22 target: {host: 'localhost', port: 3000} 23}); 24 25let baseUrl = "domain.com"; 26let server = https.createServer(ssl, function ( req, res ) { 27 //console.log(req.headers.host); 28 //console.log(req.headers); 29 try{ 30 let domain = req.headers.host; 31 let host = domain.split(":")[0]; 32 33 if (host===baseUrl) { 34 HomepageProxy.proxyRequest(req, res); 35 } else if (host==="test."+baseUrl){ 36 TestApiProxy.proxyRequest(req, res); 37 } else { 38 res.writeHead(404); 39 res.end(); 40 } 41 } catch (e) { 42 console.log('error', e); 43 res.writeHead(404); 44 res.end(); 45 } 46}); 47 48server.on( 'upgrade', function( req, socket, head ) { 49 try{ 50 req.headers['x-forwarded-for'] = req.connection.remoteAddress || req.connection.socket.remoteAddress; 51 //console.log(req.headers); 52 wsProxy.ws(req, socket, head); 53 } catch (e) { 54 res.writeHead(404); 55 res.end(); 56 } 57}); 58 59server.listen(443);
package.jsonは以下の様になります。
json
1{ 2 "name": "proxy", 3 "version": "1.0.0", 4 "description": "Proxy server.", 5 "main": "index.js", 6 "scripts": { 7 "start": "node index.js &", 8 "stop": "./stop.sh" 9 }, 10 "author": "Robert Lie", 11 "license": "ISC", 12 "dependencies": { 13 "fs": "0.0.1-security", 14 "http-proxy": "^1.16.2" 15 } 16}
どのようにコードを組めばいいのかわかる方、参考になりそうな情報を知っている方は回答の方を宜しくお願いします。
追記
上記のコードではWSも使用しています。
追記2
回答を参考にしコードを組んでみましたが動きません。
ブラウザでアクセスしてみましたが安全な接続ができませんでしたと出るだけでエラー番号も出されず先へ進めない状態です。ここからどうすればいいのか教えて下さい。参考
js
1let httpProxy = require('http-proxy'), 2 fs = require('fs'), 3 tls = require("tls"); 4 5function getCredentialsContext(cer) { 6 return tls.createSecureContext({ 7 key: fs.readFileSync('/etc/letsencrypt/live/' + cer + '/privkey.pem'), 8 cert: fs.readFileSync('/etc/letsencrypt/live/' + cer + '/fullchain.pem') 9 }).context; 10} 11 12let certs = { 13 "domain.tk": getCredentialsContext('domain.tk'), 14 "test.domain.tk": getCredentialsContext('test.domain.tk') 15}; 16let options = { 17 https: { 18 SNICallback: function(hostname) { 19 return certs[hostname]; 20 } 21 }, 22 hostnameOnly: true, 23 router: { 24 'domain.tk': '127.0.0.1:3000', 25 'test.domain.tk': '127.0.0.1:3000' 26 }, 27 target: { 28 https: true // This could also be an Object with key and cert properties 29 } 30}; 31 32let proxy = httpProxy.createServer(options); 33 34proxy.on('upgrade', function (req, socket, head) { 35 req.headers['x-forwarded-for'] = req.connection.remoteAddress || req.connection.socket.remoteAddress; 36 proxy.proxy.proxyWebSocketRequest(req, socket, head); 37}); 38 39proxy.listen(443);
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/03/10 12:37