Railsアプリのログをローテーションした話

Web を見ていてログローテーションの記事を見かけたので、そういえばさくらの VPS で動かしている Rails アプリのログはどうなってるんだろう、と思った。で、調べてみるとつぎの通り。

[takatoh@tk2-254-36564 log]$ ls -lh
合計 1.2G
-rw-r--r-- 1 root root  25K  5月  5 09:53 2017 development.log
-rw-r--r-- 1 root root 1.2G 12月  5 03:56 2018 production.log

うわあああああ、production.log が 1.2GB もあるううう!!!!!

こりゃ、ぜひともログローテーションしなきゃ、と思って調べてみると、Rails にはログのローテーションをする機能があるらしい。アプリのディレクトリ以下の config/environments/production.rb ファイルで、つぎのようにすればいいようだ。

config.logger = Logger.new("log/production.log", 'daily')

ところが、実際に動いているアプリのファイル(の該当部分)を見てみるとつぎのようになっている。

# config.logger = ActiveSupport::TaggedLogging.new(SyslogLogger.new)

コメントアウトしてあるのはいいとしても、Rails のバージョンのせいなのか何なのか、全然違う。はっきりいってこういうのはウカツに弄りたくない。

というわけで、logrotate でやってみることにした。さくらの VPS では logrotate がデフォルトで動いている(らしい)ので、/etc/logrotate.d 以下に設定ファイルを書いて置いてやればいい。

/var/www/lathercraft/log/production.log {
daily
rotate 14
missingok
notifempty
compress
delaycompress
sharedscripts
postrotate
/sbin/service unicorn_lathercraft rotate > /dev/null 2> /dev/null || true
endscript
}

参考にしたページ:
cf. さくらのVPSの設定 – logrotateの設定
テストしてみる。

[takatoh@tk2-254-36564 logrotate.d]$ logrotate -dv unicorn_lathercraft
reading config file lathercraft
reading config info for /var/www/lathercraft/log/production.log 

Handling 1 logs

rotating pattern: /var/www/lathercraft/log/production.log  after 1 days (14 rotations)
empty log files are not rotated, old logs are removed
considering log /var/www/lathercraft/log/production.log
  log does not need rotating
not running postrotate script, since no logs were rotated

エラーらしきものは出てないので、いいのかな。
とりあえずこれで様子を見てみよう。

CentOS 7上でbottleアプリをuWSGIで動かす

専用ユーザーの作成

[takatoh@bigswifty ~]$ sudo useradd lcstorage
[sudo] takatoh のパスワード:
[takatoh@bigswifty ~]$ sudo passwd lcstorage
ユーザー lcstorage のパスワードを変更。
新しいパスワード:
よくないパスワード: このパスワードには一部に何らかの形でユーザー名が含まれています。
新しいパスワードを再入力してください:
passwd: すべての認証トークンが正しく更新できました。

よくないパスワードとか言われてるけど無視。sudo する権利をつける。

[takatoh@bigswifty ~]$ sudo usermod -G wheel lcstorage

ここからは新しいユーザーでの作業になるので、ログインし直し。

bottleアプリの配置

bitbucket.org から clone。

[lcstorage@bigswifty ~]$ git clone https://[email protected]/takatoh/lathercraft-storage-py.git lcstorage
Cloning into 'lcstorage'...
Password for 'https://[email protected]': 
remote: Counting objects: 127, done.
remote: Total 127 (delta 0), reused 0 (delta 0)
Receiving objects: 100% (127/127), 13.63 KiB | 0 bytes/s, done.
Resolving deltas: 100% (55/55), done.

中に入って virtualenv を作成。

[lcstorage@bigswifty ~]$ cd lcstorage
[lcstorage@bigswifty lcstorage]$ virtualenv env
New python executable in /home/lcstorage/lcstorage/env/bin/python2
Also creating executable in /home/lcstorage/lcstorage/env/bin/python
Installing setuptools, pip, wheel...
done.
[lcstorage@bigswifty lcstorage]$ source env/bin/activate
(env) [lcstorage@bigswifty lcstorage]$

