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

我正在运行安装了Nginx的Debian服务器以及OpenResty。 我有一个域名,该域名的一个子域名,未来将有多个域名指向其IP地址与Alogging。

我希望每个域或子域的OpenResty服务器运行在不同的端口上,Nginx服务器根据域名在服务器之间路由请求。

所以,现在我有:

  • 指向IP的domain1.comsub.domain1.com
  • 运行在端口80上的Nginx和路由请求(我在下面解释的configuration更改)
  • 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 ,依此类推

我曾尝试使用proxy_passproxy_set_headerproxy_redirect ,以各种configuration使用Googlesearchbuild议。 我设法一次有一个proxy_pass工作,但是显示端口给用户。 我试图以这种方式设置的全部原因是,它似乎并没有在多个端口上运行给用户。

另外,我正在使用SSL,并希望HTTP请求redirect到HTTPS。 我意识到,而试图找出这一点,我需要更改代理服务器端口443的SSL请求(要在默认端口上运行)。

这是我得到它与子域的工作:

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

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

     #include /etc/nginx/conf.d/*.conf; #include /etc/nginx/sites-enabled/*; 
  2. http { }块中添加domain1.com的证书:

     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 } } } 

你需要做的第一件事就是定义你希望nginx监听的请求,你使用server_name来做什么,并且定义你想要使用listen来监听哪个端口。

从你所说的话听起来,你只是想让人们进入到他们的浏览器,然后将内容服务。 如果是这样的话,那么Nginx会监听端口80上的请求,并将其传递给端口8000/8001 / 800x上的OpenResty。

然而,这些都是非常基本的configuration,可以做到这一点,但你可能需要更多的设置。 查看这里和这里的文档以获取完整的列表,包括进一步的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/文件夹来pipe理/组织网站,但是“可以”把它放在http块的nginx.con

否则,您将添加删除的行,将这些configuration分成两个文件,然后将这些文件放在/etc/nginx/sites-available和符号链接到/etc/nginx/sites-enabled folder

我相信您需要为每个虚拟主机服务器块或域名设置listen指令。

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。