A smarter lighttpd?

There is an instruction a better way of virtual host setting on Mac at A Smarter MAMP. I tried to set it up with lighttpd instead of Apache2.

DNS server (BIND) settings are the same as the article. The following instruction is setting up lighttpd.

  1. Install lighttpd with MacPorts
    $ sudo port install lighttpd
    
  2. Create lighttpd.conf
    $ cd /opt/local/etc/lighttpd
    $ sudo cp lighttpd.conf.default lighttpd.conf
    
  3. Edit lighttpd.conf and add following line to include custom configuration file
    include "evhost.conf"
    
  4. Modify document root path if necessary
    server.document-root = "/Users/username/Sites/default/public/"
    
  5. Create evhost.conf with the following contents.
    server.modules += ( "mod_evhost" )
    $HTTP["host"] =~ "^[^.]+.[^.]+$" {
        evhost.path-pattern  = "/Users/username/Sites/%1/%2/public/"
    }
    
  6. Create required directories for lighttpd
    $sudo mkdir -p /opt/local/var/run
    $sudo mkdir /var/log/lighttpd
    $sudo chown www:www /var/log/lighttpd
    

Test run.

sudo lighttpd -f /opt/local/etc/lighttpd/lighttpd.conf

And then verify the result.

I’m not sure the regular expression in the above evhost.conf is the best, but it works as I expected.

Advertisements
A smarter lighttpd?

ApacheとBINDでVirtualHostの簡単設定

参照元: A Smarter MAMP

POSTPOSTMODERNに書かれていた、Mac OSX上で、ApacheとBINDを使ってVirtual hostを簡単に設定する方法。この設定をすると、ローカルで新しいサイト用の環境を作るのが簡単になる。

(以下、概要)

古い方法

  1. サイト用のディレクトリを作る。例:
    mkdir -p ~/Sites/domain.com/public
    
  2. /etc/hostsに1行追加する。
    127.0.0.1 domain.dev
    
  3. Apacheの設定ファイルにvirtual hostの設定を追加する。
    <VirtualHost *>
        ServerName domain.dev
        DocumentRoot /Users/jason/Sites/domain.com/public
    </VirtualHost>
    
  4. Apacheをリスタート
    sudo apachectl graceful
    

新しい方法

  1. サイト用のディレクトリを作る。例:
    mkdir -p ~/Sites/domain.com/public
    

終了。

ということで、ローカルに複数サイト用の環境を作るのが楽に。OSXにはデフォルトでBIND (named)が用意されているので、それを利用する。手順は次の通り。

POSTPOSTMODERNのJasonさんはローカル環境で個人用のサイトに.ppm、実験用に.dev、仕事用に.bsiというTLDを使っていて、下のような構成にしてある(一部省略)。

Sites
|-- bsi
|   |-- this
|   `-- that
|-- dev
|   `-- experiment1
`-- ppm
    |-- postpostmodern
    `-- littlebeestudio

それぞれ、

  • this.bsi
  • that.bsi
  • experiment1.dev
  • postpostmodern.ppm
  • littlebeestudio.ppm

となるように設定していく。

rndcのセットアップ

$ sudo -s
# rndc-confgen > /etc/rndc.conf
# head -n 6 /etc/rndc.conf > /etc/rndc.key
# exit
$

DNS zoneファイルの作成

例えば.dev用には次のような内容のファイル dev.zone を/var/namedに作る。

;
; BIND data file for dev sites
;
$TTL    604800
@       IN      SOA     dev. root.dev. (
                     2008101920         ; Serial
                         604800         ; Refresh
                          86400         ; Retry
                        2419200         ; Expire
                         604800 )       ; Negative Cache TTL
;
@       IN      NS      dev.
@       IN      A       127.0.0.1
*.dev.  14400   IN      A       127.0.0.1

同様のファイルを使用するTLD分作る。

named.confの設定

まず、DNS情報をどこから取得するかを設定する。OpenDNSを使う場合optionセクションのdirectory “/var/named”の後に次の行を追加する。

forwarders {
    208.67.222.222;
    208.67.220.220;
};

そして、作成したzoneファイルの分だけ次のようなセクションを追加する(localhostセクションの次辺りに)。

zone "dev" IN {
  type master;
  file "dev.zone";
};

LaunchDeamonの設定と読み込み