依存ライブラリのインストール。

(env) [lcstorage@bigswifty lcstorage]$ pip install -r requirements.txt
Collecting PyYAML==3.12 (from -r requirements.txt (line 1))
  Downloading https://files.pythonhosted.org/packages/4a/85/db5a2df477072b2902b0eb892feb37d88ac635d36245a72a6a69b23b383a/PyYAML-3.12.tar.gz (253kB)
    100% |████████████████████████████████| 256kB 6.9MB/s 
Collecting bottle==0.12.10 (from -r requirements.txt (line 2))
  Downloading https://files.pythonhosted.org/packages/5c/a9/f157af11b37834db992b14e43ade37a1bdc141485657cfa36dc1d99420a6/bottle-0.12.10-py2-none-any.whl (88kB)
    100% |████████████████████████████████| 92kB 8.9MB/s 
Collecting requests==2.12.3 (from -r requirements.txt (line 3))
  Downloading https://files.pythonhosted.org/packages/84/68/f0acceafe80354aa9ff4ae49de0572d27929b6d262f0c55196424eb86b2f/requests-2.12.3-py2.py3-none-any.whl (575kB)
    100% |████████████████████████████████| 583kB 8.1MB/s 
Building wheels for collected packages: PyYAML
  Running setup.py bdist_wheel for PyYAML ... done
  Stored in directory: /home/lcstorage/.cache/pip/wheels/03/05/65/bdc14f2c6e09e82ae3e0f13d021e1b6b2481437ea2f207df3f
Successfully built PyYAML
Installing collected packages: PyYAML, bottle, requests
Successfully installed PyYAML-3.12 bottle-0.12.10 requests-2.12.3

アプリの設定ファイルを作って、起動確認。設定はとりあえずはデフォルトのままで。

(env) [lcstorage@bigswifty lcstorage]$ cp config.yaml.example config.yaml
(env) [lcstorage@bigswifty lcstorage]$ python index.py
Bottle v0.12.10 server starting up (using WSGIRefServer())...
Listening on http://0.0.0.0:8080/
Hit Ctrl-C to quit.

よし、大丈夫そうだ。じゃ、virtualenv をぬけて uWSGI に行くぞ。

uWSGIで起動

まずは uWSGI のインストール。

[lcstorage@bigswifty lcstorage]$ sudo pip install uwsgi
Collecting uwsgi
  Using cached https://files.pythonhosted.org/packages/a2/c9/a2d5737f63cd9df4317a4acc15d1ddf4952e28398601d8d7d706c16381e0/uwsgi-2.0.17.1.tar.gz
Installing collected packages: uwsgi
  Running setup.py install for uwsgi ... done
Successfully installed uwsgi-2.0.17.1
You are using pip version 8.1.2, however version 18.1 is available.
You should consider upgrading via the 'pip install --upgrade pip' command.

上では省略しちゃったけど、最初のインストールの時にエラーが出て、sudo yum install gcc python2-devel しなきゃならなかった。
ともかくインストールできたので、コマンドラインから起動してみる。

[lcstorage@bigswifty lcstorage]$ uwsgi --http :8080 --wsgi-file index.py -H env

他のマシンからアクセスしたら、ちゃんと動いていたのでOK。

設定ファイルを書く。

[uwsgi]
uid = lcstorage
gid = lcstorage
http = :8080
venv = /home/lcstorage/lcstorage/env
wsgi-file = /home/lcstorage/lcstorage/index.py
master = true
pidfile = /home/lcstorage/lcstorage/lcstorage.pid
logger = file:/home/lcstorage/lcstorage/lcstorage.log

起動確認。

[lcstorage@bigswifty lcstorage]$ uwsgi lcstorage.ini
[uWSGI] getting INI configuration from lcstorage.ini

