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
配置好域名之后就可以开始写了
创建一个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
以上是关于Nodejs绑定域名与反向代理的主要内容,如果未能解决你的问题,请参考以下文章
Nginx反向代理docker容器进行域名解析绑定的实现方法
docker 安装 wordpress,通过nginx反向代理,绑定域名,配置https