CentOS7 に Nginx インストール

Kibana構築用に書いときました。

環境

  • CentOS7

Nginxインストール

  • Nginx用リポジトリ作成
1
# vim /etc/yum.repos.d/nginx.repo
  • 以下追記
1
2
3
4
5
[nginx]
name=nginx repo
baseurl=http://nginx.org/packages/mainline/centos/7/$basearch/
gpgcheck=0
enabled=1

Nginx モジュールインストール

1
$ sudo yum install --enablerepo=nginx nginx
サービス登録

サーバ起動時・再起動時にNginxが起動するようにします。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
$ sudo systemctl disable httpd
$ sudo systemctl enable nginx
$ sudo systemctl start nginx
$ systemctl status nginx

nginx.service - nginx - high performance web server
Loaded: loaded (/usr/lib/systemd/system/nginx.service; enabled)
Active: active (running) since Mon 2015-08-03 06:07:44 UTC; 2s ago
Docs: http://nginx.org/en/docs/
Process: 12642 ExecStart=/usr/sbin/nginx -c /etc/nginx/nginx.conf (code=exited, status=0/SUCCESS)
Process: 12641 ExecStartPre=/usr/sbin/nginx -t -c /etc/nginx/nginx.conf (code=exited, status=0/SUCCESS)
Main PID: 12645 (nginx)
CGroup: /system.slice/nginx.service
├─12645 nginx: master process /usr/sbin/nginx -c /etc/nginx/nginx....
└─12646 nginx: worker process

Aug 03 06:07:44 ip-172-31-19-253 systemd[1]: Starting nginx - high performan....
Aug 03 06:07:44 ip-172-31-19-253 nginx[12641]: nginx: the configuration file...k
Aug 03 06:07:44 ip-172-31-19-253 nginx[12641]: nginx: configuration file /et...l
Aug 03 06:07:44 ip-172-31-19-253 systemd[1]: Failed to read PID from file /r...t
Aug 03 06:07:44 ip-172-31-19-253 systemd[1]: Started nginx - high performanc....
Hint: Some lines were ellipsized, use -l to show in full.

アクセス確認

http://<IPアドレス or ドメイン>

以下のように表示されればOK

以上です。

go get で 「exec: "bzr": executable file not found in $PATH」エラー対策

結論

bzrモジュールインストールした後、再度go getして問題なく動作しました。

1
# yum install -y bzr

概要

EC2のCentOS7で
以下のように go get した際にbzrが見当たらないというエラーが発生した。

1
2
3
4
5
$ go get launchpad.net/goamz/aws

[centos@ip-xxx-xx-xx-xx src]$ go get launchpad.net/goamz/aws
go: missing Bazaar command. See http://golang.org/s/gogetcmd
package launchpad.net/goamz/aws: exec: "bzr": executable file not found in $PATH

ちょこっとしたつまづきでした。

ちなみに

bzrはgitと同様、分散バージョン管理システムです。

今回インストールしようとしたPackageがBazaarで管理していたから必要になったのでしょう。

以下参照
Bazaarユーザーリファレンス

Golang Revelフレームワークエラー 「server.go:1775: http: TLS handshake error from 127.0.0.1:36799: tls: first record does not look like a TLS handshake」対応

結論

[prod]モード以外で http.ssl = true とし起動すると発生するエラーでした。
その為、[prod]以外では http.ssl = false として起動することとしました。

概要

テスト環境で app.conf にて[test]モードを追加し
そこでオレオレ SSL 証明書作成して https リンクの動作確認をしようとしてました。

ですが、起動こそするものの一向にアクセスできず汗

dev モードではアクセス出来るのでその差分を見たところ、上記の結論に至りました。

エラー内容

revel 起動し url にアクセスすると以下のような TLS ハンドシェイクができずアクセスできない状況になる。

1
2
3
4
5
6
7
$ revel run myapp test

...
...

INFO 2015/08/19 14:48:38 harness.go:165: Listening on :9000
2015/08/19 14:48:40 server.go:1775: http: TLS handshake error from 127.0.0.1:36799: tls: first record does not look like a TLS handshake
go-sql-driver/mysqlでcreated_at (datetime) がUTCで登録されてしまう件

