CentOS

Vagrantで構築したCentOSで開発する メール送信テスト環境設定

メール送信のテストする為の環境構築した際にてこずったので、同じミスをしないようにブログに投稿します。

Vagrantについては、昨日書いたエントリーの通りとなります。

suusuke – blog – Vagrantで構築したCentOSで開発する.

目次

  1. Postfixインストール・設定
  2. Dovecotインストール・設定
  3. Hostから送受信テスト

Postfixインストール・設定

Postfixをインストールして、設定ファイルを変更します。
開発環境なので、メールが送れているかチェックしたいだけなので、全てのドメイン宛のメールをローカルの配送する用に設定します。

$ yum -y install postfix
$ cp /etc/postfix/{main.cf,main.cf.org}
$ vi /etc/postfix/main.cf

# 全てのメールを受け取る
inet_interfaces = all

# ローカル配送で不明なユーザを拒否しない
local_recipient_maps =

# Maildir形式として保存するディレクトリを /usr/local/mail/ の下にユーザー毎に作成する
mail_spool_directory = /usr/local/mail/

# ローカル配送で不明なユーザへのメールは maildev へ送る
luser_relay = maildev

# トランスポートマップを指定
transport_maps = hash:/etc/postfix/transport

トランスポートマップの設定

$ vi /etc/postfix/transport

# 全てローカルに配送
*       local:
$ postmap /etc/postfix/transport

設定反映

$ /sbin/service postfix reload

Maildirの場所ですが、通常であれば、~/Maildir/となるのですが、/home/ディレクトリをホストにマウントしており、何度メールを送ってもnot permittedになってしまい、配送に失敗していたため、変更しました。
ただ、Vagrantfileでマウントの設定でユーザーは root パーミッションは 777 にしているつもりなのですが、ここは今後の課題ですね。

Nov 30 19:50:20 localhost postfix/local[5922]: 7D5656F026C: to=<maildev@mail.vagrant-centos59_64.localdomain>, relay=loc
al, delay=0.17, delays=0.14/0/0/0.03, dsn=5.2.0, status=bounced (maildir delivery failed: create maildir file /home/mail
dev/Maildir/new/1385808620.V15I7c25M679327.vagrant-centos59_64: Operation not permitted)

配送先ユーザーmaildevは予め追加しておきます。

$ useradd maildev
$ passwd maildev

元々、sendmailもpostfix入っていないサーバーだったので、mtaの変更は必要ないですが、一応確認だけします。

$ /usr/sbin/alternatives --config mta

1 プログラムがあり 'mta' を提供します。

  選択       コマンド
-----------------------------------------------
*+ 1           /usr/sbin/sendmail.postfix

Enter を押して現在の選択 [+] を保持するか、選択番号を入力します:

Dovecotインストール・設定

Dovecotをインストールし、設定します。
各プロトコルを使えるようにと、PostfixでMaildirのパスを変更しているのでそこを設定します。

$ yum -y install dovecot
$ cp /etc/{dovecot.conf,dovecot.conf.org}

protocols = imap imaps pop3 pop3s
mail_location = maildir:/usr/local/mail/%u

Dovecotは、本番環境に合わせて、1系をyumでそのままインストールしました。

Hostから受信テスト

telnetコマンドでメールを送ります。

$ telnet localhost 25
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
220 mail.vagrant-centos59_64.localdomain ESMTP Postfix
helo localhost
250 mail.vagrant-centos59_64.localdomain
mail from: k.suke.suzuki@gmail.com
250 2.1.0 Ok
rcpt to: test@test.com
250 2.1.5 Ok
data
354 End data with <CR><LF>.<CR><LF>
subject: test
てすとです。
.
250 2.0.0 Ok: queued as 6E27E6F026E
quit
221 2.0.0 Bye
Connection closed by foreign host.

HostにThunderbirdをインストール、アカウントを設定して受信確認できればOKです。
受信トレイ

参考サイト

全てのドメイン宛のメールを受信する – ngの日記.

追記1

Mailcatcher for Drupal and other PHP-applications – The simple version.

