Развертывание на сервере¶
Вы можете запустить Xitrum напрямую:
Браузер ------ экземпляр Xitrum сервера
Или добавить балансировщик нагрузки (например, HAProxy), или обратный прокси сервер (например, Apache или Nginx):
Браузер ------ Балансировщик/Прокси -+---- экземпляр Xitrum сервера
+---- экземпляр Xitrum сервера
Сборка¶
Используйте команду sbt/sbt xitrum-package
для подготовки директории target/xitrum
, которая
может быть развернута на сервере:
target/xitrum
config
[config files]
public
[static public files]
lib
[dependencies and packaged project file]
script
runner
runner.bat
scalive
scalive.jar
scalive.bat
Сборка и xitrum-package¶
По умолчанию команда sbt/sbt xitrum-package
копирует директории
config
, public
, и script
в target/xitrum
. Если необходимо
дополнительно копировать какие-то директории или файлы измените build.sbt
следующим образом:
XitrumPackage.copy("config", "public, "script", "doc/README.txt", "etc.")
Подробнее смотри xitrum-package.
Подключение Scala консоли к запущенному JVM процессу¶
В боевом режиме, при определенной настройке, допускается использовать Scalive для подключения Scala консоли к работающему JVM процессу для живой отладки.
Запустите scalive
из директории script:
script
runner
runner.bat
scalive
scalive.jar
scalive.bat
Установка Oracle JDK на CentOS или Ubuntu¶
Приведенная информация размещена здесь для удобства. Вы можете установить Java используя пакетный менеджер.
Проверьте установленные альтернативы:
sudo update-alternatives --list java
Пример вывода:
/usr/lib/jvm/jdk1.7.0_15/bin/java
/usr/lib/jvm/jdk1.7.0_25/bin/java
Определите ваше окружение (32 бита или 64 бита):
file /sbin/init
Пример вывода:
/sbin/init: ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.24, BuildID[sha1]=0x4efe732752ed9f8cc491de1c8a271eb7f4144a5c, stripped
Скачайте JDK по ссылке Oracle. Обходной путь для загрузки jdk без браузера:
wget --no-cookies --header "Cookie: gpw_e24=http%3A%2F%2Fwww.oracle.com" "http://download.oracle.com/otn-pub/java/jdk/7u45-b18/jdk-7u45-linux-x64.tar.gz"
Распакуйте и переместите в подходящею папку:
tar -xzvf jdk-7u45-linux-x64.tar.gz
sudo mv jdk1.7.0_45 /usr/lib/jvm/jdk1.7.0_45
Зарегистрируйте как альтернативу:
sudo update-alternatives --install "/usr/bin/java" "java" "/usr/lib/jvm/jdk1.7.0_45/bin/java" 1
sudo update-alternatives --install "/usr/bin/javac" "javac" "/usr/lib/jvm/jdk1.7.0_45/bin/javac" 1
sudo update-alternatives --install "/usr/bin/javap" "javap" "/usr/lib/jvm/jdk1.7.0_45/bin/javap" 1
sudo update-alternatives --install "/usr/bin/javaws" "javaws" "/usr/lib/jvm/jdk1.7.0_45/bin/javaws" 1
Установите как активную альтернативу:
sudo update-alternatives --config java
Пример вывода:
There are 3 choices for the alternative java (providing /usr/bin/java).
Selection Path Priority Status
------------------------------------------------------------
* 0 /usr/lib/jvm/jdk1.7.0_25/bin/java 50001 auto mode
1 /usr/lib/jvm/jdk1.7.0_15/bin/java 50000 manual mode
2 /usr/lib/jvm/jdk1.7.0_25/bin/java 50001 manual mode
3 /usr/lib/jvm/jdk1.7.0_45/bin/java 1 manual mode
Press enter to keep the current choice[*], or type selection number: 3
update-alternatives: using /usr/lib/jvm/jdk1.7.0_45/bin/java to provide /usr/bin/java (java) in manual mode
Проверьте версию:
java -version
Пример вывода:
java version "1.7.0_45"
Java(TM) SE Runtime Environment (build 1.7.0_45-b18)
Java HotSpot(TM) 64-Bit Server VM (build 24.45-b08, mixed mode)
Установите альтернативы так же для:
sudo update-alternatives --config javac
sudo update-alternatives --config javap
sudo update-alternatives --config javaws
Запускайте Xitrum в боевом режиме когда система запускается¶
Скрипт script/runner
(для *nix) и script/runner.bat
(для Windows) запускает
сервер в боевом окружении используя указанный объект как main
класс.
script/runner quickstart.Boot
Вы можете улучшить runner
(или runner.bat
)
настроив JVM.
Так же смотри config/xitrum.conf
.
Для запуска Xitrum в фоновом режиме при старте Linux системы проще всего добавить строчку в /etc/rc.local
:
su - user_foo_bar -c /path/to/the/runner/script/above &
Кроме того можно использовать утилиту daemontools. Для установки на CentOS, смотри инструкцию.
Или используйте Supervisord.
Пример /etc/supervisord.conf
:
[program:my_app]
directory=/path/to/my_app
command=/path/to/my_app/script/runner quickstart.Boot
autostart=true
autorestart=true
startsecs=3
user=my_user
redirect_stderr=true
stdout_logfile=/path/to/my_app/log/stdout.log
stdout_logfile_maxbytes=10MB
stdout_logfile_backups=7
stdout_capture_maxbytes=1MB
stdout_events_enabled=false
environment=PATH=/usr/local/bin:/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/sbin:/opt/aws/bin:~/bin
Настройка портов¶
Xitrum слушает порт 8000 и 4430 по умолчанию.
Вы можете изменить эти порты в конфигурации config/xitrum.conf
.
Вы можете обновить /etc/sysconfig/iptables
для перенаправления портов
80 на 8000 и 443 на 4430:
sudo su - root
chmod 700 /etc/sysconfig/iptables
iptables-restore < /etc/sysconfig/iptables
iptables -A PREROUTING -t nat -i eth0 -p tcp --dport 80 -j REDIRECT --to-port 8000
iptables -A PREROUTING -t nat -i eth0 -p tcp --dport 443 -j REDIRECT --to-port 4430
iptables -t nat -I OUTPUT -p tcp -d 127.0.0.1 --dport 80 -j REDIRECT --to-ports 8000
iptables -t nat -I OUTPUT -p tcp -d 127.0.0.1 --dport 443 -j REDIRECT --to-ports 4430
iptables-save -c > /etc/sysconfig/iptables
chmod 644 /etc/sysconfig/iptables
Конечно в данном примере предполагается что эти порты свободны. Если на них работает Apache остановите его командой:
sudo /etc/init.d/httpd stop
sudo chkconfig httpd off
Смотри так же:
Настройка Linux для обработки большого числа подключений¶
Важно: JDK страдает серьезной проблемой производительности IO (NIO) на Mac.
Смотри так же:
Увеличьте лимит открытых файлов¶
Каждое подключение рассматривается операционной системой как открытый файл. По умолчанию максимальное количество открытых файлов 1024. Для увеличения этого лимита, исправьте /etc/security/limits.conf:
* soft nofile 1024000
* hard nofile 1024000
Нужно заново зайти в систему что бы этот конфигурация подействовала.
Убедитесь что лимит изменился ulimit -n
.
Оптимизация ядра¶
Согласно A Million-user Comet Application with Mochiweb, измените /etc/sysctl.conf:
# General gigabit tuning
net.core.rmem_max = 16777216
net.core.wmem_max = 16777216
net.ipv4.tcp_rmem = 4096 87380 16777216
net.ipv4.tcp_wmem = 4096 65536 16777216
# This gives the kernel more memory for TCP
# which you need with many (100k+) open socket connections
net.ipv4.tcp_mem = 50576 64768 98152
# Backlog
net.core.netdev_max_backlog = 2048
net.core.somaxconn = 1024
net.ipv4.tcp_max_syn_backlog = 2048
net.ipv4.tcp_syncookies = 1
# If you run clients
net.ipv4.ip_local_port_range = 1024 65535
net.ipv4.tcp_tw_recycle = 1
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_fin_timeout = 10
Выполните sudo sysctl -p
что бы применить изменения. Перезагрузка не требуется,
теперь ваше ядро способно обработать гораздо больше подключений.
Замечание об использовании backlog¶
TCP выполняет 3 рукопожатия (handshake) для установки соединения. Когда удаленный клиент устанавливает подключение к серверу, он отправляет SYN пакет, а сервер отвечает SYN-ACK, затем клиент посылает ACK пакет и соединение устанавливается. Xitrum получает соединение после того как оно было полностью установлено.
Согласно статье Socket backlog tuning for Apache, таймаут подключение случается когда SYN пакет теряется. Это происходит потому что очередь backlog переполняется подключениями посылающими SYN-ACK медленным клиентам.
Согласно FreeBSD Handbook, значение 128 обычно слишком мало для обработки подключений на высоко нагруженных серверах. Для таких окружений, рекомендуется увеличить это значение до 1024 или даже выше. Это так же способствует в предотвращении атак Denial of Service (DoS).
Размер backlog для Xitrum установлен в 1024 (memcached так же использует это значение), но вам так же нужно изменить ядро как показано ниже.
Для проверки конфигурации backlog:
cat /proc/sys/net/core/somaxconn
Или:
sysctl net.core.somaxconn
Для установки нового значения используйте:
sudo sysctl -w net.core.somaxconn=1024
HAProxy¶
Смотри пример настройки HAProxy для SockJS.
defaults
mode http
timeout connect 10s
timeout client 10h # Set to long time to avoid WebSocket connections being closed when there's no network activity
timeout server 10h # Set to long time to avoid ERR_INCOMPLETE_CHUNKED_ENCODING on Chrome
frontend xitrum_with_discourse
bind 0.0.0.0:80
option forwardfor
acl is_discourse path_beg /forum
use_backend discourse if is_discourse
default_backend xitrum
backend xitrum
server srv_xitrum 127.0.0.1:8000
backend discourse
server srv_discourse 127.0.0.1:3000
В этом обсуждении предлагается способ настройки HAProxy который позволяет перезагружать конфигурационные файлы без перезапуска сервера.
HAProxy гораздо проще в использовании чем Nginx. Он подходи Xitrum поскольку как сказано в секции про кэширование, Xitrum отдает статические файлы очень быстро. Вам не нужна возможность отдачи статики в Nginx.
Nginx¶
Если вы используете WebSocket или SockJS в Xitrum и Nginx 1.2, то вам следует установить дополнительный модуль nginx_tcp_proxy_module. Nginx 1.3+ поддерживает WebSocket из коробки.
Nginx по умолчанию использует протокол HTTP 1.0. Если ваш сервер возвращает chunked response, вам нужно использовать протокол HTTP 1.1, пример:
location / {
proxy_http_version 1.1;
proxy_set_header Connection "";
proxy_pass http://127.0.0.1:8000;
}
Как сказано в документации к http keepalive, вам следует установить proxy_set_header Connection “”;
Развертывание в Heroku¶
Xitrum может быть запущен на Heroku.
Зарегистрируйтесь и создайте репозиторий¶
Следуя официальной документации, зарегистрируйтесь и создайте git репозиторий.
Создание Procfile¶
Создайте Procfile и сохраните его в корневой директории. Heroku читает этот файл при старте.
web: target/xitrum/script/runner <YOUR_PACKAGE.YOUR_MAIN_CLASS> $PORT
Изменения порта¶
Поскольку Heroku назначает порт автоматически, используйте код:
config/xitrum.conf:
port {
http = ${PORT}
# https = 4430
# flashSocketPolicy = 8430 # flash_socket_policy.xml will be returned
}
Уровень логирования¶
config/logback.xml:
<root level="INFO">
<appender-ref ref="CONSOLE"/>
</root>
Просмотр логов в Heroku:
heroku logs -tail
Создание алиаса для xitrum-package
¶
Во время развертывания, Heroky выполняет sbt/sbt clean compile stage
.
Поэтому вам нужно добавить алиас для xitrum-package
.
build.sbt:
addCommandAlias("stage", ";xitrum-package")
Развертывание на Heroku¶
Процесс развертывания запускается автоматически после git push.
git push heroku master
Смотри также официальная документация по языку Scala.