go-sql-driver/mysqlでcreated_at (datetime) がUTCで登録されてしまう件

環境

  • go-sql-driver/mysql version 1.2

結論

以下のように parseTime=trueloc=Asia%2FTokyoを設定する。

1
db, err := sql.Open("mysql", "user:passward@/dbname?parseTime=true&loc=Asia%2FTokyo")

loc=xxxxの指定がない場合、localが指定され、
datetime に time.Now()を指定して INSERT しても
UTC 時間に書き直されてしまう。

ちょっとハマりました。

Golang Revelフレームワーク ホットデプロイ方法

概要

Revel Official サイトにあるデプロイ方法を検証しました。

Revel Deployment

  1. ローカルでアプリをビルドしサーバにコピーする
  2. サーバーで更新したコードを pull し、ビルド・起動する
  3. Heroku を利用しデプロイ管理する

1. ローカルビルド

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# アプリを実行しテストする
$ revel run import/path/to/app

# パッケージ化
$ revel package import/path/to/app
Your archive is ready: app.tar.gz

# 対象マシンへコピー
$ scp app.tar.gz target:/srv/

# ターゲットマシンで起動
$ ssh target
$ cd /srv/
$ tar xzvf app.tar.gz
$ bash run.sh

開発しているアーキテクチャと同じ環境へデプロイする場合、
もしくは go インストールを設定し、デフォルトで希望するアーキテクチャへビルドするための唯一の方法です。

2. 追加デプロイメント

フルセットアセット付きの静的にリンクされたバイナリが巨大になる可能性があるので、
追加デプロイをサポートしています。

1
2
3
4
5
6
7
8
# アプリを一時ディレクトリにビルド
$ revel build import/path/to/app /tmp/app

# サーバのhomeディレクトリにその一時ディレクトリにrsync
$ rsync -vaz --rsh="ssh" /tmp/app server

# サーバーに接続しアプリを再起動
...

rsync は ssh でのコピーをサポートしているので、以下のように複雑にはなりますがデプロイ可能です。

1
2
# カスタム証明書、ログイン名、対象ディレクトリを指定しrsync
$ rsync -vaz --rsh="ssh -i .ssh/go.pem" /tmp/myapp2 ubuntu@ec2-50-16-80-4.compute-1.amazonaws.com:~/rsync

3. サーバでビルド

この方法はバージョンコントロールシステムに依存します。
Go をインストールしているサーバーが必要です。
その代わり、クロスコンパイルを回避することができます。

1
2
3
4
5
6
7
8
$ ssh server
... install go ...
... configure your app repository ...

# appディレクトリに移動し pullしサーバー起動する
$ cd gocode/src/import/path/to/app
$ git pull
$ revel run import/path/to/app prod

総評

現在社内では、1. ローカルビルド のデプロイ方法を選択しています。

2. 追加デプロイメント は、再起動時の瞬断が懸念されます。
大規模アクセスを捌く目的で利用する Go には向いていないと思います。

3. サーバでビルド は、運用方法にもよりますが、
本番環境でコンフリクトが起きてしまったらコンパイルもストップしてしまう懸念があります。

1. ローカルビルド方法を Jenkins で管理して運用しており
現状特に問題ないです。

Jenkins の設定等まとめてから公開したいと思います。

Ruby インストール on CentOS7

環境

  • AWS
  • CentOS Linux release 7.0.1406 (Core)

必要モジュールインストール

1
$ sudo yum -y install git libffi libffi-dev gcc openssl-devel readline-devel zlib-devel

rbenv, ruby-build ダウンロード

1
2
$ git clone https://github.com/sstephenson/rbenv.git ~/.rbenv
$ git clone https://github.com/sstephenson/ruby-build.git ~/.rbenv/plugins/ruby-build

rbenv PATH指定

1
2
3
4
$ echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.bash_profile
$ echo 'eval "$(rbenv init -)"' >> ~/.bash_profile
$ exec $SHELL
$ source ~/.bash_profile
1
2
3
4
5
6
7
8
9
10
11
12
$ rbenv install -list

Available versions:
:
:
2.0.0-p643
2.0.0-p645 ← 2.0.0の最新 (※2015/08/06時点)
2.1.0-dev
2.1.0-preview1
2.1.0-preview2
2.1.0-rc1
:

