# Redmine: избавляемся от Webrick

Источник: https://blog.xsk.in/it/redmine-izbavlyaemsya-ot-webrick/703/
Опубликовано: 2014-12-23 · Рубрики: IT, Linux, nginx, Redmine


Если внимательно читать официальный мануал по установке *Redmine*, то можно наткнуться на замечание:

> Note: Webrick is **not** suitable for production use, please only use webrick for testing that the installation up to this point is functional. Use one of the many other guides in this wiki to setup redmine to use either Passenger (aka mod\_rails), FCGI or a Rack server (Unicorn, Thin, Puma, hellip;) to serve up your redmine.

Я [при установке](/it/redmine-i-gitlab-na-odnom-servere/640/ "Redmine и Gitlab на одном сервере") руководствовался преимущественно русскоязычным гайдом, его составители были или ленивыми, или невнимательными, поэтому долгое время продакшн крутился на *webrick* с жуткими тормозами. В поисках причин и было найдено это уточнение. Переезд на *thin* в качестве бэкенда для *nginx* под катом

Итак, для начала устанавливаем *Thin*:

```
apt-get install thin
```

Перед настройкой создадим папку для логов

```
mkdir /var/log/thin
chmod 755 /var/log/thin
```

Позаботимся заблаговременно о ротации этих логов, чтобы в дальнейшем не возвращаться к проблеме растущего *system time* на сервере. Для этого создаем */etc/logrotate.d/thin* следующего содержания:

```
/var/log/thin/*.log {
        daily
        missingok
        rotate 52
        compress
        delaycompress
        notifempty
        create 640 root adm
        sharedscripts
        postrotate
                /etc/init.d/thin restart >/dev/null
        endscript
}
```

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

```
thin config --config /tmp/redmine.yml --chdir /home/redmine \
    --environment production --socket /var/run/redmine/sockets/thin.sock \
    --daemonize --log /var/log/thin/redmine.log --pid /var/run/thin/redmine.pid \
    --user www-data --group www-data --servers 2 --prefix /redmine
mv /tmp/redmine.yml /etc/thin/redmine.yml
chown root:root /etc/thin/redmine.yml
chmod 644 /etc/thin/redmine.yml
```

Мне больше по душе редактирование конфига руками, в результате файл */etc/thin/redmine.yml* выглядит примерно так:

```
# расположение файла pid
pid: /var/run/thin/thin.pid
# таймаут запросов
timeout: 30
# расположение логов
log: /var/log/thin/redmine.log
# максимальное количество одновременных соединений
max_conns: 1024
# подключение библиотек
require: []

# окружение фреймворка
environment: production
# максимальное количество постоянных соединений
max_persistent_conns: 512
# смена текущей директории
chdir: /home/redmine
# количество запускаемых серверов thin
servers: 2
# переходить в режим демона
daemonize: true

# расположение сокета
socket: /home/redmine/tmp/sockets/thin.sock
# учетная запись, под которой будет работать
# сервер thin
user: www-data
# группа, под которой будет работать сервер thin
group: www-data
```

Проверяем наличие run-скрипта */etc/init.d/thin* и при необходимости правим его:

```
#!/bin/sh
### BEGIN INIT INFO
# Provides:          thin
# Required-Start:    $local_fs $remote_fs
# Required-Stop:     $local_fs $remote_fs
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: thin initscript
# Description:       thin
### END INIT INFO

# Original author: Forrest Robertson

# Do NOT "set -e"

DAEMON=/usr/bin/thin
SCRIPT_NAME=/etc/init.d/thin

# Exit if the package is not installed
[ -x "$DAEMON" ] || exit 0

run_action() {
        ACTION="$1"

	if [ -x /usr/bin/ruby1.8 ]; then
	    /usr/bin/ruby1.8 $DAEMON $ACTION --all /etc/thin1.8
	fi

	if [ -x /usr/bin/ruby1.9.1 ]; then
	    /usr/bin/ruby1.9.1 $DAEMON $ACTION --all /etc/thin
	fi

}

case "$1" in
  start)
	run_action start
	;;
  stop)
	run_action stop
	;;
  restart|force-reload|reload)
	run_action restart
	;;
  *)
	echo "Usage: $SCRIPT_NAME {start|stop|restart}" >&2
	exit 3
	;;
esac

:
```

Запускаем, проверяем наличие *"thin server"* в списке процессов. Если что-то не работает - читаем логи, особое внимание стоит уделить наличию необходимых прав на рабочей директории *redmine* и папок для логов и *pid*-файлов.

После успешного запуска нового сервера правим конфигурацию nginx

```
	server {
		listen :80;
		server_name redmine;
		error_log   /var/log/nginx/thin_error.log;
		root /home/redmine/public;
		location / {
			try_files $uri $uri/index.html $uri.html @redmine_thin;
		}
		location @redmine_thin {
			proxy_pass http://redmine_thin;
			proxy_set_header   X-Forwarded-Proto $scheme;
			proxy_set_header   Host              $http_host;
			proxy_set_header   X-Real-IP         $remote_addr;
			proxy_redirect off;
		}
	}
	upstream redmine_thin {
		server unix://home/redmine/tmp/sockets/thin.0.sock;
		server unix://home/redmine/tmp/sockets/thin.1.sock;
	}
```

Здесь количество воркеров в директиве **upstream** совпадает с указанным в конфиге *thin* количеством запускаемых серверов.

Использование **try\_files** позволяет избавить *thin* от раздачи статики, этим занимается непосредственно сам *nginx*.

*Ссылки:*

- [Installing Redmine](http://www.redmine.org/projects/redmine/wiki/RedmineInstall)
- [Installing Redmine with MySQL Thin and Redmine on Debian Squeeze](https://www.debian-administration.org/article/673/Installing_Redmine_with_MySQL_Thin_and_Redmine_on_Debian_Squeeze)

