如何根据域名在同一IP地址上的Nginx服务器之间路由请求?

如何根据域名在同一IP地址上的Nginx服务器之间路由请求?

我正在运行安装了 Nginx 和 OpenResty 的 Debian 服务器。我有一个域名,该域名的一个子域名,将来还会有多个域名通过 A 记录指向其 IP 地址。

我想要每个域或子域运行一个在不同端口上的 OpenResty 服务器,并使用一个 Nginx 服务器根据域名在服务器之间路由请求。

因此,现在我有:

  • domain1.comsub.domain1.com指向 IP
  • Nginx 在端口 80 上运行并路由请求(我所做的配置更改解释如下)
  • domain1.com正在端口 8000 上提供服务,sub.domain1正在端口 8001 上提供服务

我想:

  • Nginx 会让用户感觉他们正在访问sub.domain1.comdomain1.com。 否domain1.com:8000sub.domain1.com:8001
  • 将来,当我domain2.com指向 IP 和在端口 8002 上运行的服务器时,它也会向用户显示为,domain2.com而不是domain2.com:8002,等等

我尝试过使用Google 搜索建议的各种配置,包括proxy_passproxy_set_headerproxy_redirect。我曾经设法让 proxy_pass 工作,但会向用户显示端口。我尝试以这种方式设置的原因是为了不让用户看到它在多个端口上运行。

此外,我正在使用 SSL,并希望将 HTTP 请求重定向到 HTTPS。在尝试解决这个问题时,我意识到我需要将代理服务器更改为端口 443 以接收 SSL 请求(在默认端口上运行)。

这就是我让它与子域名一起工作的方法:

Nginx 的配置(/etc/nginx/nginx.conf)是默认的,但有以下例外:

  1. 删除了虚拟主机包含指令:

    #include /etc/nginx/conf.d/*.conf;
    #include /etc/nginx/sites-enabled/*;
    
  2. domain1.com在区块中添加了以下证书http { }

    ssl_certificate /path/to/public.pem;
    ssl_certificate_key /path/to/private.pem;
    
  3. 为我的代理定义以下内容:

    server {
        listen 443 ssl;
        ssl on;
        server_name dev.domain1.com;
        location / {
            proxy_pass https://sub.domain1.com:8001;
        }
    }
    
    server {
        listen 80;
        server_name sub.domain1.com;
        return 301 https://$host$request_uri;
    }
    

工作很好,但后来我尝试server { }对域名本身进行同样的拦截,工作得很好,破了。

我到底在干什么?

补充笔记:

被代理的服务器基本上是:

http {
    ssl_certificate /path/to/public.pem;
    ssl_certificate_ley /path/to/private.pem;

    include mime.types;

    server {
        listen port ssl;
        ssl on;
        error_page 497 https://$host:$server_port$request_uri;

        location / {
            #whatever
        }
    }
}

答案1

您需要做的第一件事是定义您希望 nginx 监听哪些请求,server_name以及定义您想要使用哪个端口进行监听listen

从您所说的内容来看,您似乎只是希望人们进入domain1.com浏览器,然后输入要提供的内容。如果是这样的话,这将实现这一点,Nginx 将在端口 80 上监听请求,并将这些请求传递给端口 8000/8001/800x 上的 OpenResty。

然而这些是非常基本的配置,可以完成这些操作,但你可能需要更多设置。查看文档这里这里包含更多 SSL 设置的完整列表

server { 
listen          80;
server_name     domain1.com;

location / {
  proxy_pass      http://127.0.0.1:8000;
    }
}  

server { 
listen          80;
server_name     domain2.com;

location / {
  proxy_pass      http://127.0.0.1:8001;
    }
}

我个人更喜欢使用文件夹来管理/组织网站,/etc/nginx/sites-enabled/但“可以”将其放在nginx.conhttp 块内。

否则,您需要重新添加删除的行,将这些配置拆分为两个文件,然后将这些文件放入/etc/nginx/sites-available并符号链接到/etc/nginx/sites-enabled folder.

答案2

我相信您需要为您正在服务的每个虚拟主机服务器{}块或域名设置监听指令。

http://nginx.org/en/docs/http/ngx_http_core_module.html#listen

server {
    listen domain1.com:8000;
    ...
}
server {
    listen domain2.com:8001;
    ...
}    

如果使用防火墙,您可能还需要打开这些端口。

如果您有 Nginx 的默认设置,那么您可能需要注释掉可能在 conf 文件中加载的任何 listen 指令并重新启动 nginx。

相关内容