记录:最近在做的科大商城项目时,想用nginx做反向代理给宿舍笔记本电脑上的微服务,但是发现自己的腾讯云服务器ping不通宿舍的电脑
因为科大商场的微服务端用得上宿舍的笔记本电脑,宿舍得到的 IP 地址是校园网的私有 IP 地址,所有无法在公网上直接ping通。
使用 frp 配合 nginx 搭建一个内网穿透服务器
接着,进入到 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
成功:
编辑 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
在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
最终,我们想要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/**
,则转交给对应的服务器