ssh hell

個人的に最近はなにをするにもsshが絡んでくる。
Webページのようにある意味1回設定したらほぼ無視できるようなものはまだ許容範囲。

でもユーザごとにアプリケーション別に設定しようとすると発狂しそうになる。
そこでユーザ認証時にできないものかということで、LDAPとSSHキーでググったところ
やっぱり機能的にはありそうな気配。

となると、ようやくここでOpenLDAPの導入タイミングかなぁ。
SingleSignOnのためだけに考えてたけど、SSHの管理がしきれないよね。

TeratermやWinSCPとLDAPとの連携ができると個人的には使いやすいと思うんだけど
そんな機能あったりするのかな?
って考えてみたけど、サーバのユーザ認証をLDAPでするからアクセスするツールは関係ないか。

Restyaboardの前にOpenLDAPに浮気かな。
そして、もう一度Server全部Clash&Buildしたくなってきた。

ジェットストリーム

uniのジェットストリームのボールペンを何故か4つもっている上に
布教活動のためにプレゼントするときに必ずつけているくらい書き心地はお気に入りなんですがリフィルがイマイチ。

なんだか調べたら同じ境遇の人がいるみたいで、外れロットだったのかなと。

5本入りのやつ買ったので悲しいくらい全部はずれ。
1割も使わないうちにかすれる。

持っている4本のうち1本はPrime版なんだけど、こちらもインクが切れたので新しくリフィル買おうと思ったけど全然売ってない。
フリクションはどこに行ってもいっぱい売ってるのはそんなに人気なのかな?

そんなこんなで、昔買ったペンやもらったペンをもう一度試してみる。

フリクションは予定が変わりまくる手帳に書くにはすごく便利だけど
書き心地よくないからストレスとまでは行かないけど、ジェットストリームみたいに使いたい!という気持ちにならない。
というか、そもそもメモをとるときとか消さないし、その間違いなども当時の記憶を思い出すために必要でしょと思う。

ビクーニャは滑らかさはもしかしたらジェットストリームよりも上なのかもしれないけどどうしてもフィーリングが合わない。

ジェットストリームのリフィルを色んな種類おいている店無いかなぁ

サーバー移行途中経過メモ

■デフォルトのイメージ図

               <Internet>
                 ↓ ↑
               <Webサーバ>
               Nginx 80,443
            ↓ ↑        ↓ ↑
      <APサーバ>            <その他>
       Nginx 80(仮)             Nginx 80,443
    JBossEAP ajp:8009            PHP-FPM:9000
           http:8080           Wordpress
           https:8443           Gitlab:8080
           admin:9990          Restyaboard:???
            ・・・                Zabbix:8008?
      Apache Solr               JobScheduler:4444?
      Apache Spark
            ↓ ↑        ↓ ↑
                <DBサーバ>
               MariaDB:3306

■導入完了リスト
Nginx
PHP-FPM
Wordpress

■導入間近
Gitlab
Restyaboard
Apache Spark
JbossEAP

■導入未定
Apache Solr
Zabbix
JobScheduler

■その他
Go言語で作ったソースと、HTML5の勉強のために作ったソースが廃止予定のサーバにあったのでサルベージする
サーバのレンタル数がいまひどいことになってきた。

WordPress,PHP7のインストール

様々なフレームワークを入れすぎてカオスになってきたサーバを正しく分解を目指す。
一時的にサーバ増やして対応後すぐ削除するつもりが恒例のごとくドはまりしたので記録を残す。

目的

Internet → Webサーバ → APサーバ → DBサーバ
              Nginx           php-fpm        MariaDB

こんな感じで3階層モデルにしたかった。
ただ、結構探したつもりでもNginxとPHP-FPMを同じサーバに入れる方法しか出てこなくはまった。
ハマった理由は単純にNginxもPHPも普段全く使わないので、httpdやJavaと似たような感じと思ってちゃんと公式を見なかったのがイケない気がする。
でも公式もなんかいまいち。

参考サイト
CentOS7 + php7 + nginx + php-fpm環境にwordpressインストール

PHP7の追加

