Использование Phusion Passenger для развертывания приложения, созданного с помощью create-реакции-приложения - PullRequest
0 голосов
/ 05 января 2020

Я создал веб-приложение, начиная с команды npx create-react-app myapp. Я надеюсь использовать Phusion Passenger с Nginx для обслуживания приложения из собственного субдомена. Моя проблема (я полагаю) состоит в том, чтобы сообщить Phusion Passenger, где найти файл, который Node.js должен запустить.

На моей машине для разработки все работает нормально.

Я использовал git push ... загрузить проект на мой сервер Ubuntu 16.04. Там, как описано здесь , я запустил npm run build.

В соответствии с документацией это ...

  • Сборка приложения для производства до сборки папка.
  • Правильно связывает React в рабочем режиме и оптимизирует сборку для достижения максимальной производительности.
  • Гарантирует, что сборка минимизирована, а имена файлов содержат хэши.

Вкратце: Ваше приложение готово к развертыванию.

Я успешно использовал serve -s build для запуска приложения на порту 5000 и проверил с помощью curl http://localhost:5000, что минимизировано HTML-файл обслуживается локально на сервере.

Теперь мне нужно сообщить Phusion Passenger о запуске приложения, и здесь мне нужна помощь. Следуя инструкциям здесь , я создал следующий файл конфигурации nginx:

server {
    listen 80;
    server_name subdomain.example.com;

    # Tell Nginx and Passenger where your app's 'public' directory is
    root /var/www/myapp/web/public;

    # Turn on Passenger
    passenger_enabled on;
    # Tell Passenger that your app is a Node.js app
    passenger_app_type node;
    passenger_startup_file app.js; ## THIS IS WHERE I THINK THE ISSUE IS ##
} 

Насколько я понимаю, последняя строка должна указывать, какой файл Node.js должен запускаться. В случае создания проекта с использованием npx create-react-app..., файл, запускаемый Node.js в режиме разработки, имеет значение src/index.js, а не app.js.

Где мне указать passenger_startup_file, чтобы найти файл для запуска в производственном режиме? Или я должен думать об этом совершенно по-другому?

1 Ответ

0 голосов
/ 31 января 2020

Ваш подход в порядке, и Nginx / Phusion Passeger по умолчанию работает в режиме production.

Я еще не пробовал запускать приложения Node, но сделал это для Python. Я предполагаю, что для узла это работает так же. Однако мне не нужно было указывать passenger_app_type и passenger_startup_file, поскольку Phusion Passenger использует настройки приложения Python по умолчанию, такие как:

passenger_app_type wsgi;
passenger_startup_file passenger_wsgi.py;

passenger_wsgi.py или в вашем случае app.js является точкой входа в приложение, поэтому она должна быть создана в папке приложения, в вашем случае: /var/www/myapp/web В этом файле вам необходимо импортировать ваше фактическое приложение Node. Поэтому оставьте файл конфигурации таким, какой он есть, но убедитесь, что в app.js вы импортируете и запустите приложение Node. Имя приложения wsgi должно быть «application», поэтому в моем случае (Python app) passenger_wsgi.py содержит только одну строку:

from app import MyApp as application

Возможно, ваш app.js уже ваше приложение Node, поэтому вам не нужно импортировать ваше приложение туда, это зависит от того, как вы его настроили ...

Вы можете просмотреть журнал ошибок в nginx расположение по умолчанию /var/log/nginx/error.log, но увидеть содержимое, которое вам, вероятно, нужно использовать:

sudo vi /var/log/nginx/error.log

Откройте файл и очистите его или пометьте последнюю строку «START NEW LOG», чтобы вы знали, где начинается новый журнал, когда вы в следующий раз откроете журнал для просмотреть это. Перезагрузите сервер с помощью:

$ sudo service nginx restart

Затем go в своем браузере и откройте страницу: http://www.yourdomain.com, затем go вернитесь на свой сервер и просмотрите ошибку Nginx log.

Что вы видите в журнале? Иногда полезно, чтобы ваш Node-скрипт или файл точки входа (приложение. js) распечатывали некоторую информацию, например переменные окружения и т. Д. c, чтобы убедиться, что она использует правильные значения и что все настроено так, как вы ожидаете. Так что для Python я бы сделал в app.py или прямо в passenger_wsgi.py:

import sys
import os 
def application(environ, start_response):
       start_response("200 OK", [("Content-Type", "text/plain")])
       ret = ["%s: %s\n" % (key, value)
               for key, value in environ.items()]
       ret.append('sys.version: {}\n'.format(sys.version))
       ret.append('sys.executable: {}\n'.format(sys.executable))
       ret.append('sys.path: {}\n'.format(sys.path))
       return ret

Но вам нужно перевести его на JavaScript или TypeScript, поскольку ваше приложение является приложением Node. Поэтому в следующий раз, когда вы откроете свое приложение в браузере, вы увидите напечатанные параметры среды и системы. Затем вам нужно сравнить его с тем, что вы видите, когда запускаете приложение локально на сервере в терминале (не используя браузер и URL). Надеюсь, это поможет

...