Nodejs绑定域名与反向代理

Posted js知识小屋

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Nodejs绑定域名与反向代理相关的知识,希望对你有一定的参考价值。





Nodejs作为Web开发的后起之秀,在现在的国内环境下,虽比不上php的火热,没有.net那么广大的群众基础,盖不过Java的高大上,但Nodejs基于谷歌V8引擎的极速,异步IO与事件模型,无疑将是Web开发的重大革新;作为一个前端,对node向往已久。



现在大多数都是用nginx做反向代理,我是一个服务器小白,百度看Nginx做反向配置的时候,一脸懵逼,按照别人的模板,修改自己想要的样子,除非你是一个运维,不然避免一些未知的小问题  代理后客户端的IP获取问题(获取所有客户的IP都是一样的……),上传文件的大小限制问题,都需要你再次重新配置相关的Nginx配置项;
基本配置方式如下:


命令行进入nginx.exe目录 -> start nginx (启动nginx) -> 打开conf目录里的nginx.conf 文件 –> 新增一段upstream

upstream nodejs

{

     server 127.0.0.1:3000; //你的Express项目端口 # 

     server 127.0.0.1:3001; 

     keepalive 64;

}

-> 在后面的server{}里引用这里定义好的nodejs

完整的片段如下:

server { 

    listen 80;

     server_name www.famanoder.com famanoder.com; //请求到80端口的                     host location / { 

            proxy_set_header X-Real-IP $remote_addr;

            proxy_set_header X-Forwarded-For   $proxy_add_x_forwarded_for; 
            proxy_set_header Host $http_host; 

            proxy_set_header X-Nginx-Proxy true;
            proxy_set_header Connection ""; proxy_pass http://nodejs;

         }

     }

重启nginx:nginx –s reload或者nginx –c conf/nginx.conf

顺利的话就可以跨域请求了;


因为node的出现让我有种为什么不用node去做反向代理呢,在node模块中找到了http-proxy模块,了解了如何用node做反向代理 不多说贴上代码


首先修改 hosts 配置个域名

Win + R 组合快捷键打开运行命令框,然后在打开后面键入或者粘贴上上面的Hosts文件路径,如图所示。

C:\WINDOWS\system32\drivers\etc

Nodejs绑定域名与反向代理



配置好域名之后就可以开始写了

创建一个proxy.js

const http = require('http'),

    express = require('express'),

    httpProxy = require('http-proxy'),

    proxy = httpProxy.createProxyServer({

        xfwd: true//true/false, adds x-forward headers

    }),

    config = require('./config'),

    fs = require('fs'),

    path = require('path'),

    app = express();

//配置路由

app.use((req, res) => {

    config.forEach(o => {

        console.log(req.headers.host,o.proxy,o.host);

        if (req.headers.host == o.host) {

            //请求

            proxy.web(req, res, {

                target: 'http://' + o.proxy

            })

        }

    })

})

var cookie = ""

//监听请求,可以在里面设置请求头和参数

proxy.on('proxyReq', function (proxyReq, req, res) {

    let bodyData = JSON.stringify(req.body);

    req.headers.cookie = cookie + req.headers.cookie;

    proxyReq.setHeader('Content-Type', 'application/json');

    //proxyReq.setHeader('Content-Length', Buffer.byteLength(bodyData));

    proxyReq._headers = req.headers;

    return req

});

//监听响应

proxy.on('proxyRes', function (proxyRes, req, res) {

    var JSESSIONID = proxyRes.headers['set-cookie']

    if (JSESSIONID) {

        cookie = JSESSIONID;

        res.setHeader('Set-Cookie', proxyRes.headers['set-cookie'])

    }

});

//监听报错 

proxy.on('error', function (proxyReq, req, res) {

    res.send("<h1>404 Not Found</h1>")

});

console.log("服务已经启动!");

app.listen(9005);//监听端口,因为我的80端口被使用了 ,所有随便用了一个端口

接口文件config.js

module.exports = [

    {

        host: 'admin.test.com:9005',

        proxy: '127.0.0.1:3001/api'

    },

    {

        host:'127.0.0.1:9005',

        proxy:'127.0.0.1:3001/api',

    },

]


配置响应服务器serverRes.js

var express = require('express');

var app = express();

var responsePort = 3001;  // 请求页面跑在3001端口

app.get('/api', (req, res) => {

    console.log(11);

    res.send("Hello world from Proxy  :)")

});

app.listen(responsePort, function () {

    console.log('Responser is listening on port '+ responsePort);

});

这样子启动服务就可以用了


但是在做小demo的过程发现了一篇文章,上面详解讲解了Nginx和http-proxy的的性能区别nginx的处理能力是http-proxy的2倍有兴趣的可以看下文章

https://segmentfault.com/q/1010000004652320



END





以上是关于Nodejs绑定域名与反向代理的主要内容,如果未能解决你的问题,请参考以下文章

Nginx反向代理docker容器进行域名解析绑定的实现方法

nginx反向代理二级域名绑定方法及注意事项

docker 安装 wordpress,通过nginx反向代理,绑定域名,配置https

Apache的网站,使用Nginx进行反向代理(1个IP绑定多个域名,对应多个网站)解决方案

Nginx域名绑定

nginx反向代理PC端和手机端分别请求各自后台工程