うっかりエンジニアのメモ

未来の自分に宛てたメモ

さくらVPSにowncloudをインストール

owncloudとは

owncloudは自分のサーバ上にdropboxのようなクラウドファイル同期環境を実現するオープンソースソフトウェアです。

クラウドストレージサービスはすでにDropboxなどが定番でしょうか。しかし、デフォルトの容量が2GBと少なく、いろいろ頑張って無料範囲内で増量しても、せいぜい10GB。ですので

  • メジャーなクラウドストレージサービスでは足りない人
  • 諸事情でDropboxにはつなげられないけどクラウドでファイル同期したい人

に、おすすめです。

今回はowncloud6.0.1をさくらのVPSに入れてみました。

環境

LAMP環境をすでに構築してあるものとします。

さくらVPSLAMP環境を構築する手順は過去記事を参考にどうぞ。

準備

MySQL

owncloudは管理のためにDBを利用します。v6.0.1ではMySQLSQLiteを選択できるので、ここではMySQLを選択します。

owncloud用のDBを作成し、owncloud用のユーザを作成します。

mysql> create database owncloud character set utf8;
mysql> grant all privileges on owncloud.* to 'owncloud'@'localhost' identified by '【パスワード】' with grant option;
mysql> flush previleges;

Apache

/etc/httpd/conf.d/owncloud.confを新規作成し、

<Directory /var/www/html/owncloud/>
    Options Indexes FollowSymLinks MultiViews
    AllowOverride All
    Order allow,deny
    allow from all
</Directory>

と入力して保存。

owncloudインストール

cd /etc/yum.repos.d/
wget http://download.opensuse.org/repositories/isv:ownCloud:community/CentOS_CentOS-6/isv:ownCloud:community.repo
yum install owncloud

デフォルトでowncloudは/var/www/html/owncloudにインストールされます。rootユーザでファイルが生成されているとあかんので、apacheユーザにしておきます。

chown -R apache:apache /var/www/html/owncloud

Apacheを再起動します。

service httpd restart

owncloudへのアクセス

http://host.your.domain/owncloud

初期設定画面が表示されたら、インストールは完了です。


トラブルシューティング

手元のマシンからMySQL DBへ接続できない

リモート(たとえば手元のMacBook Pro)から、すべてのDBにアクセスできるDBユーザを作成済みで、正しいユーザ名とパスワードであるにもかかわらず、接続できない。

原因

ファイアウォールMySQLのポートへの接続が制限されているかも。

解決策

iptablesに下記を追加します。

-A INPUT -p tcp --dport 3306 -j ACCEPT
-A INPUT -p tcp --sport 3306 -j ACCEPT

iptablesを再起動します。

service iptables restart

owncloudにログインしようとするとリダイレクトループでログインできない

解決策

セッションファイルの所有者を確認します。 CentOS 6.5の場合、PHPのセッションファイルはデフォルトで/var/lib/php/session下に保存されるので、所有者をapacheの実行ユーザに変更する。

chown -R apache:apache /var/lib/php/session

原因

たぶんこのハマり方したのは自分だけのような気が…。 owncloud redirect loopググると、海外のフォーラムはよくひっかかる。それぞれ原因は異なるように見え、解決策を見つけることはできず。

うーん…と悩みつつ、あらためてコマンド履歴を振り返ると、owncloudのアクセス中にhttpd.confを編集した形跡が…! 思い出しました。owncloudインストール後に、Apacheの実行ユーザとグループをhogeに変えていたことを。

つまりこんなことが起きてました。

  • Apacheの実行ユーザがapacheの状態で、owncloudにログイン
  • /var/lib/php/session下に、所有者apacheでセッションファイルが生成される
  • owncloudにログイン中(=セッション有効中)にhttpd.confを開き、Apacheの実行ユーザをhogeに変更
  • Apache再起動
  • ブラウザからowncloud利用しようとするとログイン画面へ飛ばされる
  • ログイン画面で正しいユーザID/パスワードを入力する
  • ログイン情報は正しいのでログインしようとするが、セッションファイルを生成するディレクトリの所有者がapacheなので、生成できない
  • ここでリダイレクトループ発生?