vagrant mail で検索してたら、MailCatcherという、ruby製のSMTPサーバーが有ることを知りました。
これを使うと、メールを送信した内容がWEBブラウザで簡単に確認できるようになるようです。
PHPの場合は、php.inisendmail_pathを変更するだけで使えるようになるようです。
※未検証

追記2

試してないけど、synced_folderの書き込めない件は、Vagrantfileの設定のグループを変更するれば出来そう。もしくは、dmode(ディレクトリのパーミッション?)は777になってましたが、fmode(ファイルのパーミッション?)が666なのでそこを変えても出来そうです。
※未検証

Vagrantで構築したCentOSで開発する

Vagrantで開発を始めて、ある程度知識も溜まってきたので備忘録代わりにブログに書きたいと思います。

環境

HOST Max OS X Lion
GEST CentOS 5.9(64bit)
Vagrant 1.3.5
Virtual Box 4.3.0

目次

  1. VirtualBox のインストール
  2. Vagrant1.3 のインストール
  3. box ファイルのインストール
  4. Vagrantfile の作成
  5. 仮想サーバを構築

Virtual Box のインストール

Downloads – Oracle VM VirtualBox.

上記からダウンロード、インストール。インストール時最新は、4.3.0。

Vagrant1.3 のインストール

Vagrant – Downloads.

上記からダウンロード、インストール。Rubyのgemコマンドでもインストールできるようです。インストール時最新は、1.3.5。

box ファイルのインストール

A list of base boxes for Vagrant – Vagrantbox.es.

イメージファイルを一から作るのは大変ですので、上記、Vagrantbox.esサイトからboxファイルを探して、インストールする方法が一番手軽です。ただ、他人が作ったイメージファイルなので、セキュリティがどうとかっていう事を聞いたことが有るので、そこは自己責任ですね。
会社のサーバーが古いのでそれに合わせて、イメージファイルを探して、インストールしました。

$ vagrant box add centos59_64 http://tag1consulting.com/files/centos-5.9-x86-64-minimal.box

Vagrantfile の作成

Vagrantfileはvagrantの設定ファイルになります。
$HOMEの下にvagrantというディレクトリと今回のサーバー用のディレクトリ(centos59_64)を作成して、その下で管理しています。

$ mkdir ~/vagrant
$ cd ~/vagrant
$ mkdir centos59_64
$ cd centos59_64

Vagrantfilevagrant initコマンドで作成し、変更していきます。

$ vagrant init
$ vi Vagrantfile

ちなみに、変更後のVagrantfileは以下の通りです。

VAGRANTFILE_API_VERSION = "2"

Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|

  config.vm.box = "centos59_64"
  config.vm.network :private_network, ip: "192.168.33.10"

  config.vm.synced_folder "/Users/suusuke/vagrant/centos59_64/home/", "/home/", \
        create: true, owner: 'root', group: 'root', \
        mount_options: ['dmode=777,fmode=666']

   config.vm.provider :virtualbox do |vb|
     #vb.gui = true
  
     # Use VBoxManage to customize the VM. For example to change memory:
     vb.customize ["modifyvm", :id, "--memory", "1024"]
   end
end

Vagrantのプロ?は、ここでchefやshellを使って、プロビジョニングしていくようですが、まだそこまで出来ないので、最低限の設定を書いています。
一つだけポイントとして、vagrantにはsynced_folderという機能があり、仮想サーバーのディレクトリを、ホストにマウントすることができます。今回は、Vagrantfileのあるディレクトリに、homeディレクトリをマウントさせています。これは、WEBサイトを作成する際に、ApacheのVirtualHostで各ユーザーディレクトリの下を公開ディレクトリにして開発する為です。

仮想サーバーを構築

vagrant upコマンドで、仮想サーバーを立ち上げます。

$ vagrant up

あとは、sshでサーバーにログインして、環境を作成していきます。

$ root@192.168.33.10

Apache、PHP、MySQL、PostgreSQL、Postfix、Dovecot 等をインストールして、それぞれ設定しホストPCでホストの設定をすればWEBの開発環境の完成です。

