[spanish]Instalar apache+php+mysql+mod_wsgi en Snow Leopard[/spanish][english]Installing apache+php+mysql+mod_wsgi on Snow Leopard[/english]

[spanish]Últimamente, por diferentes circunstancias, he tenido que probar cosas nuevas en Apache. Hasta ahora, siempre habí­a utilizado MAMP por su sencillez para ser instalado en Snow Leopard, pero una vez que necesitas nuevos módulos, versiones diferentes de los paquetes, etc… la cosa se complica bastante. Así­ que me decidí­ por utilizar MacPorts para configurar un entorno de desarrollo local a medida.

Instalación de XCode Developer Tools y MacPorts.

En el dvd de Snow Leopard disponemos de XCode Developer Tools. Lo instalamos, asegurándonos de instalar las utilidades de desarrollo desde la lí­nea de comandos (Unix Development).

A continuación, descargamos macports (en este momento, versión 1.9.2). Instalamos como cualquier otra aplicación en Snow Leopard y nos aseguramos de tener todo actualizado a la íºltima versión, abriendo un terminal y ejecutando
[codesyntax lang=”bash”]sudo port -v selfupdate[/codesyntax]

Instalación de MySQL

Comenzamos a utilizar macports, muy parecido a apt-get de debian, para instalar el servidor de MySQL (v5.1):
[codesyntax lang=”bash”]
sudo port install mysql5-server
sudo -u mysql mysql_install_db5
[/codesyntax]

Hay varias formas de poner en marcha el demonio de mysql. Como no me gusta tener más demonios de la cuenta en el arranque del sistema, lo voy a poner en marcha manualmente cada vez que quiera utilizarlo. Una de las formas de ponerlo en marcha (más adelante crearemos un alias para no tener que escribir toda la ruta):
[codesyntax lang=”bash”]
sudo /opt/local/etc/LaunchDaemons/org.macports.mysql5/mysql5.wrapper start
[/codesyntax]

Ahora, si vamos a trabajar en local, creamos la contraseña de root de mysql con
[codesyntax lang=”bash”]
/opt/local/lib/mysql5/bin/mysqladmin -u root password ‘password’
[/codesyntax]

(Para entornos de producción, además de cambiar el password, habrí­a que cambiar más cosas, como deshabilitar el acceso anónimo y el acceso remoto de root, con /opt/local/lib/mysql5/bin/mysql_secure_installation)

Instalación de Apache

Para instalar apache, volvemos a hacer uso de macports y, como he estado jugando con python/django, instalo también el módulo mod_wsgi (una de las cosas “complicadas” con MAMP):
[codesyntax lang=”bash”]
sudo port install apache2 mod_wsgi
[/codesyntax]

A continuación, editamos el archivo de configuración de apache /opt/local/apache2/conf/httpd.conf para añadir el módulo de wsgi y, ya que estamos, cambiar el nombre del servidor:
[codesyntax lang=”apache” title=”/opt/local/apache2/conf/httpd.conf”]
LoadModule wsgi_module modules/mod_wsgi.so
ServerName localhost
[/codesyntax]

Instalación de PHP

Ahora instalamos php5, con los módulos para apache2 y mysql5.
[codesyntax lang=”bash”]
sudo port install php5 +apache2 php5-mysql
[/codesyntax]
Activamos el módulo de php en apache con
[codesyntax lang=”bash”]
cd /opt/local/apache2/modules
sudo /opt/local/apache2/bin/apxs -a -e -n “php5″ libphp5.so
[/codesyntax]
y editamos de nuevo /opt/local/apache2/conf/httpd.conf para añadir en la sección de mime types a los ficheros .php:
[codesyntax lang=”apache” title=”/opt/local/apache2/conf/httpd.conf”]
AddType application/x-httpd-php .php
[/codesyntax]

