俺の開発大作戦

Linux, Mac, Windows10 で 迷走する1開発を進めていく備忘録5

LOCALHOST からクラウドの DB サーバに接続

さくらインターネットなど大手レンタルサーバ事業者は、およそ、ローカルのWeb開発環境から 直接DBサーバに接続できない仕様だ。むろん、安全対策上必要な仕様であるものの、localhost に設置した web サーバ上で web製作を進める場合には、少々不便を感じることがある。

一方、たいていのレンタルサーバ事業者は、ローカルからのssh通信は許可している。つまり、sshポートフォワーディングを利用すれば、localhost のwebサーバと、クラウドの DB サーバで通信が可能になる。

というわけで、さっそく設定を行った備忘録。

1. 鍵認証によるsshアクセスを行う設定

(*すでに設定済、あるいはIDパスワードのみによる認証でよければこの設定は不要。)
まずは、localhost 側で以下のコマンドを実行して鍵を作成。

% ssh-keygen -t rsa

ssh-keygen コマンドの -t オプションで、鍵のタイプを指定。タイプは、「RSA」方式と「DSA」方式のどちらかを選択可能。なお、「OpenSSH」の最新版では、より長い鍵長が選択できる「RSA」がデフォルトになっている模様。念の為、オプションを付けておく。

コマンドを打つと設定するパスワードのフレーズを聞かれるので入力する。(入力せずに Enter で進むとパスワードなしの設定となる。)その後、デフォルトの設定で、次のとおり localhost に鍵が作成される。

公開鍵:~/.ssh/id_rsa.pub
秘密鍵:~/.ssh/id_rsa

続いて、sshアクセスするクラウドサーバにアクセスして、サーバの ~/.ssh/authorized_keys に、公開鍵を登録する。.ssh フォルダやauthorized_keys がなければ作成する。この時、作成と一緒にパーミッションを 設定するのを忘れずに行う。

% ssh ユーザー名@サーバアドレス
% mkdir ~/.ssh
% touch ~/.ssh/authorized_keys
% chmod 700 ~/.ssh
% chmod 600 ~/.ssh/authorized_keys

あとは、authorized_keys に localhost 側に作成した id_rsa.pub の内容を追記すればよい。なお、sshアクセスから作成済の authorized_keys に公開鍵を追記するまでの作業を一貫して行いたい場合は、次のとおり。

% cat ~/.ssh/id_rsa.pub | ssh ユーザー名@サーバアドレス 'cat >> .ssh/authorized_keys'

2. ssh によるポートフォワーディング実行

本題のポートフォワーディングを以下のコマンドにて実行する。

% ssh -f -N -L 3307:リモート(クラウド上)のDBサーバアドレス:3306 ユーザー名@サーバアドレス;

-f オプションは ssh をバックグランドで接続するよう指示するもの。また、-N オプションはリモートコマンドを実行しないようにする。これらのオプションはポート転送のみをおこないたい接続の場合につけておくと便利。

-L オプションでは、ローカル側ソケットを指定する。ここで指定した localhost 上のTCP ポートまたはUnixソケットを、続いて指定するリモートホスト上のポートにフォワーディングできる。使用する場合は、'ローカル側ソケット:リモート側DBサーバアドレス:リモート側DBサーバ使用ポート'のように続けて指定する。

上の例では、ローカル側の3307ポートをリモート側DBサーバの3306ポートに転送している。これで、'localhost:3307'のようなアドレス指定で、ローカルのwebサーバからリモートのDBサーバにアクセスできるようになる。(後日追記:MySQLなどのUnixサーバ上では、ホストネームの localhost には特別な意味を持ち、TCP/IPではなくUnixソケットで接続されることが多く、このような場合にポート番号を指定しても無視されてしまう。このため、hosts などでlocalマシンのアドレス '127.0.0.1' に localhost 以外の適当な名前を登録して、'適当な名前:3307' のように指定して使用する方が無難である。)

なお、バックグランドで実行中のssh接続を止める場合は、次のとおり。

% pgrep -f 'ssh'
プロセス番号
% kill プロセス番号

(*)pgrep コマンドは、シンプルにプロセス番号(pid)のみを返り値とし、また、自身のコマンド分は表示しないなど、grepにオプションを沢山つけてを使う場合と比べて効率的で便利。以下のようにシンプルなワンライナーで kill処理まで指示を書くこともできる。

 % pgrep -f 'ssh' | xargs kill

