Webkiszolgáló kevés erőforrással rendelkező VPS-ben

2010.10.09. | 3 hozzászólás | Kategória: Gentoo

A minap kellett egy weboldalt elhelyeznem, azonban pár egyedi dolog miatta  szokásos tárhely ajánlatok nem megfelelőek. Így szereztem egy Mini VPS a vpspro.hu oldalon, melyben 256 MiB RAM, ugyanennyi SWAP és 10 GiBájt tárhely található.

Természetesen a csomagokat nem a VPS-en forgattam le, hanem saját gépen, amit aztán összetömörítettem és ebből lett a VPS. A frissítéseket is érdemes binhost használatával (ami pl. a saját gépünkön futó virtuális gép) telepíteni, mivel egy ekkora VPS-ben nagyon sokáig tártana leforgatni a csomagokat.

Webkiszolgálónak a szokásos Apace helyett a sokkal “könnyebb” Lighttpd-t fogom használni, és a PHP-t FastCGI-vel futtatom.

Kezdésnek fogtam és feltelepítettem egy alap gentoot,majd megfrissítettem. Most, hogy kész az alap rendszer, jöhetnek a webkiszolgáló dolgai.

Lighttpd+PHP telepítése

Elsőként állítsuk be a szükséges USE flageket a Lighttpd csomagnak. A USE Flagek mondják meg a csomagnak, hogy milyen opciókkal, featurokkal forduljon le.

A Lighttpd-nek egyedül a fastcgi opciót adom, meg, mivel a PHP-t majd ezen keresztül szeretném használni. Lehetséges opciók még:

  • bzip2 - bzip2 támogatás a mod_compress modulhou
  • fastcgi – FastCGI támogatás
  • gdbm - GNU database libraryk támogatása
  • ipv6 - IPv6 támogatás
  • lua - Lua szkriptnyelv engedélyezése, pl. mod_cml modulhoz
  • memcache - Memcache támogatás, szintén a  mod_cml modulnak
  • mysql - MySQL támogatás VHOST-oknak (VHOST-ok adati MySQL adatbázisból jönnek), mod_mysql_vhost
  • pcre - PCRE támogatás, regex használatához konfigurációs fájlokban
  • php - mod_fastcgi/php alapértelmezett beállítások
  • rrdtool - RRDtool támogatás
  • ssl - OpenSSL, HTTPS használatához
  • doc - Dokumentáció telepítése
  • fam - Enables fam/gamin for reducing number of stat() calls
  • ldap - Ldap támogatás
  • minimal - Minimális telepítés, dokumentáció nélkül, csak a legszükségesebb modulokkal.
  • webdav - WebDAV támogatás, pl. SVN-hez
  • xattr - Kiterjesztett attribútumok támogatása

Nekem alapvetően csak a fastcgi USE flag kellett, így ez került csak be a package.use fájlba.

echo www-servers/lighttpd fastcgi>>/etc/portage/package.use

A php már jóval több modullal rendelkezik, így ott engedélyezzük azt, amire szükségünk van. Én a következőket engedélyeztem, ez általában elég is – a cgi opciót azonban mindenképp engedélyezzük, különben nem tudjuk FastCGI-vel használni a PHP-t:

dev-lang/php cgi force-cgi-redirect bcmath calendar ctype curl curlwrappers exif filter flatfile ftp gd gmp hash imap inifile json mysql mysqli simplexml soap sockets ssl tidy tokenizer truetype wddx xml xmlreader xmlrpc xmlwriter xpm xsl zip>>/etc/portage/package.use

Gentoon (amd64-es rendszeren), alapból az 5.2.14-es PHP érhető el, azonban unstabled formában elérhető az 5.3.3-as verzió is. Ha ezt szeretnénk használni, akkor csak unmaskolni kell:

echo "dev-lang/php ~amd64">>/etc/portage/package.keywords

Akkor itt az ideje leforgatni a PHP-t, és a Lighttpd-t:

emerge dev-lang/php www-servers/lighttpd

Gépünk sebességétől függően hamarosan lefordul a Lighttpd és a PHP.

Lighttpd beállítása

Most, hogy lefordultak a csomagok, be kell állítani őket.

A szerveren két VHOST-ot szeretnék kiszolgálni, egyet melyben az oldal fut, php támogatással és egy static vhost, ahol a fájlok kiszolgálása történik, php nélkül.

Nézzük előbb a mod_fastcgi.conf fájlt, melybe a PHP FastCGI beállításait írom, magyarázatok a fájlban:

#Engedélyezzük a mod_fastcgi modult
server.modules += ("mod_fastcgi")

