一个运行Nginx的Docker容器,该容器提供Angular应用程序资源文件,这些文件已复制到docker build上的Docker映像中。
当前正在内部在容器上侦听端口5007并在主机上外部侦听端口5007的api
我正在设置临时环境和以下外部URL:
app.staging.mysite.com
account.staging.mysite.com
app.staging.mysite.com到达端口80并使用Angular应用程序资源进行响应。 />
现在我想获取account.staging.mysite.com外部API URL请求,以使我的API Docker容器在端口5007上监听。来自account.staging.mysite.com的请求将达到主机的端口80 。
Nginx将收到account.staging.mysite.com端口80请求并将它们代理到Docker容器127.0.0.1:5007,同时默认情况下仍为所有外部URL提供我的Angular应用文件/我未在Nginx配置中明确表示代理的域。
我不想使用Angular应用程序,而是希望使用Nginx将请求转发到端口5007,以便我的Account API可以响应。因此,我已将Nginx配置更改为以下内容:
upstream accountstaging{
server 0.0.0.0:5007
}
server {
listen 80 default_server;
listen [::]:80 default_server;
server_name _;
# Main
location / {
root /usr/share/nginx/html;
index index.html index.htm;
try_files $uri$args $uri$args/ /index.html;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}
}
server {
listen 80;
server_name account.staging.mysite.com;
location / {
proxy_pass http://accountstaging;
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-Host $server_name;
}
}
让我真正感到惊讶的是现在没有default_server命中。换句话说,当我添加第二个服务器侦听端口80专门用于account.staging.mysite.com时,正在使用Angular应用程序资源并对其进行响应的app.staging.mysite.com不再起作用。
所以这个问题实际上与Docker容器无关,而实际上与Nginx配置有关。尽管我不能完全确定是否可以将我的Docker容器排除在问题之外。所以这是我的account.staging.mysite.com的docker-compose.yml:
version: '3'
services:
apistaging:
build:
context: ./
dockerfile: docker/staging/Dockerfile
image: tsl.api.account.image
container_name: tsl.api.account.container
ports:
- "5007:5007"
environment:
ASPNETCORE_URLS: http://+:5007
这是我用于app.staging.mysite.com的docker-compose.yml:还要充当反向代理,您可以看到Nginx default_server服务器将我复制到docker build上此Docker映像中的Angular应用程序资源文件作为服务器:此问题可能是由于Angular应用程序前端docker容器的80:80绑定引起的吗?
#1 楼
多亏了这里的问题和答案,我才意识到我遇到了两个问题:容器具有不同的默认Docker网络,因为我使用的是两个不同的docker-compose.yml文件,我已经预见到我的Ngnix代理完全独立于我的任何API容器(包括docker-compose)独立工作,第二个问题就是当我尝试代理127.0.0.1:5023时,是Ngnix容器内的本地主机,而不是Nginx代理容器外的网络
,所以docker-docker为我的Nginx代理docker容器和api docker容器创建的不同默认网络是因为我是使用两个不同的docker-compose.yml文件。这是因为我拥有针对许多API微服务的Jenkins构建,因此具有独立的docker-compose文件,并且我需要Nginx代理将端口80上的请求转发至每个微服务。对于这两个容器,API和Nginx代理,都使用docker-compose.yml: 0.1:5023,该转发保留在Nginx Docker容器中,并且从未找到在Docker主机上运行的API,我只需要使用docker-compose.yml服务名称即可:
version: '3'
services:
reverseproxy:
build:
context: ./
dockerfile: docker/nginxproxy/docker/Dockerfile
image: tsl.devops.reverseproxy.image
container_name: tsl.devops.reverseproxy.container
ports:
- "80:80"
apistaging:
build:
context: ./
dockerfile: docker/staging/Dockerfile
image: tsl.api.example.image
container_name: tsl.api.example.container
ports:
- "5023:5023"
environment:
ASPNETCORE_URLS: http://+:5023