$ vi /etc/hosts
192.168.33.10  vagrant.localhost
192.168.33.10  test.example.com
....

実際にプログラムは、synced_folderのお陰で、ホストPCで変更したものが即座に反映されます。
僕は、Eclipseを普段使っているので、workspaceを~/vagrang/centos59_64/homeにして、開発をしています。

あと、WEBプログラムでメールのテストの為に、PostfixとDevcotで設定したのですが、逆にsynced_folderの機能のせいで、半日くらいうまく行かなくて時間を使ってしまったので、そちらは後ほど書き留めたいと思います。

参考サイト

Vagrant で自分の PC に「作って、壊して、元に戻せる」サーバを作る – Shin x blog.

portを開いているプロセスを特定する

portを開いているプロセスは、
lsof -i:[port]コマンドで確認できます。

VPSを使っていると急にサービスが停止してしまう事があり、そういう場合httpdのプロセスが残ってしまい再起動しても

(98)Address already in use: make_sock: could not bind to address [::]:80

の様に既に80ポートが使われている為、起動できないというケースが有るので、

lsof -i:80
kill [PID]

の様にプロセスIDをkillすれば起動できるようになります。

/usr/sbin/lsof -i | grep http

のようにして、httpのプロセスIDを表示する方法も有るようです。

Serversman@vpsにてSSLを設定する方法

このブログはServersman@vpsのCentOS上で動いています。
ブログの他にもいくつかサイトが有って、SSLの必要が出てきたので設定した方法を書きます。
また、証明書は独自の証明書(オレオレ証明書)を使います。

目次

  • mod_sslインストール
  • Makefileで証明書(.crt)ファイルの作成
  • Apache(mod_ssl)の設定

mod_sslインストール

[root@suusuke ~]# yum -y install mod_ssl

Makefileで証明書(.crt)ファイルの作成

[root@suusuke ~]# cd /etc/pki/tls/certs/
[root@suusuke certs]# make server.crt
umask 77 ; \
	/usr/bin/openssl genrsa -des3 1024 > server.key
Generating RSA private key, 1024 bit long modulus
.....++++++
.................................++++++
e is 65537 (0x10001)
Enter pass phrase:
Verifying - Enter pass phrase:
umask 77 ; \
	/usr/bin/openssl req -utf8 -new -key server.key -x509 -days 365 -out server.crt -set_serial 0
