使用Nginx和Frp实现二级域名访问内网的不同环境
本教程的目标:
- 浏览器访问 dev.zxd.cn 能访问到内网部署在9081端口的程序
- 浏览器访问 uat.zxd.cn 能访问到内网部署在9082端口的程序
- 离开内网仍然能够 ssh到内网的机器 进行管理。
最终结果示意图如下:
1.软硬件准备
(1) 机器准备
- 注册一个域名且备案,本教程使用的是:zxd.cn这个域名
- 准备一台有公网IP的服务器,本教程使用的是腾讯云的低配服务器,一个月10块钱。
- 准备一台内网电脑/服务器,本片教程内网机器是Linux,后面要访问的程序就部署在这台机器上。
(2) 软件准备
- Frp: 本教程内网穿透使用Frp,官方地址:github.com/fatedier/fr…
- Nginx: 虽然Frp本身就能实现二级域名穿透转发,还是在公网服务器上装一个Nginx来实现不同二级域名的转发吧,以方便后面进行拓展。
- 两个程序: 内网服务器部署两个程序,分别部署在9081端口和9082端口上。
2.域名配置
申请的域名进行备案后,对域名添加记录,这样就建好了两个二级域名:
- dev.zxd.cn
- uat.zxd.cn
访问这两个地址,因为记录指向了公网服务器IP,不严谨的说,可以看作是访问公网服务器IP:80
3.公网服务器安装Frp服务端
(1) 下载Frp
查看自己公网服务器的内核架构,下载对应版本的压缩包,上传到公网服务器的 /data/frp/ 目录下,解压。
github.com/fatedier/fr…
(2) 启动Frp服务端
cd /data/frp
# 创建开机启动文件
vim frps.service
# 拷贝配置文件
cp frps.service /etc/systemd/system
# 刷新服务列表、设置开机自启、启动Frp服务端
systemctl daemon-reload
systemctl enable frps
systemctl start frps
frps.service文件内容如下:
[Unit]
Description=frps
After=network.target
[Service]
ExecStart=/data/frp/frp_0.35.0_linux_386/frps -c /data/frp/frp_0.35.0_linux_386/frps.ini
[Install]
WantedBy=multi-user.target
(3) 配置Frp服务端
编辑 frps.ini 文件
- 配置bind_port为17000,用于Frp服务端与客户端的通信
- 配置vhost_http_port为18000,用于Http请求的转发
- 配置dashboard相关,用于Frp仪表盘的访问
[common]
bind_port = 17000
vhost_http_port = 18000
dashboard_port = 17080
dashboard_user = root
dashboard_pwd = 123654@#*!
重启Frp服务端,使配置生效
systemctl restart frps
4.内网机器安装Frp客户端
(1) 下载Frp
下载对应版本的压缩包,上传到内网机器的 /data/frp/ 目录下,解压。
(2) 启动Frp客户端
cd /data/frp
# 创建开机启动文件
vim frpc.service
# 拷贝配置文件
cp frpc.service /etc/systemd/system
# 刷新服务列表、设置开机自启、启动Frp客户端
systemctl daemon-reload
systemctl enable frpc
systemctl start frpc
frpc.service文件内容如下:
[Unit]
Description=frpc
After=network.target
[Service]
ExecStart=/data/frp/frp_0.35.0_linux_386/frpc -c /data/frp/frp_0.35.0_linux_386/frpc.ini
[Install]
WantedBy=multi-user.target
(3) 配置Frp客户端
编辑 frpc.ini 文件
- 配置server_addr,指向Frp服务端的公网IP
- 配置server_port,指向Frp服务端配置的通信端口
- 配置ssh相关,以使服务器管理员可以通过公网服务器IP:17022访问内网机器的22端口进行管理内网服务器。
- 配置dev.zxd.cn相关
- 配置uat.zxd.cn相关
server_addr = 182.165.78.12
server_port = 17000
[ssh]
type = tcp
local_ip = 127.0.0.1
local_port = 22
remote_port = 17022
[dev]
type = http
local_port = 9081
custom_domains = dev.zxd.cn
[uat]
type = http
local_port = 9082
custom_domains = uat.zxd.cn
重启Frp客户端,使配置生效
systemctl restart frpc
5.公网服务器安装nginx
主要是用于对不同的二级域名进行转发,虽然Frp本身就支持不同的二级域名转发,但是考虑到后续拓展的和其他环境转发等因素,还是在Frp前置一个Nginx,目前两个环境都是转发到Frp服务端的转发Http端口上。
经过配置后,访问两个不同的域名应该会是这个流程:
- dev.zxd.cn -> 182.165.78.12:80 -> frp服务端Http转发端口 -> 内网机器的Frp客户端 -> 内网dev程序
- uat.zxd.cn -> 182.165.78.12:80 -> frp服务端Http转发端口 -> 内网机器的Frp客户端 -> 内网uat程序
server {
listen 80;
server_name dev.zxd.cn;
location / {
proxy_pass http://182.165.78.12:18000;
proxy_set_header Host $host;
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;
}
}
server {
listen 80;
server_name uat.zxd.cn;
location / {
proxy_pass http://182.165.78.12:18000;
proxy_set_header Host $host;
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;
}
}
6.测试
(1) Http访问测试
浏览器访问两个二级域名,应该能访问到内网机器上部署的两个不同的程序。
(2) ssh测试
使用Xshell等工具,连接公网服务器IP:17022,就能ssh到内网机器了。