UNIX の忘れがちなシェルコマンド備忘録

便利だが忘れがちなコマンド構文を備忘録として残していく第一弾。

1. 指定する文字列を含む文書を一括検索してフルパスで表示する

% find PATH -type f -print | xargs grep 'hoge' 2> /dev/null

PATH は検索を開始したい場所。hoge は検索したい文字列。

'xargs' コマンドは 'コマンドA | xargs コマンドB' のように2つのコマンドをパイプでつなぐことで前のコマンド(コマンドA)で取得した値(標準出力)を読み込み、それを引数としてコマンドBへ渡して実行させる役割を果たす。組み合わせや引数の組み合わせ次第では、コマンドが許容の長さを超える引数のリストを受け付けない問題を回避できたり、処理を並列化して高速化できる場合がある。

'find' コマンドは-typeオプションで、ファイルタイプを指定して検索できる。値を 'f' にすると通常ファイルを検索し、 'd' はディレクトリを、 'l' はシンボリックリンクを検索する。

また、 'find' コマンドに-printオプションをつけると、フルパスで検索結果を標準出力する。

コマンドに '2> /del/null' を付けると標準エラー出力を/dev/nullに捨てることができる。ブラウザのキャッシュなどが走査対象に含まれていて、'検索対象のファイルやディレクトリが見つからない'等のエラーが頻出する場合は、これらを表示しないようにできる。

2. ディレクトリ内にある全ての文書内の文字列Aを文字列Bに置き換える

% grep -l '文字列A' ./* | xargs sed -i.bak -e 's/文字列A/文字列B/g'

再び'xargs' コマンドを含む構文のコマンドで、「置換・削除」を行うための'sed' コマンドをパイプで繋ぐもの。

'sed' コマンドは-iオプションをつけると、変換処理後にファイルを上書き保存できる。更にこのオプションに文字列を続けると、元ファイルをこの文字列を接尾語としたファイルに別名保存して残しておくことができる。なお、文字列を続ける場合は、-iとの間にスペースを挟んではいけない。

'sed' コマンドの-eオプションをつけると、続けて指定する条件式に従って変換処理を行うことができる。このコマンドには、ほかに-fオプションも用意されていて、変換処理を行うための条件式が記述されたファイルの保存場所をPATH指定して、このファイルの内容に基づいて変換処理を進めることもできる。

'sed -e' で全文を一括置換する場合の構文は、's/文字列A/文字列B/g'。ほかにもsに繋げる構文の組み合わせでケースに応じた色々な置換ができる。

% sed -e "s/文字列A/文字列B/"       # 置換 行で最初に出てきた'文字列A'を'文字列B'に置換
% sed -e "s/^文字列A/文字列B/"      # 行頭(^)の'文字列A'を'文字列B'に置換
% sed -e "s/文字列A\$/文字列B/"     # 行末($)の'文字列A'を'文字列B'に置換($は\でescape)
% sed -e "s/~/文字列B/"          # 行頭に'文字列B'を追加
% sed -e "s/\$/文字列B/"         # 行末に'文字列B'を追加
% sed -e "s/.*/文字列C/"         # すべての行を'文字列C'に置換

* * *

Web制作等で複数ファイルに跨る変数やディレクトリ構造そのものを変える必要がある時に、変更漏れのファイルが無いか気になるところ。むしろ、そのような効率の悪い作業が発生しないように、編集効率の良いファイル構成を組みたいところだけど、作業中は仕様変更が頻繁に起こってそうもいかないことも少なからずある。

そんな時に、未編集ファイルの一括検出や置換が効率良くできるこれらコマンドは、非常に便利で重宝している。

Ubuntu16.04LTS に MySQL5.7 をインストール

LAMP環境(*)構築の仕上げにMYSQLをインストールする。併せて、PHPとMySQLを連携させたり、MySQL管理ツールのphpMyAdminを利用するために必要なモジュール群をインストールしていく。

(*)Linux, Apache, MySQL, PHP を組み合わせたWebアプリケーションの開発・実行環境のこと。それぞれの頭文字をとって、LAMP環境。

1. MySQL5.7をインストール

確認したところ、PPA無しの公式aptリポジトリで最新版の5.7がインストールできるようなので、早速実行。

% sudo apt-get install mysql-server

冒頭、MySQLのrootパスワード設定を求められる。適当に設定すると後で面倒そうなので、きちんと設定。設定後、もう一度パスワードの入力を求められるので、再度入力する。

