FreeBSD – Lighttpd + FastCGI + MySQL

FreeBSD 에서 Lighttpd 를 설치하는 방법이며 잊어 먹지 않기 위해 기록 해둡니다.
우선 lighttpd 는 정적파일 서빙시 우수 하다고 알려져 있습니다. (아파치 보단 우수하다고 하는듯..?)

http://www.lighttpd.net/benchmark/

0. MySQL 설치
기본 데이터베이스의 언어셋(charset)은 UTF8 로 합니다.

[root@yongbok ~]# cd /usr/ports/databases/mysql51-server
[root@yongbok ~]# make WITH_CHARSET=utf8 BUILD_OPTIMIZED=yes BUILD_STATIC=yes install clean

– MySQL 시작

[root@yongbok ~]# echo ‘mysql_enable=”YES”‘ >> /etc/rc.conf
[root@yongbok ~]# /usr/local/etc/rc.d/mysql-server start

– 루트 비밀번호 설정

[root@yongbok ~]# mysqladmin -u root password ‘123456’

– 사용자 추가

[root@ruo91 ~]# mysql -u root -p

mysql> GRANT ALL ON ruo91.* TO ‘ruo91’@’localhost’ IDENTIFIED BY ‘123456 WITH GRANT OPTION;

– MySQL 데이터베이스 생성

mysql> CREATE DATABASE ruo91;
mysql> flush privileges;
mysql> exit

1. Lighttpd 설치
lighttpd 는 Ports 를 이용하여 설치를 진행하며 의존성으로 libtool, pcre, pkg-config, spawn-fcgi 가 함께 설치 됩니다.
(Ports 로 설치 진행시 필요한 모듈을 선택 하는 화면이 나오므로 사용자 환경에 맞도록 설정 해주세요.)

[root@yongbok ~]# cd /usr/ports/www/lighttpd ; make install clean


lighttpd 와 spawn-fcgi 를 /etc/rc.conf 에 등록 해줍니다.

[root@yongbok ~]# echo ‘lighttpd_enable=”YES”‘ >> /etc/rc.conf
[root@yongbok ~]# echo ‘spawn_fcgi_enable=”YES”‘ >> /etc/rc.conf

2. PHP 설치
FastCGI 를 사용하기 위해서 PHP 설치를 진행합니다. (PHP 역시 모듈 옵션 선택 창이 뜹니다.)

[root@yongbok ~]# cd /usr/ports/lang/php5 ; make install clean

[root@yongbok ~]# cp /usr/local/etc/php.ini-recommended /usr/local/etc/php.ini

– PHP Extensions 설치

[root@yongbok ~]# cd /usr/ports/lang/php5-extensions ; make install clean

3. lighttpd.conf 설정
lighttpd.conf 설정 파일에 사용자 환경에 맞도록 수정

[root@yongbok ~]# ee /usr/local/etc/lighttpd.conf

# lighttpd configuration file
#
# use it as a base for lighttpd 1.0.0 and above
#
# $Id: lighttpd.conf,v 1.7 2004/11/03 22:26:05 weigon Exp $

############ Options you really have to take care of ####################

## 모듈 로드
# – 비활성 모듈
# “mod_trigger_b4_dl”,
# “mod_auth”,
# “mod_status”,
# “mod_setenv”,
# “mod_proxy”,
# “mod_simple_vhost”,
# “mod_evhost”,
# “mod_userdir”,
# “mod_cgi”,
# “mod_ssi”,
# “mod_usertrack”,
# “mod_secdownload”,
# “mod_rrdtool”,
server.modules = ( “mod_rewrite”, “mod_redirect”, “mod_alias”, “mod_access”, “mod_fastcgi”, “mod_compress”, “mod_expire”, “mod_accesslog” )

## 기본 문서 디렉토리
server.document-root = “/usr/home/www”

## 에러 로그
server.errorlog = “/var/log/lighttpd.error.log”

# 인덱스 파일 지정
index-file.names = ( “index.php”, “index.html”,
“index.htm”, “default.htm” )

