欢迎访问shiker.tech

请允许在我们的网站上展示广告

您似乎使用了广告拦截器,请关闭广告拦截器。我们的网站依靠广告获取资金。

同一机器,不同端口的泛域名解析如何做到?
(last modified Oct 30, 2022, 1:18 PM )
by
侧边栏壁纸
  • 累计撰写 176 篇文章
  • 累计创建 61 个标签
  • 累计收到 4 条评论

目 录CONTENT

文章目录

同一机器,不同端口的泛域名解析如何做到?

橙序员
2022-10-27 / 0 评论 / 0 点赞 / 452 阅读 / 1,420 字 / 正在检测百度是否收录... 正在检测必应是否收录...
文章摘要(AI生成)

答案:nginx反向代理nginx反向代理首先我们要理解代理,所谓代理,就是两台机器之间的通信非直接通信,而是通过代理服务进行间接通信。假设我们原来与服务器直接的交互如下:‘添加了代理后,我们的请求会首先通过代理协议发送到代理服务,代理服务再转发到服务器上:根据代理服务部署再客户端(请求方)和服务端

答案:nginx反向代理

nginx反向代理

首先我们要理解代理,所谓代理,就是两台机器之间的通信非直接通信,而是通过代理服务进行间接通信。假设我们原来与服务器直接的交互如下:

image-1667021895795

添加了代理后,我们的请求会首先通过代理协议发送到代理服务,代理服务再转发到服务器上:
image-1667022051394

根据代理服务部署再客户端(请求方)和服务端(被请求方)的区别,我们将代理分为正向代理和方向代理。

正向代理:一般用与我们个人电脑上,由于直接访问服务端被拉黑导致访问不了的原因,我们需要通过代理服务来访问。这里常见的应用为加速器、VPN等。
反向代理:一般在服务器端,用来做负载均衡、隐藏服务真实地址、统一访问控制来使用。常见的反向代理工具如nginx,CDN等。

NGINX反向代理: nginx对服务端进行反向代理我们需要通过修改nginx的配置文件nginx.conf来完成对服务端的代理

nginx配置文件结构

nginx.conf 由模块组成,这些模块由配置文件中指定的指令控制。指令分为简单指令和块指令。一个简单的指令由名称和参数组成,由空格分隔并以分号 ; 结尾。块指令与简单指令具有相同的结构,但它不是以分号结尾,而是以一组由大括号 {}包围的附加指令。如果块指令可以在大括号内包含其他指令,则称为上下文. nginx.conf 的主要结构如下:

events {
    #events块
}

http {
   #http全局块
   server{
      #server块
      location [PATTERN] {
      	 #location块
      }
   }
}
  1. 全局块:配置运行nginx服务器的用户组,nginx进程pid存放路径,日志存放路径,配置文件引入,允许生成worker process数等。
  2. events块:配置影响nginx服务器或与用户的网络连接。有每个进程的最大连接数,选取哪种事件驱动模型处理连接请求,是否允许同时接受多个网路连接,开启多个网络连接序列化等。
  3. http块:可以嵌套多个server,配置代理,缓存,日志定义等绝大多数功能和第三方模块的配置。如文件引入,mime-type定义,日志自定义,是否使用sendfile传输文件,连接超时时间,单连接请求数等。
  4. server块:配置虚拟主机的相关参数,一个http中可以有多个server。
  5. location块:配置请求的路由,以及各种页面的处理情况。

同一机器,不同端口的泛域名解析如何做到?

回到本文问题,我们已经了解完反向代理以及nginx相关配置文件了,所以如何实现我们泛域名对同一机器不同端口的反向代理呢?

反向代理写在哪里?

由于是同一台主机的反向代理,所以我们需要将我们的反向代理逻辑写到同一server块中。则我们的伪代码实现如下:

   server{
      设置监听的主机端口
      设置服务名称(域名)、https认证等
      location / {
      	 #location块\
         如果域名前缀为a,
        	 反向代理到a对应的端口1;
         如果域名前缀为b,
        	 反向代理到b对应的端口2;
         走默认兜底的代理端口3或返回404;
      }
   }

及对一个泛域名,采用前缀解析的方式,将不同前缀反向代理到同一机器的不同端口上。

实际我们的配置如下:

server
{
    listen 80;
    listen 443 ssl http2;
    server_name baidu.com ~^(?<subdomain>.+).baidu.com$;
    index index.html index.htm default.htm default.html;
        location / {
        if ($subdomain = "sub-web"){
           proxy_pass http://127.0.0.1:1001;
        }
        if ($subdomain = "dev-data"){
           proxy_pass http://127.0.0.1:1002;
        }
        if ($subdomain = "json"){
           proxy_pass http://127.0.0.1:1003;
        }
        if ($subdomain = "monitor"){
           proxy_pass http://127.0.0.1:1004;
        }
        proxy_pass http://127.0.0.1:1005;
        proxy_set_header Host $Host:$server_port;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header REMOTE-HOST $remote_addr;
        add_header X-Cache $upstream_cache_status;
        proxy_set_header X-Host $host:$server_port;
        proxy_set_header X-Scheme $scheme;
        proxy_connect_timeout 30s;
        proxy_read_timeout 86400s;
        proxy_send_timeout 30s;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
    }
}

思维发散:不同机器的泛域名解析如何做到?

由于是不同主机的反向代理,所以我们需要将我们的反向代理逻辑写到不同server块中。则我们的伪代码实现如下:

   server{
      设置监听的主机端口
      设置子域名a、https认证等
      location / {
      	 #location块\
        反向代理到a对应的端口1;
      }
   }
   
   server{
      设置监听的主机端口
      设置子域名b、https认证等
      location / {
      	 #location块\
         反向代理到b对应的端口1;
      }
   }

反向代理的部分的代码是相同的,所以这里不再追写具体实现。总之要想解答本文的问题,我们需要了解nginx,学会nginx每个块指令的作用域,这样才能真正运用好反向代理。

0

评论区