Category Archives: サーバー

Android担当のseitoです。最近弊社ではCordovaを使ったアプリ開発に力を入れています。

今回はそのCordovaでCIを回したくてDocker+werckerでCI環境を作ってみました。

ざっくりとした手順は

1 werckerで呼び出すDockerイメージの作成

2 作成したDockerイメージをDocker Hubへプッシュ

3 wercker.ymlファイル作成

です。

 

1 werckerで呼び出すDockerイメージの作成

Docker Toolboxが入ってる前提で進めます。
まずはベースとなるOSを取得します。
Docker Quickstart Terminalを開きます。今回はCentOS6をベースにします。

docker pull centos:centos6

ダウンロードが始まります。しばらく待っているとダウンロード完了。
実際にダウンロードできたのか確認します。

$ docker images
REPOSITORY                TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
centos                    centos6             2f96ee8baf17        2 weeks ago         228.9 MB

無事できました。
次に先ほど取得したイメージからコンテナを作成します。

docker run -it centos:centos6

上記コマンドを実行すると作成されたコンテナ内のターミナルが開かれると思います。
実際にコンテナが起動しているか確認してみます。ctrl+p+qを押すとコンテナを起動したままコンテナ内のターミナルからexitできます。
コンテナが起動しているか調べます。docker psを使います。

$ docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
a6f43b17c7e5        centos:centos6      "/bin/bash"         17 seconds ago      Up 16 seconds                           evil_hypatia

コンテナが起動してるのがわかりますね。
それではこのコンテナにモジュールを色々入れていきます。今回はCordovaでionicというフレームワークを使用しているので
ionicコマンドが打てるようにしたいです。
なので今回は
・node.js
・npm
をインストールして
・cordova
・ionic
です。それでは再びコンテナに入ります。
起動しているコンテナに入る時はdocker attachを使います。

$ docker attach a6f

ログインできました。
次にnode.jsをインストールします

# rpm -Uvh https://rpm.nodesource.com//pub_4.x/el/6/x86_64/nodesource-release-el6-1.noarch.rpm

現時点で生きてるrpmです。

# yum install nodejs

インストール後、動作確認します。

# node -v
v4.4.3

問題なさそうです。
続いてnpmも入れます。

# yum install -y npm

動作確認します。

# npm -v
2.15.1

後はnpmでcordovaとionicを入れるだけです。

# npm install -g cordova
# npm install -g ionic

ionicコマンドが打てればOKなので確認

# ionic -v
1.7.14

できました。
それではこのコンテナをイメージにしたいと思います。
docker commitを使います。
一旦ctrl+p+qでコンテナから抜けます。

$ docker commit a6f plusrseito/sample

イメージ名は適当です。
イメージの確認を行います。

$ docker images
REPOSITORY                TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
plusrseito/sample         latest              40775aeb5d44        21 seconds ago      631.8 MB

これでDocker Hubへ上げるコンテナができました。

2 作成したDockerイメージをDocker Hubへプッシュ

できたコンテナをwerckerから呼び出せるようにDocker Hubへ上げます。
Docker Hubのユーザ登録手順は省きます。

まずログインします。

$ docker login

docker pushでローカルにあるイメージをDocker Hubへあげます。
先ほど作ったイメージをあげます。

$ docker push plusrseito/sample

今更ながらもうちょいまともな名前にすればよかった。
コマンドを叩くとアップロードが始まります。
作ったイメージのサイズによりますが、けっこう時間かかります。
完了したらDocker Hubのダッシュボードでイメージが上がっているか確認します。

スクリーンショット 2016-04-20 11.14.47

無事アップロードできました。既に2回プルされてるのは何だろう?と気になりつつもスルーします。

3 wercker.ymlファイル作成

前提として、対象プロジェクトのリモートリポジトリをwerckerと関連付ける作業が終わってるものとします。

実際にCordovaのプロジェクトで作ったDockerイメージを使っていきます。
Cordovaのプロジェクト直下にwercker.ymlを作成します。

wercker.yml

box: plusrseito/sample
build:
  steps:
    - script:
        name: check ionic version
        code: |
          ionic -v

今回はサンプルなのでバージョンチェックのみです。
wercker.ymlを追加したら変更をコミット・プッシュします。
werckerの対象プロジェクトのページでCI状況を確認します。

スクリーンショット 2016-04-20 11.24.51

