Проблемы с Nginx и маршрутами приложений Dockerized Angular

У меня есть полноценное веб-приложение с серверной частью Spring Boot и внешним интерфейсом Angular, оба докеризованы с помощью Docker и Docker Compose. Хотя я могу получить доступ к корневому URL-адресу моего приложения Angular, переход к другим маршрутам приводит к появлению сообщения «Добро пожаловать в nginx!» страница

Моя установка

Docker Создать файл:

services:

  postgres:
    container_name: postgres-readly
    image: postgres
    environment:
      POSTGRES_USER: username
      POSTGRES_PASSWORD: password
      PGDATA: /var/lib/postgresql/data
      POSTGRES_DB: readly
    ports:
      - 5432:5432
    volumes:
      - postgres:/data/postgres
    networks:
      - readly-network
    restart: unless-stopped

  mail-dev:
    container_name: mail-dev-bsn
    image: maildev/maildev
    ports:
      - 1080:1080
      - 1025:1025

  readly-api:
    container_name: readly-api
    image: readly/readly:0.0.1-SNAPSHOT
    ports:
      - 8088:8088
    networks:
      - readly-network
    depends_on:
      - postgres

  readly-frontend:
    container_name: readly-frontend
    image: readly/readly-frontend:0.0.1-SNAPSHOT
    ports:
      - 4200:80
    networks:
      - readly-network
    depends_on:
      - readly-api

networks:
  readly-network:
    driver: bridge
volumes:
  postgres:
    driver: local

Угловой Docker-файл:

Этап 1. Создание приложения Angular

# Stage 1: Build the Angular application
FROM node:18 as build-stage

WORKDIR /app

COPY package*.json ./

RUN npm install

COPY . .

RUN npm run build

FROM nginx:alpine

COPY nginx.conf /etc/nginx/nginx.conf

COPY --from=build-stage /app/dist/frontend /usr/share/nginx/html

EXPOSE 80

Конфигурация Nginx (nginx.conf):

events {}

http {
    server {
        listen 80;

        location / {
            root /usr/share/nginx/html;
            index index.html;
            try_files $uri $uri/ /index.html;
        }

        # Handle JavaScript | CSS files with the correct MIME type
        location ~ \.(js|css)$ {
            root /usr/share/nginx/html;
            include /etc/nginx/mime.types;
        }

        # Catch-all location to handle refreshes on any route
        location ~ ^/.+$ {
            root /usr/share/nginx/html;
            index index.html;
            try_files $uri /index.html;
        }
    }
}

Проблема Когда я перехожу по адресу http://localhost, я вижу корневую страницу моего приложения Angular. Однако переход к другим маршрутам, таким как /login, приводит к тому, что Nginx отображает страницу приветствия по умолчанию или возвращает ошибку 404. Вот соответствующие журналы:

2024-05-29 23:15:38 172.18.0.1 - - [29/May/2024:22:15:38 +0000] "GET / HTTP/1.1" 200 615 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Safari/537.36"
2024-05-29 23:15:42 172.18.0.1 - - [29/May/2024:22:15:42 +0000] "GET / HTTP/1.1" 304 0 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Safari/537.36"
2024-05-29 23:19:14 172.18.0.1 - - [29/May/2024:22:19:14 +0000] "GET /login HTTP/1.1" 304 0 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Safari/537.36"

Я ожидал, что после настройки Nginx для обслуживания index.html для всех маршрутов я смогу переходить по различным путям в моем приложении Angular (например, /login, /dashboard), не сталкиваясь со страницей Nginx по умолчанию или ошибками 404. Вместо этого я бы увидел соответствующие компоненты Angular, отображаемые для каждого маршрута.

Дополнительная информация

  • Угловая версия: 17.1.0

  • Версия весенней загрузки: 3.2.5

  • Версия Nginx: альпийская

Несмотря на эти усилия, проблема остается. Что я упускаю или делаю неправильно? Любая помощь будет принята с благодарностью!

Ваш ответ: «304 — Не изменено». Ваш браузер закешировал старую версию. Для этого URL.

x539 31.05.2024 17:24

Я сделал это и не дал никаких результатов, страница приветствия nginx по-прежнему отображается в браузере.

Mohamed Boukthir 31.05.2024 18:00

Мне кажется, что location ~ должно быть location ~*.

Joosep Parts 01.06.2024 08:14

я тоже пробую, но все равно то же самое

Mohamed Boukthir 01.06.2024 16:26
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Angular и React для вашего проекта веб-разработки?
Angular и React для вашего проекта веб-разработки?
Когда дело доходит до веб-разработки, выбор правильного front-end фреймворка имеет решающее значение. Angular и React - два самых популярных...
Эпизод 23/17: Twitter Space о будущем Angular, Tiny Conf
Эпизод 23/17: Twitter Space о будущем Angular, Tiny Conf
Мы провели Twitter Space, обсудив несколько проблем, связанных с последними дополнениями в Angular. Также прошла Angular Tiny Conf с 25 докладами.
Угловой продивер
Угловой продивер
Оригинал этой статьи на турецком языке. ChatGPT используется только для перевода на английский язык.
Мое недавнее углубление в Angular
Мое недавнее углубление в Angular
Недавно я провел некоторое время, изучая фреймворк Angular, и я хотел поделиться своим опытом со всеми вами. Как человек, который любит глубоко...
Освоение Observables и Subjects в Rxjs:
Освоение Observables и Subjects в Rxjs:
Давайте начнем с основ и постепенно перейдем к более продвинутым концепциям в RxJS в Angular
0
4
94
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Я нашел решение проблемы. Команда COPY Dockerfile неправильно копировала выходные данные сборки Angular в соответствующий каталог на сервере nginx. Предыдущая команда предполагала структуру приложения Angular Universal, которая включает вложенную папку браузера в выходные данные сборки. Однако наше приложение Angular использует Angular Universal, и поэтому выходные данные сборки включают каталог браузера.

COPY --from=build /app/dist/frontend/browser /usr/share/nginx/html

Это изменение гарантирует, что построенное приложение Angular будет правильно скопировано в каталог /usr/share/nginx/html на сервере nginx. Это гарантирует, что сервер nginx сможет правильно обслуживать наше приложение Angular.

Другие вопросы по теме