CentOS7 で Rails4 を Nginx, MariaBD で運用するための設定


## CentOS-7-x86_64-Minimal-1511.iso をインストール

 途中で root のパスワード設定と管理者ユーザ（madoka）を作成
 以後、

 * \# は Linux（サーバ : server.com）での root の作業

 * % は Mac（ローカル）での madoka の作業

 * $ は Linux（サーバ : server.com）での madoka の作業

 とする。

## Linux を最新の状態に

 ```
% ssh madoka@server
$ sudo yum -y update
 ```

## user の skel の作成

 ```
% ssh madoka@server
$ sudo mkdir /etc/skel/.ssh
$ sudo chmod 700 /etc/skel/.ssh
$ sudo touch /etc/skel/.ssh/authorized_keys
$ sudo chmod 600 /etc/skel/.ssh/authorized_keys
 ```

## 管理者ユーザ（madoka）の設定

### パスコードでログインするための準備

```
% scp ~/.ssh/id_rsa.pub madoka@server:~/
% ssh madoka@server
$ cat id_rsa.pub >> .ssh/authorized_keys
$ rm id_rsa.pub
```

### madoka のシェルを変更（各自の環境（好み）に合わせて適宜修正）

```
% scp ~/.tcshrc madoka@server:~/
% ssh madoka@server
$ chsh
新しいシェル [/bin/bash]: /bin/tcsh
パスワード:
シェルを変更しました。
```

## 各種設定

### SELinux 関係のソフトのインストール

```
% ssh madoka@server
$ sudo yum -y install policycoreutils-gui
$ sudo yum -y install policycoreutils-restorecond
$ sudo yum -y install star
$ sudo yum -y install selinux-policy-minimum
$ sudo yum -y install selinux-policy-mls
$ sudo yum -y install iptstate
$ sudo yum -y install firewalld
$ sudo yum -y install setools
```

star はセキュリティコンテキストも保存できる（tar はできない）

```
$ star -H=exustar -xattr -cvz -f /tmp/log.tar gz var/log/maillog*
```

cp では --preserve=context オプションをつける

```
$ cp --preserve=context /etc/passowrd .
```

### ssh の設定

* ポートの確認

 ```
$ sudo semanage port -l | grep ssh
 ```
 
* ssh で 22 番ポート以外を使う場合

 ```
$ sudo semanage port -a -t ssh_port_t -p tcp 9022
 ```

* ポートを削除する場合

 ```
$ sudo semanage port -d -t ssh_port_t -p tcp 9022
 ```

* ssh での認証の修正

 ```
$ sudo vi /etc/ssh/sshd_config
PermitRootLogin no          # root でのログインは不可
PasswordAuthentication no   # password による認証は不可
 ```

### 時刻同期（初期段階でインストール済み）

ntpd は obsolete

* インストールする場合

 ```
$ sudo yum -y install chrony
 ```

* 手動で起動する場合

 ```
$ sudo systemctl start chronyd
 ```

* 自動設定

 ```
$ sudo systemctl enable chronyd
$ systemctl list-unit-files -t service | grep chronyd
 ```

* 動作確認

 ```
$ sudo chronyc sources
 ```

### 各種コマンドのインストール

```
$ sudo yum -y install screen wget git emacs
$ sudo yum -y groupinstall "Development Tools"
$ sudo yum install -y openssl-devel readline-devel zlib-devel mysql-devel
```

### open-vm-tools のインストール（server.com を VMWare で運用している場合）

VMwareTools は非推奨になった

```
$ sudo yum -y install open-vm-tools
$ sudo reboot
```

* 動作確認

 ```
$ ps -ef | grep vmtools
$ systemctl status vmtoolsd.service
 ```

### madoka ユーザの git の設定

```
$ git config --global user.name "Kaname Madoka"
$ git config --global user.email "madoka@mitakihara.com"
$ git config --global core.editor "emacs"
$ git config --global color.ui auto
$ git config --global core.excludesfile ~/.gitignore_global
```