## 이벤트 핸들러 지정 (FreeBSD 는 kqueue 사용, Linux 는 epoll 이던가..)
server.event-handler = “freebsd-kqueue” # needed on OS X

# Use the “Content-Type” extended attribute to obtain mime type if possible
#mimetype.use-xattr = “enable”

## 서버 헤더 설정
server.tag = “lighttpd”

#### accesslog module
accesslog.filename = “/var/log/lighttpd.access.log”

## deny access the file-extensions
#
# ~ is for backupfiles from vi, emacs, joe, …
# .inc is often used for code includes which should in general not be part
# of the document-root
url.access-deny = ( “~”, “.inc” )

$HTTP[“url”] =~ “\.pdf$” {
server.range-requests = “disable”
}

# 가상 호스트 설정
# example1 – yongbok.net
$HTTP[“host”] =~ “(^|\.)yongbok\.net$” {
server.document-root = “/usr/home/www/”
server.errorlog = “/var/log/yongbok.net-error.log”
accesslog.filename = “/var/log/yongbok.net-access.log”
server.error-handler-404 = “/error-404.php”
}

# example2 – static.yongbok.net
$HTTP[“host”] =~ “(^|\.)static\.yongbok\.net$” {
server.document-root = “/usr/home/www/img/”
server.errorlog = “/var/log/static.yongbok.net-error.log”
accesslog.filename = “/var/log/static.yongbok.net-access.log”
server.error-handler-404 = “/error-404.php”
}

# example3 – rewrite
$HTTP[“host”] =~ “(^|\.)www.yongbok\.net$” {
url.rewrite-once = (
“^(thumbnail)/([0-9]+/.+)$” => “cache/$1/$2″,
“^(cache)+/+(.+[^/])\.(cache|xml|txt|log)$” => “$0″,
“^(.*[^/])$” => “$1/”,
“^(.*)$” => “rewrite.php”
)
}

##
# which extensions should not be handle via static-file transfer
#
# .php, .pl, .fcgi are most often handled by mod_fastcgi or mod_cgi
static-file.exclude-extensions = ( “.php”, “.pl”, “.fcgi” )

######### Options that are good to be but not neccesary to be changed #######

## bind to port (default: 80)
server.port = 80

## bind to localhost (default: all interfaces)
#server.bind = “127.0.0.1”

## error-handler for status 404
#server.error-handler-404 = “/error-handler.html”
#server.error-handler-404 = “/error-handler.php”

## to help the rc.scripts
server.pid-file = “/var/run/lighttpd.pid”

###### virtual hosts
##
## If you want name-based virtual hosting add the next three settings and load
## mod_simple_vhost
##
## document-root =
## virtual-server-root + virtual-server-default-host + virtual-server-docroot
## or
## virtual-server-root + http-host + virtual-server-docroot
##
#simple-vhost.server-root = “/srv/www/vhosts/”
#simple-vhost.default-host = “www.example.org”
#simple-vhost.document-root = “/htdocs/”

##
## Format: <errorfile-prefix><status-code>.html
## -> …./status-404.html for ‘File not found’
#server.errorfile-prefix = “/usr/share/lighttpd/errors/status-”
#server.errorfile-prefix = “/srv/www/errors/status-”

## virtual directory listings
#dir-listing.activate = “enable”
## select encoding for directory listings
#dir-listing.encoding = “utf-8″

## enable debugging
#debug.log-request-header = “enable”
#debug.log-response-header = “enable”
#debug.log-request-handling = “enable”
#debug.log-file-not-found = “enable”

### only root can use these options
# chroot 디렉토리 지정 (default: no chroot() )
server.chroot = “/”

## UID 지정 (default: don’t care)
server.username = “www”

## GID 지정 (default: don’t care)
server.groupname = “www”

#### 압축 모듈 (compress module)
# 압축에 사용할 캐시 디렉토리 지정
compress.cache-dir = “/var/cache/lighttpd/compress/”
# 압축을 사용할 파일 종류
compress.filetype = ( “text/plain”, “text/html”, “image/gif”, “image/jpeg”, “image/png”, “image/x-xbitmap”, “text/css”, “text/javascript”, “text/xml” )