/System/Library/LaunchDaemons/org.isc.named.plist の Disabled を true から false に変更する。

次のコマンドを実行して読み込む。

sudo launchctl load /System/Library/LaunchDaemons/org.isc.named.plist

Apacheの設定

Jasonさんの場合、個人用の設定ファイルが/etc/apache2/usersの下にあるので /etc/apache2/users/jason.conf を次のように設定している。

DocumentRoot "/Users/jason/Sites/default/public/"

NameVirtualHost 127.0.0.1

<VirtualHost 127.0.0.1>
    VirtualDocumentRoot /Users/jason/Sites/%-1/%-2+/public
</VirtualHost>

これで、http://example.dev/にアクセスした場合、/Users/jason/Sites/dev/example/publicが読み込まれるようになる。

そしてApacheをリスタートする。

sudo apachectl graceful

ネットワークの設定

システム環境設定のネットワークで、DNSサーバに127.0.0.1を追加する。

補足

Tigerの場合、apacheのバージョンが1.3で、/etc/httpd/users/username.confを上のようにしても、動かない。うちはTigerなので、MacPortsでApache2をインストールした。

sudo port install apache2
cd /opt/local/apache2/conf
sudo cp httpd.conf.sample httpd.conf

/opt/local/apache2/conf/extraに自分用の設定ファイル(上のjason.confの内容)を作る。

DocumentRoot "/Users/username/Sites/default/public/"

<Directory "/Users/username/Sites/">
    Options Indexes MultiViews
    AllowOverride None
    Order allow,deny
    Allow from all
</Directory>

NameVirtualHost 127.0.0.1

<VirtualHost 127.0.0.1>
    VirtualDocumentRoot /Users/username/Sites/%-1/%-2+/public
</VirtualHost>

httpd.confに次の行を追加。

Include conf/extra/username.conf

Apacheをスタートして、確認。

sudo /opt/local/apache2/bin/apachectl start
ApacheとBINDでVirtualHostの簡単設定

How to shutdown a server

サーバをシャットダウンする作法(UNIX系OS編)

The linked article describes example of how to shutdown a server by anyone from beginners to experts. This is the summary.

Beginners: Login as root and then shutdown.

Intermediates: Login as root, and then check if active TCP connection, services and processes. Shutdown the services and the processes. Shutdown the server.

Experts: Confirm input command several times, and then press enter. Shutdown after doing “sync” x3 and confirm if he miss some operations. Experts are very cautious.

At the end of article, he wrote commands when he shutdown a server.

# ps -ef|more
# netstat -an|more
# w
# free

sitenote:
ps – report a snapshot of the current processes.
-e Select all processes.
-f does full-format listing.

netstat – Display  network  connections, routing tables, interface statistics, masquerade connections, netlink messages, and multicast memberships
-a print all sockets, including the listening server sockets.
-n shows numerical  addresses instead of trying to determine symbolic host, port or user names.

w – Show who is logged on and what they are doing.
free – Display amount of free and used memory in the system

How to shutdown a server

Linux で外付けの HDD を使用する

参照

設定手順

USB 接続の HDD にパーティションを作ってフォーマットする。

fdisk を実行。

# fidsk /dev/sda

fdisk のメニューで Linux パーティションを作る。

コマンド (m でヘルプ): d
領域番号 (1-4): 1

コマンド (m でヘルプ): n
コマンドアクション
e 拡張
p 基本領域 (1-4)
p
領域番号 (1-4): 1
最初 シリンダ (1-9733, default 1):
Using default value 1
終点 シリンダ または +サイズ または +サイズM または +サイズK (1-9733, default 9733):
Using default value 9733

フォーマットする。

# mkfs -t ext3 /dev/sda1

mke2fs 1.35 (28-Feb-2004)
Filesystem label=
OS type: Linux
Block size=4096 (log=2)
Fragment size=4096 (log=2)
9781248 inodes, 19545072 blocks
977253 blocks (5.00%) reserved for the super user
First data block=0
Maximum filesystem blocks=20971520
597 block groups
32768 blocks per group, 32768 fragments per group
16384 inodes per group
Superblock backups stored on blocks:
32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208,
4096000, 7962624, 11239424

Writing inode tables: done
Creating journal (8192 blocks): done
Writing superblocks and filesystem accounting information: done

This filesystem will be automatically checked every 26 mounts or
180 days, whichever comes first. Use tune2fs -c or -i to override.

