使用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 ...
随机推荐
- HBase-1集群安装部署
1.1 准备安装包 下载安装包并上传到hadoop01服务器 安装包下载地址:https://www.apache.org/dyn/closer.lua/hbase/2.2.6/hbase-2.2.6 ...
- Elasticsearch(5) --- 基本命令(集群相关命令、索引CRUD命令、文档CRUD命令)
这篇博客的命令分为ES集群相关命令,索引CRUD命令,文档CRUD命令.这里不包括Query查询命令,它单独写一篇博客. 一.ES集群相关命令 ES集群相关命令主要是_cat命令,所以这里详细讲解下该 ...
- w3cschool-Struts2 概述
Struts2 概述 Struts2 是目前较为普及和成熟的基于MVC设计模式的web应用程序框架,它不仅仅是Struts1 的升级版本,更是一个全新的Struts架构.最初,是以WebWork框架和 ...
- getDerivedStateFromProps 详解
getDerivedStateFromProps 是 React 生命周期中的一个静态方法,主要用于在组件接收到新的 props 时更新 state.这个方法在组件的初始渲染和后续的每次更新(即每次接 ...
- mybatis之xml简单映射,解决实体类属性字段与数据库表字段不一致问题
当实体类属性字段与数据库表字段不一致时该怎么办? 方法一:起别名 <select id="getUserList" resultType="RealUser&quo ...
- 在Windows系统中安装Open WebUI并连接Ollama
一.Open WebUI简介与安装前准备 Open WebUI是一个开源的大语言模型(LLM)交互界面,支持本地部署与离线运行.通过它,用户可以在类似ChatGPT的网页界面中,直接操作本地运行的Ol ...
- 在 GitLab CI/CD 中使用内置的容器镜像库
配置 Docker-in-Docker Docker-in-Docker (dind) means: 你应该注册一个 Docker executor 或 Kubernetes executor 执行器 ...
- 『Python底层原理』--Python属性的工作原理
Python中的属性操作(如获取.设置和删除属性)是我们日常编程中非常常见的操作. 但你有没有想过,当我们写下obj.attr或obj.attr = value时,Python 内部究竟发生了什么? ...
- Edge浏览器网站页面如何设置自动刷新
1.浏览器设置 要在Edge浏览器中设置网站页面自动刷新,可以按照以下步骤操作: 打开Edge浏览器,进入你想要自动刷新的网站页面. 在地址栏上方点击"设置和更多选项"(三个水平点 ...
- 设计原则&模式:原型模式 Prototype(创建型)
定义:用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象.也就是说,这种不通过new关键字来产生一个对象,而是通过对象复制(Java中的clone或反序列化)来实现的模式,就叫做原型模式. ...