nginx实现根据URL转发请求的实战经历

前言

因为这久完成了一个分布式文件系统的内网外穿部署,使用fastdfs,该应用部署到8088端口,它的后台管理系统部署在8089端口(同一个内网服务器),该后台管理系统的服务要请求fastdfs服务,可以直接请求(同一个服务器的资源),但是我们现在只外穿了后台管理系统(Springboot项目),不通过公网分配的IP只能访问到后台管理系统,要直接访问fastdfs服务的接口的话必须连接服务器公网,但是这限制了我们用户的访问(我没办法每次都去你的服务器的地方访问,我想在其他地方也可以访问)

代理服务器:SockerServer监听某个端口,根据http报文连接到指定服务器端口,进行数据请求
- HTTP代理
http请求经过代理服务器,代理服务器只要负责转发相应的http响应体就可以了。
- HTTPS代理
https请求经过代理服务器,会发送一个CONNECT报文,用于和代理服务器建立隧道,如果代理服务器返回HTTP 200,则建立成功,后续代理服务器只要负责转发数据就行,实际上SSL/TLS握手还是发生在客户端和真实服务器。

ProxyServlet

因为该后台项目8089端口可以访问服务器fastdfs服务,所以我首先想到的是使用Springboot的ProxyServlet把指定请求代理到服务器8088端口

Spring boot 的主 Servlet 为 SpringMVC的DispatcherServlet,其默认的url-pattern为“/”,如果我们想要为某个url添加不同的调用(其他服务器接口),则需要创建新的代理servlet,会使用到ServletRegistrationBean,创建一个新的ProxyServlet来处理不同端口的监听和数据的发送,并将它注册到springboot管理的servletContext中(设置指定服务器和端口,请求转发的接口)

依赖

<dependency>
 <groupId>org.mitre.dsmiley.httpproxy</groupId>
 <artifactId>smiley-http-proxy-servlet</artifactId>
 <version>1.7</version>
 </dependency>

配置