OK。大丈夫そうだ。

とりあえずここまで。

USB外付けHDDを接続する

さて、今度は bigswifty に USB の外付け HDD を接続してみる。
マシンを起動した状態で繋いで見ると次のようになる。

[takatoh@bigswifty ~]$ sudo blkid
[sudo] takatoh のパスワード:
/dev/sda1: UUID="4c426dd3-8999-4bc0-ba95-2a21ffe751f1" TYPE="xfs" 
/dev/sda2: UUID="3JSzi4-m7uB-BxAK-ue4f-DaUl-d3G5-pIbs9U" TYPE="LVM2_member" 
/dev/mapper/centos_bigswifty-root: UUID="b05ee492-4803-4e72-9b6b-e180623577f0" TYPE="xfs" 
/dev/mapper/centos_bigswifty-swap: UUID="48a4fa87-45ef-4fce-acaf-3020d65d8874" TYPE="swap" 
/dev/mapper/centos_bigswifty-home: UUID="4e1e2a4f-ebce-49e9-bf84-4c5e53306c6a" TYPE="xfs" 
[takatoh@bigswifty ~]$ lsblk
NAME                      MAJ:MIN RM   SIZE RO TYPE MOUNTPOINT
sda                         8:0    0 232.9G  0 disk 
├─sda1                      8:1    0     1G  0 part /boot
└─sda2                      8:2    0 231.9G  0 part 
  ├─centos_bigswifty-root 253:0    0    50G  0 lvm  /
  ├─centos_bigswifty-swap 253:1    0   3.8G  0 lvm  [SWAP]
  └─centos_bigswifty-home 253:2    0 178.1G  0 lvm  /home
sdb                         8:16   0 931.3G  0 disk

sudo blkid コマンドでは出てこないけど lsblk コマンドでは sdb ってのが出てくる。これが外付け HDD だろう。もともとは Windows マシンで使っていたものだけど、ディスク消去ソフトでデータを消去してあるので、ファイルシステムも何もない。これを ext4 にフォーマットして使う。

まずはパーティションを切ることから。

[takatoh@bigswifty ~]$ sudo fdisk /dev/sdb
[sudo] takatoh のパスワード:
Welcome to fdisk (util-linux 2.23.2).

Changes will remain in memory only, until you decide to write them.
Be careful before using the write command.

Device does not contain a recognized partition table
Building a new DOS disklabel with disk identifier 0x7a9ef1d0.

コマンド (m でヘルプ): p

Disk /dev/sdb: 1000.0 GB, 1000010997760 bytes, 1953146480 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O サイズ (最小 / 推奨): 512 バイト / 512 バイト
Disk label type: dos
ディスク識別子: 0x7a9ef1d0

デバイス ブート      始点        終点     ブロック   Id  システム

コマンド (m でヘルプ): n
Partition type:
   p   primary (0 primary, 0 extended, 4 free)
   e   extended
Select (default p): 
Using default response p
パーティション番号 (1-4, default 1): 
最初 sector (2048-1953146479, 初期値 2048): 
初期値 2048 を使います
Last sector, +sectors or +size{K,M,G} (2048-1953146479, 初期値 1953146479): 
初期値 1953146479 を使います
Partition 1 of type Linux and of size 931.3 GiB is set

コマンド (m でヘルプ): p

Disk /dev/sdb: 1000.0 GB, 1000010997760 bytes, 1953146480 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O サイズ (最小 / 推奨): 512 バイト / 512 バイト
Disk label type: dos
ディスク識別子: 0x7a9ef1d0

デバイス ブート      始点        終点     ブロック   Id  システム
/dev/sdb1            2048  1953146479   976572216   83  Linux

コマンド (m でヘルプ): w
パーティションテーブルは変更されました!

ioctl() を呼び出してパーティションテーブルを再読込みします。
ディスクを同期しています。