これでMySQLのインストールは終了になる。コマンドでインストールされたバージョンを確認しておく。

% mysql --version
mysql  Ver 14.14 Distrib 5.7.20, for Linux (x86_64) using  EditLine wrapper

2. 必要なPHPモジュール群をインストール

PHPとMySQLの接続モジュールをインストールする。

% sudo apt-get install php5.6-mysql

phpMyAdminの設定ファイル等で必要とするphp-mcryptをインストールしておく。

% sudo apt-get install php5.6-mcrypt

日本語などのマルチバイト文字利用のための拡張モジュールもインストールしておく。

% sudo apt-get install php5.6-mbstring

ついでに、'php.ini'でマルチバイト文字利用のための設定を行う。

% vim /etc/php/5.6/apache2/php.ini

PHP公式サイトを参考に次のように設定。

extension=php_mbstring.dll ;行先頭のコメントアウトは外す→後日、エラーログをチェックしたところ、 'No such file or directory' と警告が出ており、また別で代替のモジュールとなる 'mbstring.so' を読み込んでいたので、コメントアウトを戻した。

mbstring.language = Japanese
mbstring.detect_order = UTF-8,SJIS,EUC-JP,JIS,ASCII
mbstring.substitute_character = none
mbstring.func_overload = 0
mbstring.encoding_translation = Off
mbstring.strict_detection = Off

default_charset = "UTF-8"

zend.multibyte = On
zend.script_encoding = "UTF-8"

3. 定番管理ツールのphpMyAdminをインストール

公式レポジトリからインストール開始。

% sudo apt-get install phpmyadmin

途中、オプションの選択について聞かれるが、必要無いので「いいえ」を選択。

更に、webサーバの選択について聞かれるので、「apache2」を選択。

インストール終了後、apacheサーバを再起動。

% sudo service apache2 reload

2.で実施したマルチバイト文字利用の設定が無事完了していれば、'http://localhost/phpmyadmin'を開くと、次のようにphpMyAdminのログインページが現れる。

4. 'my.cnf'へ言語設定の記述を追記

最後に、MySQLの設定ファイル'my.cnf'を編集して、デフォルトの言語を'latin1'から'UTF-8'に変更するための記述を追加。

% sudo vim /etc/mysql/my.cnf
[mysqld]
character_set_server=utf8
skip-character-set-client-handshake

[client]
default-character-set=utf8

[mysql]
default-character-set=utf8

[mysqldump]
default-character-set=utf8

MySQLを再起動し、言語設定が反映されているのを確認して終了。

% sudo systemctl restart mysql
[ ok ] Restarting mysql (via systemctl): mysql.service.
% mysql -u root -p
Enter password:
Welcome to the MySQL monitor.  Commands end with ; or \g.

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

mysql> status
--------------
mysql  Ver 14.14 Distrib 5.7.20, for Linux (x86_64) using  EditLine wrapper

*
*
Server characterset:	utf8
Db     characterset:	utf8
Client characterset:	utf8
Conn.  characterset:	utf8
*
*

--------------

<追記1>MySQLの停止・開始や状態確認のコマンド

% sudo systemctl stop mysql
% sudo systemctl start mysql
% sudo systemctl restart mysql
% sudo systemctl status mysql

<追記2>自動起動の開始および停止

% sudo systemctl disable mysql
% sudo systemctl enable mysql

Ubuntu16.04LTS に PHP5.6 をインストール

さて、PHPのインストールであるが、いきなりPHPのバージョン選択に悩むことになる。

