如何让多端口网站用一个nginx进行反向代理实际场景分析

前段时间公司要整合服务器资源,刚好趁这次机会将这些乱七八糟的服务器做一次梳理和整合,断断续续一个月迁移完成大概优化掉了1/3的机器,完成之后遇到了一些问题,比如曾今零零散散部署在生产上一些可视化UI:apollo,kibana,grafana,jenkins 等等要么采用80端口,要么对公开放了其他端口,为了安全,现在不再开放非80之外的公网端口,由于机器少了,80端口不够,这些可视化UI不再能直接访问到了。所以需另寻其他出路。

一:用nginx做反向代理

为了解决这两个问题,自然第一反应想到的就是使用反向代理,我的理想构思下应该是下图这样的。

既用户所有的请求都经过nginx,让nginx来判断当前url需要跳转到哪一个后端代理上,比较好的策略应该是让nginx来判断当前的host是什么来决定跳转到后端的哪一个webserver上,比如a.mip.com 就跳转到apollo,j.mip.com 就跳转到jenkins. 以此类推,这样就可以完美解决了,是吧?在nginx中你完全可以使用rewrite模块下if指令来进行判断。

二:使用if指令

这里要提一下,nginx比较原始化,如果需使用第三方module,你还需要重新编译nginx,用起来很麻烦,所以这里干脆使用OpenResty,它扩展了nginx,并且集成了很多成熟的lua模块,自行下载最新的1.15.8,安装方式和nginx一模一样。

默认是安装到/usr/local/目录下,当你看到有一个openresty目录表示你安装成功。


[root@localhost local]# ls
bin  etc  games  include  lib  lib64  libexec  openresty  sbin  share  src
[root@localhost local]# pwd
/usr/local

接下来你可以使用 nginx -v 来看一下openresty版本号啥的。


[root@localhost sbin]# pwd
/usr/local/openresty/nginx/sbin
[root@localhost sbin]#
[root@localhost sbin]# ./nginx -v
nginx version: openresty/1.15.8.1

为了方便,我就直接使用nginx开启三个server:

  • 192.168.23.129:80   nginx上开启的第一个网站,就是proxy了。

  • 192.168.23.129:8001 nginx上开启的第二个网站,模拟apollo。

  • 192.168.23.129:8002 nginx上开启的第三个网站,模拟jenkins。

1. apollo的模拟


server {listen       8001;server_name  somename  alias  another.alias;location / {root   html;index  apollo.html;}}

8001端口网站的默认页是apollo.html,这个apollo.html所在路径就是在nginx下的html目录,如下所示。


[root@localhost html]# pwd
/usr/local/openresty/nginx/html
[root@localhost html]# ls
50x.html  apollo.html  index.html  jenkins.html

2. jenkins的模拟

server {listen       8002;server_name  somename  alias  another.alias;location / {root   html;index  jenkins.html;}}

jenkins.html的文件所在路径如上所示哈。不再赘述。

3. proxy的模拟