完全におばかさんでした。 Apacheの実行ユーザはよく考えて、最初に決めましょう。

さくらVPSで複数の独自ドメインを運用する

さくらのVPSで、もともとサーバに付与されているipアドレスを生かしたまま、複数の独自ドメインを運用する手順を説明します。

環境

LAMP環境をすでに構築してあるものとします。

さくらVPSLAMP環境を構築する手順は過去記事を参考にどうぞ。

手順

ここでは例として、追加したいドメインは下記の2つとします。

DNSレコード設定

上記のドメインはさくらで取得していたので、さくらの管理画面からAレコードの指すipアドレスVPSサーバに付与されているものに変更するだけでした。5分程度で反映されました。

NameVirtualHost

Apacheが同じサーバ上で別々のドメインのサイトを運用する方法の一つが名前ベースのバーチャルホストです。Apacheは、クライアント(ブラウザ)から送られてくるHTTPHostヘッダを頼りに、どの独自ドメイン宛のリクエストなのかを判別します。

NameVirtualHostの有効化

/etc/httpd/conf/httpd.confを開き

#NameVirtualHost *:80

先頭の#を外します。

ドメインとの対応付け

ドメインに対するアクセスを、どのディレクトリに対応付けるかを設定します。 /etc/httpd/conf/httpd.confに書いてもよいのですが、ここで、/etc/httpd/conf.d/下にある.confで終わるファイルが、apacheの起動時にhttpd.confと同様に読み込まれることを利用します。

/etc/httpd/conf.d/moiranographia.com.confを新規作成し、下記を書きます。

<VirtualHost *:80>
  ServerName moiranographia.com
  DocumentRoot "/var/www/moiranographia.com/public_html"
  DirectoryIndex index.html index.php
  ErrorLog /var/log/httpd/moiranographia.com_error_log
  CustomLog /var/log/httpd/moiranographia.com_access_log combined
  AddDefaultCharset UTF-8
  <Directory "/var/www/moiranographia.com/public_html">
    AllowOverride All
  </Directory>
</VirtualHost>

独自ドメインが複数ある場合、同様にファイルの作成を繰り返します。

もともとサーバに付与されているipアドレスを生かす

Apacheの公式ドキュメントにもある通り、VirtualHostを有効にすると、もともとサーバに付与されているipアドレスの直打ちではアクセスできなくなります。

メインホストはなくなります

既にあるウェブサーバにバーチャルホストを追加する場合、 既存のウェブサーバに対しても ブロックを作らなければなりません。このバーチャルホストの ServerName と DocumentRoot は、グローバルな ServerName と DocumentRoot と同じものにします。また、このバーチャルホストを設定ファイルの中で先頭に置いて、デフォルトホストとして動作するようにします。

http://httpd.apache.org/docs/current/ja/vhosts/name-based.html より引用

ですので、httpd.confを編集します。

/etc/httpd/conf/httpd.confを開き、NameVirtualHost *:80の下あたりに、下記を追加します。

<VirtualHost *:80>
  ServerName xxx.xxx.xxx.xxx
  DocumentRoot "/var/www/html"
  DirectoryIndex index.html index.php
  ErrorLog /var/log/httpd/error_log
  CustomLog /var/log/httpd/access_log combined
  AddDefaultCharset UTF-8
  <Directory "/var/www/html">
    AllowOverride All
  </Directory>
</VirtualHost>

xxx.xxx.xxx.xxx: もともとVPSに割り当てられていたipアドレス

この設定により、たとえばxxx.xxx.xxx.xxx/example.htmlへのリクエストに対して、apache/var/www/html/example.htmlをレスポンスとして返します。

apacheを再起動します。

service httpd restart

さくらVPSにLAMP環境構築

さくらのVPSを契約してから、LAMP環境を構築するまでの手順を記録しておきます。

