Как мне обслуживать приложение React.js Vite, размещенное в экземпляре контейнера Azure, по настраиваемому маршруту, где маршрутизацией управляет Caddy?

Я хочу обслуживать свое приложение React по другому маршруту, чтобы все мои серверы находились в одной группе контейнеров.

Мой Caddyfile выглядит так:

fqdn {
    handle_path /backend* {
        reverse_proxy http://localhost:8000
    }

    handle_path /react-app* {
        reverse_proxy http://localhost:3001 {
            header_up Host {host}
            header_up X-Forwarded-Host {host}
            header_up X-Forwarded-For {remote}
            header_up X-Forwarded-Proto {scheme}
        }
    }

    handle {
        reverse_proxy http://localhost:3000
    }


    # This will handle all other requests and route them to port 5000
    handle {
        reverse_proxy http://localhost:5000
    }
}

Понятно, что мой внутренний сервер и два моих внешних сервера размещены на 8000, 3000 и 3001 соответственно. Все остальное работает идеально. Если я размещаю приложение реагирования в другой группе контейнеров, оно работает нормально, так как тогда маршрут будет «/».

Вот моя конфигурация Vite:

import { defineConfig } from 'vite'
import react from '@vitejs/plugin-react'

export default defineConfig({
 plugins: [react()],
 server: {
   host: true,
   port: 3001,
   strictPort: true,
 },
 base: '/react-app/',
 preview: {
   port: 3001,
 }
})

И мой main.jsx для ссылки на маршрутизацию:

  ReactDOM.createRoot(document.getElementById('root')).render(
    <Router basename = "/">
    <Routes>
      <Route path = "/" element = {<Login />} />
      <Route path = "/app" element = {<App />} />
    </Routes>
  </Router>
  )

Проблема, с которой я столкнулся, заключается в том, что, поскольку и конфигурация vite, и caddyfile указывают на /react-app, я получаю бесконечные перенаправления, если я изменяю опорное имя базового имени в компоненте Router. Если я удалю его, как в приведенном выше коде, vite все равно будет искать ресурсы по базовому пути, поэтому ничего не загружается. Например, приведенные ниже файлы не загружаются, поскольку vite ищет их в fqdn/src/ вместо fqdn/react-app/src.

import { BrowserRouter as Router, Route, Routes } from 'react-router-dom';
import Login from './Login.jsx';

Я обслуживаю приложение реагирования, используя npm run dev, который, хотя и любительский, пока у меня работает нормально. Это делается с помощью файла dockerfile.

Буду признателен за любую информацию о том, как решить эту неприятную проблему. Спасибо.

Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Навигация по приложениям React: Исчерпывающее руководство по React Router
Навигация по приложениям React: Исчерпывающее руководство по React Router
React Router стала незаменимой библиотекой для создания одностраничных приложений с навигацией в React. В этой статье блога мы подробно рассмотрим...
Массив зависимостей в React
Массив зависимостей в React
Все о массиве Dependency и его связи с useEffect.
0
0
50
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

Чтобы настроить сервер Caddy для обслуживания приложения React, созданного с помощью react-router, в экземпляре контейнера Azure, вам необходимо изменить свой Caddyfile следующим образом:

Я использовал эту ссылку для реализации try_files в Caddyfile.

Чтобы получить последний образ Caddy из Docker Hub, используйте команду ниже:

docker pull caddy

Поместите Caddyfile и Dockerfile в основной путь:

:80 {
    root * /usr/share/caddy
    file_server
    try_files {path} /index.html
}

Я ссылался на эту ссылку для настройки React Router с помощью Caddy.

Докер

FROM  caddy

COPY  ./dist  /usr/share/caddy

COPY  ./Caddyfile  /etc/caddy/Caddyfile

Команда для сборки образа Docker:

docker build -t caddy:dockerfile .

Используйте команды docker run, чтобы запустить контейнер Docker с изображением caddy, предоставляя порт 80 в контейнере порту 8080 на хост-компьютере:

docker run -p 8080:80  caddy:dockerfile
docker run -p 8080:80 -d caddy:dockerfile

Локально с сервером Caddy:

Шаги по размещению сервера Caddy в экземплярах контейнеров Azure:

Команда docker tag используется для пометки образа новым именем, что часто бывает полезно при отправке образа в реестр контейнеров, например Azure Container Registry (ACR):

docker tag caddy:dockerfile AzureContainer RegistryName.azurecr.io/caddy:dockerfile

Чтобы войти в Реестр контейнеров Azure (ACR), используйте команду Azure CLI ниже:

az acr login --name "AzureContainerRegistryName"
az acr login --name "AzureContainerRegistryName" --password "Password" --username "UserName"

  • Перейдите в реестр контейнеров и выберите «Запустить экземпляр», чтобы создать экземпляры контейнеров Azure.

Выберите IP-адрес экземпляров контейнера, чтобы просмотреть приложение , размещенное с образом Caddy.

Хотя напрямую это и не сработало, хитростью была директива try_files. handle /react-app* { root * /appverse_proxy localhost:3001 try_files {path} /index.html file_server } Это конфигурация, которая сработала. Спасибо!

Armaan Shah 20.07.2024 10:28

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