编程技术分享平台

网站首页 > 技术教程 正文

node.js如何把nginx改成动态网关?

xnh888 2024-09-19 06:34:52 技术教程 19 ℃ 0 评论

nginx无疑是网关最稳定的选择,尝试过很多动态网关,但是最终都觉得那些太复杂臃肿,比如kong等,很难想象他们的实际使用场景,以及在实际使用中的意义,还是动手来改造nginx吧。

  • 设计思路:

首先暂不考虑lua脚本,因为老胡希望,在最恶劣和最失误的情况,nginx仍然能保持大部分业务系统的正常运行,这也是微服务的设计初衷。我曾经有这样一个动态网关方案,eureka+gateway,然后遇到参数错误直接把eureka注册中心弄死机,然后gateway死机,那种全业务崩溃的感觉能感受吗?从那以后,我就坚信任何复杂的网关都不具有实用价值。

我采用动态生成nginx的conf配置文件的方案来实现动态网关,之前用java实现过一次动态生成conf文件,没有找到现成的开源包,自己虽然实现了,但是感觉不够灵活。这次决定使用node.js来做,没想到很快就找到了开源包 nginx-conf。

const NginxConfFile = require('nginx-conf').NginxConfFile;
// 需要提供tt.conf文件,或者创建空的 tt.conf文件
NginxConfFile.create('./tt.conf', (err, conf)=>{
  		// 清空 原文件的 server节点,upstream节点,这个根据实际需要
 				conf.nginx._remove('server')
        conf.nginx._remove('upstream')
  
     		conf.nginx._add('server', null)
        conf.nginx.server[0]._add('listen', 80)
        conf.nginx.server[0]._add('server_name', '\tlocalhost')
        conf.nginx.server[0]._add('client_max_body_size', '\t100m')
        conf.nginx.server[0]._add('proxy_set_header', '\tHost\t$host')
        conf.nginx.server[0]._add('proxy_set_header', '\tX-Real-IP\t$remote_addr')
        conf.nginx.server[0]._add('proxy_set_header', '\tX-Forwarded-For\t$proxy_add_x_forwarded_for')
        conf.nginx.server[0]._add('proxy_set_header', '\tX-Forwarded-Proto\t$scheme')
        conf.nginx.server[0]._add('proxy_set_header', '\tX-Forwarded-Port\t$server_port')
  
  	// 创建一个新的 location,  路径为 /aaa/ 的访问,都指向 http://192.168.0.1:8080/aaa/
  		conf.nginx.server[0]._add('location', '/aaa/')
       conf.nginx.server[0].location[i]._add('proxy_pass', 'http://192.168.0.1:8080/aaa/')
  
  conf.on('flushed', () => {
            console.log('finished writing to disk, exiting');
            process.exit();
        });

  		// 将对conf的修改,写入 配置文件
        conf.flush()
})

得到tt.conf配置文件,查看:

server {
    listen 80;
    server_name 	localhost;
    client_max_body_size 	100m;
    proxy_set_header 	Host	$host;
    proxy_set_header 	X-Real-IP	$remote_addr;
    proxy_set_header 	X-Forwarded-For	$proxy_add_x_forwarded_for;
    proxy_set_header 	X-Forwarded-Proto	$scheme;
    proxy_set_header 	X-Forwarded-Port	$server_port;
    location /aaa/ {
        proxy_pass http://192.168.0.1:8080/aaa/;
    }
}

简单吧,再修改为从mysql数据库读取,就成为动态网关了。

  • 异常

这种模式会出现哪些异常呢?第一是路径配置错误,那后果就是新配置的不能用,某一个老的配置路径被冲突了。这个破坏范围还算小吧? 第二个是 动态文件生成失败,那就继续使用原有的配置文件呗。 所以,可见这种做法的安全性是可以得到保障的。最重要的是不用学习nginx里面的配置在spring-gateway里面如何实现等等。

  • 关注老胡,分享更多简洁有用的技巧

Tags:

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表