OSはCentOS 6.5 x86_64です。

事前準備

何はともあれ、まずはyum update

yum update

OSの言語を日本語にします。etc/sysconfig/i18nを開き

LANG="ja_JP.UTF-8"

に変更して保存。

SELinuxはオフにします。vi/selinux/configを開き

SELINUX=disabled

に変更して保存。

epel,remiレポジトリの追加

標準レポジトリPHPMySQLのバージョンが古いので、新しいバージョンをインストールするためにepel,remiレポジトリを追加します。

wget http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm
wget http://rpms.famillecollet.com/enterprise/remi-release-6.rpm
rpm -ivh epel-release-6-8.noarch.rpm 
rpm -ivh remi-release-6.rpm 

作業用ユーザ設定

rootでずっと作業したくないので、作業用ユーザhogeを追加します。

useradd hoge
passwd hoge
<ユーザhogeに設定したいパスワードを入力>

ユーザhogeをwheelグループに追加

usermod -G wheel hoge

ユーザhogeがsudoを実行できるように設定を変更します。

visudo

開いたテキストファイル中の

#%wheel        ALL=(ALL)       ALL

の先頭の#を削除する。

公開鍵認証

hogeユーザで実行します。

mkdir ~/.ssh
chmod 700 ~/.ssh

手元のPCで実行します。

ssh-keygen -t rsa -v
chmod 600 .ssh/id_rsa.pub
scp ~/.ssh/id_rsa.pub hoge@IP.ADD.RE.SS:~/.ssh/authorized_keys
ssh -i ~/.ssh/id_rsa hoge@IP.ADD.RE.SS

完了したら、ssh hoge@IP.ADD.RE.SSで、パスワードを聞かれることなくサーバにログインできることを確認。

SSH

サーバのセキュリティを高めます。

  • SSHポート番号変更
  • パスワード認証を禁止
  • rootユーザのログインを禁止

/etc/ssh/sshd_configを開き

Port 【10000以降で適当なポート番号】
PasswordAuthentication no
PermitRootLogin no

SSHDを再起動します。

service sshd restart

iptables

こちらの記事が非常に参考になりました。ありがとうございますm(__)m 「さくらのVPS」CentOS の初期設定の作業のまとめ&解説(iptablesによるファイアウォール編)「さくらのVPS」CentOS の初期設定の作業のまとめ&解説(iptablesによるファイアウォール編)

外部からMySQLへのアクセスを許可するために以下を追加します。

-A INPUT -p tcp --dport 3306 -j ACCEPT
-A INPUT -p tcp --sport 3306 -j ACCEPT

サーバーから外部へのHTTPS接続を許可するために以下を追加します。

-A INPUT -p tcp --sport 443 -j ACCEPT
-A OUTPUT -p tcp --dport 443 -j ACCEPT

Apache

インストール

OS起動時の自動起動設定も合わせて。

yum install httpd
chkconfig httpd on

DocumentRootの所有者がrootになっているので、apacheの実行ユーザに修正する。

chown -R apache:apache /var/www/html/

httpd.confの編集

/etc/httpd/conf/httpd.conf

ServerTokens Prod
ServerSignature Off
Options -Indexes FollowSymLinks

PHP

インストール

yum --enablerepo=remi install php php-devel php-mysql php-gd php-mbstring

php.iniの編集

error_log = /var/log/php.log
mbstring.language = Japanese
mbstring.internal_encoding = UTF-8
mbstring.http_input = auto
mbstring.detect_order = auto
expose_php = Off
date.timezone = Asia/Tokyo

apacheの再起動

service httpd restart

MySQL

インストール

yum --enablerepo=remi install mysql-server

my.cnfの編集

/etc/my.cnf