スクリーンショット 2016-04-20 11.27.36

ビルドに成功してますね。
これで自分で作ったDockerイメージを使ってwerckerでCIする環境が整いました。

注意点として、wercker.ymlに記述するコマンドは一度Dockerコンテナ作成中に試しておくことをお勧めします。
ionic state resetやionic build等を使ったときにnpmパッケージが足りないというエラーが出てはまりました。
docker run でvオプションを使うとローカルディレクトリとコンテナ内のディレクトリを同期できるので、自分はその方法で
プロジェクトを取り込み動作確認してからDocker Hubに上げるようにしています。

それでは良いCIライフを。

Androidでサーバーからのアプリへのプッシュ通知を実装する方法を解説します。
WEB上の情報だけではアプリが正常に動かなかったのと、解りづらかったので、アプリの挙動とソースをメインに解説していきます。

大まかな流れとしては

○GoogleAPIのコンソールで[プロジェクトID][API key]を取得する

○アプリを作り、アプリから[レジストレーションID]を取得する

○サーバーからアプリへ通知する

という3つの柱になります。

○GoogleAPIのコンソールで[プロジェクトID][API key]を取得する

こちらについては、下記のサイトを参考になさってください。

Androidアプリでプッシュ通知を利用する

この記事の、<< 事前準備 >>と書かれた部分を手順通り行っていくと、プロジェクトIDAPI keyを取得できるはずです。
確認の仕方は下記を参照してください。

[プロジェクトID]

プロジェクトのトップページのどこかに「Project Number: ○○○○○○○○○○○○ 」という表記があり、それがプロジェクトIDになります。または、APIコンソールのURLの一部に「project:○○○○○○○○○○○○」という文字列が含まれており、そちらでも確認できます。

[API key]

古いコンソールだと記事の通りの場所に、新しいコンソール画面であれば、左メニューの「APIs & auth」から「Registered apps」をクリックして、該当のappを選択すると表示されます。

○アプリを作り、アプリから[レジストレーションID]を取得する

次回記事を参照

○サーバーからアプリへ通知する

こちらについては、下記のサイトを参考になさってください。

GCMを使用してAndroid-PHPでPUSH通知を実装する [Google Play services対応]

基本的には、アプリからサーバーに送られてきた情報(レジストレーションID+その他)をDBに保存して、API keyレジストレーションIDをセットにしてPUSH通知要求をGCMサーバーに送信します。

上記の記事では、アプリからレジストレーションIDのみを受け取っていますが、他の情報を受け取り、phpファイル内でその情報をもとにした判別処理を組み込み、ユーザーによって通知するメッセージを変更する、みたいな動作も可能です。

こんにちは!イッシーです(。≖ิ‿≖ิ) Apacheのプロセス数が増えなくてかなり困ったのでメモっておきます。

■通常設定

まずは通常の設定ファイルを開きます。

[cc lang="bash"]
vi /etc/httpd/conf/httpd.conf
[/cc]

以下のような部分を探しましょう。

[cc lang="bash"]

MaxClients 150
StartServers 5
MinSpareServers 5
MaxSpareServers 10

[/cc]

MaxClientsの数を確認しましょう。各ディレクティブの意味は以下のとおりです。

MaxClients
応答することのできる同時リクエスト数。
StartServers
起動時に生成される子サーバプロセスの数。但し、プロセス数は動的に調整される。
MinSpareServers
リクエストを受けていないサーバプロセスの最小個数。
MaxSpareServers
リクエストを受けていないサーバプロセスの最大個数。

設定が終わったら以下のコマンドで再起動します。

[cc lang="bash"]
/etc/init.d/httpd restart
[/cc]

大概はここまでの内容で上手く反映されるかと思います。。。で、今回は反映されなくて凄く困りました。(☍﹏⁰)

■現在の設定の確認

読み込まれて有効になっている設定を確認します。

[cc lang="bash"]
vi /etc/httpd/conf/httpd.conf
[/cc]

以下のような部分を探しコメントアウトを削除します。但し、以下のようにした場合は全ての場所からサーバの情報が見えてしまいますので、必要に応じてIPなどで制限するようにしてください。

[cc lang="bash"]

SetHandler server-info
Order deny,allow
Deny from all
Allow from all# you need restrict by IP address

[/cc]

変更が終わり保存したらサーバーを再起動します。

