Раньше я редко касался деплоя фронтенд проектов, в этот раз для более всестороннего изучения поставил на эту машину виртуалку, и потренировался как поставить виртуалку на виртуалку.react
написаноspa
Проект развернут на сервере этой виртуальной машины. из-заlinux
Он также новый, поэтому во всем процессе еще много ям, которые здесь записаны.
Цель
у меня есть один сreact
Напишите одностраничное приложение, а затем хотите развернуть на сервере черезip
Такие как192.168.1.240/config
Доступ к моему приложению по этому пути. этоreact
Проект зависит отnode.js
один изapi
обслуживание, мне нужноnginx
Настройка прокси делает мойreact
Приложение может получить доступ к моемуapi
Служить.
Подготовить
Первое, что нужно подготовить, это упаковатьreact
приложение, а затем установитеnginx
с однимnode.js
.
Для своего проекта я поставилreact
Все упакованные предметы помещаются/root/html/pageConfig
под этот путь.
конфигурация nginx
Исправлятьnginx
в каталоге установки./conf/nginx.conf
документ:
#user nodody;
# 1. 由于我的 react 项目打包出来放在 root 目录下,需要设置user 为 root 时内容才能够被访问
user root;
worker_processes 1;
#error_log logs/error.log;
#error_log logs/error.log notice;
#error_log logs/error.log info;
#pid logs/nginx.pid;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
#log_format main '$remote_addr - $remote_user [$time_local] "$request" '
# '$status $body_bytes_sent "$http_referer" '
# '"$http_user_agent" "$http_x_forwarded_for"';
#access_log logs/access.log main;
sendfile on;
#tcp_nopush on;
#keepalive_timeout 0;
keepalive_timeout 65;
#gzip on;
server {
listen 80;
server_name localhost;
#charset koi8-r;
#access_log logs/host.access.log main;
location / {
root html;
index index.html index.htm;
}
# 2. 对我的/api请求转发到8989端口下node.js服务
location /api {
proxy_pass http://127.0.0.1:8989;
}
# 3. 在/config下的请求都指向到我放在root下的configPage里的内容
location /config {
alias /root/html/configPage;
index index.html index.htm;
#rewrite /config /root/html/configPage/index.html;
try_files $uri $uri/ /config/index.html;
}
#error_page 404 /404.html;
# redirect server error pages to the static page /50x.html
#
error_page 500 502 503 504 /50x.html;
Вот три места, где только файл конфигурации по умолчанию был изменен в соответствии с моими требованиями:
- Исправлять
user
дляroot
, так чтоroot
Содержимое ниже может быть доступно - новый
location /api
настраиватьproxy_pass
сделать/api
Следующий запрос направляетсяproxy_pass
задаватьnode.js
Офис обслуживания, Satisfy My Front-End Pageapi
Проблема с прокси интерфейса - новый
location /config
конфигурация такая, что/config
Все запросы переадресовываются мнеreact
Путь, по которому находятся упакованные файлы. поэтому я получаю доступ192.168.1.240/config
можно увидеть мою страницу.Вот и скопировалlocation /
конфигурация с использованием того жеroot
Указав на путь, результат не смог получиться, я проверил информацию и обнаружил, что она должна быть написана какalias
просто делать
Конфигурационный файл здесь может потребоваться изменить несколько раз, чтобы добиться успеха.Следует отметить, что после каждой модификацииnginx
конфигурация, нужно перезагрузитьnginx
:
nginx -s reload
Проблема пути статического ресурса
Когда упакованный файл отправляется на сервер, статический файл ресурсов может не быть найден.
Причина пути к ресурсу не найдена
Возможная причина в том, что когдаreact
Когда приложение упаковано, оно генерируетindex.html
вставить в файлstyle
а такжеscript
Метки пути нет, поэтому не могу найти статические ресурсы.
Решение для статических ресурсов не найдено
нуждаться вwebpack
в файле конфигурации для измененияpublicPath
Это свойство, это свойство повлияет на вставку ваших статических файлов ресурсов вindex.html
путь в . Нравятся настройки моего проектаpublicPath: './'
Вот и все, вы можете изменить его несколько раз и несколько раз упаковать, чтобы попробовать.
Внешняя маршрутизация
Классификация внешней маршрутизации
Внешняя маршрутизация разделена на две реализации, одна из которыхhashRouter
, другой должен использоватьH5
новыйHistory API
осуществленныйbrowserRouter
. из-заhashRouter
Путь занимает#
Он не особенно красив, но в целом все еще используетсяbrowserRouter
более.
Проблема с внешней маршрутизацией
Грубо говоря, интерфейсная маршрутизация означает, что путь изменился.Вместо запроса к серверу используйтеjs
чтобы изменить способ работы страницы. В этом случае используйтеbrowserRouter
Если это так, то здесь есть проблема Я использую интерфейсную маршрутизацию, чтобы перейти к определенному пути./xxx
, это когда я обновляю страницу. В это время я пойду на сервер, чтобы получить ресурсы. Не должно быть никаких ресурсов по этому внешнему пути маршрутизации, поэтому он появится.404
сообщить об ошибке.
решение
Исправить обновление страницы404
Эта проблема, просто верните все запросыindex.html
, вы можете искатьhistory fallback
См. соответствующую информацию для этого ключевого слова.
это для меняnginx
Что касается конфигурации, просто добавьтеtry_files $uri $uri/ /config/index.html;
, вы можете отправить все внешние пути маршрутизации на сервер и вернуть ихindex.html
, это решает404
вопрос.
Проблема сопоставления пути маршрута
Настройте вышеуказанноеnginx
И поместите упакованные файлы в соответствующий каталог, а затем поместите мойapi
Запустите службу, а затем посетите192.168.1.240/config
, страница может отображаться нормально, и интерфейс также может нормально проксировать запросы. Но страница с маршрутизацией не отображается.
Причина сопоставления пути маршрута
Напомним, что вreact-router-dom
изRoute
передать тегpath={'/xx'}
атрибут, интерфейсная маршрутизация будет основываться на этомpath
сделать соответствующийRoute
прошел дальшеComponent
компоненты. тогда в моемnginx
в настройках я поставилlocation /config
, то есть мой фактический путь доступа имеет префикс/config
, поэтому каждыйRoute
Все пути, переданные в тегах, отсутствуют из-за отсутствия/config
Префикс вызывает неудачу всех совпадений, поэтомуRoute
Нет возможности отобразить страницу.
Метод модификации сопоставления пути маршрута
Метод прост, вBrowserRouter
добавить одинbasename
свойство, перейти к этому свойствуconfig
(Какова конкретная ценность, в зависимости от того, что вы даетеnginx
настраиватьlocation
префикс, в моем случае это былconfig
),такRoute
будет добавлено при сопоставлении путиbasename
, чтобы он мог сопоставить соответствующий путь, а затем отобразить соответствующую страницу.
Суммировать
правильноlinux
незнакомый,nginx
Я тоже не знаком с ним, я полагался на Baidu и много раз пытался его модифицировать.nginx
конфигурация, наконец, в состоянииreact
Упакованные файлы развернуты,vue
Развертывание проекта ничем не отличается.