Различия

Здесь показаны различия между двумя версиями данной страницы.

Ссылка на это сравнение

redmine_3_nginx_passenger_mysql_centos_7 [2017/02/15 00:00] (текущий)
Строка 1: Строка 1:
 +====== Redmine 3 + Nginx + Passenger + MySQL + CentOS 7 ======
  
 +Установку приложений и самого Redmine будем выполнять в рамках отдельного пользователя - **appuser** .
 +
 +
 +  * **Создадим нового пользователя**
 +
 +<code bash>
 +useradd appuser -s /​sbin/​nologin
 +</​code>​
 +
 +  * **Разрешим использовать sudo**
 +
 +<code bash>
 +visudo
 +</​code>​
 +
 +<​code>​
 +...
 +appuser ALL=(ALL) ​      ALL
 +...
 +appuser ALL=(ALL) ​      ​NOPASSWD:​ ALL
 +...
 +</​code>​
 +
 +----
 +
 +===== Установка зависимостей =====
 +
 +<code bash>
 +yum install http://​www.percona.com/​downloads/​percona-release/​redhat/​0.1-4/​percona-release-0.1-4.noarch.rpm
 +yum update -y
 +yum install zlib-devel curl-devel openssl-devel httpd-devel apr-devel apr-util-devel mysql-devel ftp wget ImageMagick-devel gcc-c++ patch readline readline-devel zlib libyaml-devel libffi-devel make bzip2 autoconf automake libtool bison iconv-devel gcc epel-release
 +</​code>​
 +
 +----
 +
 +===== Фаерволл =====
 +==== iptables ====
 +Если предпочитаете работать с iptables вместо firewalld, то вначале выполним подготовительные работы
 +
 +  * **Отключаем firewalld**
 +
 +<code bash>
 +systemctl stop firewalld
 +systemctl disable firewalld
 +</​code>​
 +
 +  * **Устанавливаем компоненты iptables**
 +
 +<code bash>
 +yum install iptables-services -y
 +systemctl enable iptables.service
 +systemctl start iptables.service
 +</​code>​
 +
 +  * **Добавляем правила**
 +
 +<code bash>
 +iptables -I INPUT -p tcp -m state --state NEW -m tcp --dport 80 -j ACCEPT
 +iptables -I INPUT -p tcp -m state --state NEW -m tcp --dport 443 -j ACCEPT
 +service iptables save
 +</​code>​
 +
 +----
 +
 +==== firewalld ====
 +
 +  * **Добавляем правила**
 +
 +<code bash>
 +firewall-cmd --permanent --zone=internal --add-service=http
 +firewall-cmd --permanent --zone=internal --add-service=https
 +firewall-cmd --reload
 +</​code>​
 +
 +----
 +
 +
 +===== Подготовка базы данных =====
 +
 +  * **Устанавливаем Percona Server 5.7**
 +
 +<code bash>
 +yum remove Percona-Server-devel-56-5.6.35-rel80.0.el7.x86_64
 +yum install Percona-Server-server-57.x86_64
 +</​code>​
 +
 +  * **Ищем пароль root**
 +
 +<code bash>
 +grep '​temporary password'​ /​var/​log/​mysqld.log
 +</​code>​
 +Желательно пароль изменить:​ [[http://​wiki.nareyko.by/​mysql._sbros_parolja_root | Сброс пароля root]]
 +
 +  * **Настройка Percona Server**
 +
 +Оптимальный конфиг можно генерировать инструментами Percona на сайте [[https://​tools.percona.com/​ | tools.percona.com]]. Необходима регистрация.
 +
 +  * **Для удобства создаём локальный конфиг**
 +
 +<code bash>
 +vim /​root/​.my.cnf ​
 +</​code>​
 +
 +<​code>​
 +[client]
 +user=root
 +password='​temp_password'​
 +socket=/​mysql-data-directory/​mysql.sock
 +</​code>​
 +
 +  * **Создание базы данных и пользователя**
 +
 +<code sql>
 +create database redmine character set utf8; 
 +create user '​redmine'​@'​localhost'​ identified by '​my_password'; ​
 +grant all privileges on redmine.* to '​redmine'​@'​localhost';​
 +flush privileges;
 +</​code>​
 +
 +----
 +
 +===== Установка RVM и Ruby =====
 +
 +  * **Запускаем shell под пользователем**
 +
 +<code bash>
 +sudo -uappuser bash
 +cd ~
 +</​code>​
 +
 +  * **Устанавливаем RVM и Ruby**
 +<code bash>
 +gpg2 --keyserver hkp://​keys.gnupg.net --recv-keys 409B6B1796C275462A1703113804BB82D39DC0E3
 +curl -L https://​get.rvm.io | bash -s stable --ruby=2.2.5
 +</​code>​
 +
 +  * **Настраиваем окружение**
 +
 +<code bash>
 +source ~/​.rvm/​scripts/​rvm
 +echo '​source ~/​.rvm/​scripts/​rvm'​ >> ~/.bashrc
 +</​code>​
 +
 +  * **Проверяем**
 +
 +<code bash>
 +ruby -v
 +</​code>​
 +
 +<​code>​
 +ruby 2.2.5p319 (2016-04-26 revision 54774) [x86_64-linux]
 +</​code>​
 +
 +<code bash>
 +rvm -v
 +</​code>​
 +
 +<​code>​
 +rvm 1.28.0 (latest) by Wayne E. Seguin <​wayneeseguin@gmail.com>,​ Michal Papis <​mpapis@gmail.com>​ [https://​rvm.io/​]
 +</​code>​
 +
 +----
 +
 +===== Установка Phusion Passenger и Nginx =====
 +
 +  * **Устанавливаем Passenger и Nginx**
 +
 +<code bash>
 +gem install passenger --no-ri --no-rdoc
 +rvmsudo passenger-install-nginx-module
 +</​code>​
 +
 +<WRAP center round info 100%>
 +Если столкнулись с ошибкой,​ что приложение gem не найдено,​ выполните
 +<code bash>
 +source ~/​.rvm/​scripts/​rvm
 +</​code>​
 +а так же проверьте,​ корректно ли добавили эту строку в файл .bashrc
 +</​WRAP>​
 +
 +{{::​passenger1.png?​nolink|}}
 +\\
 +{{::​passenger2.png?​nolink|}}
 +\\
 +<WRAP center round info 100%>
 +По умолчанию Nginx будет установлен в каталог **/​opt/​nginx**
 +</​WRAP>​
 +
 +----
 +
 +===== Настройка Nginx =====
 +
 +
 +  * **Для удобства создаём симлинк**
 +
 +<code bash>
 +sudo ln -s /​opt/​nginx/​conf/​ /etc/nginx
 +</​code>​
 +
 +  * **Создаём виртуальный хост**
 +
 +<code bash>
 +sudo mkdir -p /​etc/​nginx/​vhost
 +sudo vim /​etc/​nginx/​vhost/​redmine.conf
 +</​code>​
 +
 +<code nginx>
 +server {
 +        listen ​      80;
 +        server_name ​ www.redmine.co;​
 + 
 +        root /​home/​appuser/​redmine/​public;​
 +        passenger_enabled on;
 +        client_max_body_size ​     10m; # Max attachemnt size
 + 
 +        # redirect server error pages to the static page /50x.html
 +        #
 +        error_page ​  500 502 503 504  /50x.html;
 +        location = /50x.html {
 +            root   html;
 +        }
 +    }
 +
 +</​code>​
 +
 +  * **Меняем пользователя,​ от которого будет работать Nginx**
 +
 +<code bash>
 +sudo vim /​etc/​nginx/​nginx.conf
 +</​code>​
 +
 +<code nginx>
 +...
 +user  appuser;
 +...
 +</​code>​
 +
 +  * **Создаём Unit в systemd**
 +
 +<code bash>
 +sudo vim /​lib/​systemd/​system/​nginx.service
 +</​code>​
 +
 +<​code>​
 +[Unit]
 +Description=The NGINX HTTP and reverse proxy server
 +After=syslog.target network.target remote-fs.target nss-lookup.target
 + 
 +[Service]
 +Type=forking
 +PIDFile=/​opt/​nginx/​logs/​nginx.pid
 +ExecStartPre=/​opt/​nginx/​sbin/​nginx -t
 +ExecStart=/​opt/​nginx/​sbin/​nginx
 +ExecReload=/​bin/​kill -s HUP $MAINPID
 +ExecStop=/​bin/​kill -s QUIT $MAINPID
 +PrivateTmp=true
 + 
 +[Install]
 +WantedBy=multi-user.target
 +</​code>​
 +
 +<code bash>
 +systemctl daemon-reload
 +systemctl start nginx
 +</​code>​
 +
 +  * **Проверяем,​ что Nginx запустился**
 +
 +<code bash>
 +netstat -nlpt | grep nginx
 +</​code>​
 +
 +<​code>​
 +tcp        0      0 0.0.0.0:​80 ​             0.0.0.0:​* ​              ​LISTEN ​     6883/nginx: master
 +</​code>​
 +
 +----
 +
 +===== Установка Redmine =====
 +Продолжаем работу под пользователем appuser.
 +
 +  * **Загружаем Redmine**
 +
 +<code bash>
 +cd ~
 +wget http://​www.redmine.org/​releases/​redmine-3.3.2.tar.gz
 +tar -zxvf redmine-3.3.2.tar.gz
 +mv redmine-3.3.2 redmine
 +cd redmine
 +mkdir -p tmp tmp/pdf public/​plugin_assets
 +sudo chmod -R 775 files log tmp public/​plugin_assets
 +</​code>​
 +
 +Redmine использует Bundler для управления зависимостями gems пакетов.
 +
 +  * **Устанавливаем Boundler**
 +
 +<​code>​
 +gem install bundler
 +</​code>​
 +
 +  * **Устанавливаем зависимости,​ необходимые Redmine**
 +
 +<​code>​
 +bundle install --without development test postgresql sqlite
 +</​code>​
 +
 +  * **Генерируем новый ключ для хранения сессий**
 +
 +<​code>​
 +bundle exec rake generate_secret_token
 +</​code>​
 +
 +  * **Создаём структуру базы данных Redmine и загружаем в неё данные**
 +
 +<​code>​
 +RAILS_ENV=production bundle exec rake db:migrate
 +RAILS_ENV=production bundle exec rake redmine:​load_default_data
 +</​code>​
 +
 +  * **Настраиваем подключение к базе данных**
 +
 +<code bash>
 +vim /​home/​appuser/​redmine/​config/​database.yml
 +</​code>​
 +<​code>​
 +...
 +production:
 +  adapter: mysql2
 +  database: redmine
 +  host: localhost
 +  username: redmine
 +  password: "​my_password"​
 +  encoding: utf8
 +...
 +</​code>​
 +
 +----
 +
 +===== Проверка =====
 +  * **Перезапускаем Nginx**
 +
 +<code bash>
 +systemctl restart nginx
 +</​code>​
 +
 +  * **Добавляем на локальном компьютере домен в список хостов (если использовали произвольный,​ вместо купленного и привязанного к серверу)**
 +  * **Открываем по домену главную страницу Redmine в браузере**
 +
 +{{::​redmine1.png?​nolink|}}
 +
 +----
 +
 +===== Траблшутинг =====
 +==== duplicated key at line 466 ignored: "​inodot"​ ====
 +
 +  * **Ошибка в логе Nginx %%/​opt/​nginx/​logs/​error.log%%**
 +
 +<​code>​
 +App 20662 stderr: /​home/​appuser/​.rvm/​gems/​ruby-2.2.5/​gems/​htmlentities-4.3.1/​lib/​htmlentities/​mappings/​expanded.rb:​465:​ warning: duplicated key at line 466 ignored: "​inodot"​
 +</​code>​
 +
 +Решается удалением дублирующей строки в файле expanded.rb
 +
 +<code bash>
 +vim /​home/​appuser/​.rvm/​gems/​ruby-2.2.5/​gems/​htmlentities-4.3.1/​lib/​htmlentities/​mappings/​expanded.rb +466
 +</​code>​
 +
 +----
 +
 +==== Ошибка приложения при добавлении пользователя с данными в кириллице ====
 +Столкнулся при создании нового пользователя,​ когда указывал ФИО в кириллице.
 +
 +  * **В логе приложения** (///​home/​appuser/​redmine/​log/​production.log//​) **видим**
 +<​code>​
 +ActiveRecord::​StatementInvalid (Mysql2::​Error:​ Incorrect string value: '​\xD0\x95\xD0\xB2\xD0\xB3...'​ for column '​firstname'​ at row 1: INSERT INTO `users` (`type`, `firstname`,​ `lastname`, `language`, `status`, `login`, `salt`, `hashed_password`,​ `passwd_changed_on`,​ `created_on`,​ `updated_on`,​ `mail_notification`) VALUES ('​User',​ '​Вася',​ '​Пупкин',​ '​ru',​ 2, '​vasya',​ '​4df3f211052e2d51e89d4d5477a0e1c9256',​ '​e19d6e6f21d2afa14f23a1d4b5121f82ac8e8de0ed',​ '​2017-02-14 15:​42:​50',​ '​2017-02-14 15:​42:​50',​ '​2017-02-14 15:​42:​50',​ '​only_my_events'​)):​
 +</​code>​
 +
 +Проблема заключалась в том, что база была создана с кодировкой по умолчанию latin1
 +
 +  * **Проверяем**
 +
 +<code bash>
 +mysql redmine
 +</​code>​
 +
 +<code sql>
 +show variables like '​character_set_database';​
 +</​code>​
 +
 +<​code>​
 ++------------------------+---------+
 +| Variable_name ​         | Value   |
 ++------------------------+---------+
 +| character_set_database | latin1 ​ |
 ++------------------------+---------+
 +1 row in set (0.01 sec)
 +</​code>​
 +
 +  * **Конвертируем**
 +
 +<code bash>
 +# предварительно сделаем бэкап
 +mysqldump redmine > redmine.sql
 +# а теперь займёмся конвертацией
 +mysqldump --add-drop-table redmine | replace CHARSET=latin1 CHARSET=utf8 | iconv -f latin1 -t utf8 | mysql redmine
 +</​code>​
 +
 +----
 +
 +===== Источники =====
 +  * [[ http://​www.redmine.org/​projects/​redmine/​wiki/​RusRedmineInstall | redmine.org ]]
 +  * [[ https://​www.howtoforge.com/​tutorial/​how-to-install-redmine-3-with-nginx-on-centos-7 | howtoforge.com]]
  • redmine_3_nginx_passenger_mysql_centos_7.txt
  • Последние изменения: 2017/02/15 00:00
  • (внешнее изменение)