### 配置代理
#请求resource时代理转发到端口8088项目中
proxy.test.servlet_url_one= /resource/*
proxy.test.target_url_one= https://localhost:8088
@Component
@Data
public class ProxyFilterServlet {
 @Value("${proxy.test.target_url_one}")
 private String targetUrl;
 @Value("${proxy.test.servlet_url_one}")
 private String servletUrl;
}

更改config添加

@Configuration
public class ProxyServletConfig {
 @Autowired
 private ProxyFilterServlet proxyFilterServlet;
 //多个代理servlet可以配置多个bean
 @Bean
 public ServletRegistrationBean servletRegistrationBean(){
 ServletRegistrationBean servletRegistrationBean = new ServletRegistrationBean(new ProxyServlet(), proxyFilterServlet.getServletUrl());
 //这个setName必须要设置,并且多个的时候,名字需要不一样
 servletRegistrationBean.setName("go_backend");
 servletRegistrationBean.addInitParameter("targetUri", proxyFilterServlet.getTargetUrl());
 servletRegistrationBean.addInitParameter(ProxyServlet.P_LOG, "false");
 return servletRegistrationBean;
 }
}

通过servlet容器来建立与目标服务器连接,毕竟没有nginx这样的专业代理服务器强

nginx—代理转发

  • 这个时候我想到了服务器之间添加一层nginx,来把不同的服务请求转发到不同的端口api去处理

把需要请求的外网的请求转到同一服务器内网端口

server {
 listen 80;
 server_name 127.0.0.1;

 location / {
 proxy_pass http://127.0.0.1:3000;
 }

 location ~ /api/ {
 proxy_pass http://172.30.1.123:8081;
 }
}

参考博文:

https://www.jb51.net/article/174382.htm

https://www.jb51.net/article/174383.htm

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对我们的支持。

(0)

相关推荐

  • Nginx服务器作反向代理实现内部局域网的url转发配置

    情景 由于公司内网有多台服务器的http服务要映射到公司外网静态IP,如果用路由的端口映射来做,就只能一台内网服务器的80端口映射到外网80端口,其他服务器的80端口只能映射到外网的非80端口.非80端口的映射在访问的时候要域名加上端口,比较麻烦.并且公司入口路由最多只能做20个端口映射.肯定以后不够用. 然后k兄就提议可以在内网搭建个nginx反向代理服务器,将nginx反向代理服务器的80映射到外网IP的80,这样指向到公司外网IP的域名的HTTP请求就会发送到nginx反向代理服务器,利用

  • nginx实现根据URL转发请求的实战经历

    前言 因为这久完成了一个分布式文件系统的内网外穿部署,使用fastdfs,该应用部署到8088端口,它的后台管理系统部署在8089端口(同一个内网服务器),该后台管理系统的服务要请求fastdfs服务,可以直接请求(同一个服务器的资源),但是我们现在只外穿了后台管理系统(Springboot项目),不通过公网分配的IP只能访问到后台管理系统,要直接访问fastdfs服务的接口的话必须连接服务器公网,但是这限制了我们用户的访问(我没办法每次都去你的服务器的地方访问,我想在其他地方也可以访问) 代理

  • nginx 多个location转发任意请求或访问静态资源文件的实现

    本文主要介绍了nginx 多个location转发任意请求或访问静态资源文件的实现,分享给大家,具体如下: server { #监听的端口 listen 80; #监听的域名 server_name localhost; #监听带后缀的url location ^~\.txt { #文件放到/html文件夹下 root /; } #监听所有url,没有特殊需求就用这一个location就够了 #使用通配符只有在没有匹配上其他location的情况下会进入 location / { #去掉了只有u

  • 详解Nginx 利用代理转发请求示例

    我们米扑科技的业务遍布全球,有时国外的客户无法访问我们搭建在国内的服务,这就要求我们在国外服务器上搭建一个代理转发服务,用户请求国外服务器的域名,然后代理转发到国内,处理请求后返回结果给国外的客户.Nginx 不仅可以实现负载均衡,还可以实现反向代理转发,非常适合我们的使用场景,因此我们米扑科技采用 Nginx 利用代理转发请求实例. Nginx 利用代理转发请求实例 nginx 作为目前最流行的web服务器之一,可以很方便地实现反向代理. nginx 反向代理官方文档: NGINX REVER

  • 关于nginx 反向代理 URL替换方案

    目录 1.直接替换location  匹配部分 2.使用nginx 的rewrite 模块 rewrite 企业应用场景 nginx 提供反向代理服务,日常开发过程中有时候我们需要使用nginx 作为代理服务根据url的不同去访问不同的服务器或者不同端口,如下提供两种方案. 1.直接替换location  匹配部分 1.proxy_pass的目标地址,默认不带/,表示只代理域名,url和参数部分不会变(把请求的path拼接到proxy_pass目标域名之后作为代理的URL) 2.如果在目标地址后

  • Apache+Weblogic实现URL转发

    一.需求背景 项目部署在Weblogic应用服务器上,上线之后,申请并配置了域名,但是仍需加上端口号才能访问,这样对于用户访问很不方便.为了实现直接用域名访问系统,于是开发人员搭建了Apache HTTP Server,利用URL转发来解决这个问题. 二.安装Apache HTTP Server 1.下载apache(地址:http://httpd.apache.org),并解压到指定目录下: 2.安装,步骤如下: 首先进入解压后的apache文件夹下,然后依次执行如下命令: [root@loc

  • 详解Nginx的配置函数对于请求体的读取

    nginx核心本身不会主动读取请求体,这个工作是交给请求处理阶段的模块来做,但是nginx核心提供了ngx_http_read_client_request_body()接口来读取请求体,另外还提供了一个丢弃请求体的接口-ngx_http_discard_request_body(),在请求执行的各个阶段中,任何一个阶段的模块如果对请求体感兴趣或者希望丢掉客户端发过来的请求体,可以分别调用这两个接口来完成.这两个接口是nginx核心提供的处理请求体的标准接口,如果希望配置文件中一些请求体相关的指

  • nginx rewrite 实现URL跳转的方法

    最近工作中常常要改nginx配置,学习了nginx中rewrite的用法 URL跳转 这里说的URL跳转就是用户在访问一个URL时将其跳转到另一个URL上. 常见的应用场景是让多个域名跳转到同一个URL上,(例如让旧域名跳转到新域名上) 将静态文件请求跳转到cdn上等 根据用户设备跳转到不同站点(pc版,wap版)等. URL跳转可以通过js在页面上设置的window.location实现 也可以通过php设置header来实现 当然也可以用nginx 的 rewrite功能实现 nginx r

  • 如何利用node转发请求详解

    前言 本篇文章基于 vue.node(koa) 需求 vue 项目开发过程中,接口跨域是一个很常见的问题.在开发时候可以用 vue 自带的 proxy 可以轻松解决.生产环境下,前端项目往往是部署在后端项目下,不会存在跨域的问题,接口前缀可以忽略. dev 环境下,请求一个产品列表接口,我们可能会这么做: https://www.baidu.com/api/product/list 生产环境下,前缀可以忽略: /api/product/list 问题来了,如果我们想在本地测试生产环境下的前端项目

  • 使用Docker安装Nginx并配置端口转发问题及解决方法

    使用docker安装并运行nginx命令: docker run --name=nginx -p 80:80 -d docker.io/nginx 使用命令: docker exec -it nginx /bin/bash 进入容器可查看到几个重要的文件 配置文件:nginx.conf 在 /etc/nginx/nginx.conf 日志文件: /var/log/nginx/access.log /var/log/nginx/error.log 使用cat命令打开nginx.conf root@

随机推荐