* 改行コードを変換するための設定
 
 コミット時の CRLF から LF への変換はさせたいけれどもそれ以外の自動変換が不要な場合 input

 ```
$ git config --global core.autocrlf input
$ emacs ~/.gitignore_global
.zip
.DS_Store
Thumbs.db
/nbproject/
 ```

## Nginx のインストール

### epel リポジトリのインストールと設定

```
$ sudo yum -y install epel-release
$ sudo vi /etc/yum.repos.d/epel.repo
[epel]部分の「enabled=1」を「enabled=0」に変更
```

### Nginx パッケージのインストール

```
$ sudo yum -y install --enablerepo=epel nginx
```

### サービス登録

* サービスの確認

 ```
$ systemctl list-unit-files -t service | grep nginx
nginx.service                               disabled
 ```

* 自動起動のための設定

 ```
$ sudo systemctl enable nginx
Created symlink from /etc/systemd/system/multi-user.target.wants/nginx.service to /usr/lib/systemd/system/nginx.service.
$ systemctl list-unit-files -t service | grep nginx
nginx.service                               enabled
 ```

### サービス起動

```
$ sudo systemctl start nginx
$ systemctl -l status nginx
● nginx.service - The nginx HTTP and reverse proxy server
   Loaded: loaded (/usr/lib/systemd/system/nginx.service; enabled; vendor preset: disabled)
   Active: active (running) since 月 2016-05-16 19:21:17 JST; 31s ago
  Process: 1741 ExecStart=/usr/sbin/nginx (code=exited, status=0/SUCCESS)
  Process: 1739 ExecStartPre=/usr/sbin/nginx -t (code=exited, status=0/SUCCESS)
  Process: 1737 ExecStartPre=/usr/bin/rm -f /run/nginx.pid (code=exited, status=0/SUCCESS)
 Main PID: 1744 (nginx)
   CGroup: /system.slice/nginx.service
           ├─1744 nginx: master process /usr/sbin/ngin
           └─1745 nginx: worker proces

 5月 16 19:21:17 server.com systemd[1]: Starting The nginx HTTP and reverse proxy server...
 5月 16 19:21:17 server.com nginx[1739]: nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
 5月 16 19:21:17 server.com nginx[1739]: nginx: configuration file /etc/nginx/nginx.conf test is successful
 5月 16 19:21:17 server.com systemd[1]: Failed to read PID from file /run/nginx.pid: Invalid argument
 5月 16 19:21:17 server.com systemd[1]: Started The nginx HTTP and reverse proxy server.
```

* 動作確認

 ```
$ ps -ef | grep nginx
root       1744      1  0 19:21 ?        00:00:00 nginx: master process /usr/sbin/nginx
nginx      1745   1744  0 19:21 ?        00:00:00 nginx: worker process
 ```

### firewall の設定

```
$ sudo firewall-cmd --get-default-zone
public

$ sudo firewall-cmd --list-services --zone=public
dhcpv6-client ssh

$ sudo firewall-cmd --add-service http --zone=public --permanent
success

$ sudo firewall-cmd --add-service https --zone=public --permanent
success

$ sudo firewall-cmd --reload
success

$ sudo firewall-cmd --list-services --zone=public
dhcpv6-client http ssh
```

### 動作チェック

```
$ wget -O - -q http://localhost
% wget -O - -q http://server.com
```

### nginx のインストール状況を確認
 
