Nginx 简单代理在 Docker 中不起作用
Nginx simple proxy doesn't work in Docker
我有一个后端和一个前端 运行 在 Docker 的两个容器中,并且都可以从我的浏览器使用它们的端口访问:
localhost:8081 # frontend
localhost:8082 # backend
现在,我想使用接收所有流量(端口 80)并重定向的 Nginx 服务器:
localhost -> to frontend
localhost/api -> to the backend
在尝试了 nginx.conf
文件中的几乎所有内容之后(没有任何效果),我在一个 SO 问题中发现我必须修改的文件是:
/etc/nginx/sites-enabled/default
于是尝试修改,现在nginx运行s。对于 运行s,我的意思是至少当我访问 localhost
时,会显示 nginx 欢迎页面。但是,我仍然无法使我的 nginx 路由流量(代理方式,而不是重定向)。
现在我的 docker-compose
文件具有以下外观(nginx 的片段加上这两个服务):
nginx:
image: nginx:latest
ports:
- 80:80
volumes:
- ./Dockerfiles/nginx/default:/etc/nginx/sites-enabled/default
links:
- frontend
- backend
depends_on:
- frontend
- backend
frontend:
build: ./Dockerfiles/frontend
volumes:
- ./Dockerfiles/frontend/www/src:/usr/src/app
- ./logs/frontend/httpd:/var/logs/httpd
ports:
- "8081:3000"
links:
- backend
backend:
build: ./Dockerfiles/backend
volumes:
- ./Dockerfiles/backend/www:/var/www/html
- ./logs/backend/httpd:/var/logs/httpd
ports:
- "8082:80"
links:
- "database"
- "redis"
depends_on:
- database
- redis
我的 default
文件如前所述,nginx 配置是:
server {
listen 80 default_server;
# Add index.php to the list if you are using PHP
index index.html index.htm index.php index.nginx-debian.html;
server_name _;
location / {
# First attempt to serve request as file, then
# as directory, then fall back to displaying a 404.
#try_files $uri $uri/ =404;
proxy_pass http://frontend:8081/;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection 'upgrade';
proxy_set_header Host $host;
proxy_cache_bypass $http_upgrade;
}
location /api {
proxy_pass http://backend:8082/public/;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection 'upgrade';
proxy_set_header Host $host;
proxy_cache_bypass $http_upgrade;
}
}
例如,当我尝试访问我的 /api
url 时,nginx 告诉我的错误是:
nginx_1 | 2018/12/17 21:44:09 [error] 6#6: *1 open() "/usr/share/nginx/html/api" failed (2: No such file or directory), client: 172.20.0.1, server: localhost, request: "GET /api HTTP/1.1", host: "localhost"
这似乎是在尝试从本地文件系统检索文件(考虑到 conf. 文件,这是我无法理解的东西)。
任何线索、想法或提示?
将您的服务器配置放在:/etc/nginx/conf.d/default.conf
,而不是启用站点。
文档:https://hub.docker.com/_/nginx/
此外,您稍后将面临不同的问题。将 http://frontend:8081/;
更改为 http://frontend:3000/;
。因为 nginx 是直接联系前端容器,而不是整个主机。
我有一个后端和一个前端 运行 在 Docker 的两个容器中,并且都可以从我的浏览器使用它们的端口访问:
localhost:8081 # frontend
localhost:8082 # backend
现在,我想使用接收所有流量(端口 80)并重定向的 Nginx 服务器:
localhost -> to frontend
localhost/api -> to the backend
在尝试了 nginx.conf
文件中的几乎所有内容之后(没有任何效果),我在一个 SO 问题中发现我必须修改的文件是:
/etc/nginx/sites-enabled/default
于是尝试修改,现在nginx运行s。对于 运行s,我的意思是至少当我访问 localhost
时,会显示 nginx 欢迎页面。但是,我仍然无法使我的 nginx 路由流量(代理方式,而不是重定向)。
现在我的 docker-compose
文件具有以下外观(nginx 的片段加上这两个服务):
nginx:
image: nginx:latest
ports:
- 80:80
volumes:
- ./Dockerfiles/nginx/default:/etc/nginx/sites-enabled/default
links:
- frontend
- backend
depends_on:
- frontend
- backend
frontend:
build: ./Dockerfiles/frontend
volumes:
- ./Dockerfiles/frontend/www/src:/usr/src/app
- ./logs/frontend/httpd:/var/logs/httpd
ports:
- "8081:3000"
links:
- backend
backend:
build: ./Dockerfiles/backend
volumes:
- ./Dockerfiles/backend/www:/var/www/html
- ./logs/backend/httpd:/var/logs/httpd
ports:
- "8082:80"
links:
- "database"
- "redis"
depends_on:
- database
- redis
我的 default
文件如前所述,nginx 配置是:
server {
listen 80 default_server;
# Add index.php to the list if you are using PHP
index index.html index.htm index.php index.nginx-debian.html;
server_name _;
location / {
# First attempt to serve request as file, then
# as directory, then fall back to displaying a 404.
#try_files $uri $uri/ =404;
proxy_pass http://frontend:8081/;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection 'upgrade';
proxy_set_header Host $host;
proxy_cache_bypass $http_upgrade;
}
location /api {
proxy_pass http://backend:8082/public/;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection 'upgrade';
proxy_set_header Host $host;
proxy_cache_bypass $http_upgrade;
}
}
例如,当我尝试访问我的 /api
url 时,nginx 告诉我的错误是:
nginx_1 | 2018/12/17 21:44:09 [error] 6#6: *1 open() "/usr/share/nginx/html/api" failed (2: No such file or directory), client: 172.20.0.1, server: localhost, request: "GET /api HTTP/1.1", host: "localhost"
这似乎是在尝试从本地文件系统检索文件(考虑到 conf. 文件,这是我无法理解的东西)。
任何线索、想法或提示?
将您的服务器配置放在:/etc/nginx/conf.d/default.conf
,而不是启用站点。
文档:https://hub.docker.com/_/nginx/
此外,您稍后将面临不同的问题。将 http://frontend:8081/;
更改为 http://frontend:3000/;
。因为 nginx 是直接联系前端容器,而不是整个主机。