パーティションができたら、次はフォーマット。

[takatoh@bigswifty ~]$ sudo mkfs -t ext4 /dev/sdb1
mke2fs 1.42.9 (28-Dec-2013)
Filesystem label=
OS type: Linux
Block size=4096 (log=2)
Fragment size=4096 (log=2)
Stride=0 blocks, Stripe width=0 blocks
61038592 inodes, 244143054 blocks
12207152 blocks (5.00%) reserved for the super user
First data block=0
Maximum filesystem blocks=2392850432
7451 block groups
32768 blocks per group, 32768 fragments per group
8192 inodes per group
Superblock backups stored on blocks: 
	32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208, 
	4096000, 7962624, 11239424, 20480000, 23887872, 71663616, 78675968, 
	102400000, 214990848

Allocating group tables: done                            
Writing inode tables: done                            
Creating journal (32768 blocks): done
Writing superblocks and filesystem accounting information: done     

これでOK。確かめてみる。

[takatoh@bigswifty ~]$ sudo blkid
/dev/sda1: UUID="4c426dd3-8999-4bc0-ba95-2a21ffe751f1" TYPE="xfs" 
/dev/sda2: UUID="3JSzi4-m7uB-BxAK-ue4f-DaUl-d3G5-pIbs9U" TYPE="LVM2_member" 
/dev/mapper/centos_bigswifty-root: UUID="b05ee492-4803-4e72-9b6b-e180623577f0" TYPE="xfs" 
/dev/mapper/centos_bigswifty-swap: UUID="48a4fa87-45ef-4fce-acaf-3020d65d8874" TYPE="swap" 
/dev/mapper/centos_bigswifty-home: UUID="4e1e2a4f-ebce-49e9-bf84-4c5e53306c6a" TYPE="xfs" 
/dev/sdb1: UUID="3bdf3a15-2722-4992-9c77-cf1c2349b385" TYPE="ext4" 
[takatoh@bigswifty ~]$ lsblk
NAME                      MAJ:MIN RM   SIZE RO TYPE MOUNTPOINT
sda                         8:0    0 232.9G  0 disk 
├─sda1                      8:1    0     1G  0 part /boot
└─sda2                      8:2    0 231.9G  0 part 
  ├─centos_bigswifty-root 253:0    0    50G  0 lvm  /
  ├─centos_bigswifty-swap 253:1    0   3.8G  0 lvm  [SWAP]
  └─centos_bigswifty-home 253:2    0 178.1G  0 lvm  /home
sdb                         8:16   0 931.3G  0 disk 
└─sdb1                      8:17   0 931.3G  0 part

最後に、/etc/fstab ファイルに設定を書き込んで再起動すればマウントされるはずだ。マウントポイントは /mnt/wiwaxia にした。

# USB HDD - WIWAXIA
UUID=3bdf3a15-2722-4992-9c77-cf1c2349b385 /mnt/wiwaxia ext4 defaults 0 0

再起動した結果、次のようになった。

[takatoh@bigswifty ~]$ lsblk
NAME                      MAJ:MIN RM   SIZE RO TYPE MOUNTPOINT
sda                         8:0    0 232.9G  0 disk 
├─sda1                      8:1    0     1G  0 part /boot
└─sda2                      8:2    0 231.9G  0 part 
  ├─centos_bigswifty-root 253:0    0    50G  0 lvm  /
  ├─centos_bigswifty-swap 253:1    0   3.8G  0 lvm  [SWAP]
  └─centos_bigswifty-home 253:2    0 178.1G  0 lvm  /home