[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock

# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0

character_set_server=utf8
default-storage-engine=InnoDB
innodb_file_per_table

# Settings user and group are ignored when systemd is used (fedora >= 15).
# If you need to run mysqld under a different user or group,
# customize your systemd unit file for mysqld according to the
# instructions in http://fedoraproject.org/wiki/Systemd
user=mysql

# Semisynchronous Replication
# http://dev.mysql.com/doc/refman/5.5/en/replication-semisync.html
# uncomment next line on MASTER
;plugin-load=rpl_semi_sync_master=semisync_master.so
# uncomment next line on SLAVE
;plugin-load=rpl_semi_sync_slave=semisync_slave.so

# Others options for Semisynchronous Replication
;rpl_semi_sync_master_enabled=1
;rpl_semi_sync_master_timeout=10
;rpl_semi_sync_slave_enabled=1

# http://dev.mysql.com/doc/refman/5.5/en/performance-schema.html
;performance_schema


[mysqld_safe]
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid

[mysql]
default-character-set=utf8
[mysqldump]
default-character-set=utf8

mysql起動

OS起動時の自動起動設定も合わせて。

service mysqld start
chkconfig mysqld on

mysql初期設定

mysql_secure_installation

2014年の目標

もう2月も終わりかけですが…
駆け出しのエンジニアとして今年習得しておきたいことを書いておきたいなと。 飽きてもふらふらと別の事に取り組めるように、同時並行で進めます。

IaaS

先輩から「AWS触っとけ」と言われました。 クラウド上にアプリ展開するところまでは、自力でできるようになりたいです。

  • AWSのマイクロインスタンス借りて静的サイトをデプロイ
  • S3に静的コンテンツ置いといてどっかから参照
  • Windows Azure上に.NET MVCアプリケーションをデプロイ

「○○するには、だいたい▲▲円かかる」といった
クラウドのコスト感を身につけたいというのもあります。

VPS

勉強も兼ねて、さくらのVPSを契約しました。

  • linuxコマンド慣れる(願わくばLPIC 1取得)
  • セキュリティ設定込で、LAMP環境を一人で構築

アプリ制作

  • バンドマン支援アプリ
  • 数学愛好家向けサイト
  • 音取りアプリ

この辺り、昨年からぼんやりと作ってみたい欲求が湧いているので、時間的余裕のある若手のうちに形にしたい。

プログラミング

  • テストを作る習慣をつける
  • CIツールでテスト&ビルド自動化する
  • PHP, Javaを、後輩に技術的な指摘をできるレベルに引き上げる
  • JavaScript, Rubyを一人で調べてアプリを作れるレベルに引き上げる
  • Redmineでプロジェクト管理する

いずれにせよ、要素技術を別個に勉強するとしんどいので、上記のアプリを作りながら楽しみつつ学びたい。

業務全般

  • markdown記法でドキュメント書きまくって慣れる
  • DBスペシャリスト取得
  • Oracle RAC Expert取得

業務でRAC触りまくってるので、もしRAC Expertまで取れたら万々歳なんだけど、さすがに欲張り過ぎですね。笑

開発環境と本番環境のDB設定変更を自動化する

プライベートで作ってるアプリがそろそろリリースできそうということで、ちまちま準備しておりました。 その過程でDB設定を本番環境のDBサーバに合わせて変更する必要があったけど、環境が変わるたびにいちいちdatabase.phpを変えたりするのはめんどい。

方針として、開発環境と本番環境では動作するホストが異なるので、どうにかこれを利用して上手いことやりたい。

方法

AppModel.phpコンストラクタをオーバーライドします。

<?php

class AppModel extends Model {

    public function __construct($id = false, $table = null, $ds = null) {
        parent::__construct();

        if($_SERVER['SERVER_NAME'] === 'localhost'){
            $this->useDbConfig = 'development';
        }else{
            $this->useDbConfig = 'production';
        }
    }

}

database.php$development = ほにゃほにゃとか$production=ほにゃほにゃと書いておけば、本番環境にデプロイされた時は勝手に本番環境用の設定を読みに行ってくれます。うれしい。

ぐぐるとdatabase.phpにif文書く方法も出てくるのですが、設定ファイルに制御文書くのが個人的に嫌だったので、上記の方法にしました。