結果を確認。

# mount /dev/sda1 /mnt/usb/
# df -h
Filesystem          サイズ  使用  残り 使用% マウント位置
/dev/mapper/VolGroup00-LogVol00
                       73G  2.1G   67G   4% /
/dev/hda1              99M   12M   82M  13% /boot
none                  248M     0  248M   0% /dev/shm
/dev/sda1              74G   85M   70G   1% /mnt/usb

rsync でバックアップする時の例

ホームディレクトリと TWiki のデータをバックアップ:

#!/bin/sh
mount /dev/sda1 /mnt/usb
rsync -uva /var/www/html/twiki/data/ /mnt/usb/twiki/data/
rsync -uva /home/username/ /mnt/usb/username/
umount /mnt/usb
Linux で外付けの HDD を使用する

OpenLDAP の導入

概要

LDAP を SSH, sFTP, www (Basic 認証)のログイン認証に使う。

インストールしたパッケージ

# yum list | grep ldap
nss_ldap.i386                            226-10                 installed       
openldap.i386                            2.2.13-4               installed       
openldap-clients.i386                    2.2.13-4               installed       
openldap-devel.i386                      2.2.13-4               installed       
openldap-servers.i386                    2.2.13-4               installed       
php-ldap.i386                            4.3.9-3.9              installed       
python-ldap.i386                         2.0.1-2                installed       
compat-openldap.i386                     2.1.30-4               update          
mod_authz_ldap.i386                      0.26-2                 base            
openldap-servers-sql.i386                2.2.13-4               update      

# yum list | grep pam
pam.i386                                 0.77-66.13             installed       
pam-devel.i386                           0.77-66.13             installed       
pam_ccreds.i386                          1-3                    installed       
pam_krb5.i386                            2.1.8-1                installed       
pam_passwdqc.i386                        0.7.5-2                installed       
pam_smb.i386                             1.1.7-5                installed       

設定ファイル

# pwd
/etc/openldap
# ls -R
.:
cacerts  ldap.conf  schema  slapd.conf

./cacerts:

./schema:
README        core.schema    dyngroup.schema       java.schema  nis.schema       redhat
corba.schema  cosine.schema  inetorgperson.schema  misc.schema  openldap.schema

./schema/redhat:
autofs.schema

slapd.conf

/etc/openldap/sldapd.conf
以下のように編集する(rootpw はちゃんと変える事)。

suffix          "dc=example,dc=com"
rootdn          "cn=Manager,dc=example,dc=com"

rootpw          secret

access to attrs=userPassword
       by self write
       by users auth
       by anonymous auth

access to *
       by self write
       by users read
       by anonymous read

この例では、ユーザは自分の情報を読み書きできるけれど、他人のパスワードを見る、または情報を書き換える事はできないように設定している。

以下はあるユーザに管理権限を与える例。

access to attrs=userPassword
       by self write
       by dn="uid=username,ou=People,dc=example,dc=com" write
       by users read
       by anonymous auth

access to *
       by self write
       by dn="uid=username,ou=People,dc=example,dc=com" write
       by users read
       by anonymous read

rootpw の暗号化

slappasswd を使う。

# slappasswd
New password: 
Re-enter new password: 
{SSHA}IURIkjnl/xCkPBTG5xCmLKtXfeFLFCSe

生成された文字列を slapd.conf に設定。

rootpw                  {SSHA}IURIkjnl/xCkPBTG5xCmLKtXfeFLFCSe

起動

# service ldap start

マシン起動時に LDAP も起動するには次のようにする。

# chkconfig ldap on

正常に動作しているかは、次のようにして確認できる。

# ldapsearch -v -x -b '' -s base +
ldap_initialize( <DEFAULT> )
filter: (objectclass=*)
requesting: + 
# extended LDIF
#
# LDAPv3
# base <> with scope base
# filter: (objectclass=*)
# requesting: + 
#

