Servidor Web i MySQL

Abstract

Ha arribat el moment de preparar el servidor de pàgines web de la peixera.

Hi ha una gran quantitat d'aplicacions per preparar un servidor web, però cap tant flexible i robusta com Apache. Segons Netcraft (empresa dedicada a l'estudi d'internet), al mes de Juny del 2005, a la vora d'un 70% (69.70%) de les pàgines web d'internet funciònen sobre aquest servidor.

Evidenment, com tot el material d'aquest projecte és de codi lliure...

El nostre servidor no serà un simple servidor web, li afegirem suport SSL, PHP, zope i MySQL. Ja anirem explicant què fa cada un d'aquests afegits :)


Table of Contents

Apache
Instal·lació
Fitxers de configuració
Engegada
Altres (fitxers interssants: logs)
Autentificació 'AuthConfig'
SSL
Instal·lació
Editem els fitxers de configuració necessaris
Reinici d'Apache
PHP
Instal·lació
Fitxers de configuració
Reinici d'Apache
Zope
Instal·lació
Fitxers de configuració
Arrencada
MySQL
Instal·lació
Arrencada
Configuració
Prova
Estadístiques de la web
Instal·lació d'Analog
Fitxers de configuració
Arrencada i scripts
No ens deixem apache...

Apache

Instal·lació

Per no tenir problemes més endavant hem de compilar-lo amb suport SSL, per això afegim 'USE'.

#USE="ssl" emerge apache

Fitxers de configuració

Correcte, ara anem a veure la "mare dels ous"... El fitxer de configuració principal el trobem a /etc/apache2/conf/apache2.conf

Amb el següent exemple i els respectius comentaris hem de ser capaços controlar Apache

