远程异地调试高阶玩法
[TOC]
背景
工作地在武汉的A同学,需要远程部署一套后台服务或者前端服务亦或者APP在上海,而且部署环境在局域网(互联网无法访问),这个时候最常见的方式有3种
- 基础的代码在本地写完,然后出差去上海完成调试部署工作
- 基础的代码在本地写完,用远程工具(向日葵、ToDesk、TeamViewer)传包,看日志远程调试
- 直接去上海完成开发对接工作
疫情原因,不到万不得已才会选择出差去客户现场调试安装部署,那有没有工具能将异地局域网的环境转发到互联网环境呢,这样的话不就跟本地调试效果一样了吗,今天它来了。
异地组网方案
熟悉后台的开发肯定没少接触Nginx,平时我们主要用它来做网络路由转发,今天就可以用它来做内网路由转发,为了方便操作步骤的描述,武汉的公网环境,以下简称主机A,上海的内网环境,以下简称主机B
注:这里有个很重要的限制条件,主机B必须是双网环境,也即既能访问上海的内网环境,又能访问互联网的环境,主机A能通过互联网的远程工具访问到主机B
操作步骤
-
主机B下载nginx程序并安装,安装完成后修改nginx.conf配置文件(在conf目录下),双击nginx.exe运行并查看nginx进程是否运行正常
智慧社区-南湖image-20201225143259106.png
注:nginx官网 http://nginx.org/en/download.html
- 主机A和主机B分别下载安装
蒲公英
程序,注册蒲公英账号,主机A和主机B同时登录刚刚注册的账号
智慧社区-南湖image-20201225143947815.png
注:蒲公英官网 https://pgy.oray.com/download/
可以看到主机A的内网IP是172.16.3.202,主机B的内网IP是172.16.2.126,如果生产环境需要访问以下url
http://100.128.31.117:8080/consume/addInfo
通过配置nignx.conf文件即可将100.128.31.117转发到172.16.2.126,在武汉的同学可以访问以下url就能访问到主机B的内网,完成了这两步操作,主机A就能在本地开心的调试(关键是不用出差了,哈哈。。。),再也不用经历加了一句log就要换包的痛苦了。
http://172.16.2.126:8080/consume/addInfo
nginx.conf配置文件配置方案
#定义Nginx运行的用户和用户组
#user nobody;
#nginx进程数,建议设置为等于CPU总核心数。
worker_processes 1;
#全局错误日志定义类型,[ debug | info | notice | warn | error | crit ]
error_log logs/error.log;
#error_log logs/error.log notice;
#error_log logs/error.log info;
#进程文件
#pid logs/nginx.pid;
#工作模式与连接数上限
events {
#参考事件模型,use [ kqueue | rtsig | epoll | /dev/poll | select | poll ]; epoll模型是Linux 2.6以上版本内核中的高性能网络I/O模型,如果跑在FreeBSD上面,就用kqueue模型。
# use epoll;
#单个进程最大连接数(最大连接数=连接数*进程数)
worker_connections 1024;
accept_mutex on;
multi_accept on;
}
#缓冲区
#fastcgi_buffers 8 128k;
#超时参数
#send_timeout 60;
#sudo nginx -c /Users/chendongmei/work/nginx/gm-nginx.conf
http {
include mime.types;
default_type application/octet-stream;
index x.html;
#client_header_buffer_size 512k;
large_client_header_buffers 4 512k;
server_names_hash_bucket_size 64;
sendfile on;
keepalive_timeout 65;
gzip on;
gzip_min_length 1k;
gzip_buffers 4 8k;
gzip_comp_level 3; #0-9
gzip_types text/plain text/css text/javascript application/json application/javascript application/x-javascript text/xml application/xml application/xml+rss;
#log_format upstreamlog '[$time_local] $remote_addr - $remote_user - $server_name to: $upstream_addr: $request upstream_response_time $upstream_response_time msec $msec request_time $request_time';
log_format access '$remote_addr - $remote_user [$time_local] "$request" $status $body_bytes_sent $request_body "$http_referer" "$http_user_agent" $http_x_forwarded_for';
server {
listen 8080;
index index.html;
autoindex on;
ssi on;
limit_rate 2000k;
client_max_body_size 2048m;
location ^~ /{
proxy_pass http://100.128.31.117:8080/;
proxy_redirect default;
proxy_http_version 1.1;
proxy_set_header Connection "";
proxy_set_header Host $host:$server_port;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-Host $host;
proxy_set_header X-Forwarded-Server $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
server {
listen 3306;
index index.html;
autoindex on;
ssi on;
limit_rate 2000k;
client_max_body_size 2048m;
location ^~ /{
proxy_pass http://100.61.8.81:3306/;
proxy_redirect default;
proxy_http_version 1.1;
proxy_set_header Connection "";
proxy_set_header Host $host:$server_port;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-Host $host;
proxy_set_header X-Forwarded-Server $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
access_log logs/access.log;
}
遇到的问题
1、无法转发JDBC的请求,因此数据库无法通过此映射的方式访问
2、无法转发音视频流,因此无法通过该方式异地播放音视频
3、如果环境做了多次远程,该方式依旧不行(也即主机A访问到主机B后,还得通过主机B再访问另外一个内网主机C并将服务部署在主机C上,且C主机不具备互联网环境,这种就没法玩了)