Enter pass phrase for server.key:
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [GB]:JP
State or Province Name (full name) [Berkshire]:Miyagi
Locality Name (eg, city) [Newbury]:Sendai
Organization Name (eg, company) [My Company Ltd]:suusuke
Organizational Unit Name (eg, section) []:
Common Name (eg, your name or your server's hostname) []:Keisuke Suzuki
Email Address []:k.suke.suzuki@gmail.com

Apache(mod_ssl)の設定

バーチャルホストにて、複数サイトを運用しているので、バーチャルホスト毎に、httpd-vhosts-[サイト名]-ssl.confという設定ファイルにして個別に設定する。
まずは、ssl.confの<VirtualHost _default_:443\></VirtualHost>をコピーしてコメントアウトする。

[root@suusuke certs]# vi /etc/httpd/conf.d/ssl.conf 

#<VirtualHost _default_:443>
...
この間の設定を全部コピーしてコメントアウト
...
#</VirtualHost>

すでに、httpd-vhosts-[サイト名].confという名前でバーチャルホストを設定しているので、その設定ファイルをコピーしてhttpd-vhosts-[サイト名]-ssl.confという名前の設定ファイルを作成する。
また、ssl.confでコピーしたものを追記する。

[root@suusuke ~]# cp /etc/httpd/conf.d/httpd-vhosts.conf /etc/httpd/conf.d/httpd-vhosts-ssl.conf
[root@suusuke ~]# vi /etc/httpd/conf.d/httpd-vhosts-ssl.conf 

<VirtualHost *:443> ←ポート変更
    ServerName suusuke.info
    DocumentRoot /var/www/html
    ErrorLog logs/suusuke.info-error_log
    CustomLog logs/suusuke.info-access_log combined env=!no_log
    <Directory "/var/www/html">
        Options FollowSymLinks
        AllowOverride All
        Order allow,deny
        Allow from all
    </Directory>

    #ここから-----------------------------------------------------------------------
    SSLEngine on
    SSLProtocol all -SSLv2
    SSLCipherSuite ALL:!ADH:!EXPORT:!SSLv2:RC4+RSA:+HIGH:+MEDIUM:+LOW
    SSLCertificateFile /etc/pki/tls/certs/server.crt
    SSLCertificateKeyFile /etc/pki/tls/certs/server.key
    <Files ~ "\.(cgi|shtml|phtml|php3?)$">
        SSLOptions +StdEnvVars
    </Files>
    <Directory "/var/www/cgi-bin">
        SSLOptions +StdEnvVars
    </Directory>
    SetEnvIf User-Agent ".*MSIE.*" \
             nokeepalive ssl-unclean-shutdown \
             downgrade-1.0 force-response-1.0
    CustomLog logs/ssl_request_log \
              "%t %h %{SSL_PROTOCOL}x %{SSL_CIPHER}x \"%r\" %b"
    #ここまで-----------------------------------------------------------------------
</VirtualHost>

Apache再起動

[root@suusuke ~]# /etc/rc.d/init.d/httpd restart

https://suusuke.infoにアクセスしてsslでアクセスできることを確認してオーケー!

大量の.htpasswdを作成する方法

BASIC認証する際に.htacessで設定して、パスワードファイル(任意の名前).htpasswdを作成します。

大量のユーザーとパスワードを設定する場合はいちいちhtpasswdコマンドでユーザーを追加するのは大変です。

そんな時にはHtpsserというソフトを使うと簡単に大量のユーザーの.htpasswdファイルを作成できます。

Htpasserの詳細情報 : Vector ソフトを探す!.

使い方は非常に簡単で、ユーザー名とパスワードをタブ区切りのテキストで用意しておきそれをインポートすると.htpasswdファイルが出来上がります。

また、HtpasserはWindowsのソフトなのでMacやLinuxで生成する場合はこちらのshellを実行すると生成できるようです。
(userlistというファイルに[user]:[pass]というフォーマットでファイルを用意しておく)

#!/bin/bash

for fullname in `cat ./userlist` ; do
user=`expr $fullname : '\(.*:\)'`
user=`echo $user | sed 's/://'`
pass=`expr $fullname : '.*:\(.*\)'`

expect -c "
spawn htpasswd -d ./passwd-file $user
expect \"New password: \" ; send \""$pass"\r\"
sleep 1
expect \"Re-type new password: \" ; send \""$pass"\r\"
expect eof
" >> /var/log/adduser/passwd.log
done

VMWare Server の開発環境作り直し

インストールしたもののメモです。

OSインストール

Index of /Linux/centos/5/isos/i386. CentOS5.7を今回は使用しました。
ISOファイルをダウンロードして、最小構成でインストール。

VMWare Toolsインストール

VMWare上のCentOSは時間がずれるのでVMWare Toolsをインストール。
VMWare Serverの管理画面から[Install VMware Tools…]を選択します。
選択すると、CDドライブにインストール用のファイルがセットされます。

[root@localhost ~]# mount /dev/cdrom /mnt/
[root@localhost ~]# cd /mnt/
[root@localhost ~]# /etc/yum.conf
gpgcheck=0 ← 0に変更

[root@localhost ~]# cp VMwareTools-7.7.6-203138.i386.rpm /tmp/
[root@localhost ~]# cd /tmp/
[root@localhost ~]# yum localinstall VMwareTools-7.7.6-203138.i386.rpm
[root@localhost ~]# /etc/yum.conf
gpgcheck=1 ← 元に戻す

一旦、サーバを停止しvmxファイルを変更します。

tools.syncTime = "TRUE" ← TRUEに変更

サーバを再度起動し、grubの設定を変更します。
このパラメータの追加(divider=10)はCentOS5.7では合った方が精度が良いよ?とナレッジに記載あったので追加しました。
VMware KB: Timekeeping best practices for Linux guests.

[root@localhost ~]# vi /boot/grub/grub.conf
kernel /vmlinuz-2.6.18-274.el5 ro root=/dev/VolGroup00/LogVol00 divider=10

ntpdインストール

[root@localhost ~]# yum install ntp
[root@localhost ~]# vi /etc/ntp.conf 
tinker panic 0
restrict 127.0.0.1
restrict default kod nomodify notrap
server 0.vmware.pool.ntp.org
server 1.vmware.pool.ntp.org
server 2.vmware.pool.ntp.org
driftfile /var/lib/ntp/drift

[root@localhost ~]# vi /etc/ntp/step-tickers 
0.vmware.pool.ntp.org
1.vmware.pool.ntp.org

[root@localhost ~]# service ntpd start
[root@localhost ~]# chkconfig ntpd on

インストールと設定

まずはifconfigでipを確認して、puttyまたはpoderosaで接続する。

viコマンドでvimを使うようにする

何かとvimの方が便利なので、aliasで設定

[root@localhost ~]# vi /etc/bashrc 

alias vi='vim' ← 追加

[root@localhost ~]# source /etc/bashrc 

不要なサービス停止

yum自動アップデート停止

[root@localhost ~]# /etc/rc.d/init.d/yum-updatesd stop
yum-updates を停止中:                                      [  OK  ]
[root@localhost ~]# yum remove yum-updatesd

SELinuxを無効化

[root@localhost ~]# vi /etc/sysconfig/selinux
#SELINUX=enforcing
SELINUX=disabled

iptables停止・自動起動無効

[root@localhost ~]# service iptables stop
[root@localhost ~]# chkconfig iptables off

RPMリポジトリを追加

[root@localhost ~]# rpm -import http://www.jasonlitka.com/media/RPM-GPG-KEY-jlitka
[root@localhost ~]# vi /etc/yum.repos.d/utterramblings.repo

[utterramblings]
name=Jason's Utter Ramblings Repo
baseurl=http://www.jasonlitka.com/media/EL$releasever/$basearch/
enabled=0
gpgcheck=1
gpgkey=http://www.jasonlitka.com/media/RPM-GPG-KEY-jlitka

enabled=0にしているので、通常のyumコマンドではこのリポジトリは使われない。

使う場合は

[root@localhost ~]# yum --enablerepo=utterramblings install パッケージ
[root@localhost ~]# yum --enablerepo=utterramblings update パッケージ

とする。

再起動

[root@localhost ~]# reboot

Apache,PHP,MySQLインストール

[root@localhost ~]# yum --enablerepo=utterramblings install httpd httpd-devel php php-mbstring php-devel php-mcrypt php-pear php-mysql php-gd mysql-server

Apache,MySQLの起動と自動起動設定

[root@localhost ~]# chkconfig httpd on
[root@localhost ~]# chkconfig mysqld on
[root@localhost ~]# service httpd start
[root@localhost ~]# service mysqld start

MySQLのユーザ設定

rootのパスワードを設定して、パスワードがブランクのユーザを削除

[root@localhost ~]# mysql -u root
mysql> set password for root@localhost=password('password');
mysql> exit

[root@localhost ~]# mysql -u root -p
mysql> DELETE FROM mysql.user WHERE Password = '';
mysql> exit

Apacheの設定

sampleユーザ追加

[root@localhost ~]# adduser sample
[root@localhost ~]# su - sample
[root@localhost ~]# chmod 755 /home/sample/

[sample@localhost ~]$ mkdir ~/public_html

[sample@localhost ~]$ vi ~/public_html/phpinfo.php ← 確認用
<?php
phpinfo();


&#91;sample@localhost ~&#93;$ exit
&#91;/bash&#93;

<h4>バーチャルホスト設定</h4>

[root@localhost ~]# vi /etc/httpd/conf.d/vhosts.conf

NameVirtualHost *:80# sample<VirtualHost *:80>
        DocumentRoot /home/sample/public_html
        ServerName test.sample.com
        <Directory "/home/sample/public_html">
                Options Indexes FollowSymLinks MultiViews Includes ExecCGI
                AddType text/html .shtml
                AddHandler server-parsed .shtml
                AddHandler cgi-script .cgi .pl
                AllowOverride All
                Order allow,deny
                Allow from all
        </Directory>
</VirtualHost>

確認

[root@localhost ~]# httpd -S
VirtualHost configuration:
wildcard NameVirtualHosts and _default_ servers:
*:80                   is a NameVirtualHost
         default server test.sample.com (/etc/httpd/conf.d/vhosts.conf:5)
         port 80 namevhost test.sample.com (/etc/httpd/conf.d/vhosts.conf:5)
Syntax OK

Windowsのhostsファイル変更

C:\Windows\System32\drivers\etc\hosts

192.168.1.3       test.sample.com

http://test.sample.com/phpinfo.phpにアクセスして確認.

ここまでで一通り開発環境が出来ました。
ソースのアップはrsync等で同期すると簡単にできると思います。

Windowsからrsyncを利用する方法も書きました。
suusuke – blog – Windows で rsync を使用する.

追加

ここからは有ると便利な設定等を追記していきます。

PHP Xdebugインストール

gcc,gcc-c++インストール

[root@localhost ~]# yum -y install gcc gcc-c++

Xdebugインストール

既にphp-devel,php-pearはインストールしてある状態なのでpeclコマンドでインストール。

[root@localhost ~]# pecl install xdebug

....


Build process completed successfully
Installing '/usr/lib/php/modules/xdebug.so'
install ok: channel://pecl.php.net/xdebug-2.1.2
configuration option "php_ini" is not set to php.ini location
You should add "extension=xdebug.so" to php.ini

/usr/lib/php/modules/xdebug.soにxdebug.soがインストールされました。

php.iniに追記

/etc/php.ini

zend_extension="/usr/lib/php/modules/xdebug.so"

サーバが重い時の負荷の正体を突き止める

WEB+DB PRESS Vol.65|gihyo.jp … 技術評論社.

WEB+DB PRESS の特集1「WEBエンジニアが知るべきインフラの基礎知識」が非常にまとまってて良かった。

闇雲にtopコマンドとかネットで調べながら調査してたので今後のためにもメモ。

ロードアベレージ(忙しさの度合い)

uptimeコマンドを使って見る。

[root@suusuke ~]# uptime 
 22:27:30 up 202 days, 18:48,  1 user,  load average: 0.07, 0.15, 0.08

0.07という数字は処理を実行したいが、何かしらの処理で実行できなくて待たされている状態のプロセス数

何かしらの要因とは?

  • 他のプロセスにCPUが使われていて、空くのを待っている状態(CPU使用率)
  • ディスクに読み書き要求を発行してその結果を待っている状態(I/O待ち率)

CPU使用率とI/O待ち状態

sarコマンドを使って見る。

インストール

[root@suusuke ~]# sudo yum install sysstat
[root@suusuke ~]# sudo service sysstat start

CPU使用率のレポート(-u)を3秒ごとに10回表示して終了する。

[root@suusuke ~]# sar -u 3 10
Linux 2.6.18-194.3.1.el5.028stab069.6  	2011年10月24日

22時26分12秒       CPU     %user     %nice   %system   %iowait    %steal     %idle
22時26分15秒       all      0.00      0.00      0.00      0.00      0.00    100.00
22時26分18秒       all      0.17      0.00      0.00      0.00      0.00     99.83
22時26分21秒       all      0.00      0.00      0.00      0.00      0.00    100.00
22時26分24秒       all      0.00      0.00      0.00      0.00      0.00    100.00
22時26分27秒       all      0.00      0.00      0.00      0.00      0.00    100.00
22時26分30秒       all      0.00      0.00      0.00      0.00      0.00    100.00
22時26分33秒       all      0.00      0.00      0.00      0.00      0.00    100.00
22時26分36秒       all      0.00      0.00      0.00      0.00      0.00    100.00
22時26分39秒       all      9.00      0.00      0.33      0.50      0.00     90.17
22時26分42秒       all      0.00      0.00      0.00      0.00      0.00    100.00
平均値:        all      0.92      0.00      0.03      0.05      0.00     99.00
%user
ユーザ空間でCPUが使われた時間の割合
%nice
優先度を変更されたプロセスにより、ユーザ空間でCPUが使われた時間の割合
%system
カーネル空間でCPUが使われた時間の割合
%iowait
CPUがディスクI/Oの結果を待っていた時間の割合
%steal
仮想サーバがCPUを使って待たされていた時間の割合
%idle
ディスクI/O街以外で、CPUが何もしないで待っていた時間の割合

%systemも%userも低く、%iowaitが高い場合

物理搭載メモリ量を超えてスワップが大量に発生している可能性がある。
sar -Wでスワップインとスワップアウトの状況
freeでシステム全体のメモリ使用状況
topでメモリ使用率順でソート後メモリを消費しているプロセスを特定する

%systemが高く、%iowaitも高い場合

「I/O待ち状態」となっている。
psでSTATの項目がDのものを探し特定する。
Dは割り込み不可能な待機状態を意味する。

%userが高い場合

「CPU使用率」が高い。
topでCPU使用率の高い順にソートして特定する。
また、psでプロセスの情報を見る。

[root@suusuke ~]# top

top - 22:33:23 up 202 days, 18:54,  1 user,  load average: 0.20, 0.11, 0.07
Tasks:  26 total,   1 running,  25 sleeping,   0 stopped,   0 zombie
Cpu(s):  0.2%us,  0.0%sy,  0.0%ni, 99.8%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st
Mem:   2097152k total,   272144k used,  1825008k free,        0k buffers
Swap:        0k total,        0k used,        0k free,        0k cached

  PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND    

負荷のまとめチャート

cp -f でも上書きの確認表示が出てしまう

cp -fとやっても確認表示がでてきてしまう場合はcpのエイリアスを調べてみる。

aliasで調べてみる

$ alias 
alias cp='cp -i'

cpのエイリアスにcp -iが設定されていました。

\でエイリアスを無効にして実行する

$ \cp -rfp app/ .

\を付けて実行するとエイリアスを無効にして実行出来るということを初めて知りました。

SSHのアクセス元IPを制限する方法

TCP Wrapperを利用してSSHにログインできるIPを制限します。

設定ファイルは

/etc/hosts.deny (拒否するIP/ホストを設定)
/etc/hosts.allow (許可するIP/ホストを設定)

の二つです。

この設定ファイルで制御できるプロセスは次の二つです。

  • xinetd で制御されているプロセス
  • configure時に TCP Wrapper を使うと指定されたプロセス(←SSHはこっち)

SSHはxinetdで制御されてないけども、自分でhosts.{deny,allow}を読み込むみたいです。

設定は全ての接続を拒否して、指定したIPを許可するという流れが一般的です。

全てのアクセスを拒否

/etc/hosts.denyに下記を追記します。

sshd : all

指定したIPからのアクセスを許可

/etc/hosts.allowに下記を追記します。

sshd : 100.100.100.100
sshd : 192.168.1.1

TCP Wrapperで制御した場合はアプリケーションレベルでのアクセス制御になるので、IPレベルで制御したい場合はiptablesを設定する必要が有ります。

※本当はTCP Wrapperとiptables両方設定した方が良いのでしょうね。

sshfs が非常に便利 Windows編

ローカル環境だけでは本番環境と同じ環境が作れないという事が有ると思いますが、そのような場合はVMWareなどを使って仮想化して開発環境を作っていると思います。

仮想化したサーバーのソースを修正する場合は、ちょっとしたものであればputty等で直接修正しても良いのですが、開発となるとそうはいきません。

そんな時は、仮想化したサーバーをマウントして直接ホストから変更できるようにします。

Macの場合は
sshでリモートサーバーをマウント、便利にsshfs
で対応してたのですが、Windowsでもssh経由でマウントが簡単に出来たのでその時のメモ。

といっても、インストールするのは2つだけ。
Dokan

  • Dokanライブラリ
  • Dokan SSHFS

の順でインストールすれば簡単にマウントできます。

ファイルのアップとかもエクスプローラーから簡単に出来ますので大変便利です。