#
dn:
structuralObjectClass: OpenLDAProotDSE
namingContexts: dc=example,dc=com
supportedControl: 2.16.840.1.113730.3.4.18
supportedControl: 2.16.840.1.113730.3.4.2
supportedControl: 1.3.6.1.4.1.4203.1.10.1
supportedControl: 1.2.840.113556.1.4.1413
supportedControl: 1.2.840.113556.1.4.1339
supportedControl: 1.2.840.113556.1.4.319
supportedControl: 1.2.826.0.1.334810.2.3
supportedExtension: 1.3.6.1.4.1.1466.20037
supportedExtension: 1.3.6.1.4.1.4203.1.11.1
supportedExtension: 1.3.6.1.4.1.4203.1.11.3
supportedFeatures: 1.3.6.1.4.1.4203.1.5.1
supportedFeatures: 1.3.6.1.4.1.4203.1.5.2
supportedFeatures: 1.3.6.1.4.1.4203.1.5.3
supportedFeatures: 1.3.6.1.4.1.4203.1.5.4
supportedFeatures: 1.3.6.1.4.1.4203.1.5.5
supportedLDAPVersion: 2
supportedLDAPVersion: 3
supportedSASLMechanisms: CRAM-MD5
supportedSASLMechanisms: DIGEST-MD5
subschemaSubentry: cn=Subschema

# search result
search: 2
result: 0 Success

# numResponses: 2
# numEntries: 1

# 

データの入力

LDIF ファイルを使った入力

LDIF ファイルの例:

dn: dc=example,dc=com
objectClass: dcObject
objectClass: organization
o: example
dc: example

dn: ou=Users,dc=example,dc=com
objectClass: top
objectClass: organizationalUnit
ou: users

dn: cn=FirstnameLastname,ou=Users,dc=example,dc=com
sn: Lastname
telephoneNumber: 03-1111-2222
userPassword: 1234567
mail: user@example.com
objectClass: top
objectClass: person
objectClass: organizationalPerson
objectClass: inetOrgPerson
uid: username
cn: FirstnameLastname

コマンド実行例:

# ldapadd -x -h localhost -D cn=manager,dc=example,dc=com -f ldif.txt -W
Enter LDAP Password: 
adding new entry "dc=example,dc=com"

adding new entry "ou=Users,dc=example,dc=com"

adding new entry "cn=FirstnameLastname,ou=Users,dc=example,dc=com"

検索例 (uid=username):

# ldapsearch -LLL -x -h localhost -b dc=example,dc=com uid=username
dn: cn=FirstnameLastname,ou=Users,dc=example,dc=com
sn: Lastname
telephoneNumber: 00-1111-2222
userPassword:: MTIzNDU2Nw==
mail: user@example.com
objectClass: top
objectClass: person
objectClass: organizationalPerson
objectClass: inetOrgPerson
uid: username
cn: FirstnameLastname

LDAP をシステムのログイン認証に使う

PAM の設定

‘authconfig’ を実行して、use LDAP と use LDAP auth にチェックし、next へ進んで OK を押す。すると /etc/pam.d/system-auth に以下のように追加される。

auth        sufficient    /lib/security/$ISA/pam_ldap.so use_first_pass
account     [default=bad success=ok user_unknown=ignore] /lib/security/$ISA/pam_ldap.so
password    sufficient    /lib/security/$ISA/pam_ldap.so use_authtok
session     optional      /lib/security/$ISA/pam_ldap.so

その後、system-auth に以下の行を追加。

session     required      /lib/security/$ISA/pam_mkhomedir.so skel=/etc/skel umask=0022

system-auth の例:

# cat /etc/pam.d/system-auth 
#%PAM-1.0
# This file is auto-generated.
# User changes will be destroyed the next time authconfig is run.
auth        required      /lib/security/$ISA/pam_env.so
auth        sufficient    /lib/security/$ISA/pam_unix.so likeauth nullok
auth        sufficient    /lib/security/$ISA/pam_ldap.so use_first_pass
auth        required      /lib/security/$ISA/pam_deny.so

account     required      /lib/security/$ISA/pam_unix.so broken_shadow
account     sufficient    /lib/security/$ISA/pam_succeed_if.so uid < 100 quiet
account     [default=bad success=ok user_unknown=ignore] /lib/security/$ISA/pam_ldap.so
account     required      /lib/security/$ISA/pam_permit.so

password    requisite     /lib/security/$ISA/pam_cracklib.so retry=3
password    sufficient    /lib/security/$ISA/pam_unix.so nullok use_authtok md5 shadow
password    sufficient    /lib/security/$ISA/pam_ldap.so use_authtok
password    required      /lib/security/$ISA/pam_deny.so

