Nginx & Passenger & Redmine(もしくはRails系導入)

#今回の目的
- Nginx & Passenger & Redmineでリバースプロキシー建てなくても良い状態にする。
- 複数のRailsアプリケーションをわざわざポートを開かずに実行できるようにする。
- Thinとかも使っていろいろ試してみたものの、すでに組み込みになる方が再起動時の安心感を持つことができるようにする。
- 今後自分が同じことをするときにサイトを行ったり来たりしないためのログとして残す。
- 今後自分が一切困らないように細かく残す。(長いです)

#実践
##passengerやruby2系のレポジトリを追加する
`sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys 561F9B9CAC40B2F7`
`sudo apt-get install -y apt-transport-https ca-certificates`
`sudo sh -c 'echo deb https://oss-binaries.phusionpassenger.com/apt/passenger trusty main > /etc/apt/sources.list.d/passenger.list'`
`sudo add-apt-repository -y ppa:brightbox/ruby-ng`

##レポジトリを追加したらupdateとupgrade
必要ならばrebootかけましょう。
`sudo apt-get update`
`sudo apt-get upgrade`
`sudo reboot`

##ビルド系に必要なもののインストール
`sudo apt-get install build-essential make`
今後必要ななることが多いと思いますので
_makeが入ってないとbigdecimalのgem updateで引っかかります_

## gem install railsでのnokogiriエラー対策
`sudo apt-get install zlib1g-dev libxslt1-dev`


##Ruby2.1とruby2.1-devのインストール
~~`sudo apt-get install ruby2.1　ruby2.1-dev`~~
`sudo apt-get install ruby2.1 ruby2.1-dev`
_正しくは半角スペースです。_

###使用するSQLサーバの選定
今回はMySQL5.5を使用。最新が良いならばmysql-server-5.6を指定する
以下のコマンドの場合(2015/10/22現在)5.5がインストールされる。
MySQLのインストール方法は省略といいつつも、rootパスワード設定するだけです。
`sudo apt-get install mysql-server libmysqlclient-dev`

#Passengerのインストール
**Nginxは以下のコマンドで自動インストールされる。**
`sudo apt-get install nginx-extras passenger`

