Как развернуть приложение Meteor.js в Ubuntu 14.04 с Nginx

О Meteor.js

http://meteor.com [Meteor.js] - это среда для JavaScript, которая позволяет веб-разработчикам один раз написать код JavaScript и повторно использовать его как на стороне клиента, так и на стороне сервера. Это стало возможным благодаря уникальному процессу сборки в Meteor (подробнее о http://docs.meteor.com/#structuringyourapp так, чтобы он структурировал код вашего приложения и совместное использование кода)). Это также решает проблему необходимости сложного процесса развертывания между development mode, где разработчики кодируют и отлаживают, и production mode, который достаточно безопасен для общедоступной версии приложения. Среда Meteor обеспечивает тесную связь между клиентским кодом и серверным кодом, а также разработкой и производством. Это, наверное, самый простой способ для разработчиков на стороне клиента начать работу над кодом на стороне сервера!

Чтобы увидеть это в действии, вы можете просмотреть вступительный video на веб-сайте Meteor.

Meteor.js позволяет разрабатывать проекты, такие как веб-сайт (веб-приложение), приложение веб-браузера на основе HTML5 (с использованием AppCache) или мобильное приложение (через интеграцию с PhoneGap). Все, что вам нужно, это знание Javascript и HTML. Meteor включает поддержку MongoDB (база данных NoSQL). Atmosphere содержит пакеты, которые могут предоставить полные строительные блоки для вашего приложения, чтобы еще больше ускорить разработку.

  • В конце этого урока у нас будет: *

  • Установлен Meteor.js

  • Создан пакет развертывания, который содержит все приложение Meteor в готовом производственном формате (за исключением веб-сервера и базы данных)

  • Установил Nginx в качестве нашего веб-сервера для передачи HTTP-запросов в Meteor.

  • Установил MongoDB в качестве нашей базы данных

  • Управляем нашим приложением с помощью Upstart

  • Настроенные ежедневные резервные копии базы данных для базы данных Meteor

В этом руководстве, если у вас еще нет собственного приложения Meteor, вы можете использовать пример приложения «Список Todo» с веб-сайта Meteor.

Прежде чем вы начнете

У тебя должно быть:

  • Существующее приложение Meteor на отдельном компьютере разработчика (вы можете просмотреть пример приложения «Список Todo» here; инструкции приведены ниже в руководстве)

  • Свежий * Ubuntu 14.04 * сервер; существующие метеорологические установки должны работать в большинстве случаев

  • * root * доступ к серверу для выполнения команд

  • Обновлены списки пакетов. Выполнение: + apt-get update

  • Замените доменным именем, которое вы фактически используете (или оставьте его, если у вас нет домена и вы будете использовать вместо него IP-адрес)

  • Замените (без .net) на имя вашего приложения

Шаг 1 - Настройка веб-сервера Nginx

Мы установим и настроим Nginx, потому что он позволяет нам шифровать веб-трафик с помощью SSL, функции, которую не предоставляет встроенный веб-сервер Meteor. Nginx также позволит нам обслуживать другие веб-сайты на том же сервере, а также фильтровать и регистрировать трафик.

В нашей конфигурации мы будем защищать наш сайт с помощью SSL-сертификата и перенаправлять весь трафик с HTTP на HTTPS. Мы также будем использовать несколько новых методов обеспечения безопасности для повышения безопасности SSL-соединения.

Для установки Nginx мы выполняем:

apt-get install nginx

Создайте файл конфигурации виртуального хоста в + / etc / nginx / sites-available +.

Ниже приведен аннотированный файл конфигурации, который мы можем создать как + / etc / nginx / sites-available / + со следующим содержимым. Пояснения ко всем параметрам конфигурации включены в комментарии в файле:

server_tokens off; # for security-by-obscurity: stop displaying nginx version

# this section is needed to proxy web-socket connections
map $http_upgrade $connection_upgrade {
   default upgrade;
   ''      close;
}

# HTTP
server {
   listen 80 default_server; # if this is not a default server, remove "default_server"
   listen [::]:80 default_server ipv6only=on;

   root /usr/share/nginx/html; # root is irrelevant
   index index.html index.htm; # this is also irrelevant

   server_name ; # the domain on which we want to host the application. Since we set "default_server" previously, nginx will answer all hosts anyway.

   # redirect non-SSL to SSL
   location / {
       rewrite     ^ https://$server_name$request_uri? permanent;
   }
}