rpm --import http://rpms.famillecollet.com/RPM-GPG-KEY-remi
rpm -ivh http://rpms.famillecollet.com/enterprise/remi-release-7.rpm
yum install --enablerepo=remi-php70 php php-mbstring php-pear php-fpm php-mcrypt php-mysql php-gd

マルチバイト(日本語など)を扱うphp-mbstring
PEARを使用するphp-pear
暗号化関数Mcryptを使用するphp-mcrypt
MariaDB接続用のphp-mysql
Wordpressで使用するphp-fpm
画像を扱うphp-gd

いろんなサイトみてもこれで行けそうなのに、エラーが出て進めない。
エラー内容

Error: Package: php-mcrypt-7.0.6-3.el7.remi.x86_64 (remi-php70)
           Requires: php-common(x86-64) = 7.0.6-3.el7.remi
           Installing: php-common-5.4.16-36.el7_1.x86_64 (base)
               php-common(x86-64) = 5.4.16-36.el7_1
 You could try using --skip-broken to work around the problem
 You could try running: rpm -Va --nofiles --nodigest

どうやら優先度を変えてあげる必要があるとのことで修正。
priority=1を追加。

vi /etc/yum.repos.d/remi-php70.repo

# This repository only provides PHP 7.0 and its extensions
# NOTICE: common dependencies are in "remi-safe"

[remi-php70]
priority=1
name=Remi's PHP 7.0 RPM repository for Enterprise Linux 7 - $basearch
#baseurl=http://rpms.remirepo.net/enterprise/7/php70/$basearch/
mirrorlist=http://rpms.remirepo.net/enterprise/7/php70/mirror
enabled=0
gpgcheck=1
・・・省略

phpのインストールができた。

wordpressのインストール

yum install wget
wget http://wordpress.org/latest.tar.gz
tar -zxvf latest.tar.gz

useradd -s /sbin/nologin nginx
chown -R nginx:nginx /var/www/html/wordpress/

cp -p wp-config-sample.php wp-config.php

php fpm

nginxのユーザ、グループに変更。(しなくてもいい気がしつつ修正)

cp -p /etc/php-fpm.d/www.conf{,.org}
perl -pi -e 's/user = apache/user = nginx/' www.conf
perl -pi -e 's/group = apache/group = nginx/' www.conf
sdiff -s www.conf www.conf.org

systemctl enable php-fpm
systemctl start php-fpm
systemctl status php-fpm

ここまであとから無理やり書いているのでカレントディレクトリを無視してます。
この辺までは間違ってるところもあるかもしれないが、他のサイト見てやれば間違わないはず。
# usraddは数字まで指定したほうが良かったのではなど。

そもそもこの3階層モデルにしようとしたのは
軽く調べた状態でphp-fpmが単体で動くはずという認識のとなったから。
NginxやhttpdをAPサーバには入れずにひたすら頑張ってみる。。

Nginxからphpに接続するのはfastcgiでなければダメということは
Nginxのメリットデメリットを見てわかっていたのでnginxのdefault.configを参考に作成

cp -p /etc/nginx/conf.d/default.conf /etc/nginx/conf.d/wordpress.conf
vi /etc/nginx/conf.d/wordpress.conf

server {
    listen       80;
    server_name  aaa.bbb.ccc.ddd;

    rewrite ^/$ /wordpress/ redirect;

    location / {
    }

    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   /usr/share/nginx/html;
    }

    location /wordpress/ {
        fastcgi_pass  eee.fff.ggg.hhh:9000;
        fastcgi_index index.php;
        include       fastcgi_params;
        fastcgi_param SCRIPT_FILENAME /html$fastcgi_script_name;
    }

}

大体はdefault.confにあるのを自分用に書き換えれば動く。
注目点は「root html」と書きそうな部分は削除。
これは同じサーバに入れる場合は有効かもしれないが、リモート接続する場合DocumentRootなんて存在しない。
また、fastcgi_paramも/scriptsから/htmlに変更。
こちらはphp-fpmとの設定ファイルと連携を取りながら合わせる必要がある。

cp -p /etc/php-fpm.d/www.conf /etc/php-fpm.d/www.conf.org
vi /etc/php-fpm.d/www.conf

[www]