[cc lang="bash"]
/etc/init.d/httpd restart
[/cc]

その後ブラウザからアクセスします。

[cc lang="bash"]

http://127.0.0.1/server-info

[/cc]

読み込まれているモジュールの一覧などが表示されますので、prefork.cをクリックします。以下のように表示されました。

[cc lang="bash"]
Module Name: prefork.c
In file: /etc/httpd/conf/httpd.conf
78: StartServers 5
79: MinSpareServers 5
80: MaxSpareServers 10
82: MaxClients 150
In file: /etc/httpd/conf.d/swtune.conf
78: StartServers 5
79: MinSpareServers 5
80: MaxSpareServers 10
82: MaxClients 10
[/cc]

もう1ファイル読み込まれていることが分かります。そしてMaxClientsの値が上書きされていたことも分かりました。

■設定ファイルの変更

もうできたも同然ですね(♡´ω`♡)。以下のコマンドで設定ファイルを編集します。

[cc lang="bash"]
vi /etc/httpd/conf.d/swtune.conf
[/cc]

MaxClientsの値を変更したら以下のコマンドでサーバーを再起動します。

[cc lang="bash"]
/etc/init.d/httpd restart
[/cc]

キタ━━━━。゚+.ヽ(´∀`*)ノ ゚+.゚━━━━!!。ということで今回はライトに締めくくります。ではではー

こんにちは。イッシーですʕ→ᴥ←ʔ キュンキュン!世の中ドキュメントはHTMLという流れですね。オフィスで残すのも管理が大変なので、ちゃっかりブログに載せちゃえ主義を貫こうと思います。

さて、プラスアールではクラウドを利用してサービスを運営しています。そこで本日はAWSでサーバをたてます。硬派なインストール方法(ソースからビルド)をせず、yumしまくってますがご了承ください。m(__)m

※Amazon Linuxの32bitを使用しております。

■Apache

いわゆるWebサーバです。

[cc lang="bash"]
sudo yum install httpd
sudo chkconfig httpd on
[/cc]

インストール及びマシン起動時の設定が完了しました。特にサーバーとしては問題なく動作するのですがセキュリティ上望ましくない部分もありますので設定を変更します。

設定

以下のコマンドで設定ファイルを編集します。

[cc lang="bash"]
sudo vi /etc/httpd/conf/httpd.conf
[/cc]

HTTPヘッダ内のApacheのバージョン

特定のバージョンに存在する未知の脆弱性というものも存在するかもしれません。以下の部分を

[cc lang="bash"]
ServerTokens OS
[/cc]

以下のように編集しバージョンを隠すようにしましょう。

[cc lang="bash"]
ServerTokens ProductOnly
[/cc]

サーバーネームの変更

[cc lang="bash"]
#ServerName www.example.com:80
[/cc]

以下のように変更する。

[cc lang="bash"]
ServerName hogehoge.com:80
[/cc]

ディレクトリの一覧表示を禁止

ディレクトリの中身が見えてしまうというのはセキュリティ上好ましくありません。以下の部分を

[cc lang="bash"]
Options Indexes FollowSymLinks
[/cc]

以下のように変更して一覧を表示させないようにしましょう。

[cc lang="bash"]
Options -Indexes FollowSymLinks
[/cc]

htaccessの使用を許可

これは用途によりますが大概のWebアプリケーションはhtaccessファイルを使用しているのではないかと思います。<Directory “/”>内の以下の部分を

[cc lang="bash"]
AllowOverride None
[/cc]

以下のように変更します。

[cc lang="bash"]
AllowOverride All
[/cc]

.htaccessファイルは外から見られるとセキュリティリスクになります。以下の記述が見つからない場合は追記しましょう。

[cc lang="xml"]

Order allow,deny
Deny from all

[/cc]

エラーページにおけるサーバ情報の表示禁止

これは一番最初の設定項目と同様の理由です。不要な情報は極力表示させないようにしましょう。以下の部分を

[cc lang="bash"]
#ServerSignature On
[/cc]

以下のように変更します。

[cc lang="bash"]
ServerSignature Off
[/cc]

起動

以下のコマンドで起動します。

[cc lang="bash"]
sudo /etc/init.d/httpd start
[/cc]

ちなみに初期設定の場合は以下のディレクトリのファイルが参照されます。