# HTTPS server
server {
   listen 443 ssl spdy; # we enable SPDY here
   server_name ; # this domain must match Common Name (CN) in the SSL certificate

   root html; # irrelevant
   index index.html; # irrelevant

   ssl_certificate /etc/nginx/ssl/; # full path to SSL certificate and CA certificate concatenated together
   ssl_certificate_key /etc/nginx/ssl/; # full path to SSL key

   # performance enhancement for SSL
   ssl_stapling on;
   ssl_session_cache shared:SSL:10m;
   ssl_session_timeout 5m;

   # safety enhancement to SSL: make sure we actually use a safe cipher
   ssl_prefer_server_ciphers on;
   ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
   ssl_ciphers 'ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:kEDH+AESGCM:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-RSA-AES256-SHA256:DHE-DSS-AES256-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:ECDHE-RSA-RC4-SHA:ECDHE-ECDSA-RC4-SHA:RC4-SHA:HIGH:!aNULL:!eNULL:!EXPORT:!DES:!3DES:!MD5:!PSK';

   # config to enable HSTS(HTTP Strict Transport Security) https://developer.mozilla.org/en-US/docs/Security/HTTP_Strict_Transport_Security
   # to avoid ssl stripping https://en.wikipedia.org/wiki/SSL_stripping#SSL_stripping
   add_header Strict-Transport-Security "max-age=31536000;";

   # If your application is not compatible with IE <= 10, this will redirect visitors to a page advising a browser update
   # This works because IE 11 does not present itself as MSIE anymore
   if ($http_user_agent ~ "MSIE" ) {
       return 303 https://browser-update.org/update.html;
   }

   # pass all requests to Meteor
   location / {
       proxy_pass http://127.0.0.1:8080;
       proxy_http_version 1.1;
       proxy_set_header Upgrade $http_upgrade; # allow websockets
       proxy_set_header Connection $connection_upgrade;
       proxy_set_header X-Forwarded-For $remote_addr; # preserve client IP

       # this setting allows the browser to cache the application in a way compatible with Meteor
       # on every applicaiton update the name of CSS and JS file is different, so they can be cache infinitely (here: 30 days)
       # the root path (/) MUST NOT be cached
       if ($uri != '/') {
           expires 30d;
       }
   }
}

Если вы хотите адаптировать файл конфигурации к вашим потребностям, и для получения более подробных объяснений, посмотрите этот учебник на https://www.digitalocean.com/community/tutorials/how-to-set-up-nginx- server-blocks-virtual-hosts-on-ubuntu-14-04-lts [виртуальные хосты Nginx].

Как видно из файла конфигурации виртуального хоста, Nginx будет ожидать действительный сертификат SSL и ключ в + / etc / nginx / ssl +. Нам нужно создать этот каталог и обезопасить его:

mkdir /etc/nginx/ssl
chmod 0700 /etc/nginx/ssl

Затем мы можем создать файлы, содержащие сертификат (и цепной сертификат, если требуется) и ключ в местах, которые мы определили в конфигурации выше:

  • сертификат: + / etc / nginx / ssl / +

  • ключ: + / etc / nginx / ssl / +

Если у вас еще нет SSL-сертификата и ключа, вы должны создать самозаверяющий сертификат, используя этот https://www.digitalocean.com/community/tutorials/how-to-create-a-ssl-certificate-on. -nginx-for-ubuntu-12-04 [учебник по созданию самозаверяющих SSL-сертификатов для Nginx]. Помните, что вы хотите использовать те же имена из файла конфигурации, как * todos.key * в качестве имени ключа и * todos.pem * в качестве имени сертификата. Хотя самоподписанный сертификат подходит для тестирования, рекомендуется использовать коммерческий, подписанный сертификат для производственного использования. Самозаверяющий сертификат вызовет предупреждения Nginx, связанные с ssl_stapling, и предупреждение безопасности в веб-браузере.

Когда вы закончите создание или получение сертификата, убедитесь, что у вас есть файлы + todos.pem + и + todos.key +, упомянутые выше.

Далее мы должны отключить vhost по умолчанию:

