MySQL テーブル単位の容量確認

  • SQL
1
2
3
4
5
6
7
8
9
10
11
mysql> use zabbix
Database changed

mysql> select
-> table_name, engine, table_rows as tbl_rows, avg_row_length as rlen,
-> floor((data_length+index_length)/1024/1024) as allMB, #総容量
-> floor((data_length)/1024/1024) as dMB, #データ容量
-> floor((index_length)/1024/1024) as iMB #インデックス容量
-> from information_schema.tables
-> where table_schema=database()
-> order by (data_length+index_length) desc;
  • 実行結果
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
+----------------------------+--------+----------+-------+-------+------+------+
| table_name | engine | tbl_rows | rlen | allMB | dMB | iMB |
+----------------------------+--------+----------+-------+-------+------+------+
| history | InnoDB | 23815217 | 51 | 1802 | 1179 | 623 |
| history_uint | InnoDB | 21709131 | 51 | 1646 | 1075 | 571 |
| trends_uint | InnoDB | 45152 | 650 | 28 | 28 | 0 |
| trends | InnoDB | 30965 | 914 | 27 | 27 | 0 |
| history_str | InnoDB | 129224 | 109 | 19 | 13 | 5 |
| items | InnoDB | 2242 | 708 | 2 | 1 | 0 |
| images | InnoDB | 144 | 11036 | 1 | 1 | 0 |
| items_applications | InnoDB | 2468 | 66 | 0 | 0 | 0 |
| triggers | InnoDB | 805 | 223 | 0 | 0 | 0 |
| graphs_items | InnoDB | 948 | 103 | 0 | 0 | 0 |
| functions | InnoDB | 833 | 98 | 0 | 0 | 0 |
| events | InnoDB | 718 | 114 | 0 | 0 | 0 |
| alerts | InnoDB | 88 | 930 | 0 | 0 | 0 |
| graphs | InnoDB | 329 | 248 | 0 | 0 | 0 |

...
...

ちなみに上記は Zabbix DBの結果
history (履歴) にデータが肥大化傾向にあるので
パーティション や Zabbix housekeeping での
保存期間設定を調整するなど必要なことがわかります。

2016年5月現在、SSL評価Fを取らない為に

2016年5月現在、SSL評価Fを取らない為に

それは、ある日 QUALYS SSL LABS で SSL チェックしたとき

F になってる…

常に A+ を保っていたのに…

どうやら 2016/5/3 時点で新たに脆弱性が発見されたとのこと。

今回指摘されている CVE-2016-2107 :

AES-NI CBC MAC チェックで MITM 攻撃者がパディングオラクル攻撃可能なことがわかりました。この問題は、CVE-2013-0169(Lucky 13 パディング)の修正のために導入された箇所の不具合から発生しました。

上記対応策をまとめました。

対応策

  • OpenSSL version up

※試験 OS 環境: CentOS7

以下記事では 「OpenSSL のバージョンを 1.0.2h/1.0.1t にあげてください。」とありますが、

general-security-20160504

段階的に試した所
以下コマンドで openssl のバージョンアップをした所
エラーが消え B となりました。

事前に Nginx を 1.11.1 にアップデートした為でしょうか汗

1
2
3
4
# yum upgrade openssl -y

# openssl version
OpenSSL 1.0.1e-fips 11 Feb 2013
  • ssl_ciphers の設定変更

config generator で 生成される ssl_ciphers ディレクティブをそのまま設定すると評価が B 止まりでした。

https://ssl-config.mozilla.org/

諸々含めたくない暗号化法があるようです。

1
ssl_ciphers 'ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA:ECDHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-RSA-AES256-SHA256:DHE-RSA-AES256-SHA:ECDHE-ECDSA-DES-CBC3-SHA:ECDHE-RSA-DES-CBC3-SHA:EDH-RSA-DES-CBC3-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:DES-CBC3-SHA:!DSS';

_以下最終的に設定した ssl_ciphers_ すると A+ に戻りました。

1
ssl_ciphers 'ECDH !aNULL !eNULL !SSLv2 !SSLv3';

OpenSSL の脆弱性はチェックし続けていかねば

補足