ruby インストール

1
$ rbenv install -v 2.0.0-p645

再読込

1
$ rbenv rehash

インストールしたバージョンに切り替え

1
$ rbenv global 2.0.0-p645

確認

1
2
$ ruby -v
ruby 2.0.0p645 (2015-04-13 revision 50299) [x86_64-linux]

以上

ElasticSearchインストール on CentOS7

環境

  • CentOS Linux release 7.0.1406 (Core)
  • ElasticSearch 1.7.1

必要モジュールダウンロード

1
$ yum install -y curl-devel java-1.8.0-openjdk

java バージョン確認

1
2
3
# java version "1.7.0_85"
OpenJDK Runtime Environment (rhel-2.6.1.2.el7_1-x86_64 u85-b01)
OpenJDK 64-Bit Server VM (build 24.85-b03, mixed mode)

public signing keyをダウンロード・インストール

1
$ rpm --import https://packages.elastic.co/GPG-KEY-elasticsearch

yum repositoryに elasticsearch追加

/etc/yum.repos.d/elasticsearch.repo 作成

1
$ vi /etc/yum.repos.d/elasticsearch.repo

以下追記

1
2
3
4
5
6
[elasticsearch-1.7]
name=Elasticsearch repository for 1.7.x packages
baseurl=http://packages.elastic.co/elasticsearch/1.7/centos
gpgcheck=1
gpgkey=http://packages.elastic.co/GPG-KEY-elasticsearch
enabled=1

インストール

1
$ yum install -y elasticsearch

config設定

設定ファイル作成
1
2
$ cp /etc/elasticsearch/elasticsearch.yml /usr/share/elasticsearch/config
$ vim /usr/share/elasticsearch/config/elasticsearch.yml
  • 9200 port設定
1
2
- #http.port: 9200
+ http.port: 9200

kuromojiプラグインをインストール

形態素解析器を使って日本語検索が可能になる。

ElasticSearchのバージョンによって elasticsearch-analysis-kuromojiのバージョンを変更する必要があります。
以下参考にお願いします。

https://github.com/elastic/elasticsearch-analysis-kuromoji

ここかなりハマりました汗

1
$ /usr/share/elasticsearch/bin/plugin --install elasticsearch/elasticsearch-analysis-kuromoji/2.7.0

elasticsearch サーバ起動時、自動起動登録

1
2
3
$ systemctl start elasticsearch.service
$ systemctl daemon-reload
$ systemctl enable elasticsearch.service

実行確認

1
$ curl http://localhost:9200
  • 実行結果
1
2
3
4
5
6
7
8
9
10
11
12
13
{
"status" : 200,
"name" : "Angelica Jones",
"cluster_name" : "elasticsearch",
"version" : {
"number" : "1.7.1",
"build_hash" : "b88f43fc40b0bcd7f173a1f9ee2e97816de80b19",
"build_timestamp" : "2015-07-29T09:54:16Z",
"build_snapshot" : false,
"lucene_version" : "4.10.4"
},
"tagline" : "You Know, for Search"
}

以上

CentOS7 に MySQL 5.6インストール

参照: http://www.kakiro-web.com/linux/mysql-yum-repository-install.html

MySQLのリポジトリ設定パッケージをダウンロード

1
$ wget http://dev.mysql.com/get/mysql-community-release-el7-5.noarch.rpm

MySQLのリポジトリのインストール

1
2
3
4
5
6
7
# rpm -Uvh mysql-community-release-el7-5.noarch.rpm

# MySQL 5.6 のリポジトリ利用
# yum --enablerepo=mysql56-community list | grep mysql

# MySQL 5.6 インストール
# yum --enablerepo=mysql56-community install -y mysql-community-server

rpm(Redhat Package Management)コマンドについて以下参照

http://itpro.nikkeibp.co.jp/article/COLUMN/20060227/230875/

MySQL 起動 / 登録

1
2
# systemctl start mysqld.service
# systemctl enable mysqld.service
DBアクセス
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
$ mysql -u root

Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 3
Server version: 5.6.25 MySQL Community Server (GPL)

Copyright (c) 2000, 2015, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql>

