Я хочу обслуживать свое приложение 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.
Буду признателен за любую информацию о том, как решить эту неприятную проблему. Спасибо.
Чтобы настроить сервер 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"
Выберите IP-адрес экземпляров контейнера, чтобы просмотреть приложение , размещенное с образом Caddy.
Хотя напрямую это и не сработало, хитростью была директива try_files. handle /react-app* { root * /appverse_proxy localhost:3001 try_files {path} /index.html file_server } Это конфигурация, которая сработала. Спасибо!