HTTP Strict Transport Security を 有効化 (常時 SSL) にしないと
A+ は取れません。

常時 SSL はパフォーマンスにも影響するので
せめて A まで取る、という指針を決めてから着手してください。

Nginx 1.9.6 → 1.11.1 へバージョンアップ 脆弱性対応

Nginx 1.9.6 → 1.11.1 へバージョンアップ 脆弱性対応

脆弱性 CVE-2016-4450 に対応した Nginx 1.11.1 が 2016-05-31 リリースされたということで
早速バージョンアップを試みました。

SIOS Tech. Lab - エンジニアのためになる技術トピックス

ダウンタイムゼロで実行できました。

現状の Nginx configure 確認

1
2
3
4
# nginx -V
nginx version: nginx/1.9.6

configure arguments: --prefix=/etc/nginx --sbin-path=/usr/sbin/nginx --modules-path=/usr/lib64/nginx/modules --conf-path=/etc/nginx/nginx.conf --error-log-path=/var/log/nginx/error.log --http-log-path=/var/log/nginx/access.log --pid-path=/var/run/nginx.pid --lock-path=/var/run/nginx.lock --http-client-body-temp-path=/var/cache/nginx/client_temp --http-proxy-temp-path=/var/cache/nginx/proxy_temp --http-fastcgi-temp-path=/var/cache/nginx/fastcgi_temp --http-uwsgi-temp-path=/var/cache/nginx/uwsgi_temp --http-scgi-temp-path=/var/cache/nginx/scgi_temp --user=nginx --group=nginx --with-http_ssl_module --with-http_realip_module --with-http_addition_module --with-http_sub_module --with-http_dav_module --with-http_flv_module --with-http_mp4_module --with-http_gunzip_module --with-http_gzip_static_module --with-http_random_index_module --with-http_secure_link_module --with-http_stub_status_module --with-http_auth_request_module --with-http_xslt_module=dynamic --with-http_image_filter_module=dynamic --with-http_geoip_module=dynamic --with-http_perl_module=dynamic --add-dynamic-module=njs-1c50334fbea6/nginx --with-threads --with-stream --with-stream_ssl_module --with-http_slice_module --with-mail --with-mail_ssl_module --with-file-aio --with-ipv6 --with-http_v2_module --with-cc-opt='-O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector-strong --param=ssp-buffer-size=4 -grecord-gcc-switches -m64 -mtune=generic'