Como archivo de configuración de php, tenemos dos archivos php.ini de ejemplo en /opt/local/etc/php5. Como estamos en desarrollo, utizamos el php.ini-development para tener nuestro php.ini
[codesyntax lang=”bash”]
sudo cp php.ini-development php.ini
[/codesyntax]
Por íºltimo, editamos /opt/local/etc/php5/php.ini y cambiamos date.timezone a nuestra zona y el socket de mysql:
[codesyntax lang=”ini” title=”/opt/local/etc/php5/php.ini”]
date.timezone=Europe/Madrid
mysql.default_socket = /opt/local/var/run/mysql5/mysqld.sock
[/codesyntax]

Arranque y parada de Apache y MySQL

Ya sólo nos queda crear un alias para llamar y ejecutar apache y mysql cuando queramos en nuestro .profile
[codesyntax lang=”bash”]
cd ~
nano .profile
[/codesyntax]
[codesyntax lang=”bash” title=”~/.profile”]
alias apache2=’sudo /opt/local/etc/LaunchDaemons/org.macports.apache2/apache2.wrapper’
alias mysql5=’sudo /opt/local/etc/LaunchDaemons/org.macports.mysql5/mysql5.wrapper’
alias mysql=’/opt/local/bin/mysql5′
[/codesyntax]

De esta forma, con “apache2 start|stop|restart” y “mysql5 start|stop|restart” tenemos bajo control los demonios respectivos, y creamos un alias al cliente de mysql, por si queremos utilizarlo sin realizar la llamada con la ruta absoluta.

Configuración de hosts en Apache

Por defecto, Apache lee los documentos de /opt/local/apache2/htdocs. Esto lo podemos cambiar para adecuarlo a nuestras necesidades. Por ejemplo, a mí­ me gusta tener todas las webs en desarrollo dentro del directorio Sites de mi usuario. Para ello, editamos /opt/local/apache2/conf/httdp.conf y cambiamos el DocumentRoot de “/opt/local/apache2/htdocs” a “/Users/my_user/Sites” y la directiva Directory “/opt/local/apache2/htdocs” de la misma forma:

[codesyntax lang=”apache” title=”/opt/local/apache2/conf/httpd.conf”]
DocumentRoot “/Users/my_user/Sites”

<Directory “/Users/my_user/Sites”>

[/codesyntax]

Además, normalmente tengo varias webs en desarrollo, así­ que vamos a utilizar hosts virtuales. Para ello, descomentamos la lí­nea del httpd.conf:
[codesyntax lang=”apache” title=”/opt/local/apache2/conf/httpd.conf”]
Include conf/extra/httpd-vhosts.conf
[/codesyntax]

y en httpd-vhosts.conf, siguiendo el ejemplo de los que hay creados (y que debemos comentar, si no queremos errores al arrancar apache), creamos todos los hosts virtuales que necesitemos:
[codesyntax lang=”apache” title=”/opt/local/apache2/conf/extras/httpd-vhosts.conf”]
<VirtualHost *:80>
DocumentRoot “/Users/my_user/Sites/web1”
ServerName dominio1.localhost
ErrorLog “logs/error_log”
CustomLog “logs/access_log” common
</VirtualHost>
<VirtualHost *:80>
DocumentRoot “/Users/my_user/Sites/web2”
ServerName dominio2.localhost
ErrorLog “logs/error_log”
CustomLog “logs/access_log” common
</VirtualHost>
[/codesyntax]

Recuerda añadir los dominios de estos hosts virtuales en /etc/hosts:
[codesyntax lang=”text” title=”/etc/hosts”]
127.0.0.1 localhost
127.0.0.1 dominio1.localhost
127.0.0.1 dominio2.localhost

[/codesyntax]

Instalación de phpmyadmin

Como es algo que solemos utilizar muchas veces, instalamos phpmyadmin mediante macports:

[codesyntax lang=”bash”]
sudo port install phpmyadmin
[/codesyntax]

