当前位置: 首页 > 知识库问答 >
问题:

nginx - 解决AMH面板lngx(NGINX)与FRP反代80/443端口限制下的域名访问问题?

宿衡虑
2024-10-17

提一个及其特殊的情况下,amh面板的lngx+FRP反代80、443端口的问题
注:amh面板的lngx就是Linux+Nginx+X,其中X为未限定

前提描述:

  1. A机器部署frps, http和https监听80 443端口,nginx配置不可修改,且仅能新建两条隧道(80 443)
  2. 通配符域名*.a.cn指向A机器的CNAME
  3. B机器无法直接访问80 443端口,部署了AMH面板的lngx,然后lngx部署通配符域名站点*.a.cn和业务站点b.cn(本地ip 127.0.0.1:1000),然后通过FRPC监听本地的127.0.0.1:80 和127.0.0.1:443
  4. 域名b.cn指向B机器的IP
  5. frp隧道已通,其他任意的xxx.a.cn可以访问到frp的页面

问题需求:
如何通过直接访问域名:b.a.cn,实现直接访问B机器上b.cn的效果?
同理,实现直接访问c.a.cn的效果

尝试

目前可行的方法一:
直接新建一个frp隧道b.a.cn,直接代理B机器的1000端口,但是这个方法肯定要多一条隧道,不满足第一点仅能80 443两条隧道的方法

方法二:修改B机器的nginx
首先B机器lngx站点*.a.cn直接监听80端口
其次直接修改站点*.a.cn的nginx配置文件:

