Инструменты пользователя

Инструменты сайта


redmine_3_nginx_passenger_mysql_centos_7

Различия

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

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

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 (внешнее изменение)