Sólo nos queda configurar un host virtual para acceder a él:
[codesyntax lang=”apache” title=”/opt/local/apache5/conf/extra/httpd-vhosts.conf”]
<VirtualHost *:80>
DocumentRoot “/opt/local/www/phpmyadmin”
ServerName phpmyadmin.localhost
<Directory “/opt/local/www/phpmyadmin”>
Options Indexes FollowSymLinks
AllowOverride None
Order allow,deny
Allow from all
</Directory>
</VirtualHost>
[/codesyntax]
añadiendo de nuevo la referencia en nuestro archivo de hosts:
[codesyntax lang=”text” title=”/etc/hosts”]

127.0.0.1 phpmyadmin.localhost
[/codesyntax]

Con esto ya está todo. Tenemos un entorno de desarrollo a medida, podemos cambiar, añadir, quitar los módulos que queremos a nuestro antojo, y todo de manera sencilla gracias a macports.[/spanish]

[english]
Recently, because of different circumstances, I’ve had to test new things on Apache. Until now, I’ve always used MAMP, thank to its simple installation on Snow Leopard, but once you need new modules, different package versions, etc… things get complicated. So I decided to use MacPorts to set up a home development environment.

XCode Developer Tools and MacPorts.

We have the XCode Developer Tools in the Snow Leopard DVD. We need to install it, being sure we include the unix development tools.

After that, we’ll download macports (at this moment, v1.9.2). We’ll install it like any other app in Snow Leopard and we’ll be sure we have the last package version, opening a terminal and running
[codesyntax lang=”bash”]sudo port -v selfupdate[/codesyntax]

MySQL

Let’s start using macports (very similar to apt-get on debian), to install the mysql server (v5.1):
[codesyntax lang=”bash”]
sudo port install mysql5-server
sudo -u mysql mysql_install_db5
[/codesyntax]

There are several ways to run the mysql daemon, I’m going to use one of them. I don’t like to have too many daemons on the startup, so I’m going to start it manually each time I want to use it. The way I’m going to use is (and later on we’ll create an alias to avoid the full route..):
[codesyntax lang=”bash”]
sudo /opt/local/etc/LaunchDaemons/org.macports.mysql5/mysql5.wrapper start
[/codesyntax]

Next, as we are going to work locally, we’ll set the mysql root password:
[codesyntax lang=”bash”]
/opt/local/lib/mysql5/bin/mysqladmin -u root password ‘password’
[/codesyntax]

(In production environments, we should change more things: disable anonymous access or the root remote access, for instance, with /opt/local/lib/mysql5/bin/mysql_secure_installation)

Apache

In order to install apache, we’ll use again macports. Lately, I’ve been playing with python/django, so I’m also going to install the mod_wsgi module (this is one of the tough tasks with MAMP):
[codesyntax lang=”bash”]
sudo port install apache2 mod_wsgi
[/codesyntax]

After that, we’ll edit the apache config file (/opt/local/apache2/conf/httpd.conf), to add the mod_wsgi module and change the server name:
[codesyntax lang=”apache” title=”/opt/local/apache2/conf/httpd.conf”]
LoadModule wsgi_module modules/mod_wsgi.so
ServerName localhost
[/codesyntax]

PHP

Now, we’ll install php5, with the apache2 and mysql5 modules.
[codesyntax lang=”bash”]
sudo port install php5 +apache2 php5-mysql
[/codesyntax]
We’ll enable the php module on apache with
[codesyntax lang=”bash”]
cd /opt/local/apache2/modules
sudo /opt/local/apache2/bin/apxs -a -e -n “php5″ libphp5.so
[/codesyntax]
and we’ll edit again /opt/local/apache2/conf/httpd.conf to add .php files to the mime-types section:
[codesyntax lang=”apache” title=”/opt/local/apache2/conf/httpd.conf”]
AddType application/x-httpd-php .php
[/codesyntax]

