使用Nginx反向代理本地服务(无固定公网IP通过端口映射公开的服务)的坑
使用Nginx反向代理本地服务(无固定公网IP通过端口映射公开的服务)的坑
前言:之前公司的服务器都是云服务器,性能比较差,而我们有一些内部使用的系统和极少数外部用户使用的系统,对资源有一定的要求,也不要求多少个的9的可靠性,于是我们买了一台服务器,将这类服务放在了本地。这一部分服务有时候也需要外网访问,非专线宽带80端口和443端口都不能使用,于是通过云服务器上的Nginx反向代理这部分服务,在这个过程中,踩了一些坑,这里记录下来
网络结构
在这个网络中,因为用公网IP,虽然不是固定的,还是可以通过使用其他端口的方式访问,但是用户在使用时就需要使用带端口号的地址,这样看起来不是很正规(主要是个人洁癖),于是设计成了这样的一个网络结构,可能有部分同学会觉得这样很浪费云服务器的带宽,这一点我也考虑过,我们的服务大部分是前后端分离项目,前端用了CDN,后端使用直接映射的域名和端口,不走代理,只有部分前后端不分离项目会耗带宽一点,但是大部分访问都是内网访问,已经通过内部的DNS直接解析到了本地地址,不会从云上绕一圈,因此带宽也是可以接受的
配置文件(有问题版)
server {
listen 80;
server_name a.domain.com c.domain.com c.domain.com;
location / {
proxy_pass http://local.domain.com:6666;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection keep-alive;
proxy_set_header Host $host;
proxy_cache_bypass $http_upgrade;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
这是一个常规的反向代理,因为以前一直这么用的,按照正常来说应该不会出问题,刚配上的时候,确实是可以的,然后到了下午,突然就无法访问了,查看Nginx错误日志
10060: A connection attempt failed because the connected party did not properly respond after a period of time, or established connection failed because connected host has failed to respond
最开始以为是配置的问题,经过仔细检查,发现配置确实没有错误,于是选择nginx -s reload重新加载,重新加载后服务又正常了,一时间不知道发生了什么,后来一阵搜索,发现是当使用域名作为反向代理时,Nginx会缓存域名解析后的IP地址,直到重启Nginx服务或重新加载配置文件,反向代理的域名使用DDNS服务将解析IP地址始终保持为对应的公网IP地址,但是毕竟是动态公网,每隔一段时间公网地址会刷新,刷新后Nginx还是反向代理的以前的IP地址,也就造成了服务无法访问
在搜索的问题的过程中,也找到了问题的解决办法,就是让域名解析后的地址不一直缓存,而是每隔一段时间刷新,Nginx的官方解决方案是resolver,下面是网上的关于resolver的
看完之后,对配置文件做了如下修改,反向代理到本地服务器就正常了
配置文件(修复版)
server {
listen 80;
server_name a.domain.com c.domain.com c.domain.com;
resolver 119.29.29.29 valid=30s;
set $loaclserver http://local.domain.com:6666;
location / {
proxy_pass $loaclserver;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection keep-alive;
proxy_set_header Host $host;
proxy_cache_bypass $http_upgrade;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
看了上面提到的大佬关于resolver的用法的文章,对配置文件做了一些修改,将代理的地址设为了变量,设置了解析域名的DNS服务器,解析值30秒过期,然后代理访问本地的服务就正常了
这中间有个小插曲,一度让我觉得这个方法没有作用,因为最开始我设置的DNS是114.114.114.114,这个DNS可能是国内公共DNS知名度最高的一个了,但是这个DNS好像没有刷新我的域名解析,在更改了解析值十多分钟后还是解析为原来的解析值,后来换了DNSPod的公共DNS,表示很好用
使用Nginx反向代理本地服务(无固定公网IP通过端口映射公开的服务)的坑的更多相关文章
- nginx反向代理本地 单台wed -使用ip+端口代理
环境: 本地外网ip:123.58.251.166 .配置index.html网页 [root@host---- conf.d]# cat /web/sing/index.html <h1> ...
- 在centos7.6上部署前后端分离项目Nginx反向代理vue.js2.6+Tornado5.1.1,使用supervisor统一管理服务
原文转载自「刘悦的技术博客」https://v3u.cn/a_id_102 这一次使用vue.js+tornado的组合来部署前后端分离的web项目,vue.js不用说了,前端当红炸子鸡,泛用性非常广 ...
- Nginx反向代理+Tomcat+Springmvc获取用户访问ip
Nginx+Tomcat+Springmvc获取用户访问ip 1.Nginx反向代理 修改Nginx配置文件 location / { ***********之前代码*******; proxy_se ...
- nginx反向代理本地 两台web负载均衡 使用域名代理
环境: 本地外网ip:123.58.251.166 .配置index.html网页 [root@host---- conf.d]# cat /web/sing/index.html <h1> ...
- nginx反向代理本地 两台web负载均衡 使用ip+端口代理
环境: 本地外网ip:123.58.251.166 .配置index.html网页 [root@host---- conf.d]# cat /web/sing/index.html <h1> ...
- nginx反向代理本地 单台wed -使用域名代理
环境: 本地外网ip:123.58.251.166 .配置index.html网页 [root@host---- conf.d]# cat /web/sing/index.html <h1> ...
- NGINX反向代理,后端服务器获取真实IP
一般使用中间件做一个反向代理后,后端的web服务器是无法获取到真实的IP地址. 但是生产上,这又是不允许的,那么怎么解决? 1.在NGINX反向代理服务器上进行修改 2.修改后端web服务器配置文件 ...
- Nginx 反向代理时获取用户的真实 IP
在平时我们开发后端程序的过程中,应该多多少少都会碰到记录客户端 IP 的场景,例如我之前写过的 APP 用户的一个审计功能,就需要获取用户的 IP 地址:还有广告系统里面,也是需要获取用户的 IP 地 ...
- nginx反向代理后端web服务器记录客户端ip地址
nginx在做反向代理的时候,后端的nginx web服务器log中记录的地址都是反向代理服务器的地址,无法查看客户端访问的真实ip. 在反向代理服务器的nginx.conf配置文件中进行配置. lo ...
- Nginx 反向代理(http转htpps,并支持80端口继续提交post请求)
项目是一个web server + 多个client的形式,client由用户安装在自己的电脑上 由http升级为https后,我们通过在Nginx做了80端口重定向443的配置,使用户通过访问htt ...
随机推荐
- w3cschool-Django中文教程
https://www.w3cschool.cn/django/ Django 简介 Django 是用Python开发的一个免费开源的Web框架,可以用于快速搭建高性能,优雅的网站!采用了MVC的框 ...
- const 用法详解
1. 类的成员函数声明为const类型,在类外定义的时候,也需要添加const 2. 如果常成员函数修改了成员变量,会在编译的时候检查出来错误! 其实关于const用错的报错都是在编译阶段出现的!(大 ...
- 基于FATE的可验证秘密分享算法详解及应用场景分享:学习
内容来自"光大科技-基于FATE的可验证秘密分享算法详解及应用场景分享" 理论 基于Shamir的秘密共享方案,通过多项式插值实现. 加入可验证功能,即发送多项式系数的模数给对方作 ...
- 极客时间《Redis核心技术与实战》阅读笔记
极客时间<Redis核心技术与实战>阅读笔记 数据结构 为了实现从键到值的快速访问,Redis 使用了一个哈希表来保存所有键值对. 哈希桶中的元素保存的并不 ...
- 鸿蒙页面开发 - 扩展组件样式 @Extend
这篇文章介绍一个装饰器 @Extend,它的主要作用是:用于扩展原生组件的样式 比如我们扩展 Text 组件的样式,为其添加一个默认的 fontSize 和 fontColor,如下: @Entry ...
- 面试必备!HR面常问的20个问题及高分回答秘诀
HR面试一般会花大约20分钟,主要会问一些个人情况.处理事情的方法.工作经验.成长经历等相关问题. 当你到了HR面,基本上就代表你的面试已经通过了一大半了.不过,还是不要掉以轻心,HR面还是有可能会挂 ...
- C51基础知识总览
- Android应用禁止屏幕休眠的3种方法
做android应用开发时,有时需要在应用前台运行时,禁止休眠,以下几种方法供参考. 方法一:持有wakelock 添加休眠锁,休眠锁必须成对出现. private wakelock mwakeloc ...
- QT5笔记:10. 容器类的迭代
1. 这里指的是Java类型的迭代器,即使用方式和Java中一致 代器的使用例子(适用于可读可写迭代器) QList<QString>list;//声明容器类 list << ...
- AWS - [01] 概述
题记部分 001 || 概述 AWS,全称Amazon Web Services,是亚马逊公司旗下的云计算服务平台,自2006年起向全球用户提供广泛而深入的云计算服务.AWD是全球最全面.应用最广 ...