session     required      /lib/security/$ISA/pam_limits.so
session     required      /lib/security/$ISA/pam_unix.so
session     optional      /lib/security/$ISA/pam_ldap.so
session     required      /lib/security/$ISA/pam_mkhomedir.so skel=/etc/skel umask=0022

NSS の設定

/etc/nsswitch.conf の passwd, shadow, group に ldap を追加。

passwd:     files ldap
shadow:     files ldap
group:      files ldap

既存ユーザの移行

移行ツールの設定

/usr/share/openldap/migration/migrate_common.ph の $DEFAULT_MAIL_DOMAIN と $DEFAULT_BASE を修正する。

# Default DNS domain
$DEFAULT_MAIL_DOMAIN = "example.com";

# Default base
$DEFAULT_BASE = "dc=example,dc=com";
移行ツールを実行する
# /usr/share/openldap/migration/migrate_passwd.pl /etc/passwd ./ldifpasswd.txt
# /usr/share/openldap/migration/migrate_group.pl /etc/group ./ldifgroup.txt

./ldifpasswd.txt と ldifgroup.txt が作成される。これらの上位エントリ ‘ou=People,dc=example,dc=com’ 用の ldif ファイルを作成する。
例:

dn: ou=People,dc=example,dc=com
ou: People
objectClass: top
objectClass: organizationalUnit

dn: ou=Group,dc=example,dc=com
ou: Group
objectClass: top
objectClass: organizationalUnit

このエントリを最初に登録する。

# ldapadd -x -h localhost -D cn=manager,dc=example,dc=com -f ldif.txt -W
Enter LDAP Password: 
adding new entry "ou=People,dc=example,dc=com"

移行ツールで作った ldifpasswd.txt から uid が 100 以下のものと 65000 以上のものを削除する(これらはシステムが使用するユーザなので)。その後、以下のように実行する。

# ldapadd -x -h localhost -D cn=manager,dc=example,dc=com -f ldifpasswd.txt -W
Enter LDAP Password: 
adding new entry "uid=username,ou=People,dc=example,dc=com"

# ldapadd -x -h localhost -D cn=manager,dc=example,dc=com -f ldifgroup.txt -W
Enter LDAP Password: 
adding new entry "ou=People,dc=example,dc=com"
確認手順
  1. /etc/passwd にユーザがいない事を確認
  2. /home/username を作成し、owner をそのユーザに変更
  3. そのユーザでログインする(ログインできるはず)
  4. LDAP を停止して、同じユーザでログインする(ログインできないはず)
  5. そのユーザのホームディレクトリを削除
  6. LDAP を起動して、そのユーザでログインする(ログインできて、ホームディレクトリが作成される)

実行例:

# grep username /etc/passwd
# mkdir /home/username
# chown username /home/username
# ls -l /home
合計 16
drwxr-xr-x  2 username root 4096  3月  5 15:24 username

$ ssh username@example.com
username@example.com's password: 
Last login: Mon Aug 22 22:42:17 2005 from 192.168.1.2
-bash-3.00$ 

# service ldap stop
# ls -l /home
合計 16
drwxr-xr-x  2 500 root 4096  3月  5 15:28 username

$ ssh username@example.com
username@example.com's password: 
Permission denied, please try again.
username@example.com's password: 

# rm -r /home/username
rm: descend into directory `/home/username'? y
rm: remove 通常ファイル `/home/username/.bash_history'? y
rm: remove ディレクトリ `/home/username'? y
# service ldap start

$ ssh username@example.com
username@example.com's password: 
Creating directory '/home/username'.
Last login: Sun Mar  5 15:25:28 2006 from 192.168.1.2
OpenLDAP の導入

MySQL の導入

インストール

# yum install mysql-server

参考: MySQL関連でインストール済みのソフトウェア(2006/07/25現在)

# yum list installed | grep mysql
mysql.i386                               5.0.22-1.centos.1      installed       
mysql-server.i386                        5.0.22-1.centos.1      installed       
mysqlclient14.i386                       4.1.14-4.2.c4.1        installed       
php-mysql.i386                           5.0.4-5.centos4        installed       

起動

デーモンの起動。

# service mysqld start

システム起動時に起動する。

# chkconfig mysqld on

root password の変更

# mysqladmin -u root password 'mynewpassword'

パスワードを変更したら、次のコマンドを実行。

# mysqladmin -h hostname flush-privileges

参照

MySQL の導入