上記のようにアクセスできれば成功です。

以上

MySQL コマンドまとめ

MySQL コマンドまとめ

Dump 不要なテーブルは「–ignore-table=(テーブル名)」で排除

1
mysqldump -u <user> -p<password> dbname --ignore-table=dbname.table > dump.sql

DDL(Data Definition Language)取得

1
mysqldump -u <user> -p<password> --no-data dbname > ddl.sql

データ(INSERT クエリ)取得

1
mysqldump -u <user> -p<password> --no-create-info dbname > data.sql

DB インポート

1
mysql -u <user> -p<password> dbname < data.sql

ちなみにインポート時に以下のようなエラーが出た場合は、

1
ERROR 2006 (HY000) at line ***: MySQL server has gone away

以下記事参照してください。
[http://kenzo0107.hatenablog.com/entries/2015/12/17]

DDL なし + CSV はきだし

[f:id:kenzo0107:20160119111938p:plain]

1
2
3
mkdir ./csv
chmod o+x ./csv
mysqldump -u <user> -p<password> --tab=./csv --fields-terminated-by=, --fields-optionally-enclosed-by=\" --lines-terminated-by="\r\n" dbname

SELECT 文から CSV データで出力

  • SELECT ~ INTO OUTFILE output.csv の場合、DB サーバに /tmp/hoge.csv は出力される。
    コマンド実行するサーバと DB サーバが異なる場合は注意が必要です。
1
2
use dbname
SELECT * INTO OUTFILE'/tmp/hoge.csv' FIELDS TERMINATED BY ';' OPTIONALLY ENCLOSED BY '"' ESCAPED BY '' LINES STARTING BY '' TERMINATED BY '\r\n' FROM table;
  • コマンドライン SQL ファイルをロードし実行結果を CSV に保存
1
mysql -h <host> -u <user> -p<password> <db_name> -e "`cat query.sql`" | sed -e 's/\t/,/g' >/tmp/result.csv

INPUT OUTFILE を利用せずに CSV ファイル生成

https://kenzo0107.github.io/2015/12/16/2015-12-17-mysql-error-2006-hy000-mysql-server-has-gone-away/

テーブル指定し出力

1
mysqldump -u <user> -p<password> -t dbname table1 tabl2 > no_data.sql

テーブル指定し WHERE 句ありで出力

1
mysqldump -u <user> -p<password> -t dbname table1 "-w created_at < '2016-10-27' " > no_data.sql

output by CSV format

1
2
3
mysql -u user -ppassword
> use dbname
> LOAD DATA INFILE "<CSVFile>" INTO TABLE table FIELDS TERMINATED BY ',' ENCLOSED BY '"';

全テーブル TRUNCATE

1
mysql -u root dbname -N -e 'show tables' | while read table; do mysql -u root -e "truncate table $table" dbname; done

AUTO_INCREMENT 値確認

1
SELECT auto_increment FROM information_schema.tables WHERE table_name = '<table>';

AUTO_INCREMENT 値設定

1
ALTER TABLE <table> auto_increment=<int val>;

テーブル名変更

1
ALTER TABLE <old table> rename <new table>;

テーブルにカラム追加

1
ALTER TABLE <table> ADD <column> TINYINT(3) NOT NULL DEFAULT <deafult value> COMMENT '<comment>' AFTER <previous column>;
  • 例) テーブル user の email カラムの次にカラム名: mailmagazine_status を
    tinyint(3) 符号なし(unsigned)、デフォルト 0 の追加
1
ALTER TABLE user ADD mailmagazine_status TINYINT(3) UNSIGNED NOT NULL DEFAULT 0 COMMENT 'メルマガステータス' AFTER email;

テーブルのカラム削除

1
ALTER TABLE <table> DROP COLUMN <column>;

テーブルのカラム編集

1
ALTER TABLE <table> CHANGE <old column> <new column> <column 定義>;
  • 例) product テーブル の カラム名「no」を 「id」に、 unsigned(符号なし)、NULL 禁止、デフォルト: 0、カラムコメント 「商品 ID」に修正
1
ALTER TABLE product CHANGE `no` `id` int(11) unsigned NOT NULL DEFAULT '0' COMMENT '商品ID';

