Подтвердить что ты не робот

Как запустить Snap haskell webapp в производстве?

Я установил Snap/Haskell на моем сервере Ubuntu для производства (на EC2) и проверил мой проект, но как его запустить?

Я имею в виду, локально я запускаю его из командной строки:

project-name -p 8000

Приходит ли у него собственный веб-сервер (он похож на него), и если да, то как мне настроить его на как какой-то демон?

Любые советы?

Изменить 2:

В wiki они говорят:

snap-server - это HTTP-серверная библиотека, поддерживающая интерфейс определенный в snap-core.

В то время как вики "haskell" о "Вариантах развертывания/поддержки для вашего веб-кода haskell" говорят, что Snap:

включает свой собственный сервер. см. Веб/Рамки

Но КАК? Как я могу запустить собственный сервер? Почему я должен знать о развертывании этой проклятой вещи, если мне просто интересно программировать...

Изменить: связанный с этим вопрос: Развернуть код Haskell, который использует Snap Framework

4b9b3361

Ответ 1

Итак, после некоторого копания и , вот что я придумал.

Большая идея

Скомпилируйте приложение Snap в двоичный файл, а затем запустите его как службу с помощью upstart.

Шаг за шагом

  • Скомпилируйте свой webapp. Для этого примера предположим, что webapp находится в /home/john/webapps/mysite:

    $ cd /home/john/webapps/mysite
    $ cabal install
    ...
    Preprocessing executable 'mysite` for 'mysite-0.1'...
    Installing executable(s) in /home/john/.cabal/bin
    

    Как мы видим, двоичный файл помещается в /home/john/.cabal/bin. Вы можете переместить его в любое место, которое вам нравится, но мы оставим его там.

  • Создайте журнал в папке вашего приложения, иначе snap будет жаловаться:

    $ mkdir /home/john/webapps/mysite/log
    
  • Теперь мы создадим сервис, который запустит наш webapp. Для этого мы будем использовать сервисную службу Ubuntu под названием upstart.

    a) Мы называем нашу услугу просто создавая файл conf с нужным именем в каталоге /etc/init/. Позвольте называть его mysite:

    $ sudo vi /etc/init/mysite.conf
    

    b) Теперь добавьте описание того, что наша служба:

    start on startup
    chdir /home/john/webapps/mysite
    exec /home/john/.cabal/bin/mysite -p 80
    

    Во-первых, мы говорим, что служба должна запускаться при запуске (или при загрузке) системы.

    Во-вторых, поскольку snap нуждается в нем snaplets и других статических ресурсах (например, каталог журналов, который мы создали ранее) - мы говорим службе, чтобы она запускалась внутри нашего каталога проектов.

    Наконец, мы указываем двоичный файл, который фактически будет запускаться как служба: /home/john/.cabal/bin/mysite. Мы передаем параметр -p 80 на веб-сервер snap, чтобы он выполнялся на порту 80. (Примечание: вам нужно отключить все серверы apache и nginx, чтобы они больше не занимали этот порт)

  • Готово. Вы можете проверить, запущен ли он и запустить его вручную, если вам нужно:

    initctl list | grep mysite
    initctl start mysite
    

Ответ 2

Да, snap-сервер - это собственный сервер, что означает, что компиляция вашего приложения Haskell/Snap оставляет вам исполняемый файл, который вы можете буквально запустить из командной строки для размещения вашего сайта. Для этого нет внешнего сервера, такого как apache или nginx. Вы можете настроить обратные прокси, если это необходимо, но это зависит от вас.

Вот что я делаю с большинством моих серьезных развертываний:

  • Компиляция на одном и том же ящике Linux или совместимой машине - я почти всегда использую cabal-dev для песочницы
  • Аргументы командной строки: cabal-dev/bin/myapp -p 8010 -e prod +RTS -A4M -qg1
  • Я запускаю непривилегированный, не по умолчанию порт (8010 выше), чтобы я мог использовать балансировщик нагрузки для пересылки запросов на него. Это также позволяет мне запускать несколько приложений с привязкой для каждого окна Linux, если это необходимо.
  • Затем я использую простое приложение для мониторинга процесса, чтобы убедиться, что оно осталось. Вы можете использовать:
  • Когда монитор настроен, вы можете просто отправить сигнал HUP вашему приложению, когда вы хотите перезагрузить компьютер, и приложение мониторинга просто вернет его.
  • Я большой поклонник Fabric для автоматизации развертывания. Вы можете обрабатывать удаленную синхронизацию, перезагрузку и т.д., Используя всю ткань.

Надеюсь, что это поможет.

Ответ 3

Поскольку это Ubuntu, вы почти всегда можете использовать выскочку, чтобы управлять им.

man 5 init

Кроме всего прочего, он позволяет устанавливать иерархии зависимостей для ваших служб. "snapapp зависит от mongodb, поэтому не запускайте snapapp до тех пор, пока mongodb не будет запущен" - вот что.

Да, snap - это веб-сервер, но мы почти всегда ставим nginx перед ними, когда приложения snap только прослушивают локальный хост, а proxy_path указывает на сервер или группу из них.

Забавно, мы почти полностью переключились на Common Lisp для новой разработки на $work, и настройка точно такая же.