sdb                         8:16   0 931.3G  0 disk 
└─sdb1                      8:17   0 931.3G  0 part /mnt/wiwaxia
[takatoh@bigswifty ~]$ df -h
ファイルシス                      サイズ  使用  残り 使用% マウント位置
/dev/mapper/centos_bigswifty-root    50G  3.9G   47G    8% /
devtmpfs                            1.8G     0  1.8G    0% /dev
tmpfs                               1.8G   30M  1.8G    2% /dev/shm
tmpfs                               1.8G  9.7M  1.8G    1% /run
tmpfs                               1.8G     0  1.8G    0% /sys/fs/cgroup
/dev/sda1                          1014M  223M  792M   22% /boot
/dev/sdb1                           917G   77M  870G    1% /mnt/wiwaxia
/dev/mapper/centos_bigswifty-home   179G  305M  178G    1% /home
tmpfs                               359M   32K  359M    1% /run/user/1000

CentOS7: ノートPCを閉じてもサスペンドさせない

CentOS をインストールしたノートPCをサーバとして動かすとき、ふだんは閉じていると思う。だけど、デフォルトの設定では、閉じるとサスペンドしてしまって、サーバの役目を果たさない。これはどうにかしなきゃならない。
というわけで、ググってみたらちょうどそのまんまの記事をみつけた。

cf. CentOS7でノートPCを閉じてもサスペンドさせない – Qiita

/etc/systemd/logind.conf ファイルを下のように編集する。

#HandleSuspendKey=suspend
#HandleHibernateKey=hibernate 
#HandleLidSwitch=suspend
HandleSuspendKey=ignore 
HandleHibernateKey=ignore
HandleLidSwitch=ignore

コメントアウトしてあるのがもともとの設定(もとからコメントアウトしてあった)で、下の 3 行が変更した設定。
logind をリスタートして変更を反映させる。

[takatoh@bigswifty ~]$ sudo systemctl restart systemd-logind

これで一晩おいてから確かめてみると、閉じている状態でもちゃんと動いていることが確認できた。

CentOS7でNginxを動かす

OS のインストールが終わった bigswifty、Web サーバにするので Nginx をインストールする。と言っても、過去記事があるのでそこにリンクするだけにしておく。

cf. CentOS 7にNginxをインストールする

上の記事に、インストールからファイアウォールの設定、Nginx の起動まで書いてある。

別のマシンからブラウザでアクセスしてみて、ちゃんと動いているのを確認した。

新しいノートPCにCentOS7をインストールした

新しいといっても中古だけど。
インターネットに公開してるサーバのバックアップにしようと思って、HP のノートPCを中古で買ったんだ。4年落ちくらいの Windows7 Pro がインストールされてるやつ。で、サーバにするので、Windows はサクッと消して CentOS をインストールしようというわけ。

修復ディスクの作成

万が一、CentOS がインストールできなくても Windows PC として使えるように、修復ディスクを作っておく。USB メモリを買っておいたんだけど、Windows 7 では DVD にしか作れないようだ。無駄になった。
それはさておき、コントロールパネル → システムとセキュリティ → バックアップと復元 とたどって開いたウィンドウの左側にある、「システム修復ディスクの作成」を選んで修復ディスクを作成した。

CentOS 7のインストール

9月に、nightschool にインストールしたのと同じ CentOS 7.5 1804 のディスクを使う。
ノートPC の電源を入れ、起動の途中で ESC キーを押してセットアップメニューに入る。F9 のブートオプションから USB CD/DVD ブートを選んで起動する。ソフトウェアの選択では「サーバ(GUI使用)」を選んだ。ユーザー takatoh を管理者として作成。ホスト名は bigswifty。
後はインストールが済むのを待つ。
終わると再起動して、ライセンスに同意。これでインストール終了。

日本語入力

左上のメニューから、アプリケーション → システムツール → 設定 → 地域と言語 とたどって、入力ソースのところで + ボタンを押し、「日本語(かな漢字)」を追加する。これで、Windowsキー + スペースキーで日本語入力に切り替えられるようになった。

パッケージのアップデート

[takatoh@bigswifty ~]$ sudo yum update

361個のパッケージがアップデートされた。

さて、ひとまずここまで。