Nginx上游和侦听同一端口

Nginx上游和侦听同一端口,nginx,amazon-ec2,nginx-reverse-proxy,Nginx,Amazon Ec2,Nginx Reverse Proxy,我已经在EC2实例上配置了nginx http://ip-address:15672 我正在运行rabbitmq管理,它运行在端口15672上,可以使用实例的IP地址访问 http://ip-address:15672 我不希望允许使用IP地址进行访问,希望使用我的域,但使用与相同的端口 http://utils.example.com:15672 为此,我尝试使用配置来配置nginx服务器 upstream rabbitmq_server { server localhost:1

我已经在EC2实例上配置了
nginx

http://ip-address:15672
我正在运行
rabbitmq管理
,它运行在端口
15672
上,可以使用实例的IP地址访问

http://ip-address:15672
我不希望允许使用IP地址进行访问,希望使用我的域,但使用与相同的端口

http://utils.example.com:15672
为此,我尝试使用配置来配置
nginx
服务器

upstream rabbitmq_server {
    server localhost:15672;
}


server {

  listen      15672 ssl;
  server_name utils.example.com;

  location / {
      proxy_pass          http://rabbitmq_server/;
      proxy_redirect      off;
      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-Protocol $scheme;
  }
}
但是,这会在启动
nginx
服务器时出错

[emerg] 7476#7476: bind() to 0.0.0.0:15672 failed (98: Address already in use)
当我将端口更改为
listen 15673
时,它可以工作,也可以使用域访问,但也可以使用IP地址访问

  • 如何使用运行应用程序的同一内部IP,以便从
    http://utils.example.com
  • 如何禁用IP地址的直接访问并仅限制对域/子域的访问

  • 您可以使用IF并检查位置中的$host变量,您可以在此处找到nginx的IF指南

    结果将与此类似

    upstream rabbitmq_server {
        server localhost:15672;
    }
    
    
    server {
    
    listen      15672 ssl;
    server_name utils.example.com;
    
    location / {
        if ($host = utils.example.com) {
            proxy_pass          http://rabbitmq_server/;
            proxy_redirect      off;
            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-Protocol $scheme;
            }
    
        }
    }
    
    1) 如何使用运行应用程序的同一内部IP进行访问

    您不能让这两个应用程序(nginx和rabbit)监听同一个端口

    向ip发送请愿书:与此相同(不完全相同,但在示例中它会起作用)

    我的推荐:

    将rabbitmq端口更改为另一个端口,比如15673。并按如下方式设置nginx配置:

    upstream rabbitmq_server {
        server localhost:15673;
    }
    
    
    server {
    
        listen      15672 ssl;
        server_name utils.example.com your_ip_numbers;
    
        location / {
            proxy_pass          http://rabbitmq_server/;
            proxy_redirect      off;
            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-Protocol $scheme;
        }
    }
    
    这样,您的_ip:15672和utils.example.com:15672都将通过nginx被代理到rabbitmq

    2) 如何禁用IP地址的直接访问并仅限制对域/子域的访问

    如果要使用建议并阻止对防火墙中15673端口的任何访问,请从server_name指令中删除“your_ip_number”。大多数防火墙不将本地主机代理视为正常连接

    如果您只有服务器名称utils.example.com的服务器括号中的rabbitmq代理;这已经是一种只过滤到rabbitmq的子域连接的方法

    如果我没有正确地表达自己,在评论中问我指的是什么,我很乐意回答

    编辑:

    对于不被代理传递的ip,在同一端口中创建另一个默认的服务器支架(它是nginx,这样它们就不会冲突)将ip发送到那里

    server {
    
        listen      15672 ssl default_server;
        server_name _;
        return 418; #(or really any code you like) 
    }
    

    希望我能提供帮助。

    您不能让两个应用程序使用同一端口。您可以在另一台服务器上安装nginx,并在rabbitmq服务器的上游安装一些防火墙规则,以便只允许从您的nginx服务器在该端口上安装nginx。由于您尝试获取相同的端口,它不会仍然失败吗?加上服务器名称utils.example.com;已筛选域2。我没有在
    server\u name
    中添加
    IP
    地址,但仍然可以从
    IP
    地址访问该地址。我认为从
    服务器\u name
    @AnujTBE添加和删除IP不会产生任何效果,只需添加一个服务器配置,将错误代码返回到IP请求。如果我将
    return
    添加到基本配置中,它会在所有端口上工作吗?。我有多个端口服务于多个应用程序,只需要一个一次性解决方案;这意味着它只侦听15672,接受ssl连接,并且它是此端口的默认_服务器,而不是所有nginx配置。如果您对此感觉不好,只需将服务器名称从更改为您的ip,并去掉“默认服务器”。像这样,它只会得到“ip:15672”这样的连接,返回418它位于一个服务器支架内,侦听一个端口。不是所有的