Как настроить nginx внутри docker compose, чтобы он корректно работал с vue-router?

Как настроить nginx в docker-compose для обеспечения доступа к Vue-приложению, работающему на своем адресе через proxy_pass?
  • 8 января 2024 г. 16:18
Ответы на вопрос 2
Чтобы настроить Nginx в Docker Compose для работы с Vue-приложением, использующим vue-router в режиме истории, вам необходимо обеспечить возвращение `index.html` на все запросы, чтобы Vue Router мог управлять маршрутизацией на клиентской стороне.

Вот шаги, которые следует выполнить:

1. Создайте конфигурационный файл Nginx, например `default.conf`:

```nginx
server {
    listen 80;

    location / {
        root /usr/share/nginx/html;
        try_files $uri $uri/ /index.html;
        add_header Cache-Control "no-cache";
    }

    # Если у вас есть API или другие пути, которые нужно проксировать
    location /api {
        proxy_pass http://backend:3000; # Предполагается, что у вас есть сервис `backend` в docker-compose
    }
}
```

Здесь `try_files $uri $uri/ /index.html;` указывает Nginx на то, чтобы попытаться найти файл или директорию для текущего URI и, если это не удается, возвращать `index.html`.

2. Добавьте свой Dockerfile для Nginx, если у вас его нет. В нем нужно скопировать конфигурацию и статические файлы вашего Vue-приложения:

```Dockerfile
# Выберите образ Nginx
FROM nginx:alpine

# Копируем конфиг файлы для Nginx
COPY default.conf /etc/nginx/conf.d/

# Удаляем дефолтные файлы Nginx
RUN rm -rf /usr/share/nginx/html/*

# Копируем собранные файлы Vue-приложения в контейнер
COPY dist /usr/share/nginx/html
```

3. Определите конфигурацию сервисов в `docker-compose.yml`:

```yaml
version: '3.8'
services:
  frontend:
    build:
      context: .
      dockerfile: Dockerfile
    ports:
      - "80:80"
    depends_on:
      - backend
    restart: always
  
  backend:
    # Определите контейнер для вашего backend приложения
    # ...
```

Убедитесь, что ваша Vue-приложение уже собрано (`npm run build` или `yarn build`) и файлы размещены в каталоге `dist`, предполагая, что ваша структура файлов имеет стандартное распределение, когда все файлы сборки находятся в каталоге `dist`.

Теперь, когда вы выполните `docker-compose up --build`, образ с Nginx должен быть собран, и внутренний сервер Nginx будет настроен для обслуживания вашего Vue-приложения.

Убедитесь, что ваш Vue Router настроен в режиме истории и в Nginx вы указали правильное местоположение ваших статических файлов. Если ваши Vue-файлы находятся в другой директории внутри контейнера, используйте соответствующий путь в директиве `root`.

Если вам необходимо связать Vue-приложение с бэкендом через прокси, убедитесь, что `proxy_pass` в вашем конфиге Nginx указывает на соответствующий сервис и порт в `docker-compose.yml`. Не забудьте настроить CORS на бэкенде, если требуется, чтобы позволить вашему Vue-приложению осуществлять запросы.
Попробуйте добавить try_files в настройки nginx 
Похожие вопросы