[cc lang="bash"]
/var/www/html/
[/cc]

従ってそこにindex.htmlを設置すれば参照できますね。Webサーバーσ°▽°)σ ゲッツ!

■MySQL

いわゆるDBです。Amazon RDSを使用しても良いのですが今回は同マシン内でMySQLも動かしてみます。

[cc lang="bash"]
sudo yum install mysql mysql-server mysql-devel
sudo chkconfig mysqld on
[/cc]

設定

以下のコマンドで設定ファイルを編集します。

[cc lang="bash"]
sudo vi /etc/my.cnf
[/cc]

文字コード

MySQLのデフォルトの文字コードはコンパイルオプションで指定しないとlatin1です。試しに以下のコマンドで確認します。

[cc lang="bash"]
mysql> show variables like ‘character_set%’;
+————————–+—————————-+
| Variable_name | Value |
+————————–+—————————-+
| character_set_client | latin1 |
| character_set_connection | latin1 |
| character_set_database | latin1 |
| character_set_filesystem | binary |
| character_set_results | latin1 |
| character_set_server | latin1 |
| character_set_system | utf8 |
| character_sets_dir | /usr/share/mysql/charsets/ |
+————————–+—————————-+
[/cc]

マルチバイト圏に生まれて凹みますね。でも大丈夫。以下の記述を設定ファイルに加えましょう。

[cc lang="bash"]
[mysqld]
character-set-server=utf8
[client]
default-character-set=utf8
[/cc]

以下のように生まれ変わります!

[cc lang="bash"]
mysql> show variables like ‘character_set%’;
+————————–+—————————-+
| Variable_name | Value |
+————————–+—————————-+
| character_set_client | utf8 |
| character_set_connection | utf8 |
| character_set_database | utf8 |
| character_set_filesystem | binary |
| character_set_results | utf8 |
| character_set_server | utf8 |
| character_set_system | utf8 |
| character_sets_dir | /usr/share/mysql/charsets/ |
+————————–+—————————-+
[/cc]

僕はunicode以外の文字コードは嫌いです(●´⌓`●)

パスワード

インストール直後のMySQLはrootのパスワードがありません。セキュリティを考えて必ず設定しておきましょう。

[cc lang="bash"]
myql -u root
[/cc]

以下のSQLを実行します。

[cc lang="sql"]
SET PASSWORD FOR root@localhost=PASSWORD(‘fugafuga’);
exit;
[/cc]

実はもっと沢山の設定項目がありますが本題から外れてしまいそうなのでサクっと終わらせます。

起動

以下のコマンドで起動します。

[cc lang="bash"]
sudo /etc/init.d/mysqld start
[/cc]

MySQLサーバーσ°▽°)σ ゲッツ!

■PHP

みんな大好き”ゆとり言語”PHPです!必要に応じてパッケージは追加してください。

[cc lang="bash"]
sudo yum install php php-devel php-pdo php-pear php-mcrypt php-mysql php-mbstring
[/cc]

Amazon LinuxリポジトリのPHPバージョンは5.3.6。キュンキュンするバージョンですね。ʕ→ᴥ←ʔ キュンキュン!

PHP設定

以下のコマンドを実行し設定ファイルを編集します。

[cc lang="bash"]
sudo vi /etc/php.ini
[/cc]

文字コード

以下の項目を探して下記を例に変更しましょう。

[cc lang="bash"]
mbstring.language = Japanese
mbstring.internal_encoding = UTF-8
mbstring.http_output = UTF-8
[/cc]

※携帯サイトの場合はSJISかもしれません。

PHPのバージョン表示

PHPには特定のバージョンに存在する脆弱性が存在します。以下の部分を

[cc lang="bash"]
expose_php = On
[/cc]

以下のように変更し

[cc lang="bash"]
expose_php = Off
[/cc]

バージョン情報をクライアントに送信しないようにしましょう。

タイムゾーンの設定

以下の部分を

[cc lang="bash"]
;date.timezone =
[/cc]

以下のように書き換えましょう。

[cc lang="bash"]
date.timezone = Asia/Tokyo
[/cc]

動作確認

[cc lang="bash"]
sudo /var/www/html/index.php
[/cc]

以下のように記述します。

[cc lang="php"]
phpinfo();
[/cc]

キタ━━━━。゚+.ヽ(´∀`*)ノ ゚+.゚━━━━!!ドキュメント化に30分くらいかかってしまいましたが、上述の作業だけだったら10分でできるかと思います。自分で書いたタイトルですが「普通のウェブアプリケーション」って何をもってして普通なんでしょうね・・・

