我正在嘗試使用 nginx 對經典的 NodeJS(Express、TS) Angular 應用程式進行 Dockerize,但我很難通過 nginx 正確系結我的 api。
實際上,nginx 的目標似乎是我的 localhost:80...

...雖然我希望它針對我的localhost:3000. 當我在添加:3000之后手動 ping 那個 url 時localhost,它可以作業。
我試圖保持我的代碼簡單。這是我的不同檔案。
回傳 Dockerfile :
FROM node:15.14-alpine AS build
RUN mkdir -p /build/tmp
WORKDIR /build/tmp
COPY . .
RUN npm ci
CMD ["npm", "run", "start"]
前端 Dockerfile :
### STAGE 1: Build ###
FROM node:15.14-alpine AS build
WORKDIR /usr/src/app
COPY package.json package-lock.json ./
RUN npm install
COPY . .
RUN npm run build
### STAGE 2: Run ###
FROM nginx:1.17.1-alpine
COPY nginx.conf /etc/nginx/nginx.conf
COPY --from=build /usr/src/app/dist/front /usr/share/nginx/html
dockercompose.yml :
version: '3.4'
services:
mymusicads-front:
container_name: mymusicads-front
build:
context: ./front
dockerfile: Dockerfile
ports:
- 80:80
restart: on-failure
depends_on:
- mymusicads-api
networks:
- front-back
mymusicads-api:
container_name: mymusicads-api
build:
context: ./api
dockerfile: Dockerfile
ports:
- 3000:3000
networks:
- front-back
networks:
front-back:
driver: bridge
nginx.conf :
events{}
http {
include /etc/nginx/mime.types;
upstream api {
server 127.0.0.1:3000;
}
server {
listen 80;
server_name front;
root /usr/share/nginx/html;
index index.html;
location / {
try_files $uri $uri/ /index.html;
}
}
server {
listen 80;
server_name api;
location /api/ {
proxy_pass http://localhost:3000/;
proxy_redirect off;
}
}
}
謝謝 !
編輯:通過檢查錯誤,我們可以看到我們正在獲取我的 Angular index.html 檔案作為回應,而不是我的 API 應該回傳的 JSON 物件,這可能表示代理錯誤。似乎 nginx 缺少location /api/指令,或者可能是整個指令server。
uj5u.com熱心網友回復:
當您server在配置中使用多個塊時,nginx 會根據 HTTPHost標頭值選擇服務器塊來處理您的請求。如果它與任何指定的服務器名稱都不匹配(或者如果Host標題根本不存在),則將使用默認服務器塊。您可以使用指令的default_server標志顯式指定默認服務器塊listen。如果您沒有明確指定它,則將使用偵聽特定埠的第一個服務器塊。有關更多詳細資訊,請參閱nginx 如何處理請求官方檔案頁面或此答案。
試試這個配置:
events {}
http {
include /etc/nginx/mime.types;
server {
listen 80;
root /usr/share/nginx/html;
index index.html;
location / {
try_files $uri $uri/ /index.html;
}
location /api/ {
proxy_pass http://mymusicads-api:3000/;
proxy_redirect off;
}
}
}
您不需要將 node.js 埠 3000 暴露給外部世界,只有mymusicads-front容器應該可以訪問該埠。根據docker-compose 埠與公開SO 執行緒之間的區別dockercompose.yml是什么,您的檔案應該類似于
version: '3.4'
services:
mymusicads-front:
container_name: mymusicads-front
build:
context: ./front
dockerfile: Dockerfile
ports:
- 80:80
restart: on-failure
depends_on:
- mymusicads-api
networks:
- front-back
mymusicads-api:
container_name: mymusicads-api
build:
context: ./api
dockerfile: Dockerfile
expose:
- 3000
networks:
- front-back
networks:
front-back:
driver: bridge
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/338573.html
上一篇:似乎可以關閉docker容器