インデックス一覧表示

1
SHOW INDEXES FROM <table>;

インデックス追加

1
2
3
ALTER TABLE <table> ADD INDEX <index name>(<column>);

ALTER TABLE <table> ADD INDEX <index name>(<column1>,<column2>);

インデックス削除

1
ALTER TABLE <table> DROP INDEX <index name>;

ユニーク追加

1
ALTER TABLE <table> ADD UNIQUE(<column>);

ユニーク削除

DB の文字コード確認

1
SHOW CREATE DATABASE dbname

gz 形式で圧縮状態のファイルを特定 DB スキーマへ実行

1
zcat dump.sql.gz | mysql -u <user> -p<password> dbname

全テーブルの統計情報をサイズ順に一覧表示

1
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
SELECT * FROM information_schema.schemata WHERE schema_name = 'database_name';

+--------------+---------------+----------------------------+------------------------+----------+
| CATALOG_NAME | SCHEMA_NAME | DEFAULT_CHARACTER_SET_NAME | DEFAULT_COLLATION_NAME | SQL_PATH |
+--------------+---------------+----------------------------+------------------------+----------+
| def | database_name | utf8 | utf8_general_ci | NULL |
+--------------+---------------+----------------------------+------------------------+----------+

DB/Table 作成

DB 作成 (CHARACTER=utf8)

1
CREATE DATABASE `database_name` CHARACTER SET utf8;

指定 DB/ホストに対してユーザ・パスワード・権限設定

以下設定する必要あり

  • database_name
  • user_name
  • host_name
  • password
1
GRANT ALL PRIVILEGES ON `database_name`.* TO `user_name`@'host_name' IDENTIFIED BY 'password' WITH GRANT OPTION;

指定ユーザに mysql スロークエリログ参照権限付与

1
GRANT select ON mysql.slow_log TO user_name;

指定ユーザに RDS(AWS)の msyql スロークエリ参照権限付与

1
GRANT EXECUTE ON PROCEDURE mysql.rds_rotate_slow_log TO user_name;

指定ユーザの権限表示

1
SHOW GRANTS for 'user_name'@'%';

設定反映

上記権限設定した後に設定反映

1
FLUSH PRIVILEGES;

GRANT での権限付与の場合は特に FLUSH PRIVILEGES は不要ですが念の為。
INSERT、UPDATE、DELETE 等で権限付与した場合は FLUSH PRIVILEGES が必要になります。

テーブル毎の容量確認

[http://kenzo0107.hatenablog.com/entry/2016/06/27/121920:embed:cite]

ちょうど 1 年前に

1
SELECT NOW() - INTERVAL 1 YEAR;

昨日のことのように

1
SELECT NOW() - INTERVAL 1 DAY;

1 日前の 00:00:00

1
SELECT CURDATE() - INTERVAL 1 DAY;

1 日前の 11:00:00

1
SELECT DATE_FORMAT(CURDATE() - INTERVAL 1 DAY, '%Y-%m-%d 11:00:00');

MySQL バージョン確認

1
2
3
4
5
6
7
mysql -u <user> -p<pass> -e"SELECT version();"

+------------+
| version() |
+------------+
| 5.5.42-log |
+------------+

各種メトリクス

SELECT / INSERT / UPDATE / DELETE / REPLACE コマンドの実行回数取得

1
mysql -u root -NBe "SHOW GLOBAL STATUS" | grep "Com_"  | grep -E "select|insert|update|delete|replace"

[f:id:kenzo0107:20160927140251p:plain]

Item Explain
Com_delete 削除 (DELETE) 実行回数
Com_delete_multi 複数行 (DELETE) 実行回数
Com_insert 登録 (INSERT) 実行回数
Com_insert_select コピー作成 (INSERT SELECT) 実行回数
Com_replace 再作成 (REPLACE) 実行回数
Com_replace_select 再作成 (REPLACE SELECT) 実行回数
Com_select 選択 (SELECT) 実行回数
Com_update 更新 (UPDATE) 実行回数
Com_update_multi 複数行更新 (UPDATE) 実行回数

接続中 のコネクション数取得

1
mysql -u root -BNe "SHOW STATUS LIKE 'Threads_connected';"