rm /etc/nginx/sites-enabled/default

И включите наш Meteor vhost:

ln -s /etc/nginx/sites-available/ /etc/nginx/sites-enabled/

Проверьте, что конфигурация vhost не содержит ошибок (вы увидите ошибку, связанную с ssl_stapling, если у вас есть самозаверяющий сертификат; это нормально):

nginx -t

Если все выглядит хорошо, мы можем применить изменения к Nginx:

nginx -s reload

На данный момент вы можете использовать свой веб-браузер для посещения https: // (или ваш IP-адрес). Это покажет нам * 502 Bad Gateway *. Это нормально, потому что у нас еще не запущен Метеор!

Шаг второй - Настройка базы данных MongoDB

Мы установим MongoDB из обычного репозитория Ubuntu. Стандартная конфигурация должна быть в порядке. Для подключения к базе данных аутентификация не требуется, но соединения возможны только с локального хоста. Это означает, что внешние подключения невозможны, и, следовательно, база данных безопасна, если у нас нет недоверенных пользователей с SSH-доступом к системе.

Установите серверный пакет MongoDB:

apt-get install mongodb-server

Это все, что нам нужно сделать, чтобы запустить MongoDB. Чтобы убедиться, что доступ с внешних хостов невозможен, мы выполним следующее, чтобы убедиться, что MongoDB привязан к * 127.0.0.1 *. Проверьте с помощью этой команды:

netstat -ln | grep -E '27017|28017'

Ожидаемый результат:

tcp        0      0 127.0.0.1:27017         0.0.0.0:*               LISTEN
tcp        0      0 127.0.0.1:28017         0.0.0.0:*               LISTEN
unix  2      [ ACC ]     STREAM     LISTENING     6091441  /tmp/mongodb-27017.sock

Чтобы иметь ежедневные резервные копии на случай, если что-то пойдет не так, мы можем * опционально * установить простую команду в качестве ежедневной задачи cron. Создайте файл + / etc / cron.d / mongodb-backup +:

@daily root mkdir -p /var/backups/mongodb; mongodump --db  --out /var/backups/mongodb/$(date +'\%Y-\%m-\%d')

Шаг 3 - Установка приложения Meteor

Для начала нам нужно установить Node.js. Поскольку для Meteor обычно требуется версия Node.js, более новая, чем та, которая доступна в стандартном репозитории, мы будем использовать пользовательский PPA _ (на момент написания Ubuntu 14.04 предоставляет nodejs = 0.10.25 ~ dfsg2-2ubuntu1, а Meteor 0.8.3 требуется Node.js 0.10.29 или новее) _.

Выполните следующее, чтобы добавить PPA с Node.js, и подтвердите, нажав Enter:

add-apt-repository ppa:chris-lea/node.js

Выход:

Evented I/O for V8 javascript. Node's goal is to provide an easy way to build scalable network programs
More info: https://launchpad.net/~chris-lea/+archive/ubuntu/node.js
Press [ENTER] to continue or ctrl-c to cancel adding it

gpg: keyring `/tmp/tmphsbizg3u/secring.gpg' created
gpg: keyring `/tmp/tmphsbizg3u/pubring.gpg' created
gpg: requesting key C7917B12 from hkp server keyserver.ubuntu.com
gpg: /tmp/tmphsbizg3u/trustdb.gpg: trustdb created
gpg: key C7917B12: public key "Launchpad chrislea" imported
gpg: Total number processed: 1
gpg:               imported: 1  (RSA: 1)
OK

Теперь мы должны обновить кеш репозитория, а затем мы можем установить Node.js и npm (менеджер пакетов Node.js):

apt-get update
apt-get install nodejs

Рекомендуется запускать наше приложение Meteor как обычный пользователь. Поэтому специально для этой цели мы создадим нового пользователя системы:

adduser --disabled-login

Выход:

Adding user `todos' ...
Adding new group `todos' (1001) ...
Adding new user `todos' (1001) with group `todos' ...
Creating home directory `/home/todos' ...
Copying files from `/etc/skel' ...
Changing the user information for todos
Enter the new value, or press ENTER for the default
       Full Name []:
       Room Number []:
       Work Phone []:
       Home Phone []:
       Other []:
Is the information correct? [Y/n]