Macports installs two sample php.ini in /opt/local/etc/php5. We are setting up a development environment, so we’ll use the php.ini-development:
[codesyntax lang=”bash”]
sudo cp php.ini-development php.ini
[/codesyntax]
Last thing: we’ll edit /opt/local/etc/php5/php.ini to change properly the date.timezone and the mysql socket:
[codesyntax lang=”ini” title=”/opt/local/etc/php5/php.ini”]
date.timezone=Europe/Madrid
mysql.default_socket = /opt/local/var/run/mysql5/mysqld.sock
[/codesyntax]

Starting and stopping Apache and MySQL

As I said before, we can create and alias to run apache and mysql, in our .profile:
[codesyntax lang=”bash”]
cd ~
nano .profile
[/codesyntax]
[codesyntax lang=”bash” title=”~/.profile”]
alias apache2=’sudo /opt/local/etc/LaunchDaemons/org.macports.apache2/apache2.wrapper’
alias mysql5=’sudo /opt/local/etc/LaunchDaemons/org.macports.mysql5/mysql5.wrapper’
alias mysql=’/opt/local/bin/mysql5′
[/codesyntax]

This way, with “apache2 start|stop|restart” y “mysql5 start|stop|restart”, we have under control both daemons, and we get an alias to call the msyql client without needing to write the full route.

Apache host config

By default, apache reads the files from /opt/local/apache2/htdocs. We can change this to fit our needs. For instance, I like to save all my webs in development inside my Sites directory. To get this, we’ll edit /opt/local/apache2/conf/httdp.conf and we’ll change the DocumentRoot from “/opt/local/apache2/htdocs” to “/Users/my_user/Sites”, and the Directory directive “/opt/local/apache2/htdocs” the same way:

[codesyntax lang=”apache” title=”/opt/local/apache2/conf/httpd.conf”]
DocumentRoot “/Users/my_user/Sites”

<Directory “/Users/my_user/Sites”>

[/codesyntax]

Furthermore, I usually have several webs in development, so I’m going to use virtual hosts. In order to do that, we’ll uncomment the next line:
[codesyntax lang=”apache” title=”/opt/local/apache2/conf/httpd.conf”]
Include conf/extra/httpd-vhosts.conf
[/codesyntax]

and, in httpd-vhosts.conf, following the samples (that we should comment to avoid errors), we’ll create as many virtual hosts as we need:
[codesyntax lang=”apache” title=”/opt/local/apache2/conf/extras/httpd-vhosts.conf”]
<VirtualHost *:80>
DocumentRoot “/Users/my_user/Sites/web1”
ServerName dominio1.localhost
ErrorLog “logs/error_log”
CustomLog “logs/access_log” common
</VirtualHost>
<VirtualHost *:80>
DocumentRoot “/Users/my_user/Sites/web2”
ServerName dominio2.localhost
ErrorLog “logs/error_log”
CustomLog “logs/access_log” common
</VirtualHost>
[/codesyntax]

Just remember to add these virtual domains to your /etc/hosts:
[codesyntax lang=”text” title=”/etc/hosts”]
127.0.0.1 localhost
127.0.0.1 dominio1.localhost
127.0.0.1 dominio2.localhost

[/codesyntax]

Phpmyadmin

Using macports, it’s trivial:
[codesyntax lang=”bash”]
sudo port install phpmyadmin
[/codesyntax]

We just need to configure a virtual host to access it:
[codesyntax lang=”apache” title=”/opt/local/apache5/conf/extra/httpd-vhosts.conf”]
<VirtualHost *:80>
DocumentRoot “/opt/local/www/phpmyadmin”
ServerName phpmyadmin.localhost
<Directory “/opt/local/www/phpmyadmin”>
Options Indexes FollowSymLinks
AllowOverride None
Order allow,deny
Allow from all
</Directory>
</VirtualHost>
[/codesyntax]
adding, again, the domain to our hosts file:
[codesyntax lang=”text” title=”/etc/hosts”]

127.0.0.1 phpmyadmin.localhost
[/codesyntax]

And that’s it. Now we have a custom development environment, where we can add, change, remove whatever modules we want, thank to macports.

PD: Sorry for my poor English. I have to practice and improve it ;)[/english]