[ より nginx-1.11.1 をダウンロード

1
2
3
4
# cd /usr/local/src
# wget http://nginx.org/download/nginx-1.11.1.tar.gz
# tar xvf nginx-1.11.1.tar.gz
# cd nginx-1.11.1

Nginx 1.11.1 で利用モジュールやサードパーティ(GeoIP-devel)をインストール

以下実行しないと nginx の configure が通りませんでした。

1
# yum install pcre-devel zlib-devel openssl-devel libxml2-devel libxslt-devel gd-devel perl-ExtUtils-Embed GeoIP-devel -y
  • gd-devel がインストールされていない場合の Nginx configure error
1
2
./configure: error: the HTTP image filter module requires the GD library.
You can either do not enable the module or install the libraries.
  • libxslt-devel がインストールされていない場合の Nginx configure error
1
2
./configure: error: the HTTP XSLT module requires the libxml2/libxslt
libraries. You can either do not enable the module or install the libraries.

configure

「現状の Nginx configure 確認」で取得した configure parameter から
「–add-dynamic-module=njs-1c50334fbea6/nginx」を削除

  • --add-dynamic-module=njs-1c50334fbea6/nginx を指定した場合の Nginx configure error
1
2
adding module in njs-1c50334fbea6/nginx
./configure: error: no njs-1c50334fbea6/nginx/config was found

「–add-dynamic-module=njs-1c50334fbea6/nginx」を削除して configure 実施

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
./configure --prefix=/etc/nginx --sbin-path=/usr/sbin/nginx --modules-path=/usr/lib64/nginx/modules --conf-path=/etc/nginx/nginx.conf --error-log-path=/var/log/nginx/error.log --http-log-path=/var/log/nginx/access.log --pid-path=/var/run/nginx.pid --lock-path=/var/run/nginx.lock --http-client-body-temp-path=/var/cache/nginx/client_temp --http-proxy-temp-path=/var/cache/nginx/proxy_temp --http-fastcgi-temp-path=/var/cache/nginx/fastcgi_temp --http-uwsgi-temp-path=/var/cache/nginx/uwsgi_temp --http-scgi-temp-path=/var/cache/nginx/scgi_temp --user=nginx --group=nginx --with-http_ssl_module --with-http_realip_module --with-http_addition_module --with-http_sub_module --with-http_dav_module --with-http_flv_module --with-http_mp4_module --with-http_gunzip_module --with-http_gzip_static_module --with-http_random_index_module --with-http_secure_link_module --with-http_stub_status_module --with-http_auth_request_module --with-http_xslt_module=dynamic --with-http_image_filter_module=dynamic --with-http_geoip_module=dynamic --with-http_perl_module=dynamic --with-threads --with-stream --with-stream_ssl_module --with-http_slice_module --with-mail --with-mail_ssl_module --with-file-aio --with-ipv6 --with-http_v2_module --with-cc-opt='-O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector-strong --param=ssp-buffer-size=4 -grecord-gcc-switches -m64 -mtune=generic'

...
...

checking for GeoIP library ... found
checking for GeoIP IPv6 support ... found
creating objs/Makefile

Configuration summary
+ using threads
+ using system PCRE library
+ using system OpenSSL library
+ md5: using OpenSSL library
+ sha1: using OpenSSL library
+ using system zlib library

nginx path prefix: "/etc/nginx"
nginx binary file: "/usr/sbin/nginx"
nginx modules path: "/usr/lib64/nginx/modules"
nginx configuration prefix: "/etc/nginx"
nginx configuration file: "/etc/nginx/nginx.conf"
nginx pid file: "/var/run/nginx.pid"
nginx error log file: "/var/log/nginx/error.log"
nginx http access log file: "/var/log/nginx/access.log"
nginx http client request body temporary files: "/var/cache/nginx/client_temp"
nginx http proxy temporary files: "/var/cache/nginx/proxy_temp"
nginx http fastcgi temporary files: "/var/cache/nginx/fastcgi_temp"
nginx http uwsgi temporary files: "/var/cache/nginx/uwsgi_temp"
nginx http scgi temporary files: "/var/cache/nginx/scgi_temp"

ビルド

1
2
# make
# make install

Nginx バージョン確認

1
2
3
4
5
# nginx -V

nginx version: nginx/1.11.1

configure arguments: --prefix=/etc/nginx --sbin-path=/usr/sbin/nginx --modules-path=/usr/lib64/nginx/modules --conf-path=/etc/nginx/nginx.conf --error-log-path=/var/log/nginx/error.log --http-log-path=/var/log/nginx/access.log --pid-path=/var/run/nginx.pid --lock-path=/var/run/nginx.lock --http-client-body-temp-path=/var/cache/nginx/client_temp --http-proxy-temp-path=/var/cache/nginx/proxy_temp --http-fastcgi-temp-path=/var/cache/nginx/fastcgi_temp --http-uwsgi-temp-path=/var/cache/nginx/uwsgi_temp --http-scgi-temp-path=/var/cache/nginx/scgi_temp --user=nginx --group=nginx --with-http_ssl_module --with-http_realip_module --with-http_addition_module --with-http_sub_module --with-http_dav_module --with-http_flv_module --with-http_mp4_module --with-http_gunzip_module --with-http_gzip_static_module --with-http_random_index_module --with-http_secure_link_module --with-http_stub_status_module --with-http_auth_request_module --with-http_xslt_module=dynamic --with-http_image_filter_module=dynamic --with-http_geoip_module=dynamic --with-http_perl_module=dynamic --with-threads --with-stream --with-stream_ssl_module --with-http_slice_module --with-mail --with-mail_ssl_module --with-file-aio --with-ipv6 --with-http_v2_module --with-cc-opt='-O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector-strong --param=ssp-buffer-size=4 -grecord-gcc-switches -m64 -mtune=generic'

構文チェック

こける。。

1
2
3
4
# nginx -t

nginx: [emerg] unknown directive "geoip_country" in /etc/nginx/nginx.conf:15
nginx: configuration file /etc/nginx/nginx.conf test failed

サードパーティに依存するディレクティブについては
load_module で SharedObject(*.so) を呼び出す必要があります。

  • /etc/nignx/nginx.conf の冒頭に以下追加
1
load_module "modules/ngx_http_geoip_module.so";

再度構文チェック

1
2
3
4
# nginx -t

nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful

Nginx 設定再読み込み

1
# systemctl reload nginx

以上で Nginx バージョンアップが無事完了しました。

Ansible+Vagrant でシンプルなPrometheusモニタリング環境構築

Ansible+Vagrant でシンプルなPrometheusモニタリング環境構築

概要

Prometheus 入門 にあるチュートリアルを
Ansible で簡単に構築できるようにした、
というものです。

先日 2016 年 6 月 14 日、
LINE 株式会社でのPrometheus Casual Talks #1に参加し
ナレッジのおさらいなどしたく、
構築法をまとめました。

Prometheus とは

最近話題の Pull 型の Query Filtering 可能で Grafana 等と連携できる モニタリング/Alert ツールです。

構成

Imgur

  • Prometheus Server × 1
  • Prometheus Client × 2

環境

  • CentOS 6.5
  • Prometheus Server 0.20.0
  • Supervisor 3.3.0
  • Go 1.6.2
  • Ansibl 2.1.0.0
  • Vagrant 1.8.1
  • MacOSX 10.11.5

前提条件

以下ツールをインストールしておいてください。

  • VirtualBox
  • Vagrant
  • Ansible

使い方

1. git repository を clone

[https://github.com/kenzo0107/Vagrant-Prometheus]

1
$ git clone https://github.com/kenzo0107/Vagrant-Prometheus

2. Vagrant VM 起動

1
2
$ cd Vagrant-Prometheus
$ vagrant up

3 node running !

  • 1 node: Prometheus Server
    • 192.168.11.30
  • other 2 nodes: Prometheus Client Server
    • 192.168.33.31
    • 192.168.33.32

3. ssh.config 追加

1
$ vagrant ssh-config > ssh.config

4. ping 疎通試験

1
2
3
4
5
6
7
8
9
10
11
12
13
14
$ ansible default -m ping

server | SUCCESS => {
"changed": false,
"ping": "pong"
}
client1 | SUCCESS => {
"changed": false,
"ping": "pong"
}
client2 | SUCCESS => {
"changed": false,
"ping": "pong"
}

ok, success.

5. 2node に PrometheusClient 設定

1
$ ansible-playbook set_clients_prometheus.yml

6. PrometheusClient の起動確認

以下 PrometheusClient を起動しているサーバにアクセスし
起動されているか確認します。

以下のように表示されれば成功です。

7. PrometheusServer 設定

1
$ ansible-playbook set_server_prometheus.yml

8. PrometheusServer 確認

http://192.168.33.30:9090 にアクセス

以下のように表示されれば成功です。

是非多少なりとも一助となれば何よりです!
いじくり倒してみてください!

以上

Jenkins - Short cycles in the day-of-month field will behave oddly near the end of a month

Jenkins - Short cycles in the day-of-month field will behave oddly near the end of a month

完全なる備忘録です。

Jenkins で 毎月第 1 月曜日のみ設定しようとしたら

1
Short cycles in the day-of-month field will behave oddly near the end of a month

次の様に分けるとエラーが消えます。

概要

アメリカでは
月間の期間を 4,5 週間の単位で
売り上げの結果を考える慣習があります。

その際に月初にレポートが欲しい
なんてときに今回このような処理をする必要がありました。

以上です。

日本国内からアクセスされるIP取得スクリプト Ruby 30秒クッキング

まずスクリプト

1
2
3
4
5
6
7
8
9
10
11
12
13
14
$ git clone https://gist.github.com/kenzo0107/714ece62cf6450386ff0fb16fd5b777a
$ cd 714ece62cf6450386ff0fb16fd5b777a
$ ruby getJapanIP.rb

1.0.16.0
1.0.64.0
1.1.64.0
1.5.0.0
...
中略
...
223.223.164.0
223.223.208.0
223.223.224.0

概要

作った経緯は
日本版・海外版URLがあり、
海外版に日本からアクセスした場合は
日本版サイトにリダイレクトさせたい、
という依頼があった為です。

このスクリプトを利用して
海外版サイト .htaccess等でリダイレクト設定をしました。

以上です。

Jenkins + SonarQube で PHPコードメトリクス計測!

Jenkins + SonarQube で PHPコードメトリクス計測!

前回

Jenkins とは別のサーバ上に
SonarQube をインストールし
アクセスできるまでをまとめました。

今回は Jenkins からソースを解析し
SonarQube でのメトリクス情報を表示までの実行方法をまとめます。

言語は どれでも良いですが、 今回は PHP とします。

Overview

以下概要になります。

SonarQube 側事前準備

プロジェクトを作成しプロジェクトキーを発行します。

1. ログインページへアクセス

http://:9000/sessions/new

デフォルトでは以下 admin:admin アカウントでログイン

Item Value
ID admin
PW admin

2. プロジェクト作成

  • ヘッダーメニュー Administration クリックし Administration ページへ遷移
  • Projects > Management クリック
  • Create ボタンクリック
  • Name, Key 入力し
  • プロジェクトが追加されたことがわかります。

3. PHP Plugin インストール

  • Administration ページ System > Update Center クリック
  • Available 選択 → 検索窓で「PHP」と入力 → 表示された PHP Plugin で Install クリック
  • Restart で SonarQube に PHP Plugin インストール
  • Installed タブで PHP Plugin がインストールされていることを確認

4. authentication token 発行

  • Security > User クリック
  • TOKENS クリックしポップアップ表示
  • 任意の文字列を入力し create
  • token コピー
    Jenkins 側の設定時に利用します。

以上で SonarQube 側の事前準備は終了です。

Jenkins 側準備

1. SonarQube Plugin インストール

Jenkins の管理 > Plugin の管理
にて SonarQube Plugin インストール

2. SonarQube Scanner インストール

以下オフィシャルダウンロードページからリンク取得

Analyzing+with+SonarQube+Scanner

1
2
3
4
$ cd /var/lib/jenkins
$ wget https://sonarsource.bintray.com/Distribution/sonar-scanner-cli/sonar-scanner-2.6.1.zip
$ unzip sonar-scanner-2.6.1.zip
$ ln -s sonar-scanner-2.6.1 sonar-scanner

3. Jenkins システム設定

  • Jenkins の管理 > システムの設定 へアクセス

  • JenkinsQube servers に必要項目入力

  • SonarQube Scanner に先ほどインストールした sonar-scanner パスを設定

上記入力後保存

4. ジョブ新規作成

「sonarqubeTest」という名前のジョブを新規作成します。

  • git リポジトリより PHP プロジェクト取得設定
  • SonarScanner 実行設定

以上で Jenkins 側の設定完了です。

SonarQube 反映確認

ちなみにこちら EC-CUBE 1.1 のプロジェクトでした。

EC-CUBE のコード重複率が多く
無駄が如何に多いかがわかります。

以上です。

MySQが落ちる トラブルシューティング Cannot allocate memory for the buffer pool

MySQが落ちる トラブルシューティング Cannot allocate memory for the buffer pool

概要

AWS E2 インスタンス上に MySQL, SonarQube インストールし起動するものの
MySQL が落ちるという事象が発生。

ログを見ると以下のエラーが。。

  • /var/log/mysqld.log
1
2
3
4
5
6
InnoDB: mmap(137363456 bytes) failed; errno 12
[ERROR] InnoDB: Cannot allocate memory for the buffer pool
[ERROR] Plugin 'InnoDB' init function returned error.
[ERROR] Plugin 'InnoDB' registration as a STORAGE ENGINE
[ERROR] Unknown/unsupported storage engine: InnoDB
[ERROR] Aborting
1
2
3
Cannot allocate memory for the buffer pool

バッファープールへのメモリ割当ができない

割りあてるメモリがないという話。
なので、メモリを作ります。

対策 1. swap 領域を作成する

swap 領域作成

1
2
3
4
5
6
7
8
// 空ファイル作成
# dd if=/dev/zero of=/swapfile bs=1M count=1024

// 作成した空ファイルをswap領域に設定
# mkswap /swapfile

// スワップ領域を有効化
# swapon /swapfile

swap 領域確認

1
2
3
4
5
# free

total used free shared buff/cache available
Mem: 1015472 833592 66456 1456 115424 54708
Swap: 1048572 491136 557436 ← Swapの設定が追加されていることを確認

mysql 再起動

1
# systemctl restart mysqld

対策 2. innodb_buffer_pool_size の割当を増やす

現在設定されている innodb_buffer_pool_size 確認

1
2
3
4
5
6
7
$ mysql -u <user> -p<pass> <db>  -e "SHOW VARIABLES LIKE 'innodb_buffer_pool_size'"

+-------------------------+-----------+
| Variable_name | Value |
+-------------------------+-----------+
| innodb_buffer_pool_size | 118835956 |
+-------------------------+-----------+

エラーログにあった 137363456 を下回ってるのがわかります。
この割当メモリを増やします。

my.cnf の場所探し

左から順に検索し該当するファイルがあればその my.cnf を参照します。
/etc/my.cnf → /etc/mysql/my.cnf → /usr/etc/my.cnf → ~/.my.cnf

1
2
3
# mysql --help | grep my.cnf
order of preference, my.cnf, $MYSQL_TCP_PORT,
/etc/my.cnf /etc/mysql/my.cnf /usr/etc/my.cnf ~/.my.cnf

メモリ追加

自分の方では
my.cnf 上に innodb_buffer_pool_size の設定項目がなかったので
追加しました。

  • my.cnf
1
2
3
4
5
6
7
8
9
10
[mysqld]
...
...

# 以下追加
innodb_buffer_pool_size = 256M

[mysqld_safe]
...
...

mysql 再起動

1
# systemctl restart mysqld

増えているか確認

1
2
3
4
5
6
7
$ mysql -u <user> -p<pass> <db>  -e "SHOW VARIABLES LIKE 'innodb_buffer_pool_size'"

+-------------------------+-----------+
| Variable_name | Value |
+-------------------------+-----------+
| innodb_buffer_pool_size | 268435456 |
+-------------------------+-----------+

今回発生していたエラーログが消えました。

CentOS7にSonarQubeをインストールしアクセス確認まで

CentOS7にSonarQubeをインストールしアクセス確認まで

概要

sonarqube
Java, Python, Ruby, PHP 等、複数言語のコードメトリクス集計ができる
優れものです。

以前 MacOSX ローカル環境で
Unity プロジェクト C#コードのコードメトリクス抽出方法をまとめました。

今回は CentOS7 上に構築する方法を以下にまとめました。

環境

  • CentOS7 64bit
  • Java 1.8
  • ec2 t.micro

JDK インストール

1
2
# cd /usr/local
# wget --no-check-certificate --no-cookies --header "Cookie: oraclelicense=accept-securebackup-cookie" "http://download.oracle.com/otn-pub/java/jdk/8u45-b14/jdk-8u45-linux-x64.tar.gz"
1
# tar xvf jdk-8u45-linux-x64.tar.gz
1
# ln -s jdk1.8.0_45 latest

環境変数 JAVA_HOME 設定

.bash_profile での設定ではユーザにより環境変数が異なるので
全ユーザ共通で設定する場合は /etc/profile.d/ 以下に shell を用意する。

1
2
3
4
5
# echo "export JAVA_HOME=/usr/local/java/latest
export PATH=$PATH:$JAVA_HOME/bin" > /etc/profile.d/javaenv.sh

# echo "export JAVA_HOME=/usr/local/java/latest
export PATH=$PATH:$JAVA_HOME/bin" > /etc/profile.d/javaenv.csh

MySQL インストール

今回は同一サーバに MySQL インストールしています。
別途 MySQL サーバを立てる場合は不要です。

1
2
3
4
5
6
7
8
9
10
11
12
13
# yum -y install http://dev.mysql.com/get/mysql-community-release-el6-5.noarch.rpm
# yum -y install mysql-community-server
# chown -R mysql:mysql /var/lib/mysql/*
# systemctl start mysqld
# chkconfig mysqld on

// 以下 DB名: sonar, DB User: sonar, DB Pass: sonar で設定
# mysql -u root

mysql> CREATE DATABASE sonar;
mysql> CREATE USER 'sonar'@'localhost' IDENTIFIED by 'sonar';
mysql> GRANT ALL PRIVILEGES ON sonar.* TO 'sonar'@'localhost';
mysql> FLUSH PRIVILEGES;

SonarQube インストール

以下サイトにてダウンロード zip を取得します。
SonarQube Donwloads

Imgur

※ 2016-05-19 時点 最新は ver 5.5

1
2
3
4
5
# mkdir /usr/local/sonarqube
# cd /usr/local/sonarqube
# wget https://sonarsource.bintray.com/Distribution/sonarqube/sonarqube-5.5.zip
# unzip sonarqube-5.5.zip
# ln -s sonarqube-5.5 sonar

環境変数 SONAR_HOME 設定

1
2
3
4
5
# echo "setenv SONAR_HOME=/usr/local/sonarqube/sonar
setenv PATH=$PATH:$SONAR_HOME/bin/linux-x86-64" > /etc/profile.d/sonarenv.sh

# echo "setenv SONAR_HOME=/usr/local/sonarqube/sonar
setenv PATH=$PATH:$SONAR_HOME/bin/linux-x86-64" > /etc/profile.d/sonarenv.csh

SonarQube から MySQL を利用できる様に設定

以下ファイルを編集し作成した DB にアクセスできるように設定します。

  • /usr/local/sonarqube/sonar/conf/sonar.properties
1
2
3
sonar.jdbc.username=sonar # DB User
sonar.jdbc.password=sonar # DB Password
sonar.jdbc.url=jdbc:h2:tcp://localhost:9092/sonar # DB url

SonarQube が利用する java コマンド設定

以下ファイルを編集し SonarQube が利用する java コマンドを
インストールした JDK 内の java を指定するように変更

  • /usr/local/sonarqube/sonar/conf/wrapper.conf
1
2
#wrapper.java.command=java
wrapper.java.command=/usr/local/java/latest/bin/java

SonarQube 起動スクリプト設定

1
2
3
# ln -s /usr/local/sonarqube/sonar/bin/linux-x86-64/sonar.sh /etc/init.d/sonar
# chkconfig --add sonar
# chkconfig sonar on

サーバ再起動

/etc/profile.d に設定した 環境変数を反映させるべくサーバ再起動します。

1
# reboot

アクセスして確認

http://<IPアドレス>:9000

SonarQube 管理ページが表示されれば OK です!

再起動後アクセスできない場合

SonarQube の設定を見直すか、もしくは、

今回利用している ec2 t2.micro のような小メモリの場合
メモリ不足で MySQL が落ちる可能性があります。

以下参照して対応してください。

あとがき

どんなプロジェクトでもここ修正したい!
と思うことは多々あるかと思います。

その際、なんとなくここ使いづらいから直そう!
という曖昧な判断ではなく

先立ってまず全体としてどういう状態にあるか、
を数値でみて判断する、

というプロセスが踏めるようになることを目的に導入しました。

次回は Jenkins からの実行方法をまとめます。

sftpをシェル化してファイルアップロード

概要

データ解析サービスを提供するサードパーティで
指定の Server, Path に指定形式で格納するように、
と指示がありました。

また、
「Protocol は sftp のみ許可でお願いします」
とも。

定期実行する必要もあったため
シェルで書けないかということで、
以下まとめました。

shell

Point

  • expect で通常、対話形式となるsftpコマンドの先読みでパスワードを通過

  • -oオプションで bachmode no を指定し以下のエラーを回避

1
2
Permission denied (publickey,password).
Connection closed
  • -bオプション バッチファイルにsftpログイン後の実行処理を記述

当方では、Jenkins や cron でシェルを定期実行する必要があった為
明示的にバッチファイルの内容を指定できるようにしています。

以上です。