#### proxy module
## read proxy.txt for more info
#proxy.server = ( “.php” =>
# ( “localhost” =>
# (
# “host” => “192.168.0.101”,
# “port” => 80
# )
# )
# )

#### FastCGI 모듈
## FastCGI 를 사용하기 위해선 php.ini 파일의 내용에 cgi.fix_pathinfo = 1 이 추가가 되어 있어야 합니다.
fastcgi.server = ( “.php” =>
( “localhost” =>
(
“socket” => “/var/run/lighttpd/php-fastcgi.socket”,
“bin-path” => “/usr/local/bin/php-cgi”
)
)
)

#### CGI module
#cgi.assign = ( “.pl” => “/usr/bin/perl”,
# “.cgi” => “/usr/bin/perl” )
#

#### SSL engine
#ssl.engine = “enable”
#ssl.pemfile = “/etc/ssl/private/lighttpd.pem”

#### status module
#status.status-url = “/server-status”
#status.config-url = “/server-config”

#### auth module
## read authentication.txt for more info
#auth.backend = “plain”
#auth.backend.plain.userfile = “lighttpd.user”
#auth.backend.plain.groupfile = “lighttpd.group”

#auth.backend.ldap.hostname = “localhost”
#auth.backend.ldap.base-dn = “dc=my-domain,dc=com”
#auth.backend.ldap.filter = “(uid=$)”

#auth.require = ( “/server-status” =>
# (
# “method” => “digest”,
# “realm” => “download archiv”,
# “require” => “user=jan”
# ),
# “/server-config” =>
# (
# “method” => “digest”,
# “realm” => “download archiv”,
# “require” => “valid-user”
# )
# )

#### url handling modules (rewrite, redirect, access)
#url.rewrite = ( “^/$” => “/server-status” )
#url.redirect = ( “^/wishlist/(.+)” => “http://www.123.org/$1″ )
#### both rewrite/redirect support back reference to regex conditional using %n
#$HTTP[“host”] =~ “^www\.(.*)” {
# url.redirect = ( “^/(.*)” => “http://%1/$1″ )
#}

#
# define a pattern for the host url finding
# %% => % sign
# %0 => domain name + tld
# %1 => tld
# %2 => domain name without tld
# %3 => subdomain 1 name
# %4 => subdomain 2 name
#
#evhost.path-pattern = “/srv/www/vhosts/%3/htdocs/”

#### expire 모듈
#expire.url = ( “/buggy/” => “access 2 hours”, “/asdhas/” => “access plus 1 seconds 2 minutes”)
expire.url = ( “/usr/home/www/blog/” => “access plus 1 years” )

#### ssi
#ssi.extension = ( “.shtml” )

#### rrdtool
#rrdtool.binary = “/usr/bin/rrdtool”
#rrdtool.db-name = “/var/lib/lighttpd/lighttpd.rrd”

#### setenv
#setenv.add-request-header = ( “TRAV_ENV” => “mysql://user@host/db” )
#setenv.add-response-header = ( “X-Secret-Message” => “42” )

## for mod_trigger_b4_dl
# trigger-before-download.gdbm-filename = “/var/lib/lighttpd/trigger.db”
# trigger-before-download.memcache-hosts = ( “127.0.0.1:11211″ )
# trigger-before-download.trigger-url = “^/trigger/”
# trigger-before-download.download-url = “^/download/”
# trigger-before-download.deny-url = “http://127.0.0.1/index.html”
# trigger-before-download.trigger-timeout = 10

#### variable usage:
## variable name without “.” is auto prefixed by “var.” and becomes “var.bar”
#bar = 1
#var.mystring = “foo”

## integer add
#bar += 1
## string concat, with integer cast as string, result: “www.foo1.com”
#server.name = “www.” + mystring + var.bar + “.com”
## array merge
#index-file.names = (foo + “.php”) + index-file.names
#index-file.names += (foo + “.php”)