fastcgi.server    = (
    # .php kiterjesztésű fájlokra vonatkozó beállítások
    ".php" =>
        ((
		#php-cgi bináris helye
                "bin-path" => "/usr/bin/php-cgi",
		#FastCGI socket fájl helye
                "socket" => "/var/run/lighttpd/lighttpd-fastcgi-php-" + PID + ".socket",
		#Hány PHP process legyen minimun
                "min-procs" => 1,
		#Hány PHP process legyen maximum
                "max-procs" => 1, # Direkt van itt 1, magyarázat később!
                "idle-timeout" => 30,
                "bin-environment" => (
			#Egy PHP processznek hány gyermek folyamata lehet
                        "PHP_FCGI_CHILDREN" => "8",
			#Azt adja meg, hogy hány kérés teljesítése után felyeződjön be a PHP processz.
                        "PHP_FCGI_MAX_REQUESTS" => "100000"
                ),
		#Csak ezeket a környezeti változókat adja át a PHP-nak
                "bin-copy-environment" => (
                        "PATH", "SHELL", "USER"
                ),
		#Ha használni akarjuk a PATH_INFO és PHP_SELF változókat
                "broken-scriptfilename" => "enable"
        ))
)

A lighttpd.conf:

#Log fájlok helye
var.logdir			= "/var/log/lighttpd"
#Alapértelmezett document root
server.document-root		= "/var/www/domainem.tld/htdocs"
server.event-handler		= "linux-sysepoll"
server.network-backend		= "linux-sendfile"
#Log fájl formátuma és neve
accesslog.format		= "%h %V %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\""
accesslog.filename		= var.logdir + "/access.log"
#index fájlok
index-file.names		= ( "index.php", "index.html" )
#Az ilyen fájlokat nem lehet elérni
url.access-deny			= ( "~", ".inc", ".htaccess")
#Soha ne szolgálja ki az ilyen kiterjesztésű fájlokat statikus fájlokként
static-file.exclude-extensions	= ( ".php", ".pl", ".fcgi" )
#Milyen IP címen figyeljen a Lighttpd; 0.0.0.0 minden ip cím
server.bind			= "0.0.0.0"
server.pid-file			= "/var/run/lighttpd.pid"
#Hibaoldalak elérési helye. A hibaoldalak a status-HIBAKOD.html fájlnevet kell viselniük.
server.errorfile-prefix		= "/var/www/static.domainem.tld/htdocs/error/"
server.tag			= "Lighttpd"
dir-listing.encoding		= "utf-8"
#Mappalistázás, ha nincs index fájl
server.dir-listing		= "disable"
#Milyen felhasználóval és csoporttal fusson a Lighty
server.username			= "lighttpd"
server.groupname		= "lighttpd"
#Cache mappa
compress.cache-dir		= "/var/cache/lighttpd/compress/"

include "mime-types.conf"

#Böngésző függő beállítások
$HTTP["useragent"] =~ "(MSIE [7-9]|Mozilla/[5-9])" {
        compress.filetype  = ( "text/plain", "text/html", "text/css", "text/xml", "text/javascript", "application/x-javascript" )
}
$HTTP["useragent"] !~ "(MSIE [7-9]|Mozilla/[5-9])" {
        compress.filetype  = ( "text/plain", "text/html" )
}

#Alapértelmezett szerver név
server.name			= "web.domainem.tld"

#Helyi gépről elérhető server-status
$HTTP["remoteip"] == "127.0.0.1" {
	status.status-url = "/server-status"
	status.config-url = "/server-config"
}

#Ha a domain nem static.domain.tld...
$HTTP["host"] != static.domainem.tld" {
	#Minden más aldomainre a fődomain beállításai jönnek be (www.domainem.tld, akármi.domainem.tld, stb.)
	$HTTP["host"] =~ "(^|\.)domainem\.tld$" {
		server.name = "domainem.tld"
		#documentroot
		server.document-root ="/var/www/domainem.tld/htdocs"
		compress.cache-dir = "/var/cache/lighttpd/compress/" + server.name
		#Olvassa be a mod_fastcgi.conf tartalmát, ezáltal lesz PHP támogatás
		include "mod_fastcgi.conf"
	}
}

#static.domainem.tld virtualhost beállításai, PHP nélkül
$HTTP["host"] == "static.domainem.tld" {
	server.name = "static.domainem.tld"
	#documentroot
	server.document-root ="/var/www/static.domainem.tld/htdocs"
	compress.cache-dir = "/var/cache/lighttpd/compress/" + server.name
}

PHP beállítása

A php.ini-t az /etc/php/cgi-php5 mappában találjuk.

Ha használni akarjuk a PATH_INFO és PHP_SELF változókat, akkor mindenképpen legyen bent a php.ini fájlban – és legyen is engedélyezve – a következő opció:

cgi.fix_pathinfo = 1

A többi opciót ízlésünk és igényeink szerint állítsuk be.

Lighttpd+PHP kipróbálása

Most már minden beállítás a helyén van, indítsuk a Lightyt:

/etc/init.d/lighttpd start

MySQL telepítése, beállítása

Forgassuk le a MySQL-t:

emerge dev-db/mysql

Majd telepítés után hozzuk létre az alapértelmezett adatbázisokat:

emerge --config dev-db/mysql

Majd indítsuk el:

/etc/init.d/mysql start

Ezután állítsuk be a mysql root felhasználó jelszavát:

/usr/bin/mysqladmin -u root password 'jelszo'