user = nginx
group = nginx
listen = eee.fff.ggg.hhh:9000
listen.allowed_clients = aaa.bbb.ccc.ddd
pm = dynamic
pm.max_children = 50
pm.start_servers = 5
pm.min_spare_servers = 5
pm.max_spare_servers = 35
access.log = /var/log/php-fpm/$pool.access.log
access.format = "%R - %u %t \"%m %r%Q%q\" %s %f %{mili}d %{kilo}M %C%%"
slowlog = /var/log/php-fpm/www-slow.log
chroot = /var/www/
chdir = /
php_admin_value[error_log] = /var/log/php-fpm/www-error.log
php_admin_flag[log_errors] = on
php_value[session.save_handler] = files
php_value[session.save_path]    = /var/lib/php/session
php_value[soap.wsdl_cache_dir]  = /var/lib/php/wsdlcache

パフォーマンスに関わりそうな部分はあとでチューニングするとして
ここで注目するのはchrootとchdir。
こちらでfastCGIのROOTは/var/www/としているので、Nginx側では/htmlを追記してアクセス。

サービスを起動しなおして、Nginxのサーバにアクセス!

「Error establishing a database connection」
新しいサーバからのアクセスを受け付けてなかったので許可。
問題なく動いたと思い気や、ホスト名が昔のWebサーバになっている。
DB変更面倒だから後回しにしようと思ったのに、DBも入れ替えるか。
軽く調べてみると、DB内に直接URLをもっているらしい。。

Nginxインストール

公式サイト
http://nginx.org/
インストール手順

参考サイト
CentOS7 に Nginx をインストールする
CentOS6.xにてnginxの最新版をインストールする手順

参考サイトによると簡単にインストールできるぽいですが、
せっかくなので公式サイト通りの手順でインストール。
h2oというさらに早いものもあるみたいですが、インストールがどうしてもうまくいかないので諦め。
チューニング次第ではnginxでも同等の性能がでることと、日本製は育てていく土壌がないのでいずれ消えそうなため。

vi /etc/yum.repos.d/nginx.repo

[nginx]
name=nginx repo
baseurl=http://nginx.org/packages/centos/7/$basearch/
gpgcheck=0
enabled=1

yum install nginx

公式サイトが他の製品に比べるとあまり細かく書いていないのでこれであってるかは謎ですが、インストールはできた様子。

自動起動設定
systemctl enable nginx

起動
systemctl start nginx

停止
systemctl stop nginx

設定適用
systemctl reload nginx

稼働状況確認
systemctl status nginx

特に問題なくプロセスは起動しているようなのでポートの状況を確認
参考サイトCentOS7でポートを開放する方法。

iptablesより高機能になったようだけど、覚える気がないのもあり覚えにくい。

※参考サイト抜粋
firewall-cmd –add-port=22/tcp –zone=public –permanent

# 許可されているサービスやポートの一覧を表示
firewall-cmd –list-all –zone=public
firewall-cmd –list-services –zone=public
firewall-cmd –list-ports –zone=public

# 許可するサービスの追加と削除
firewall-cmd –add-service=ssh –zone=public –permanent
firewall-cmd –remove-service=ssh –zone=public –permanent

# 許可するポートの追加と削除
firewall-cmd –add-port=22/tcp –zone=public –permanent
firewall-cmd –remove-port=22/tcp –zone=public –permanent

# 利用可能なサービス一覧
firewall-cmd –get-services

# firewalldのリロード
firewall-cmd –reload

というわけで、下記のコマンド実施

firewall-cmd --list-ports --zone=public
firewall-cmd --add-port=80/tcp --zone=public --permanent
firewall-cmd --add-port=443/tcp --zone=public --permanent
firewall-cmd --list-ports --zone=public
firewall-cmd --reload
firewall-cmd --list-ports --zone=public

ブラウザにIPアドレスを入れて下記のイメージが出てくれば成功しているはず。
nginx

サイトが重い。。

原因は大体わかっていて、そもそも1Core1GBのクラウドサーバに
色々詰め込みすぎていること。

そろそろちゃんとお金払って改善しよう。
それなりにいろんな使い方する機会が増えてきたし。

