在NGINX反向代理中处理主机和容器上的服务

38次阅读
没有评论

问题描述

在自己的架构中有一个NGINX服务器运行在主机上,有三个URL:app1.com、app2.com和app3.com。其中,app1和app2分别位于主机上,而在容器中有app3以及app2.com/example路径。用户的问题是,他希望如何在主机的NGINX配置中引用容器。由于主机已经使用了端口80和443,所以不能直接暴露容器的这些端口,用户不确定最佳解决方案是什么。

用户考虑了一种方法,即将容器放在一个未使用的端口(例如8999),然后代理请求到该端口,并在防火墙上屏蔽这些端口,以便外部无法访问。用户想知道,如果采用这个选项,容器内的NGINX配置是否仍需要server_name?另一种方案是使用Docker套接字或者docker0网络,但不确定是否可行。

以下是主机上NGINX配置文件的示例:

server {
  server_name app1.com;
  location / {
     root /var/www/app1/;
  }
}
server {
  server_name app2.com;
  location / {
     root /var/www/app2/;
  }
  location /example {
    proxy_pass http://localhost:8999;
    proxy_set_header Host $http_host;
  }
}
server {
  server_name app3.com;
  location / {
    proxy_pass http://localhost:8999;
    proxy_set_header Host $http_host;
  }
}

以下是容器内NGINX配置文件的示例:

server {
  server_name app2.com;
  location /example {
    root /var/www/app2/;
  }
}
server {
  server_name app3.com;
  location / {
    root /var/www/app3/;
  }
}

解决方案

请注意以下操作注意版本差异及修改前做好备份。

根据用户的问题,有两种解决方案来处理在NGINX中引用容器的情况。

方案1:代理到未使用端口

在主机上的NGINX配置中,你可以使用proxy_pass将请求代理到容器运行的未使用端口(例如8999)。这样,NGINX会将请求传递到容器,从而实现在主机和容器之间的通信。

  1. 在NGINX配置中,对于需要代理到容器的路径,使用以下配置:
location /example {
    proxy_pass http://localhost:8999;
    proxy_set_header Host $http_host;
}
  1. 在容器中的NGINX配置中,对应的路径配置应保持不变。

这种方法确保了主机和容器之间的通信,但需要注意容器内的NGINX配置仍然需要server_name指令,以确保正确路由到相应的路径。

方案2:使用Docker套接字或网络

另一种方法是使用Docker套接字或者Docker网络来管理主机和容器之间的通信。这种方法可能需要更多的配置,但可以更灵活地管理容器之间的通信。

具体的操作步骤可能因环境而异,但基本思路如下:

  1. 在容器中,将NGINX配置文件中的server_name修改为容器的IP地址或Docker主机名(取决于套接字或网络的使用)。
  2. 在主机上的NGINX配置中,使用proxy_pass将请求代理到容器的IP地址或Docker主机名。
  3. 确保容器和主机之间的网络通信正常,可以使用Docker的网络工具进行测试和调试。

请注意,这种方法需要更多的配置和测试,但可以更好地控制容器之间的通信方式。

总结

根据用户的需求,你可以通过代理到未使用端口或使用Docker套接字/网络来实现主机和容器之间的通信。在主机和容器的NGINX配置中,确保server_name配置正确以实现路径的正确路由。选择哪种方法取决于你的实际需求和配置偏好。

正文完