Copyright © 2005 Solucions i Serveis amb Sistemes Open Source (www.s3os.net)
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 :)
Per no tenir problemes més endavant hem de compilar-lo amb suport SSL, per això afegim 'USE'.
#USE="ssl" emerge apache
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>
# /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
# /etc/init.d/apache2 restart
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/)...
Si no trobeu els d'SSL, és normal, tot arribarà... ;)
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:
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'
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...
# 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/
# 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>
# 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
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.
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
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
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.
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
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/
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
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.