Как развернуть приложение Angular Universal на рабочем сервере Node.js? - PullRequest
0 голосов
/ 20 октября 2019

У меня есть приложение Angular 8 с Universal, которое я хочу развернуть на общем рабочем сервере веб-хостинга. Я заранее проконсультировался с веб-хостингом, и они сказали, что на их общем веб-хостинге возможно размещение универсального углового веб-приложения. Однако, что бы я ни делал, я не могу заставить сайт работать. Когда я захожу на сайт, я вижу сообщение: «Этот сайт недоступен»

То, что я сделал до сих пор:

  1. Сборка проекта с помощью npm run build:ssr, создавший папку dist с папкой браузера и сервера и файлом server.js
  2. Переместите папку dist на сервер внутри папки public_html. Затем получил доступ к серверу через SSH и выполнил следующие действия:
  3. install Node.js и npm
  4. npm install
  5. npm install pm2 -g
  6. pm2 start dist/server.js

pm2 запускается без проблем.

Это некоторые файлы проекта. Если что-то отсутствует, пожалуйста, спросите, и я добавлю их к вопросу.

Часть package.json со скриптами:

  "scripts": {
    "ng": "ng",
    "start": "ng serve",
    "build": "ng build",
    "test": "ng test",
    "lint": "ng lint",
    "e2e": "ng e2e",
    "compile:server": "webpack --config webpack.server.config.js --progress --colors",
    "serve:ssr": "node dist/server",
    "build:ssr": "npm run build:client-and-server-bundles && npm run compile:server",
    "build:client-and-server-bundles": "ng build --prod && ng run ProjectName:server:production --bundleDependencies all"
  },

server.js из сборки (толькоэкспресс-часть, поскольку в ней более 25 000 строк):

const app = express__WEBPACK_IMPORTED_MODULE_1__();
const PORT = process.env.PORT || 4000;
const DIST_FOLDER = Object(path__WEBPACK_IMPORTED_MODULE_2__["join"])(process.cwd(), 'dist/browser');
// * NOTE :: leave this as require() since this file is built Dynamically from webpack
const { AppServerModuleNgFactory, LAZY_MODULE_MAP, ngExpressEngine, provideModuleMap } = __webpack_require__(144);
// Our Universal express-engine (found @ https://github.com/angular/universal/tree/master/modules/express-engine)
app.engine('html', ngExpressEngine({
    bootstrap: AppServerModuleNgFactory,
    providers: [
        provideModuleMap(LAZY_MODULE_MAP)
    ]
}));
app.set('view engine', 'html');
app.set('views', DIST_FOLDER);
// Example Express Rest API endpoints
// app.get('/api/**', (req, res) => { });
// Serve static files from /browser
app.get('*.*', express__WEBPACK_IMPORTED_MODULE_1__["static"](DIST_FOLDER, {
    maxAge: '1y'
}));
// All regular routes use the Universal engine
app.get('*', (req, res) => {
    res.render('index', { req });
});
// Start up the Node server
app.listen(PORT, () => {
    console.log(`Node Express server listening on http://localhost:${PORT}`);
});

Согласно нескольким ответам на SO или в другом месте, вы просто «копируете», вставляете папку dist на сервер, запускаете pm2 и ваш веб-сайт предположительно работает. Я чувствую, что чего-то не хватает, чтобы заставить его работать.

Кто-нибудь знает, как правильно развернуть сайт Angular Universal на рабочем сервере?

Ответы [ 2 ]

0 голосов
/ 27 октября 2019

Я закончил тем, что использовал в консоли DirectAdmin инструмент под названием NodeJS Selector, потому что PM2 продолжал вызывать проблемы для меня. Это инструмент для установки приложения, установите npm и запустите приложение. Так что в основном то, что вы делаете, используя SSH, но в необычном интерфейсе. Настройка выглядит следующим образом: NodeJS Selector setup

С моей структурой папок, выглядящей так:

domains
    - appname.com
        - public_html
            - browser (=> this set as the document root in Apache, because index is located here)
                - index.html
                - .htaccess
                - other files...
            - server
            - server.js
            - package.json

Мой веб-хост сделал 2 вещи, потому что я 'я не являюсь пользователем root на сервере. Они устанавливают documentroot в папку браузера в файле Apache httpd.conf. В том же файле они также добавили настройки proxy к порту 4000, потому что там работает мое приложение. Таким образом, в файле httpd.conf будет что-то вроде этого:

 DocumentRoot "/domains/appname.com/public_html/browser"

 <Proxy *>
  Order allow,deny
  Allow from all
 </Proxy>
 ProxyPreserveHost On
 ProxyRequests Off
 ProxyPass / https://localhost:4000/
 ProxyPassReverse / https://localhost:4000/

Далее в селекторе NodeJS вы устанавливаете корень, в котором находится файл запуска (в моем случае server.js). Пакет package.json также должен находиться в папке de public_html, чтобы вы могли npm установить в селекторе.

Чтобы запустить приложение, нажмите 'Запустить JS-скрипт' и выберите параметр serve: ssr, и он запускает команду сервера узла.

Документы Angular описывают, как вам нужно переписать некоторые правила на сервере. Apache установлен на моем веб-сервере, поэтому я добавил файл .htaccess с правилами перезаписи из документации. Однако это приложение обслуживается узлом, и узел может обслуживать фактические пути. Поэтому в моем случае мне не нужно было добавлять файл .htaccess с правилами перезаписи. Напротив, когда я добавил файл .htaccess, это привело к тому, что универсальная сторона моего приложения не полностью рендерилась. См. этот вопрос для получения дополнительной информации.

0 голосов
/ 20 октября 2019

В server.ts изменение файла

const DIST_FOLDER = join(process.cwd(), 'dist/browser');

на

const DIST_FOLDER = join(process.cwd(), 'browser');

Теперь создайте приложение с помощью npm run build:ssr и скопируйте все содержимое папки dist в общую папку (на хосте). Помните, вместо pm2 start dist/server.js вы должны запустить pm2 start server.js.

...