server {
    listen 80;
    server_name *.a.cn;

    # 处理 b.a.cn 请求
    if ($host = "b.a.cn") {
        proxy_pass http://127.0.0.1:1000;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header Host $host;
    }

    # 处理 c.a.cn 请求
    if ($host = "c.a.cn") {
        proxy_pass http://127.0.0.1:1001;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header Host $host;
    }

    # 处理其他请求
    location / {
        proxy_pass http://127.0.0.1:80;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header Host $host;
    }

    access_log /home/wwwroot/Lngx01/logs/*.z.taor.site-access.log;
    error_log /home/wwwroot/Lngx01/logs/*.z.taor.site-error.log crit;
}

但没有成功,虽然frp页面可以
请教各位大佬,此时我应该如何调整实现需求?

共有2个答案

漆雕原
2024-10-17

proxy_pass是需要写在 location / { ... } 之内,
不能直接写在 if ($host = "c.a.cn") { ... }中,nginx会出错。

或是location / { if ($host = "c.a.cn") { proxy_pass ... } } 这样。

通常请求不同的源站,还是建议直接添加多个lngx主机,
绑定明确的域名与请求不同的源站地址。

微生雨泽
2024-10-17

在您的场景中,由于FRP服务器(A机器)的端口限制(仅能使用80和443端口),并且B机器上的Nginx(lngx)需要处理多个基于域名的反向代理,但又不希望增加额外的FRP隧道,我们可以考虑以下解决方案:

解决方案

  1. 修改B机器上的Nginx配置
    由于您已经尝试使用if语句在Nginx中根据$host变量进行代理,但这种方法通常不推荐用于性能原因,并且可能不总是按预期工作。更好的方法是使用server_name来区分不同的服务器块(server blocks)。

    修改Nginx配置如下:

    server {
        listen 80;
        server_name b.a.cn;
    
        location / {
            proxy_pass http://127.0.0.1:1000;
            proxy_set_header X-Forwarded-Proto $scheme;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header Host $host;
        }
    
        access_log /home/wwwroot/Lngx01/logs/b.a.cn-access.log;
        error_log /home/wwwroot/Lngx01/logs/b.a.cn-error.log crit;
    }
    
    server {
        listen 80;
        server_name c.a.cn;
    
        location / {
            proxy_pass http://127.0.0.1:1001;  # 假设c.a.cn对应的是1001端口
            proxy_set_header X-Forwarded-Proto $scheme;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header Host $host;
        }
    
        access_log /home/wwwroot/Lngx01/logs/c.a.cn-access.log;
        error_log /home/wwwroot/Lngx01/logs/c.a.cn-error.log crit;
    }
    
    # 处理其他所有*.a.cn的请求
    server {
        listen 80;
        server_name *.a.cn;
    
        location / {
            # 这里可以配置一个默认的处理方式,比如重定向到某个页面或另一个服务
            proxy_pass http://127.0.0.1:8080;  # 假设有一个默认服务在8080端口
            # 或者直接返回404
            # return 404;
    
            proxy_set_header X-Forwarded-Proto $scheme;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header Host $host;
        }
    
        access_log /home/wwwroot/Lngx01/logs/default-*.a.cn-access.log;
        error_log /home/wwwroot/Lngx01/logs/default-*.a.cn-error.log crit;
    }
  2. 确保FRP隧道配置正确
    在A机器上,FRP服务器应该已经配置好监听80和443端口,并将这些请求转发到B机器的80端口(因为B机器的Nginx监听在80端口上)。
  3. DNS配置
    确保b.a.cnc.a.cn的DNS解析正确指向A机器的IP地址,这样所有请求都会先到达A机器,然后通过FRP转发到B机器。
  4. 重启Nginx和FRP服务
    在B机器上重启Nginx服务,确保新的配置生效。同时,在A机器上重启FRP服务(如果更改了FRP配置)。
  5. 测试
    使用浏览器或curl命令测试b.a.cnc.a.cn的访问情况,确保它们分别被正确代理到B机器的1000和1001端口。

通过以上步骤,您应该能够实现在不增加额外FRP隧道的情况下,通过直接访问b.a.cnc.a.cn来访问B机器上对应的服务。

 类似资料:
  • amh的LNGX反代不能使用,目前已经删了lnmp,只保留了LNGX;后端外网ip:3000,在我本地电脑能访问;反代后访问域名无法访问。系统是Debian12 传递HTTP/S协议 那些也勾过,目前只有一个lngx环境,只有一个站。后端是one-api通过IP加端口可以正常使用。要反代这个one-api。反代后访问域名无法访问。有配置ssl证书。没有cdn。

  • LNGX环境中添加了2个主机,反向代理的是自己docker部署的应用,目前可以正常访问,这两个访问的地址是a.test.com和b.test.com LNMP环境中添加了2个主机,一个是wordpress程序,访问的是c.test.com,可以正常访问,另外一个是纯静态的html应用,访问的是test.com,不带子域名的,访问的时候内容是LNGX环境中最新部署的b.test.com的内容。 求解

  • 本文向大家介绍Nginx解决前端访问资源跨域问题的方法详解,包括了Nginx解决前端访问资源跨域问题的方法详解的使用技巧和注意事项,需要的朋友参考一下 被前端跨域问题折磨快2天后,终于用ngnx的方式解决了,所以在此总结下。 该篇只探讨如何用Ngnx解决跨域问题,对于原理不作讨论。 1、首先介绍Windows环境下Nignx的相关命令操作 nginx常用命令: 验证配置是否正确: nginx -t

  • 本文向大家介绍windows下nginx的安装使用及解决80端口被占用nginx不能启动的问题,包括了windows下nginx的安装使用及解决80端口被占用nginx不能启动的问题的使用技巧和注意事项,需要的朋友参考一下 目前nginx已被广泛使用,今天我们首先来讲讲nginx在Windows下的搭建。 1、安装 到nginx官网下载一个Windows下使用的最新版本,目前是1.11.10,如图

  • 本文向大家介绍Nginx配置80端口访问8080及项目名地址方法解析,包括了Nginx配置80端口访问8080及项目名地址方法解析的使用技巧和注意事项,需要的朋友参考一下 tomcat访问项目,一般是 ip + 端口 + 项目名 nginx 配置 location / {} ,一般只能跳转到 ip + 端口,如果想要直接访问项目,就需要修改tomcat的配置了 如何保证不修改tomcat的配置,只

  • 大大,这个问题折磨了我半个清明假期,求救!! 详情 宿主机部署AMH 7.1面板 宿主机部署Nginx-proxy-manager (docker版本) 宿主机 docker 0 网卡 127.0.17.1 目前宿主机有三个docker A 部署 127.0.0.1 9002 使用amh lngx反代 ssl启用强制https 同时lngx设置为默认站点 B 部署 127.0.0.1 9004 使

  • 我之前没有使用过nginx的反向代理, 目前在使用webman框架. https://www.workerman.net/doc/webman/others/nginx-proxy.html 他的这篇文章中给出了一个示例配置, 我在AMH的LNGX虚拟主机中是这样设置的. 后面也添加了SSL, 目前访问是没什么问题的, 但是在上述webman的示例中有一行 root /your/webman/pu

  • 本文向大家介绍利用nginx解决cookie跨域访问的方法,包括了利用nginx解决cookie跨域访问的方法的使用技巧和注意事项,需要的朋友参考一下 一、写在前面 最近需要把阿里云上的四台服务器的项目迁移到客户提供的新的项目中,原来的四台服务器中用到了一级域名和二级域名。比如aaa.abc.com 和bbb.abc.com 和ccc.abc.com。其中aaa.abc.com登录,通过把cook