```
$ sudo semanage fcontext -l | grep nginx
/etc/nginx(/.*)?                                   all files          system_u:object_r:httpd_config_t:s0
/var/run/nginx.*                                   all files          system_u:object_r:httpd_var_run_t:s0
/var/lib/nginx(/.*)?                               all files          system_u:object_r:httpd_var_lib_t:s0
/var/log/nginx(/.*)?                               all files          system_u:object_r:httpd_log_t:s0
/var/opt/rh/rh-nginx18/log(/.*)?                   all files          system_u:object_r:httpd_log_t:s0
/etc/opt/rh/rh-nginx18/nginx(/.*)?                 all files          system_u:object_r:httpd_config_t:s0
/usr/lib/systemd/system/nginx.*                    regular file       system_u:object_r:httpd_unit_file_t:s0
/var/opt/rh/rh-nginx18/lib/nginx(/.*)?             all files          system_u:object_r:httpd_var_lib_t:s0
/var/opt/rh/rh-nginx18/run/nginx(/.*)?             all files          system_u:object_r:httpd_var_run_t:s0
/usr/sbin/nginx                                    regular file       system_u:object_r:httpd_exec_t:s0

$ cd /etc/nginx
$ ls -lZ
drwxr-xr-x. root root system_u:object_r:httpd_config_t:s0 conf.d
-rw-r--r--. root root system_u:object_r:httpd_config_t:s0 fastcgi_params
-rw-r--r--. root root system_u:object_r:httpd_config_t:s0 koi-utf
-rw-r--r--. root root system_u:object_r:httpd_config_t:s0 koi-win
-rw-r--r--. root root system_u:object_r:httpd_config_t:s0 mime.types
-rw-r--r--. root root system_u:object_r:httpd_config_t:s0 nginx.conf
-rw-r--r--. root root system_u:object_r:httpd_config_t:s0 scgi_params
-rw-r--r--. root root system_u:object_r:httpd_config_t:s0 uwsgi_params
-rw-r--r--. root root system_u:object_r:httpd_config_t:s0 win-utf
```

### nginx.conf を修正
 
バーチャルホストの設定は /etc/nginx/conf.d/*.conf に個別に格納する。
使わない場合は拡張子を *.stop などに変更する。

```nginx:/etc/nginx/nginx.conf
File Edit Options Buffers Tools Conf Help
# For more information on configuration, see:
#   * Official English Documentation: http://nginx.org/en/docs/
#   * Official Russian Documentation: http://nginx.org/ru/docs/

user nginx;
worker_processes auto;
error_log /var/log/nginx/error.log;
pid /run/nginx.pid;

events {
    worker_connections 1024;
}

http {
    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

    access_log  /var/log/nginx/access.log  main;

    sendfile            on;
    tcp_nopush          on;
    tcp_nodelay         on;
    keepalive_timeout   65;
    types_hash_max_size 2048;

    include             /etc/nginx/mime.types;
    default_type        application/octet-stream;

    # Load modular configuration files from the /etc/nginx/conf.d directory.
    # See http://nginx.org/en/docs/ngx_core_module.html#include
    # for more information.
    include /etc/nginx/conf.d/*.conf;
}
```

### 設定ファイルの構文チェック

```
$ sudo nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
```

### nginx の起動の確認

```
$ sudo systemctl restart nginx
$ systemctl status nginx
```

### 動作チェック

```
$ wget -O - -q http://localhost
% wget -O - -q http://server.com
```

## MariaDB のインストールと設定

### パッケージのインストール

```
$ sudo yum -y install mariadb-server mariadb
```

### 設定ファイルの修正

```:/etc/my.cnf
[mysqld]
max_allowed_packet = 128M
```

これを設定しないと、1M くらいのファイルのやり取りで、MySQL がエラーを出してはまる orz

```:/etc/my.cnf.d/server.cnf
[mysqld]
character-set-server = utf8
```

```/etc/my.cnf.d/mysql-clients.cnf
[mysql]
default-character-set = utf8
show-warnings
```

### 起動の確認

```
$ sudo systemctl start mariadb.service
$ systemctl status mariadb
```

### 自動起動の設定

```
$ sudo systemctl enable mariadb.service
$ systemctl list-unit-files -t service | grep mariadb
mariadb.service                             enabled
```

### mysql_secure_installation の実行

```
$ sudo mysql_secure_installation
...
Enter current password for root (enter for none):  [enter]
...
Set root password? [Y/n] [Y]
New password: 
Re-enter new password: 
...
Remove anonymous users? [Y/n] [Y]
...
Disallow root login remotely? [Y/n] [Y]
...
Remove test database and access to it? [Y/n] [Y]
...
Reload privilege tables now? [Y/n] [Y]
```