Érdemes pár módosítást eszközölni az /etc/mysql/my.cnf fájl, [mysqld] részébe – ami nem szerepel a my.cnf-be azt írjuk be, ami szerepel, annak csak az értékét írjuk át:

[mysqld]
key_buffer = 16K
max_allowed_packet = 1M
table_cache = 4
sort_buffer_size = 64K
read_buffer_size = 256K
read_rnd_buffer_size = 256K
net_buffer_length = 2K
thread_stack = 64K
skip-bdb
skip-innodb

Ne felejtsük el újraindítani a mysql-t a módosítás után!

SMTP szerver

Szükségünk lesz még egy SMTP szerverre a saját gépünkön, amin keresztül az operációs rendszer üzenhet nekünk, valamint a PHP-s alkalmazások kifele a világba.

Célszerű erre pl. egy Exim-et forgatni, a következő USE flagekkel:

echo mail-mta/exim spf syslog exiscan-acl>>/etc/portage/package.use

ÉS akkor forgassuk le:

emerge mail-mta/exim

Valamint példának egy alap konfigurációs fájl:

primary_hostname = web.domainem.tld
domainlist local_domains = @
domainlist relay_to_domains =
smtp_banner = "$primary_hostname"
hostlist relay_from_hosts = 127.0.0.1
acl_smtp_rcpt = acl_check_rcpt
acl_smtp_data = acl_check_data
daemon_smtp_ports = 25
local_interfaces=127.0.0.1
never_users =
host_lookup = *
rfc1413_hosts = *
rfc1413_query_timeout = 5s
ignore_bounce_errors_after = 2d
timeout_frozen_after = 7d

begin acl
acl_check_rcpt:
  accept  hosts = :
  deny    message       = Restricted characters in address
          domains       = +local_domains
          local_parts   = ^[.] : ^.*[@%!/|]
  deny    message       = Restricted characters in address
          domains       = !+local_domains
          local_parts   = ^[./|] : ^.*[@%!] : ^.*/\\.\\./
  accept  local_parts   = postmaster
          domains       = +local_domains
  accept  hosts         = +relay_from_hosts
          control       = submission
  accept  authenticated = *
          control       = submission
  require message = relay not permitted
          domains = +local_domains : +relay_to_domains
  require verify = recipient
  accept
acl_check_data:
  accept

begin routers
dnslookup:
  driver = dnslookup
  domains = ! +local_domains
  transport = remote_smtp
  ignore_target_hosts = 0.0.0.0 : 127.0.0.0/8
  no_more

begin transports
remote_smtp:
  driver = smtp

begin retry
*                      *           F,2h,15m; G,16h,1h,1.5; F,4d,6h
begin rewrite

begin authenticators

Indítsuk is el:

/etc/init.d/exim start

Utolsó simítésok

Teszteljünk le mindent, majd állítsuk be, hogy a VPS indításakor automatikusan induljon minden szolgáltatás:

rc-update add exim default
rc-update add lighttpd default
rc-update add mysql default
Szólj hozzzá Trackback 17111 olvasás, 10 ma

Kapcsolódó írások

Hozzászólások követése

3 hozzászólás

  1. W3ber

    Kicsit offolnék elnézést előre is.
    Off:Adott 1 Debian Lenny Squeeze AMD64 + VMWare Server 2+router
    Kérdés:Mit kell beállítani hogy menjen az internet a gazda gépen és a virtuális gépeken.Mind Debiantba Networking Server2 *.conf mind a programban magában.Ha tudtok adni 1 működő combót az is jó értem itt./etc/network/interfaces meg a netmap.conf vagy ehhez kapcsolódó fájlok azért nem vagyok egy guru és sajnos neten nem találtam workoroundot viszont ha lelövöm a server network részét akkor volt és ifconfig up eth0 akkor volt netem.
    192.168.1.84 ip
    255.255.255.0 mask
    192.168.1.254 gw
    192.168.1.254 dns

  2. Mategm

    Szia!

    Megtetszett a leírásod, mert már egy ideje gondolkodom VPS-ben, de linuxhoz még eléggé kezdő vagyok. Egy ubuntuval és a fórummal tudok böngészni…

    Itt azért is kérdezném meg, hogy érted azt, mit értesz azon, hogy “lefordítani”?
    Azaz:
    “Természetesen a csomagokat nem a VPS-en forgattam le, hanem saját gépen, amit aztán összetömörítettem és ebből lett a VPS. A frissítéseket is érdemes binhost használatával (ami pl. a saját gépünkön futó virtuális gép) telepíteni, mivel egy ekkora VPS-ben nagyon sokáig tártana leforgatni a csomagokat.”

    Na, ezt a részt kifejthetné valaki, mert előbb tanulom meg a kínait…

    Köszönöm előre is!

Szólj hozzá

Használható HTML tagek: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong> <pre lang="" line="" escaped="">

A hozzászólás elküldésével elfogadod az oldal felhasználási feltételeit!

Értesítés beállítása hozzászólás nélkül