#### include
#include /etc/lighttpd/lighttpd-inc.conf
## same as above if you run: “lighttpd -f /etc/lighttpd/lighttpd.conf”
#include “lighttpd-inc.conf”

#### include_shell
#include_shell “echo var.a=1″
## the above is same as:
#var.a=1

# mimetype mapping
mimetype.assign = (
“.pdf” => “application/pdf”,
“.sig” => “application/pgp-signature”,
“.spl” => “application/futuresplash”,
“.class” => “application/octet-stream”,
“.ps” => “application/postscript”,
“.torrent” => “application/x-bittorrent”,
“.dvi” => “application/x-dvi”,
“.gz” => “application/x-gzip”,
“.pac” => “application/x-ns-proxy-autoconfig”,
“.swf” => “application/x-shockwave-flash”,
“.tar.gz” => “application/x-tgz”,
“.tgz” => “application/x-tgz”,
“.tar” => “application/x-tar”,
“.zip” => “application/zip”,
“.mp3″ => “audio/mpeg”,
“.m3u” => “audio/x-mpegurl”,
“.wma” => “audio/x-ms-wma”,
“.wax” => “audio/x-ms-wax”,
“.ogg” => “application/ogg”,
“.wav” => “audio/x-wav”,
“.gif” => “image/gif”,
“.jar” => “application/x-java-archive”,
“.jpg” => “image/jpeg”,
“.jpeg” => “image/jpeg”,
“.png” => “image/png”,
“.xbm” => “image/x-xbitmap”,
“.xpm” => “image/x-xpixmap”,
“.xwd” => “image/x-xwindowdump”,
“.css” => “text/css”,
“.html” => “text/html”,
“.htm” => “text/html”,
“.js” => “text/javascript”,
“.asc” => “text/plain”,
“.c” => “text/plain”,
“.cpp” => “text/plain”,
“.log” => “text/plain”,
“.conf” => “text/plain”,
“.text” => “text/plain”,
“.txt” => “text/plain”,
“.dtd” => “text/xml”,
“.xml” => “text/xml”,
“.mpeg” => “video/mpeg”,
“.mpg” => “video/mpeg”,
“.mov” => “video/quicktime”,
“.qt” => “video/quicktime”,
“.avi” => “video/x-msvideo”,
“.asf” => “video/x-ms-asf”,
“.asx” => “video/x-ms-asf”,
“.wmv” => “video/x-ms-wmv”,
“.bz2″ => “application/x-bzip”,
“.tbz” => “application/x-bzip-compressed-tar”,
“.tar.bz2″ => “application/x-bzip-compressed-tar”,
# default mime type
“” => “application/octet-stream”,
)

압축에 사용할 캐시 디렉토리를 생성하고 쓰기 권한 추가

[root@yongbok ~]# mkdir -p /var/cache/lighttpd/compress/
[root@yongbok ~]# chmod 777 /var/cache/lighttpd/compress/

FastCGI 활성화 및 소켓 디렉토리 생성

[root@yongbok ~]# echo ‘cgi.fix_pathinfo = 1′ >> /usr/local/etc/php.ini
[root@yongbok ~]# mkdir -p /var/run/lighttpd/
[root@yongbok ~]# chmod 777 /var/run/lighttpd/

spawn-fcgi & lighttpd 시작

[root@yongbok ~]# /usr/local/etc/rc.d/spawn-fcgi start
Starting spawn_fcgi.
spawn-fcgi: child spawned successfully: PID: 86856

[root@yongbok ~]# /usr/local/etc/rc.d/lighttpd start
Starting lighttpd.
2010-04-11 16:09:38: (log.c.166) server started

phpinfo() 함수 확인

[root@yongbok ~]# touch /usr/home/www
[root@yongbok ~]# chmod 755 /usr/home/www/phpinfo.php
[root@yongbok ~]# echo ‘<?php phpinfo(); ?>’ > /usr/home/www/phpinfo.php

Loading Disqus Comments ...
Loading Facebook Comments ...

No Trackbacks.