みなさんこんにちはこんばんは。イッシーですʕ→ᴥ←ʔ。前回はSubversionでのバージョン管理でしたが世はすっかりGitムードです。プラスアールでも使い方を学びつつ四苦八苦しながらGitに移行してます。そこで今回はGitでの環境構築の部分をまとめてみました。

  • 解説は、プロジェクト名:sample.plusr.biz、ユーザ名:ishimotoとしてます
  • ルート権限で作業します

■サーバ側

【step1】グループを作る

プロジェクト名と同じ名前のグループを作りましょう。重複を防ぐためにもドメイン名が良いかと思います。

[cc lang="bash"]
/usr/sbin/groupadd sample.plusr.biz
[/cc]

【step2】グループにユーザを追加

グループにプロジェクトユーザを加えます。
[cc lang="bash"]
gpasswd -a ishimoto sample.plusr.biz
[/cc]

以下のコマンドでも同様の操作が可能ですが、今まで追加したグループを列挙しなければなりません。

[cc lang="bash"]
/usr/sbin/usermod -G sample.plusr.biz,hoge.plusr.biz,fuga.plusr.biz ishimoto
[/cc]

【step3】新規リポジトリの作成

以下のコマンドで新規リポジトリをサーバー上に作成します。

[cc lang="bash"]
mkdir sample.plusr.biz
cd sample.plusr.biz
[/cc]

【step4】リポジトリの作成

以下のコマンドで新規リポジトリをサーバー上に作成します。

[cc lang="bash"]
git –bare init
[/cc]

※bareとは作業ファイルがないからのリポジトリです。

[cc lang="bash"]
vi description
[/cc]

以下のように任意のプロジェクト名を記述します。

[cc lang="bash"]
sample.plusr.biz.repository
[/cc]

※リポジトリ名を記述しなかった場合、push時に以下のエラーが発生します。

[cc lang="bash"]
*** Project description file hasn’t been set
error: hooks/update exited with error code 1
error: hook declined to update refs/heads/master
[/cc]

【step5】権限設定

グループのユーザに書き込み権限を与えます。

[cc lang="bash"]
chmod -R 0775 /usr/local/development/repos/sample.plusr.biz
chmod -R g+s /usr/local/development/repos/sample.plusr.biz #(1)
chgrp -R sample.plusr.biz /usr/local/development/repos/sample.plusr.biz
[/cc]

※上述の(1)がない場合、pushをしたときに以下のエラーが発生する。

[cc lang="bash"]
error: failed to push some refs to ‘ssh://ishimoto@123.123.123.123:1234/usr/local/development/repos/sample.plusr.biz’
[/cc]

■クライアント側

まず、環境に合わせて以下をインストールします。

Mac
Git for Mac OS X
Win
msysgit

【step1】準備

プロジェクト用のディレクトリを作り、配下で以下ののコマンドを実行します。

[cc lang="bash"]
mkdir sample.plusr.biz
cd sample.plusr.biz
git init
[/cc]

【step2】初期状態を準備

フレームワークなどのファイルを配置した後に以下のコマンドを実行します。

[cc lang="bash"]
git add .
git commit -m “import :)”
git remote add origin ssh://ishimoto@123.123.123.123:1234/usr/local/development/repos/sample.plusr.biz
git push origin master
[/cc]

※ちなみに間違えてリモートをセットしたときは以下のコマンドで再設定できます。

[cc lang="bash"]
git remote set-url origin ssh://ishimoto@123.123.123.123:1234/usr/local/development/repos/sample.plusr.biz
[/cc]

リモートを確認するには以下のコマンドを使用します。

[cc lang="bash"]
git remote -v
[/cc]

※さらにちなみにですが僕はコメントに顔文字を入れたりします。(。・ω・)ノ゙

【参考】

いかがでしょうか?率直なところ、まだ僕はSubversionからGitに乗り換えた恩恵を授かっていません。しかし、開発人数が増加すれば分散リポジトリの恩恵を授かれるはずです。次回は、実際のGit環境での開発について書いてみたいと思います。。。あ、WinのGit環境がわからないな・・・(●´⌓`●)