Шаг четвертый - Настройка Upstart

Теперь мы готовы создать сервис Upstart для управления наше приложение Метеор. Upstart автоматически запустит приложение при загрузке и перезапустит Meteor в случае его смерти. Подробнее о создании файлов службы Upstart можно прочитать в this учебник .

Создайте файл + / etc / init / .conf +. Еще раз, это аннотировано в строке:

# upstart service file at /etc/init/
description "Meteor.js (NodeJS) application"
author "Daniel Speichert <[email protected]>"

# When to start the service
start on started mongodb and runlevel [2345]

# When to stop the service
stop on shutdown

# Automatically restart process if crashed
respawn
respawn limit 10 5

# we don't use buil-in log because we use a script below
# console log

# drop root proviliges and switch to mymetorapp user
setuid
setgid

script
   export PATH=/opt/local/bin:/opt/local/sbin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
   export NODE_PATH=/usr/lib/nodejs:/usr/lib/node_modules:/usr/share/javascript
   # set to home directory of the user Meteor will be running as
   export PWD=/home/
   export HOME=/home/
   # leave as 127.0.0.1 for security
   export BIND_IP=127.0.0.1
   # the port nginx is proxying requests to
   export PORT=8080
   # this allows Meteor to figure out correct IP address of visitors
   export HTTP_FORWARDED_COUNT=1
   # MongoDB connection string using  as database name
   export MONGO_URL=mongodb://localhost:27017/
   # The domain name as configured previously as server_name in nginx
   export ROOT_URL=https://
   # optional JSON config - the contents of file specified by passing "--settings" parameter to meteor command in development mode
   export METEOR_SETTINGS='{ "somesetting": "someval", "public": { "othersetting": "anothervalue" } }'
   # this is optional: http://docs.meteor.com/#email
   # commented out will default to no email being sent
   # you must register with MailGun to have a username and password there
   # export MAIL_URL=smtp://[email protected]:[email protected]
   # alternatively install "apt-get install default-mta" and uncomment:
   # export MAIL_URL=smtp://localhost
   exec node /home//bundle/main.js >> /home//.log
end script

В этом файле конфигурации нужно обратить внимание на параметр + METEOR_SETTINGS +. Если вы используете + meteor --settings config.json + при запуске режима разработки Meteor, то вы должны вставить содержимое + config.json + в качестве переменной в + METEOR_SETTINGS +.

+ MAIL_URL + должен быть действительным SMTP-URL * только *, если вы планируете использовать пакет электронной почты Meteor. Вы можете использовать MailGun (в соответствии с рекомендациями Meteor), локальный почтовый сервер и т. Д.

Как мы видим из файла, журнал будет сохранен в + / home //. Log. + Этот файл не будет вращаться и * будет расти * со временем. Это хорошая идея, чтобы следить за этим. В идеале в нем не должно быть много контента (ошибок). При желании вы можете настроить вращение log или замените + >> + на +> + в конце сценариев Upstart, чтобы перезаписать весь файл, а не добавлять его в конец.

Пока не запускайте эту услугу, поскольку у нас пока нет актуальных файлов приложений Meteor!

Шаг пятый - Развертывание приложения Meteor

  • Необязательно: Если у вас еще нет проекта Meteor *

Если у вас еще нет проекта Meteor и вы хотите использовать демонстрационное приложение, это не проблема!

  • Сделайте этот следующий шаг на своем домашнем компьютере или на сервере Linux разработки. * Команды могут различаться в зависимости от вашей ОС. Переместить в вашу домашнюю папку:

cd ~

Во-первых, установите версию разработки Meteor:

curl https://install.meteor.com | /bin/sh

Затем создайте приложение из примера с именем Todo List:

meteor create --example todos

Теперь введите каталог вашего приложения, и вы готовы продолжить:

cd todos
  • Все проекты Метеор *

Пришло время создать пакет производственной версии из нашего приложения Meteor. Следующие команды должны выполняться на вашем * домашнем компьютере или сервере разработки Linux *, где бы ни находилось ваше приложение Meteor. Перейдите в каталог вашего проекта:

cd

И выполнить:

meteor build .

Это создаст архивный файл типа + todos.tar.gz + в каталоге ++. Скопируйте этот файл в каталог + ~ + на вашей Droplet.