なんかおすすめの構成とかないっすかね。
1台で今の構成で普通に動かそうとすると、最低でも4Core8GBないとリソースの奪い合いが激しいはず。
さくらのクラウドを使うと9504円。(東京リージョン)
1Core1GBが1522円(石狩リージョン)

今知ったけど、4Core8GBだと東京リージョンのほうが安いのか。。。
全てにおいて石狩リージョンのほうが安いと思ってた。

でも商売するうえではうまい手法だなと思う。。
エンタープライズなものを作ろうとすると拡張性の容易さから東京リージョンを選ばざるを得ない。

で、構成の話。
やっぱりJavaが好きな私としては3階層モデルかなと。

と思って、いろいろ今使おうと思っているものを調べると結構面倒なことになりそう。

■採用予定フレームワーク
Nginx
JBossEAP
Gitlab
Restyaboard
Apache Spark
Apache Solr
MariaDB
Wordpress

■検討中
Zabbix
JobScheduler

■不採用
Apache httpd
MySQL
PostgreSQL

1個ずつ整理。

■Webサーバ

Nginx
OpenLDAP

今までWebサーバにはApache httpdを利用していたが、やっぱり捌ける量が多いNginxは魅力的。
どうやらデメリットとしてメモリを共有するためScriptを組み込めないこともある。
WebサーバでScriptを組み込むってなんの事言ってるんだと思って調べてみたけど結局よくわからない。
雰囲気phpと相性が悪いようにも見えたが、それはScriptの作りに問題があるように思える。
NginxだとPHP-FPMというCGIを入れなければならないのはそこが原因のようだけど解決策としてはすでにあるようなので
そこまでのデメリットには感じない

APサーバにはCPUリソースの消費が少ないApache httpdのほうが良い様子。
とはいえ、混在するのは面倒なので、nginxの設定いじって対応する。
って思ったけど、そもそもAPサーバに入れる必要性あるかな。

■APサーバ

JbossEAP7.0Beta
Apache Spark
Apache Solr

今動いているのはJBossEAP7.0Beta
今日時点ではまだBeta版が最新。
毎回、新しいバージョン入れるたびに同じところでハマってる気がするので
GitLabを導入して改善したい。
キーワード:Eclipse / CDI / http2 / XADatasource / JSF / standalone.xml
昔のSeamGenがあったころはDB上にテーブル作ったら、簡単なWebページなら即できて良かった。
1月頃に試した状態では、テーブルからEntityまでは作ってくれたが、
その他の部分は自分で作る必要性があってハードルが高かった。
Mavenは確かに便利なのはわかるがまだ使いこなせていないのでそれもいずれ。
Mavenを使うにしろなんにしろ、一般公開されているサイトの情報を鵜のみにできないのがつらい。

O/Rmapperはなにを使うべきか。個人的には標準のJPA一択。
黎明期のころから使っていたので他のサイトでMyBatisが称賛されている内容もわからなくもない。
どこのプロジェクトにいってもパフォーマンスチューニングする私にとっては生のSQLであったほうが都合が良いことのほうが多いかもしれない。
でも大抵の場合、それは設計の時点で間違えてる。
別の言い方をすると、正規化が大好きなウォーターフォール型の開発ではMyBatisはとても有効だと思うが
スクラム開発など、正規化に重きをおいていない開発においてはJPAが優れていると思う。
よく、生SQLのほうが人口多いって話が出るが、パフォーマンスを最適化できるレベルはそんなにいない。

ここは語ろうと思うと色々語ることが多すぎる。。

■DBサーバ

MariaDB

MysqlがOracleに買収された関係で、mysqlのコマンドでも動くMariaDBを採用。
ただし、いくつかのサービスはデフォルトで使うと、自分の推奨DBを突っ込んでくるのでそれをなんとかしたい。
Restyaboardが少し不安。

1月頃にJBossとMariaDBを繋げてみたが、まだMariaDB接続用のDriverがイケてないイメージ。
当時のバージョンはver1.3.3。
今は1.4.4なので結構良くなっていると期待。

■その他

OpenLDAP
GitLab
Restyaboard
Zabbix
JobScheduler
Wordpress

こいつらをどこに組み込もうかすごい悩んでいたけど
APサーバと同じような位置づけで別に作ればいいじゃんと解決