server {listen       80;server_name  localhost;location / {if ($host = "a.mip.com") {proxy_pass http://localhost:8001;}if ($host = "j.mip.com") {proxy_pass http://localhost:8002;}}

可以看到,只需要使用rewrite模块下的if条件语句,通过$host系统变量判断当前的url中的host的值跳转到相应的网站。

4. host映射

好了,接下来只需要将 a.mip.com 和 j.mip.com 映射到nginx的ip地址192.168.23.129即可。因为这些域名方便记忆而不是真实存在的。


192.168.23.129 a.mip.com
192.168.23.129 j.mip.com

5. 启动nginx


[root@localhost sbin]# ./nginx
[root@localhost sbin]#
[root@localhost sbin]#
[root@localhost sbin]# netstat -tlnp
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name
tcp        0      0 0.0.0.0:8001            0.0.0.0:*               LISTEN      3802/nginx: master
tcp        0      0 0.0.0.0:8002            0.0.0.0:*               LISTEN      3802/nginx: master
tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN      3802/nginx: master
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      1172/sshd
tcp        0      0 127.0.0.1:25            0.0.0.0:*               LISTEN      1724/master
tcp6       0      0 :::22                   :::*                    LISTEN      1172/sshd
tcp6       0      0 ::1:25                  :::*                    LISTEN      1724/master

通过上图可以看到,80,8001,8002 端口都已经开启了,接下来大家可以到浏览器去验证一下了。

可以看到这个问题已经很完美的解决了,好了,这就是本篇和大家聊到的实际场景中遇到的一个问题,希望本篇对你有帮助,以下是全部的nginx.conf。


#user  nobody;
worker_processes  1;#error_log  logs/error.log;
#error_log  logs/error.log  notice;
#error_log  logs/error.log  info;#pid        logs/nginx.pid;events {worker_connections  1024;
}http {include       mime.types;default_type  application/octet-stream;log_format  main  '$host ----> $remote_addr - $remote_user [$time_local] "$request" ''$status $body_bytes_sent "$http_referer" ''"$http_user_agent" "$http_x_forwarded_for"';access_log  logs/access.log  main;sendfile        on;#tcp_nopush     on;#keepalive_timeout  0;keepalive_timeout  65;#gzip  on;server {listen       80;server_name  localhost;#charset koi8-r;#access_log  logs/host.access.log  main;# location = /get {#     set_unescape_uri $key $arg_key;  # this requires ngx_set_misc#     redis2_query get $key;#     redis2_pass 10.105.13.174:6379;# }location / {if ($host = "a.mip.com") {proxy_pass http://localhost:8001;}if ($host = "j.mip.com") {proxy_pass http://localhost:8002;}root   html;index  index.html index.htm;}#error_page  404              /404.html;# redirect server error pages to the static page /50x.html#error_page   500 502 503 504  /50x.html;location = /50x.html {root   html;}# proxy the PHP scripts to Apache listening on 127.0.0.1:80##location ~ \.php$ {#    proxy_pass   http://127.0.0.1;#}# pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000##location ~ \.php$ {#    root           html;#    fastcgi_pass   127.0.0.1:9000;#    fastcgi_index  index.php;#    fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name;#    include        fastcgi_params;#}# deny access to .htaccess files, if Apache's document root# concurs with nginx's one##location ~ /\.ht {#    deny  all;#}}# another virtual host using mix of IP-, name-, and port-based configuration#server {listen       8001;server_name  somename  alias  another.alias;location / {root   html;index  apollo.html;}}server {listen       8002;server_name  somename  alias  another.alias;location / {root   html;index  jenkins.html;}}# HTTPS server##server {#    listen       443 ssl;#    server_name  localhost;#    ssl_certificate      cert.pem;#    ssl_certificate_key  cert.key;#    ssl_session_cache    shared:SSL:1m;#    ssl_session_timeout  5m;#    ssl_ciphers  HIGH:!aNULL:!MD5;#    ssl_prefer_server_ciphers  on;#    location / {#        root   html;#        index  index.html index.htm;#    }#}}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/308215.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Azure Show】|第五期(下)当下最火热的Blazor与App Service, 嘉宾闫晓迪Alan Tsai...

欢迎来到Azure Show!Azure Show欢迎来到Azure Show第五期(下),继上集分享彭爱华和阿法兔两位老师的跨界经验之后,本期我们【MVP面对面】栏目邀请到远在新西兰的微软最有价值专家闫晓迪和大家聊聊新西兰的技术生态,当然…

台式计算机听音乐,配置一台4000元的台式电脑,主要用于日常办公及上网查资料,听音乐,看电影及学习....

满意答案asshnjgs2014.04.02采纳率:44% 等级:9已帮助:861人CPU:Intel 赛扬D341 2.93G(散) CPU适用类型:台式CPU CPU内核:Prescott 主频(MHz):2930MHz 插槽类型:Socket 775 制作工艺(微米):0.09 微米 L2缓存(KB):256KB FSB(MHz)…

ASP.NET Core Blazor Webassembly 之 组件

关于组件现在前端几大轮子全面组件化。组件让我们可以对常用的功能进行封装,以便复用。组件这东西对于搞.NET的同学其实并不陌生,以前ASP.NET WebForm的用户控件其实也是一种组件。它封装html代码,封装业务逻辑,对外提供属性事件等…

122. 买卖股票的最佳时机 II008(贪心算法+思路)

一:题目 给定一个数组 prices ,其中 prices[i] 是一支给定股票第 i 天的价格。 设计一个算法来计算你所能获取的最大利润。你可以尽可能地完成更多的交易(多次买卖一支股票)。 注意:你不能同时参与多笔交易&#xf…

广东省计算机应用考试题,广东省计算机等级考试一级试题

广东省计算机等级考试一级试题一、理论部分 (共20分,每空1分)将正确答案填写在考试文件夹中“第一题答案.XLS”的Sheet1相应的位置上1. 解释程序的功能是 ( )。A解释执行高级语言源程序 B将高级语言源程序翻译成目标程序C解释执行汇编语言源程序 D将汇编语言源程序翻…

麒麟系统兼容安卓生态 弥补生态短板

日前,麒麟软件发布了银河麒麟操作系统最新版本V10。据媒体报道,麒麟软件是国内唯一一个通过CMMI5级质量评估的操作系统企业,在XC市场份额占有率达到70%以上。麒麟V10系统可以兼容安卓生态。集成了自研的UKUI桌面环境,支持多壁纸、…

763. 划分字母区间009(贪心算法+思路+详解+图示)

一:题目: 字符串 S 由小写字母组成。我们要把这个字符串划分为尽可能多的片段,同一字母最多出现在一个片段中。返回一个表示每个字符串片段的长度的列表。 示例: 输入:S "ababcbacadefegdehijhklij" 输出…

初识ABP vNext(4):vue用户登录菜单权限

点击上方蓝字"小黑在哪里"关注我吧登录菜单权限运行测试前言上一篇已经创建好了前后端项目,本篇开始编码部分。开始几乎所有的系统都绕不开登录功能,那么就从登录开始,完成用户登录以及用户菜单权限控制。登录首先用户输入账号密码…

满汉楼(德鲁伊连接池+DBUtils+DAO+Mysql)保姆级别分析+代码实现

一:需求 1.完成一个酒店后台管理系统,当然只是模拟,在控制台就行模拟 2.实现管理人员的登录和酒店成本账单的查看,以及正常的点餐,结账和查看账单等等功能 二:实现的功能展示 1.用户登录(这里…

[Hei-Ocelot-Gateway ].Net Core Api网关Ocelot的开箱即用版本

写在前面很多neter都有在用Ocelot做Api网关,但是Ocelot又不像kong或者其他网关一样,开箱即用。它需要你单独开一个web项目来部署,这样很多同学都在做重复的事了。这里[Hei.Ocelot.ApiGateway] 就把这件事给做了,以后有…

聊聊常见的服务(接口)认证授权

写在前面头发掉得多了,总有机会接触/调到各种各样的接口,各种面向Api编程实际上已经嵌入到我们的习惯中,没办法现在服务端通信还得是http(s),其他协议还未能成为通用的。大厂的开发平台api我先不敢说,各种…

二分查找(划分时左右元素个数不相等)解析+代码

一:问题描述 当我们在用二分法查找元素的时候,我们往往特希望遇到是奇数个元素个数的数组,因为划分完左右两边的个数相等,所以在以前刚学二分法的时候就有这个疑问,当时就是模模糊糊过去了,再遇到其实还是会有疑问。现…

网络计算机室电源线怎么布,网吧综合布线(电源和网络)经验谈

电源系统布线篇网吧目前所提供的服务,像网页浏览、网络游戏、在线电影、远程教育等最基本的服务都与网络有关,网络质量的好坏直接决定了网吧的生存能力。所以,如何规划一个优质的网络环境,是网吧经营者必须要考虑的一个要点&#…

69. Sqrt(x)010(二分法求解+详解注释)

一:题目 ‘给你一个非负整数 x ,计算并返回 x 的 算术平方根 。 由于返回类型是整数,结果只保留 整数部分 ,小数部分将被 舍去 。 注意:不允许使用任何内置指数函数和算符,例如 pow(x, 0.5) 或者 x ** 0…

计算机网络 哪个教材好,学习计算机网络哪本教材最好?

benxiuxian高分答主12-29TA获得超过8057个赞地理期末复习计划临近期末,为帮助学生理顺知识,培养学生灵活运用知识分析问题,解决问题的能力,形成完整的知识体系,特作复习计划如下:一、复习目的:1…

安装VSCode作为常用的文本编辑器

作为程序员,跟文本编辑器打交道那是天天都在做的事情,一个趁手的文本编辑器能大大地提供工作效率,减少996福报。笔者使用过各种文本编辑器,或是xx版,或是免费版,多多少少都有一些不便之处,如今 …

35. 搜索插入位置011(二分查找)

一:题目: 给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。请必须使用时间复杂度为 O(log n) 的算法。 示例 1: 输入: nums [1,3,5,6], …

利用 Github Actions 自动更新 docfx 文档

利用 Github Actions 自动更新 docfx 文档Introdocfx 是微软出品一个 .NET API 文档框架,有一个理念是代码即文档,会根据项目代码自动生成 API 文档,即使没有写任何注释也会生成 API 文档,也有一些默认的主题可以配置,…

34. 在排序数组中查找元素的第一个和最后一个位置012(二分查找+思路+详解+两种方法)Come Baby!!!!!!!! !

一:题目 给定一个按照升序排列的整数数组 nums,和一个目标值 target。找出给定目标值在数组中的开始位置和结束位置。 如果数组中不存在目标值 target,返回 [-1, -1]。 进阶: 你可以设计并实现时间复杂度为 O(log n) 的算法解…

计算机专业可以报考放射医学吗吗,文科生可以报考医学影像技术专业吗

近期很多文科同学都在疑惑可不可以报考医学影像技术专业,这里有途网小编告诉大家,医学影像技术专业是理科专业,文科生一般来说是不可以报考医学影像技术专业的,但在每年高校招生计划发布的时候也可能会考虑招收文科生的情况&#…