#Nginx設定
sudo nano /etc/nginx/nginx.conf
本題の63行目の>passenger_rootとpassenger_rubyをアンコメントする。
_55行目近辺のGzip Settingsあたりはお好みで_
![1.PNG](https://qiita-image-store.s3.amazonaws.com/0/71588/4e7ea6dc-6a9e-15bc-9320-a61ce355f713.png)

###補足
今回はruby2.1なのでpassenger_rubyは、`/usr/bin/ruby2.1`を指定する。
**`passenger_root`は、`passenger-config --root`で確認可能**
_passenger_rubyを指定しない場合、Nginxで明示的に記載しないと動かない可能性があります。_
_この2箇所は、デフォルト値のような設定だと考えていただければ良いと思います。_
_何故ならNginxのconfでも設定可能だからだと推測しています。_

##Nginx + Passengerが正常動作しているか確認
`sudo service nginx restart`
`sudo passenger-config validate-install`
設定が正しく投入されていれば :heavy_check_mark: が2箇所表示される
![2.jpg](https://qiita-image-store.s3.amazonaws.com/0/71588/7e6ad8bb-d6d0-254b-13ee-66cc3eaa2a96.jpeg)

##最後にプロセスが動作しているか確認
`sudo passenger-memory-stats`
**`Nginx processes`**と**`Passenger processes`**が表示されていれば問題なし。
![3.jpg](https://qiita-image-store.s3.amazonaws.com/0/71588/fb0f0d31-4a2f-0a61-1315-e226aa1fbdc8.jpeg)
**_今回はNginxが対象なのでApache processesは無視します_**
**_今後チューニングしていく楽しみが増えそうな項目がたくさんありますね_**

##最後にupdateとupgrade
`sudo apt-get update`
`sudo apt-get upgrade`
[こちらを参照ください](https://www.phusionpassenger.com/library/install/nginx/install/oss/trusty/#step-4:-update-regularly)
これをしないと、Nginx系のPassengerが有効にならない。

## Ruby On Railsのセットアップ
`sudo gem update`
`sudo gem update --system`
`sudo gem install rails`
**時間がかかるのでお茶でも飲んでのんびりしてください**

#Redmineのインストール
今回のターゲットディレクトのは/home/自分とする
ここからは、[Redmineのインストール](http://redmine.jp/guide/RedmineInstall/)より引用続きです。

**homeディレクトリなので一部sudo不要ですのでご注意**

[本家Redmineダウンロードサイト](http://www.redmine.org/projects/redmine/wiki/Download)
最新版をwgetするもよしgitするもよしで。

2015/10/22現在の場合
`wget http://www.redmine.org/releases/redmine-3.1.1.tar.gz`
`tar xzvf redmine-3.1.1.tar.gz`
`rm redmine-3.1.1.tar.gz`
`mv redmine-3.1.1 redmine`

###RedmineのガントチャートをPNGで出力したい場合のパッケージ
`sudo apt-get install imagemagick libmagickwand-dev ruby-rmagick`

##ここからはMySQLの場合…
SQLiteのほうが手軽ですが、今回はWordPressも同居させたいのでMySQLを選択しました。
`mysql -u root -p`でMySQLにログインする。
**パスワードはMySQLインストール時に設定したものを入力する。**
>create database redmine character set utf8;
>create user 'redmine'@'localhost' identified by 'my_password';
>grant all privileges on redmine.* to 'redmine'@'localhost';
>
>my_passwordは自分でパスワードを設定してください。
>[私はよくこのサイトで【強力】でお世話になっています。](http://www.luft.co.jp/cgi/randam.php)

Redmineの名前は別に識別しやすい名前にすれば良いでしょう。
ただし、database.ymlを正しく変更しましょう。**ハマリポイント**

念のため本当にredmineアカウントが登録されたか確認する。
`SELECT host,user FROM mysql.user;`
![キャプチャ.PNG](https://qiita-image-store.s3.amazonaws.com/0/71588/74a392eb-e5f5-e423-d582-b93a9178e7f6.png)
Redmineだけ別サーバという特殊例の場合は、`localhost`を適時置き換えると良いと思います。

##database.ymlの設定
config/database.example.yml をコピーして config/database.yml
`cp database.yml.example database.yml`
`nano database.yml`
ここでは、**production:**を書き換えてください。テスト環境の場合はtest:を書き換えてください。
![4.PNG](https://qiita-image-store.s3.amazonaws.com/0/71588/aa4e2888-e00a-1af7-74b6-d89c2e09bebb.png)
`username: redmine ←create userの時のユーザー名(画像は変更前)`
`password: "my_password" ←create userの時のパスワード(画像は変更前)`

##gemのインストール
設定が終わり次第、1階層戻り必要なrails標準以外のgemをインストールします。
`cd ../`
念のため/home/hogehoge/redmineか`pwd`で確認すると尚良。
Redmineの階層に戻ったらbundle instalをしますが、development環境、test環境、postgresql、sqliteのgemは使用しないのでwithoutします。
`bundle install --without development test postgresql sqlite3`

>MariaDBの場合以下でライブラリが揃い通ります。
>`sudo apt-get install libmariadbclient-dev`


##初期データの投入
rakeでMySQLにテーブル生成とRAILS_ENVでアカウントとデフォルトデータを投入します。
`rake generate_secret_token`
`RAILS_ENV=production rake db:migrate`
`RAILS_ENV=production rake redmine:load_default_data`
Select languageではお好みに応じて設定してください。私は基本的に日本語を読みたいので**ja**にしました。
##権限設定
tmpフォルダがなければ作りましょう。あれば各種にNginxからアクセスできるように権限を与えてください。
`mkdir tmp public/plugin_assets`←たぶんあるよって言われる
`sudo chown -R www-data:www-data files log tmp public/plugin_assets`
`sudo chmod -R 755 files log tmp public/plugin_assets`

#Redmine系ログや他の設定
##ログ
Redmineのログは標準でRailsに準拠しているため、以外に大量に吐かれます。
必要に応じてログレベルの調整をしてください。
以下は、10Mごとに3ファイルERRORログを保管するという設定

```rb:config/additional_environment.rb
config.logger = Logger.new(Rails.root.join("log",Rails.env + "-ERROR.log"), 3, 10 * 1024 * 1024)
config.logger.level = Logger::ERROR
```

##RMagickやconvertコマンドが有効にならない

```rb:config/configuration.yml
#73行目
imagemagick_convert_command: "/usr/bin/convert"
```
この設定で、説明通りインストールしていれば :heavy_check_mark: がつきます。
![setting.PNG](https://qiita-image-store.s3.amazonaws.com/0/71588/c8743ff3-07bd-8521-0671-0cd4962e8860.png)


##メール送信の設定
SendGridを使用する場合

```rb:config/configuration.yml
#27行目～35行目
#ymlの注意はご存知かと思いますが、インデントに注意してください
#までを消すという考えで編集すれば問題ありません。
#587は推奨ポートです
  email_delivery:
    delivery_method: :smtp
    smtp_settings:
      address: "smtp.sendgrid.net"
      port: 587
      authentication: :login
      domain: 'domain'
      user_name: 'user_name'
      password: 'password'

```
[SengGridのSMTP接続情報](https://sendgridjp.zendesk.com/hc/ja/articles/204187885-SMTP%E3%81%AE%E6%8E%A5%E7%B6%9A%E6%83%85%E5%A0%B1%E3%82%92%E6%95%99%E3%81%88%E3%81%A6%E3%81%8F%E3%81%A0%E3%81%95%E3%81%84-)

##Nginxのconf設定
Debian系は設定ファイルの場所が解りやすく**個人的**に好きです。というと反感を喰らいそうなので先に言います。ゴメンナサイ :raised_hands: 
今回はわかりやすくredmineというsites用ファイルを作成します。
`sudo nano /etc/nginx/sites-available/redmine`

```rb:/etc/nginx/sites-available
server {
  listen  80; #ポート指定。ここで8080とか別ポートにするのもいいかもしれません。
  server_name hoge.hogehoge.com; #Redmineを動かすサーバのドメインを入力します。
  root /home/hoge/redmine/public; #redmineのpublicまでのフルパスを入力します。
  passenger_enabled on; #passengerをONにする。デフォルトではOFFになっています。
  client_max_body_size 10M; #Redmineのファイルのアップロード最大サイズを10Mにします。
  #passenger_ruby /usr/bin/ruby2.1; #Nginx.confで設定していない場合はここで設定します。
}
```
sites-enabled向けてシンボリックリンクを張り、Nginxをreloadします。
`sudo ln -s /etc/nginx/sites-available/redmine /etc/nginx/sites-enabled`
`sudo service nginx reload`

#今回の教訓
gem install passengerとかpassenger-install-nginx-moduleとか…
古くはないんだろうけど、この近辺で痛手を負いました。
なぜ動かないのかなぁと考え再度モジュールチェックで以下のようなエラー発見。
どうやらgemで二重背負していたみたい？
とりあえずいろいろありましたが

![5.jpg](https://qiita-image-store.s3.amazonaws.com/0/71588/35db356d-5b68-6181-29ae-36458833a96b.jpeg)

![6.jpg](https://qiita-image-store.s3.amazonaws.com/0/71588/5b591427-7f6b-7063-80b8-3fe6d9b1d327.jpeg)


![7.jpg](https://qiita-image-store.s3.amazonaws.com/0/71588/ff825994-be5d-1a9b-113b-ede173bca031.jpeg)

##便利そうなプラグイン
[Advanced roadmap & milestones plugin](https://github.com/ekylibre/redmine_advanced_roadmap_v2)
[Redmine Absolute Dates plugin](https://github.com/suer/redmine_absolute_dates)
[Redmine Enter Cancel plugin](https://github.com/suer/redmine_enter_cancel)
[Redmine Issues Summary Graph plugin](https://github.com/suer/redmine_issues_summary_graph)

#何かあれば
コメントください。励みとか妬みとか。