というのも、PHP7系はまだ利用されている実績が少なく感じる一方で、安定版と思う5.6系もアクティブサポートは既に終了し、セキュリティサポートも2018年末までとなっているからだ。('PHP: Supported Versions'を参照

少々悩んだ挙句、ここは手堅く安定志向に拠り5.6系を選択。

1. PPAをインストール後に、PHP5.6をインストール

Ubuntuの公式レポジトリではバージョンを選択することができず、7.0が自動的に選択され導入されてしまう。

% sudo apt show php

Package: php
Version: 1:7.0+35ubuntu6
Priority: optional
Section: php
Source: php-defaults (35ubuntu6)
Origin: Ubuntu
Maintainer: Ubuntu Developers 
Original-Maintainer: Debian PHP Maintainers 
Bugs: https://bugs.launchpad.net/ubuntu/+filebug
Installed-Size: 11.3 kB
Depends: php7.0
Supported: 5y
Download-Size: 2,832 B
APT-Sources: http://jp.archive.ubuntu.com/ubuntu xenial/main amd64 Packages
Description: server-side, HTML-embedded scripting language (default)
 PHP (PHP: Hypertext Preprocessor の再帰的頭字語) は広く使われているオープン
 ソースな汎用スクリプト言語で、特にウェブ開発に適しており、HTML に組み込むこ とができます。
 .
 This package is a dependency package, which depends on Debian's default
 PHP version (currently 7.0).

そこで、まず最初にOndřej Surý氏のPPAをインストールする。これで、バージョンを5.6, 7.0, 7.1から選択してインストールできるようになる。

% sudo add-apt-repository ppa:ondrej/php
% sudo apt-get update
% sudo apt-get upgrade

*PPAとは'パーソナル・パッケージ・アーカイブ'の略で、Ubuntuユーザーのチームや個人がそれぞれ管理している非公式のレポジトリとなる。Ubuntuでは公式レポジトリですぐ対応できないケースでも、ユーザがパッケージを用意して公式と同じ振る舞いで配布できる仕組みが用意されている。そして、ユーザが多いUbuntuコミュニティはこうした有志のPPAに強力に支えられている。

なお、'add-apt-repository'で'command not found'が返る場合は、事前にsoftware-properties-commonとpython-software-propertiesを入れてやり直す。

% sudo apt-get install software-properties-common python-software-properties
% sudo apt-get update
% sudo apt-get upgrade

また、追加したPPAを削除する場合は、以下のとおり。

sudo add-apt-repository --remove ppa:ondrej/php

この後、晴れて5.6をインストールする。

% sudo apt-get install php5.6

2. apache2でPHPモジュール読み込みを確認。

phpinfo()の実行ファイルをapache2のルートディレクトリに作成する。

% vim phpinfo.php
<?php
phpinfo();
?>

上のように記述してファイルを保存。続いて、ブラウザで'http://localhost/phpinfo.php'を開き、以下のようにPHPの環境設定情報が出力されていればPHPが正常に動作しているということで終了。

Ubuntu16.04LTS に apache2 をインストール

慣れ親しんだLAMP環境(*)でCMSとか色々作りたいので、早速apacheから入れていく。Xamppとかインストールすれば一発で開発環境が全て整って楽なんだけど、各サーバーの最新の導入仕様をきちんと手を動かし確認しながら進めたいので、急がば回れで一つ一つ導入していく。

(*)Linux, Apache, MySQL, PHP を組み合わせたWebアプリケーションの開発・実行環境のこと。それぞれの頭文字をとって、LAMP環境。

1. apache2のインストール

apt-get からインストール

% sudo apt-get update
% sudo apt-get install apache2

2. セキュリティ設定

security.conf を編集

% cd /etc/apache2/conf-available
% sudo vim security.conf

デフォルトでは、ServerTokensは「OS」になっている。

  ServerTokens OS

この状態だと、http://サーバーのアドレス/にアクセスすると、レスポンスヘッダーのServerのところに、OS名やApacheのバージョンが表示されてしまう。

セキュリティ上好ましくないので、ServerTokensを「Prod」に変更する。

  ServerTokens Prod

*ServerTokensを「Prod」に変更すると、サーバのプロダクト名(すなわち、「Apache」)だけの表示となる。ちなみに、「Full」にすると、デフォルト以上に詳細な情報が表示されるようになる。

なお、この設定はサーバ全体に適用され、バーチャルホスト上で有効にしたり 無効にしたりはできない。

次にSignatureの設定を確認。

  ServerSignature On

Signatureもデフォルトの「On」のままだとサーバが生成するドキュメント (エラーメッセージ、mod_proxy における FTP のディレクトリリスト、 mod_info の出力、等々) のフッターに、ポート番号など様々な情報が表示されてしまうので変更が必要。

  ServerSignature Off

「Off」に変えるとフッターそのものを非表示にできる。

3. バーチャルホストの設定

デフォルト以外の設定を行う場合は次の手順で行う。

(1)/etc/apache2/site-available/ のディレクトリ内にあるデフォルトの設定ファイル"000-default.conf"を元に、設定ファイル"[任意のファイル名].conf"を複製して追加し、ServerName や DocumentRoot などの項目を必要に応じて編集し保存する。

% cd /etc/apache2/sites-available/
% sudo cp -i 000-default.conf [任意のファイル名].conf
% sudo vim [任意のファイル名].conf

なお、使用しているドメイン間でそれぞれ設定を変えたい場合は、ドメイン毎にconfファイルを作成する。(ファイル内の ServerName の欄でドメイン名を指定し、その他の設定を書いていく。)

  ServerName ドメイン名
  DocumentRoot ドキュメントルートまでのパス

以下、その他の追記例。

  # 制御するディレクトリ
  <Directory ドキュメントルートまでのパス>
    # オプション
    Options FollowSymLinks
    # .htaccessの許可
    AllowOverride all
    # アクセス許可
    Require all granted
  </Directory>

  # エラーログ
  ErrorLog ${APACHE_LOG_DIR}/error.ドメイン名.log
  # エラーログを記録するレベル
  LogLevel warn
  # アクセスログ
  CustomLog ${APACHE_LOG_DIR}/access.ドメイン名.log combined

(2)上で作成したファイルのシンボリックリンクを /etc/apache2/sites-enabled のディレクトリ内に保存してapacheを再起動すれば設定が有効になる。(サーバ起動時に、httpd.conf が sites-enabled のディレクトリ内にシンボリックリンクがある全てのconfファイルを読み込む仕組み。)

シンボリックリンク作成の際は、「a2ensite」というコマンドを利用する。(作成した場所から sites-enabled へ簡単にシンボリックリンクが作成できる。)

% sudo a2ensite [任意のファイル名].conf

新しくバーチャルホストを設定した場合、デフォルトの設定ファイルへのシンボリックリンクは、特に必要なければ原則削除する。削除の場合は、「a2dissite」というコマンドを使用。

% sudo a2dissite 000-default.conf

最後にサーバを再起動して終了。

% sudo service apache2 reload

なお、サーバを段階的に停止→スタートする場合は以下のとおり。

  sudo service apache2 stop
  sudo service apache2 start

・・・

<後日追記>
アクセスのあったURLを、正規表現で書き換えてから処理する機能 'mod_rewrite' が初期状態では無効になっているために、少々苦戦したので追記。なんでも Ubuntuのリポジトリから取得出来るApache2はオリジナルのApache2とはディレクトリの構成や設定の方法が違うらしい・・・。当方は、この仕様のために仮想パスで指定した URL がアクセス先でことごとく '404 not found' になって表示不可になってしまい、数時間嵌った・・・。

まずはmod_rewriteが利用可能となっているかを確認

% cat /etc/apache2/mods-available/rewrite.load
LoadModule rewrite_module /usr/lib/apache2/modules/mod_rewrite.so

上のとおり、利用可能なことを確認したら、以下のコマンドで有効化しよう。

% sudo a2enmod rewrite
Enabling module rewrite.
To activate the new configuration, you need to run:
  service apache2 restart

上記メッセージのとおり、apache サーバを再起動すると設定が有効になる。

なお、Ubuntu で Apache2 のモジュールを有効にするには a2enmod を使用する。逆に無効化する場合は、同じ書式で a2dismod を使用する。

% sudo a2enmod [module]
% sudo a2dismod [module]

有効・無効化できるモジュールは /etc/apache2/mods-available/ にあるため、各々のファイル名を拡張子なしで指定する。

10件の記事(2ページ目表示中/全2ページ)
  1. 最初
  2. 1
  3. 2
  4. 最後

俺: 医療系事業会社のITサービス開発担当者

▼プロフィール畳む

▶プロフィール見る

ネットが産声をあげた前世紀末に元国営の通信会社に新卒入社し、以降およそ10年間勤務して、インターネット系の新規事業立ち上げに複数携わる。

その後、退職して、ITベンチャーのスタートアップ参画を皮切りに、複数のIT企業でプロダクトマネージャーを務めた後、縁あって現在の医療系事業会社へjoin。

元来、エンジニアばかりの環境で過ごしてきたが、いまいるここは一般の非IT系事業会社。

自分以外に実際に手を動かせるスタッフは誰もいない環境やさかい、IT系プロダクトの企画から内製によるシステム開発、ビッグデータ分析や人工知能のビジネス転化への試行錯誤も仕方なく一人でマルチに行い奮闘中。
(そろそろ仲間が欲しい・・・)

E-mail: contact@kobachan.biz

カテゴリー
月別アーカイブ
  • 2018 (4)
  • 2017 (6)