# nano /etc/apache2/conf/apache2.conf

	### /etc/apache2/conf/apache2.conf
	###
	### Secció principal
	###
	ServerSignature Off
	# deshabilitant aquest apartat apache no ens mostrarà la versió
	ServerTokens Prod
	# amb aquesta opció fem que apache doni menys informació dels mòduls \\
		carregats, suport PHP, SSL, ...
	ServerRoot /usr/lib/apache2
	# la ruta absoluta per apache d'ara en endavant
	#ServerName localhost
	# el nom del servidor, no és realment necessària
	PidFile /var/run/apache2.pid
	# fitxer que conté l'identificador d'apache
	ErrorLog logs/error_log
	# on ens guardarà els logs d'error
	LogLevel warn
	# nivell de log, aquest és el que vé per defecte, suficient
	DocumentRoot /var/www/localhost/htdocs
	# arrel dels documents web
	AddDefaultCharset UTF-8
	# d'aquesta manera apache ens mostrarà les pàgines amb codifició UTF-8
	
	### Dynamic Shared Object Support (DSO)
	###
	### Mínim hem d'activar els tres següents (per a un ús normal)
	### 	mod_access (Order, Allow, etc..)
	### 	mod_log_config (Transferlog, etc..)
	### 	mod_mime (AddType, etc...)
	###
	### Serviu-vos de comentar els que no creieu necessàris
	###
	LoadModule access_module                 modules/mod_access.so
	LoadModule auth_module                   modules/mod_auth.so
	LoadModule auth_anon_module              modules/mod_auth_anon.so
	LoadModule auth_dbm_module               modules/mod_auth_dbm.so
	LoadModule auth_digest_module            modules/mod_auth_digest.so
	LoadModule include_module                modules/mod_include.so
	LoadModule log_config_module             modules/mod_log_config.so
	LoadModule env_module                    modules/mod_env.so
	LoadModule mime_magic_module             modules/mod_mime_magic.so
	LoadModule cern_meta_module              modules/mod_cern_meta.so
	LoadModule expires_module                modules/mod_expires.so
	LoadModule headers_module                modules/mod_headers.so
	LoadModule usertrack_module              modules/mod_usertrack.so
	LoadModule unique_id_module              modules/mod_unique_id.so
	LoadModule setenvif_module               modules/mod_setenvif.so
	LoadModule proxy_module                  modules/mod_proxy.so
	LoadModule proxy_connect_module          modules/mod_proxy_connect.so
	LoadModule proxy_ftp_module              modules/mod_proxy_ftp.so
	LoadModule proxy_http_module             modules/mod_proxy_http.so
	LoadModule mime_module                   modules/mod_mime.so
	LoadModule status_module                 modules/mod_status.so
	LoadModule autoindex_module              modules/mod_autoindex.so
	LoadModule asis_module                   modules/mod_asis.so
	LoadModule info_module                   modules/mod_info.so
	LoadModule cgi_module                    modules/mod_cgi.so
	LoadModule cgid_module                   modules/mod_cgid.so
	LoadModule vhost_alias_module            modules/mod_vhost_alias.so
	LoadModule negotiation_module            modules/mod_negotiation.so
	LoadModule dir_module                    modules/mod_dir.so
	LoadModule imap_module                   modules/mod_imap.so
	LoadModule actions_module                modules/mod_actions.so
	LoadModule speling_module                modules/mod_speling.so
	LoadModule userdir_module                modules/mod_userdir.so
	LoadModule alias_module                  modules/mod_alias.so
	LoadModule rewrite_module                modules/mod_rewrite.so

	
	###
	### Nous Moduls per Apache 2.0 (alguns experimentals)
	### Una vegada més serviu-vos de comentar els que no creieu necessàris
	###
	LoadModule file_cache_module             modules/mod_file_cache.so
	LoadModule echo_module                   modules/mod_echo.so
	LoadModule charset_lite_module           modules/mod_charset_lite.so
	LoadModule cache_module                  modules/mod_cache.so
	LoadModule disk_cache_module             modules/mod_disk_cache.so
	LoadModule mem_cache_module              modules/mod_mem_cache.so
	LoadModule ext_filter_module             modules/mod_ext_filter.so
	LoadModule case_filter_module            modules/mod_case_filter.so
	LoadModule case_filter_in_module         modules/mod_case_filter_in.so
	LoadModule deflate_module                modules/mod_deflate.so
	#LoadModule optional_hook_export_module   modules/mod_optional_hook_\\
		export.so
	#LoadModule optional_hook_import_module   modules/mod_optional_hook_\\
		import.so
	#LoadModule optional_fn_import_module     modules/mod_optional_fn_\\
		import.so
	#LoadModule optional_fn_export_module     modules/mod_optional_fn_\\
		export.so
	#LoadModule bucketeer_module              modules/mod_bucketeer.so
	LoadModule logio_module                  modules/mod_logio.so
	
	###
	### Configuració Global
	###
	# per apache2 carreguem totes les configuracions de conf/modules.d
	Include conf/modules.d/*.conf
	Include conf/commonapache2.conf
	
	DirectoryIndex index.html index.htm
	# quins són els fitxer que mostrarà si no n'especifiquem cap a la URL
	
	###
	### Opcions específiques per directoris concrets
	###
	
	# al directori 'altres' permetem que llisti el contigut (estil \\
		servidor FTP), a més, necessita que l'usuari s'autentifiqui
	<Directory "var/www/localhost/htdocs/altres/">
		Options Indexes
		AllowOverride AuthConfig
	</Directory>
	
	# el directori 'privat' també necessita autentificació
	<Directory "/var/www/localhost/htdocs/web/privat/">
		AllowOverride AuthConfig
	</Directory>
	
	# exemple d'àlies, al cridar http://localhost/monstre ens mostrarà \\
		el contingut de /home/monstre
	# molt útil per especificar carpetes fora de l'arrel dels documents web
	Alias /monstre "/home/monstre"
	<Directory "/var/log/analog">
		Options None
		AllowOverride AuthConfig
		Order allow,deny
		Allow from all
	</Directory>
	
	
	###
	### Adreça IP/Port que escoltarà Apache pe defecte
	###
	Listen 80
	
	
	###
	### Virtual Hosts
	###
	# Podem utilitzar el hosting virtual de dues maneres: amb plantilles i \\
		manualment.
	#
	# Tenim vàries plantilles per utilitzar el Virtual Hosting.
	# Doneu un cop d'ull als fitxers que hi ha a conf/vhosts/ i editeu-los \\
		a les vostres necessitats
	# Penseu a descomentar les línies següents partinents
	#Include conf/vhosts/vhosts.conf
	#Include conf/vhosts/dynamic-vhosts.conf
	#Include conf/vhosts/virtual-homepages.conf
	
	# En el nostre cas farem servir la manera tradicional de tenir hosts \\
		virtuals,
	# així ens centrarem en aquest fitxer
	
	NameVirtualHost *:80
	# protocol http
		
	# aquests exemples estàn pensant en virtual hosts nominals (basats en \\
		el nom, els més comuns)
	# per a virtual hosting per ip (si tenim vàries ip's públiques), \\
		consulteu http://httpd.apache.org
	
	# per les crides a http://www.domini1.com ens mostrarà el contingut del \\
		directori /var/www/localhost/htdocs/domini1
	# a més hem decidit canviar la codifició UTF-8 per ISO-8859-1
	<VirtualHost *:80>
		ServerName www.domini1.com
		DocumentRoot /var/www/localhost/htdocs/domini1
		AddDefaultCharset ISO-8859-1
	</VirtualHost>
	
	# per les crides a http://www.domini2.com ens mostrarà el contingut del \\
		directori /var/www/localhost/htdocs/virtual/1/
	<VirtualHost *:80>
		DocumentRoot /var/www/localhost/htdocs/virtual/1/
		ServerName www.domini2.net
	</VirtualHost>
	
	# també podem fer virtual hosts per als dominis de 3r nivell, a les \\
		crides a http://admin.domini1.com
	# ens mostrarà el contingut del directori \\
		/var/www/localhost/htdocs/domini1/admin/
	<VirtualHost *:80>
		DocumentRoot /var/www/localhost/htdocs/domini1/admin/
		ServerName admin.domini1.com
	</VirtualHost>
	
	###
	### Secció de logs per als virtual hosts
	###
	<IfModule mod_log_config.c>
		#Single logfile with access, agent and referer information
		#This is the default, if vlogs are not defined for the main \\
			server
		CustomLog logs/access_log combined env=!VLOG
		#If VLOG is defined in conf/vhosts/vhosts.conf, we use this \\
			entry
		#CustomLog "|/usr/sbin/apache2splitlogfile" vhost env=VLOG
	</IfModule>
	
	
	
	###
	### Secció de rendiment
	###
	#
	# Timeout: El nombre de segons abans del timeout per a enviaments i \\
		recepcions.
	#
	Timeout 300
	
	#
	# KeepAlive: Activem les connexions persistents
	# (per si els clients s'han de descarregar contingut molt pesant)
	#
	KeepAlive On
	
	#
	# MaxKeepAliveRequests: El nombre màxim de connexions permanents \\
		(0 = il·limitat)
	#
	MaxKeepAliveRequests 100
	
	#
	# KeepAliveTimeout: queda explicada pel mateix títol ;-)
	#
	KeepAliveTimeout 15
	
	# quan el sevidor està escoltant
	# StartServers: nombre de processos pel servidor que engarem
	# MinSpareServers: nombre mínim de processos que guardarem per \\
		estalviar
	# MaxSpareServers: nombre màxim de processos que guardarem per \\
		estalviar
	# MaxClients: nombre màxim de processos pel servidor que \\
		permetem engegar
	# MaxRequestsPerChild: nombre màxim de crides que cada procés \\
		del servidor servirà
	<IfModule prefork.c>
		StartServers         5
		MinSpareServers      5
		MaxSpareServers     10
		MaxClients         150
		MaxRequestsPerChild  0
	</IfModule>
	
	# treballant
	# StartServers: initial number of server processes to start
	# MaxClients: nombre màxim de connexions simultànies per client
	# MinSpareThreads: nombre mínim de fils que guardarem per estalviar
	# MaxSpareThreads: nombre màxim de fils que guardarem per estalviar
	# ThreadsPerChild: nombre constant de fils per procés del servidor
	# MaxRequestsPerChild: nombre màxim de peticions que un procés del \\
		servidor servirà
	<IfModule worker.c>
		StartServers         2
		MaxClients         150
		MinSpareThreads     25
		MaxSpareThreads     75
		ThreadsPerChild     25
		MaxRequestsPerChild  0
	</IfModule>
	
	# per fill de procés
	# NumServers: nombre constant de processos del servidor
	# StartThreads: nombre inicial de fils treballant en cada procés \\
		del servidor
	# MinSpareThreads: nombre mínim de fils treballant que guardarem \\
		per estalviar
	# MaxSpareThreads: nombre màxim de fils treballant que guardarem \\
		per estalviar
	# MaxThreadsPerChild: nombre màxim de fils treballant en cada procés \\
		del servidor
	# MaxRequestsPerChild: nombre màxim de connexions per cada procés \\
		del servidor
	<IfModule perchild.c>
		NumServers           5
		StartThreads         5
		MinSpareThreads      5
		MaxSpareThreads     10
		MaxThreadsPerChild  20
		MaxRequestsPerChild  0
	</IfModule>

Engegada

# /etc/init.d/apache2 start

Per comprobar que funciona...

cangreju / # netstat -tapu | grep http
tcp        0      0 *:http                 *:*               LISTEN      -

O podem apuntar desde el navegador d'un desktop amb X a la URL: http://cangreju

Veurem una cosa semblant a:

En cas que contrari reviseu els logs

Ja tenim el servidor web apunt i funcionant, l'afegim a l'arrencada del sistema i seguim per afegir-li algunes cosetes més.

# rc-update add apache2 default

Important

Si modifiquem el fitxer de configuració hem de reiniciar Apache...
	# /etc/init.d/apache2 restart
	

Altres (fitxers interssants: logs)

Bé, el fitxer de configuració ja ens ha dit on és el fitxer de logs per errors, però n'hi ha més (tots a /var/log/apache2/)...

  • access_log: accessos al contingut
  • error_log: errors al intentar mostrar contingut
  • ssl_access_log: accessos al contingut SSL
  • ssl_error_log: errors al intentar mostrar contingut SSL
  • ssl_request_log: peticions SSL

Si no trobeu els d'SSL, és normal, tot arribarà... ;)

Autentificació 'AuthConfig'

Ja fa una mica que parlem d'usuaris d'Apache, autentificació, ... Doncs Apache, a part de les possibilitats que ens donarà PHP i ZOPE, ens permet crear usuaris i definir directoris on restringirem aquests.

Necessitem:

  • Crear un fitxer de contrasenyes, amb la comanda 'htpasswd2'. També hi afegim el primer usuari (admin)
  • Crear més usuaris (petit_admin)
  • Especificar al fitxer de configuració d'apache que requerim autentificació a un cert directori: l'opció 'AuthConfig' (al següent exemple s'assumeix que s'ha utilitzat la configuració anteriorment comentada d'apache, en concret, les opcions del directori 'privat')
  • Un fitxer '.htaccess'. Quan apache troba aquest fitxer a un dels directoris abans especificats, demana al navegador (a l'usuari) que li doni un nom d'usuari i una paraula de pas

Això és tot, posem-ho en pràctica,

cangreju / # cd /var/www/localhost/htdocs/web/
cangreju web # htpasswd2 -c .fitxer.de.claus.per.a.web admin
	New password:
	Re-type new password:
	Adding password for user admin
cangreju web # htpasswd2 .fitxer.de.claus.per.a.web petit_admin
	New password:
	Re-type new password:
	Adding password for user petit_admin
cangreju web # nano privat/.htaccess
	AuthType Basic
	AuthName "Missatge que apareix al navegador"
	AuthUserFile /var/www/localhost/htdocs/web/.fitxer.de.claus.per.a.web	\\
		# quin és el fitxer de claus
	Require valid-user	# d'aquesta manera acceptarà qualsevol usuari \\
		existent al fitxer de claus
	#Require admin		# d'aquesta manera només acceptarà l'usuari \\
		'admin'

SSL

Instal·lació

Bé, com hem avisat abans, havien de fer servir la flag 'SSL' al instal·lar apache, per tant ja tenim suport SSL, però ens falta crear els certificats.

Comencem...

  • Preparem el fitxer d'openSSL per crear els ceriticats
  • Els creem
  • Els posem on toca
# nano /etc/ssl/
# nano -w openssl.cnf
	countryName_default
	stateOrProvinceName_default
	localityName_default
	0.organizationName_default
	commonName_default
	emailAddress_default.
(les editem al nostre gust/necessitats, si les variables no hi són, les afegim)

# openssl req -new > new.cert.csr
# openssl rsa -in privkey.pem -out new.cert.key
# openssl x509 -in new.cert.csr -out new.cert.cert -req -signkey \\
	new.cert.key -days 365

# cp /etc/ssl/misc/new.cert.cert /etc/apache/conf/ssl/
# cp /etc/ssl/misc/new.cert.key /etc/apache/conf/ssl/

Editem els fitxers de configuració necessaris

# nano /etc/conf.d/apache
	APACHE2_OPTS="-D SSL"

# nano /etc/apache2/conf/apache2.conf

	# A LA PART DE MÒDULS HI AFEGIM:
	LoadModule ssl_module          /usr/lib/apache2-extramodules/mod_ssl.so
	
	# A LA PART GLOBAL (AIXÍ SAP ON ANAR-LOS A BUSCAR):
	SSLCertificateFile /etc/apache/conf/ssl/server.crt
	SSLCertificateKeyFile /etc/apache/conf/ssl/server.key

	# A LA PART DE DIRECTORIS:
	<Directory "/var/www/localhost/htdocs/domini1/ssl">
	SSLRequireSSL
	AllowOverride AuthConfig
	</Directory>
	# D'AQUESTA MANERA LI DIEM A APACHE QUE EL DIRECTORI \\
		/var/www/localhost/htdocs/domini1/ssl REQUEREIX SSL I \\
		AUTENTIFICACIÓ

	# QUE ESTIGUI AL CAS QUE HA D'ESCOLTAR AL PORT SSL:
	NameVirtualHost *:443

	# D'AQUESTA MANERA TENIM EL NOU DOMINI DE 3r NIVELL APUNT PER SSL
	<VirtualHost *:443>
	ServerName ssl.domini1.com
	DocumentRoot /var/www/localhost/htdocs/domini1/ssl
	</VirtualHost>

Reinici d'Apache

# /etc/init.d/apache2 restart

PHP

Instal·lació

# emerge php

Fitxers de configuració

# nano /etc/conf.d/apache
	APACHE2_OPTS="-D SSL -D PHP"

# nano /etc/apache2/conf/apache2.conf

	# A LA PART DE MÒDULS:
	LoadModule php4_module    /usr/lib/apache2-extramodules/libphp4.so
	
	# A LA PART GLOBAL:
	AddType application/x-httpd-php .php .phtml
	AcceptPathInfo On

Reinici d'Apache

Segurament ja no cal explicar-ho, però...

# /etc/init.d/apache2 restart

Zope

Zope és una aplicació web que es fa servir per a construir llocs web dinàmics d'alt rendiment, aquesta aplicació córrer com a un altre servidor web al port 8080, però farem que "mani" apache, com veurem més endavat.

Plone és un sistema manejador de continguts per a Zope, basat en Zope CMF. Molt útil per treballar amb zope.

Plone depèn de Zope, per tant l'instal·lació es simplifica.

Instal·lació

# emerge plone

Fitxers de configuració

Com hem dit només configurarem Apache perquè governi Zope, a la part de virtual hosts hi afegim...(les noves línies estàn comentades)

# nano /etc/apache2/conf/apache2.conf
	<VirtualHost *:80>
		ServerName      softwarelliure.com
		# quin domini disposarà de Zope
		ServerAlias     www.softwarelliure.com
		ServerAdmin 	admin@softwarelliure.com
		# mail de l'admin
	
		DocumentRoot /var/www/localhost/htdocs
		ErrorLog /var/log/apache2/softwarelliure.error.log
		# un log apart pels errors
	
		CustomLog /var/log/apache2/www.softwarelliure.access.log combined
		# un log apart pels accessos
		ServerSignature On
	
		<Proxy *>
			Order allow,deny
			Allow from all
			Deny from 65.52.0.0/14
			# deneguem robot de MSN
		</Proxy>
	
		ProxyPass        /      http://www.softwarelliure.com:8080/softwarelliure/
		ProxyPassReverse /      http://www.softwarelliure.com:8080/softwarelliure/
		# la mare dels ous, les peticions que en principi van al port de Zope,
		# i a al domini en concret són redirigides a: /var/www/localhost/htdocs

Arrencada

# /etc/init.d/zope-2.x.x

2.x.x és la versió, actualment 2.7.3.

Per posar-la a l'inici del sistema...

# rc-update add zope-2.x.x default

I pensem a reiniciar Apache...

# /etc/init.d/apache2 restart

MySQL

Instal·lació

# emerge mysql

Arrencada

# /etc/init.d/mysql start

Configuració

Instal·lem la BDD

# /usr/bin/mysql_install_db

Creem la contrasenya per a root, per defecte no en té!

# mysqladmin -u root password nova.paraula.de.pas

Prova

Entrem a la shell de MySQL i fem la primera "consulta"

# mysql -u root -p
	Welcome to the MySQL monitor. Commands end with ; or \g.
	Your MySQL connection id is 2 to server version: 3.22.21
	Type 'help' for help.
	mysql>
	mysql> show databases;
		+----------+
		| Database |
		+----------+
		| mysql    |
		| test     |
		+----------+
		2 rows in set (0.00 sec)
	mysql> exit;
	Bye

Funciona! Això del software lliure sembla pràctic i tot! ;) Ja podem começar a entrar dades.

Estadístiques de la web

Ara que tenim els servidors a punt, voldrem saber el trànsit que generem, les pàgines més visitades, usuaris connectats,...

Una aplicació útil i senzilla és Analog, un clàssic analitzador de logs per apache

Instal·lació d'Analog

# emerge analog

Fitxers de configuració

Tan sols revisem que els directoris i idioma especificats al fitxer de configuració són els que volem, en el nostre cas:

# cat /etc/analog/analog.cfg
	LOGFILE /var/log/apache2/access_log
	OUTFILE /var/log/analog/index.html
	LANGUAGE CATALAN
	IMAGEDIR images/

Arrencada i scripts

La primera vegada el podem engegar de la següent manera:

# /usr/bin/analog

A partir d'ara seria interessant que, com a mínim, rellegís els logs un cop cada dia, doncs l'afegim al 'cron.daily'

# touch /etc/cron.daily/logsApache
# echo>/etc/cron.daily/logsApache "#! /bin/sh"
# echo>>/etc/cron.daily/logsApache "analog"
# chmod 700 /etc/cron.daily/logsApache

No ens deixem apache...

Hem d'afegir les següents línies a apache2.conf:

# nano /etc/apache2/conf/apache2.conf
	Alias /analog "/var/log/analog"
	<Directory "/var/log/analog">
		Options None
		AllowOverride AuthConfig
		Order allow,deny
		Allow from all
	</Directory>

Així, al accedir a la URL http://cangreju/analog/, veurem les estadístiques de la nostra web, això si, un cop autentificats.