nginx 配合 frp 访问内网 web 应用时端口号的问题

葬天尘
  • 265

局域网中各硬件的配置

  1. win 服务器中部署了 springboot 项目,并不是前后分离的项目,一个 jar 中有前端页面也有后端服务。同时本服务器上安装了 nginx,监听了 80 端口 ,关于本项目的配置如下

    location /xzy {
        proxy_set_header Host $host:$server_port;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_pass http://127.0.0.1:8081/xzy;
        proxy_redirect http://127.0.0.1:8081/xzy /xzy;
        proxy_cookie_path /xzy /xzy;
    }
  2. 我的开发用电脑处于该服务器的同局域网内,开发电脑的 hosts 做了下面的配置

    192.168.0.205 xzyerpserver
  3. 基于上面的配置我在局域网中可以这样访问项目:http://xzyerpserver/xzy/login .
  4. 保证上面配置有效后,在 win 服务器上安装了 frp 客户端(当然有对应的腾讯云服务器上安装了 frp 的服务端),这里假设云服务器的 IP 地址是 49.xxx.xxx.119. win 服务器的 frpc.ini 中的配置如下

    [erp_bylmysql]
    type = tcp
    local_ip = 127.0.0.1
    local_port = 80
    remote_port = 15305
  5. 此时我在家里可以这样访问:http://49.xxx.xxx.119:15305/xzy/login,能正常打开项目的登录页面。点击登录后地址栏被自动更改为 http://49.xxx.xxx.119/xzy/home, 出现“该网页无法正常运作” HTTP ERROR 502. 看下图
    image.png
    此时手动将地址栏的URL更换为 http://49.xxx.xxx.119:15305/xzy/home (即手动在IP地址后面填写 frp 映射的端口号),就可以正常打开项目了。
  6. 我的问题是,要如何配置可以不用手动填写端口号,登录后能正常打开项目。
  7. ====================================================================
  8. 上面要手动填写端口号的问题解决了,下面还有二级域名的问题
  9. 腾讯云服务器(CentOS7)的IP地址绑定到我的域名 atools.club(在 DNSPOD 上设置了解析),同时设置了一个二级域名:hy.atools.club 。并且在该 CentOS7的服务器上安装了 nginx 关于该二级域名的配置如下
    server {
      listen 80;
      server_name hy.atools.club;

      location / {
        proxy_set_header Host $host:$server_port;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_pass http://127.0.0.1:15305;
      }
    }
  1. 本CentOS7服务器上还安装了 frps (frp服务端) ,在线下的 win 服务器上安装了 frp 的客户端,客户端中相关的配置如下 - win 服务器中 springboot 项目的端口号是8081
[erp_bylmysql]
type = tcp
local_ip = 127.0.0.1
local_port = 8081
remote_port = 15305
  1. 线下的 win 服务器也安装了 nginx ,相关的配置如下。nginx 中并没有监听 8081,下面的配置起始是无效的吧。
server {
    listen       80;
    server_name  localhost hy.atools.club 127.0.0.1 49.xxx.xxx.119;

    location /xzy {
        proxy_set_header Host $host:$server_port;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_pass http://127.0.0.1:8081/xzy;
        proxy_redirect http://127.0.0.1:8081/xzy /xzy;
        proxy_cookie_path /xzy /xzy;
    }
}
  1. 我在外网(非win服务器的局域网),访问地址:http://hy.xdfznh.club/xzy/login,是下面的效果。然后我到 win 服务器的 nginx 的日志目录下看 access.log 大小是0KB - 访问之前删除了该文件
    image.png
  2. 我的问题是,我要如何做可以通过二级域名访问内网的 web 服务。就如上面步骤12的访问地址
回复
阅读 994
1 个回答
ssseerr999
  • 1.1k

可以试试改成这样
用frp把内网的8081映射到vps的任意一个端口上,然后 vps 上也配置一个nginx,配置和内网的一致,proxy_pass端口改成vps上映射的端口。

===
登录之后自动跳转到80端口,我也猜测应该是代码逻辑问题。

===

补充:
举个例子,我现在在内网有一个nextcloud:127.0.0.1:7090
frpc 的配置是:

[nextcloud_7090]
local_ip = 127.0.0.1
local_port = 7090
remote_ip = 127.0.0.1
remote_port = 1123

外网VPS配置:

server {
    listen 80;
    server_name next.ap.xxx.xxx;
    rewrite ^(.*)$ https://$host$1 redirect;
}

server {
    listen       443;
    server_name  next.ap.xxx.xxx;

    access_log  /var/log/nginx/access.log  main;
    client_max_body_size 200m;
    ssl_certificate /etc/nginx/ssl/fullchain.pem;
    ssl_certificate_key /etc/nginx/ssl/privkey.pem;
    ssl_session_timeout 1d;
    ssl_session_cache shared:SSL:10m;
    ssl_session_tickets off;
    ssl_protocols TLSv1.2 TLSv1.1;
    ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256;
    location / {
        proxy_pass http://127.0.0.1:1123;
        include /etc/nginx/conf.d/proxy.conf.part;
    }
    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        return 500 "500";
    }
}

proxy.conf.part

proxy_http_version    1.1;
proxy_cache_bypass    $http_upgrade;
proxy_set_header Upgrade        $http_upgrade;
proxy_set_header Connection         "upgrade";
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 X-Forwarded-Proto    $scheme;
proxy_set_header X-Forwarded-Host    $host;
proxy_set_header X-Forwarded-Port    $server_port;

同时内网也配置了nginx,方便内网在访问,用的另外一个域名:

server {
    listen       80;
    server_name  next.mn.xxx.xxx;
    access_log  /var/log/nginx/access.log  main;
    client_max_body_size 5000m;
    location / {
        proxy_pass 127.0.0.1:7090;
        include /etc/nginx/conf.d/proxy.conf.part;
    }

    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        return 500 "500";
    }
}
宣传栏