frp 和 nginx 搭建一个内网穿透服务器(穿透校园网)

项目场景:

记录:最近在做的科大商城项目时,想用nginx做反向代理给宿舍笔记本电脑上的微服务,但是发现自己的腾讯云服务器ping不通宿舍的电脑


问题描述:

因为科大商场的微服务端用得上宿舍的笔记本电脑,宿舍得到的 IP 地址是校园网的私有 IP 地址,所有无法在公网上直接ping通。

frp 和 nginx 搭建一个内网穿透服务器(穿透校园网)_第1张图片

解决方案:

使用 frp 配合 nginx 搭建一个内网穿透服务器

1. 腾讯云(CentOs 7)Server端

将下载好的frp拷贝到 /usr/local/ 目录下
在这里插入图片描述

接着,进入到 frp_0.34.2_linux_amd64 目录下,编辑frps.ini文件:

[common]
#服务端需要开启的端口(与客户端绑定的进行通信的端口)
bind_port = 7000
#服务端需要开启的端口(访问客户端web服务自定义的端口号)
vhost_http_port = 8081
#授权令牌,需要客户端的auth_token保持一致
auth_token = websong

type = http
custom_domains = kedamall.com
auth_token = websong

接着需要设置目录下 frps 的权限为可读可写可执行,否则会报错:-bash: ./xx.sh: Permission denied

chmod 777 frps

最后,启动 frps 服务:

./frps -c ./frps.ini

成功:

在这里插入图片描述

2. Windows校园网下的Client端

编辑 frpc.ini 文件:

[common]
[common]
# 云服务器公网ip
server_addr = xxx.xxx.xxx.xxx

#客户端需要开启的端口(与服务器绑定的进行通信的端口)
server_port = 7000
auth_token = websong

[web6]
type = http
# 要穿透访问客户端机的10000端口
local_port = 10000

custom_domains =kedamall.com

接着,启动cmd命令行窗口,切换到frp目录下,运行:

frpc.exe

3. 穿透成功

在windows客户端机器的浏览器输入 kedamall.com:8081即可访问到windows客户端机器的10000端口的product服务啦!

但这不是我想要的最终结果,我们需要在输入kedamall.com即80端口下访问,这就需要用到nginx。我之前在云服务器上以及用docker装好了nginx,并将目录挂在到了/mydata/nginx下,于是我们编辑 /conf/conf.d/kedamall.conf文件:

server {
     
    listen       80;
    server_name  kedamall.com;

    #charset koi8-r;
    #access_log  /var/log/nginx/log/host.access.log  main;

    location / {
     
    # 这里一定要写云服务器的内网ip
	proxy_pass  http://172.27.0.12:8081;
		#nginx在代理给网关的时候,默认会丢掉例如Host等的信息
		#因此需要如下设置:
        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;
    }

重启nginx服务:

docker restart nginx

成功:
frp 和 nginx 搭建一个内网穿透服务器(穿透校园网)_第2张图片

4. nginx代理给网关

最终,我们想要nginx转发反向代理给(多个)网关,由网关再转发给我们的微服务群;因此我们需要修改 nginx 的根配置文件 nginx.conf,将upstream映射到我们的网关服务:

upstream kedamall{
     
	server 172.27.0.12:8081; 
}

接下来,我们修改 nginx 的 server 块配置文件 kedamall.conf,将以/开头的请求转发至我们配好的gulimall的upstream,由于nginx的转发会丢失host头,所以我们添加头信息

location / {
     
        proxy_pass http://kedamall;
        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;
}

最后,我们配置网关服务,将域名为**.gulimall.com转发至商品服务

- id: gulimall_host
  uri: lb://kedamall-product
  predicates:
  	- Host=**.kedamall.com

于是,在我们项目中,无论请求接口还是请求页面,基准路径都只写gulimall.com,由 nginx 直接代理给网关,最后由网关判断:

  • 如果/api/**,则转交给对应的服务器
  • 如果是满足域名(Host),则转交给对应的服务

你可能感兴趣的:(分布式,微服务,nginx,linux,centos,web服务器)