scp .tar.gz root@:~
  • Теперь вернитесь к своей Droplet. * Создайте каталог проекта и переместите в него файл архивного проекта. Обратите внимание, что это домашняя папка для пользователя проекта, который мы создали ранее, а не ваша корневая домашняя папка:

mkdir /home/
mv .tar.gz /home/

Перейдите в каталог проекта и распакуйте его:

cd /home/
tar -zxf .tar.gz

Взгляните на проект README:

cat /home//bundle/README

В комплект входит файл + README + с содержимым:

This is a Meteor application bundle. It has only one external dependency:
Node.js 0.10.29 or newer. To run the application:

 $ (cd programs/server && npm install)
 $ export MONGO_URL='mongodb://user:password@host:port/databasename'
 $ export ROOT_URL='http://example.com'
 $ export MAIL_URL='smtp://user:password@mailhost:port/'
 $ node main.js

Use the PORT environment variable to set the port where the
application will listen. The default is 80, but that will require
root on most systems.

Find out more about Meteor at meteor.com.

Этот рецепт отражен в нашем файле + / etc / init / .conf +. В README упоминается еще одна вещь, которую мы должны сделать.

Теперь нам нужно установить некоторые необходимые модули npm. Чтобы собрать некоторые из них, нам также нужно установить g ++ и сделать:

apt-get install g++ make
cd /home//bundle/programs/server
npm install

Вы должны увидеть результат примерно так:

npm WARN package.json [email protected] No description
npm WARN package.json [email protected] No repository field.
npm WARN package.json [email protected] No README data

> [email protected] install /home/todos/bundle/programs/server/node_modules/fibers
> node ./build.js

`linux-x64-v8-3.14` exists; testing
Binary is fine; exiting
[email protected] node_modules/underscore

[email protected] node_modules/semver

[email protected] node_modules/source-map-support
└── [email protected] ([email protected])

[email protected] node_modules/fibers

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

Мы почти готовы запустить приложение, но так как мы работали с файлами как root, и они должны принадлежать пользователю ++, нам нужно обновить владельца каталога проекта:

chown : /home/ -R

Шаг шестой - Showtime

На данный момент у нас есть все необходимое для запуска нашего приложения Meteor:

  • Среда Node.js установлена

  • Приложение установлено в своем каталоге проекта

  • Сервис Upstart настроен для запуска приложения

  • База данных MongoDB

  • Прокси-сервер Nginx перед нашим приложением Meteor для шифрования SSL

Чтобы запустить наше приложение, давайте выполним эту команду из каталога проекта:

start

Теперь вы сможете просматривать свое приложение в браузере по адресу https: //.

Повторное развертывание приложения

Когда вы вносите изменения в режим разработки (и вы будете; в конце концов, мы разработчики!), Вы можете просто повторить пятый шаг (начиная с + meteor build +) и пройти большинство шагов до + restart + команда, которая перезагрузит ваше приложение через Upstart.

Таким образом, вы можете вставить новую версию без простоев. Клиенты (посетители вашего сайта) автоматически извлекают новую версию кода и обновляют свою страницу - это волшебство Meteor!

Если вы хотите проверить это, вы можете просто изменить текст на странице + todos / client / todos.html + в своей копии приложения на своем домашнем компьютере или сервере разработки.

  • Сервер разработки: *

Телосложение:

meteor build

Загрузить:

scp .tar.gz root@:/home/
  • Производственный сервер: *

Expand:

tar -zxf /home//.tar.gz

Переместитесь в папку проекта:

cd /home//bundle/programs/server

Обновите модули npm (вы можете увидеть несколько предупреждений):

npm install

Перезапустите приложение:

restart

Поиск проблемы

Если что-то пойдет не так, вот несколько советов о том, где искать проблемы:

  • Проверьте + / home //. Log +, если ваше приложение запускается и умирает; он должен выдать соответствующее сообщение об ошибке (например, в случае ошибки программирования).

  • Проверьте + / var / log / nginx / error.log +, если вы видите ошибку HTTP вместо вашего приложения.

  • Проверьте + / var / log / mongodb / mongod.log, если вы думаете, что может быть проблема с базой данных.

Наконец, проверьте, все ли сервисы запущены:

status
service nginx status
status mongodb
Related