Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
creado por Owen Garrett en 22-feb-2013 9:16, modificado por ltima vez por Owen Garrett en 22-feb-2013 9:16 Versin 1
When you need to scale out your MySQL database, replication is a good way to proceed. Database writes (UPDATEs) go to a 'master' server and are replicated across a set of 'slave' servers. Reads (SELECTs) are load-balanced across the slaves.
Overview
MySQL's replication documentation describes how to configure replication:
MySQL Replication
A quick solution...
If you can modify your MySQL client application to direct 'Write' (i.e. 'UPDATE') connections to one IP address/port and 'Read' (i.e. 'SELECT') connections to another, then this problem is trivial to solve. This generally needs a code update (Using Replication for Scale-Out). You will need to direct the 'Update' connections to the master database (or through a dedicated Stingray virtual server), and direct the 'Read' connections to a Stingray virtual server (in 'generic server first' mode) and load-balance the connections across the pool of MySQL slave servers using the 'least connections' loadbalancing method:
Routing connections from the application However, in most cases, you probably don't have that degree of control over how your client application issues MySQL connections; all connections are directed to a single IP:port. A load balancer will need to discriminate between different connection types and route them accordingly.
Connect and Authenticate in MySQL If the proxy is to route and load-balance based on the username in the connection, it needs to correctly authenticate the client connection first. When it finally connects to the chosen MySQL server, it will then have to re-authenticate the connection with the back-end server using a different salt.
The proxy is implemented using two TrafficScript rules ('mysql-request' and 'mysql-response') on a 'serverfirst' Virtual Server listening on port 3306 for MySQL client connections. Together, the rules implement a simple state machine that mediates between the client and server:
Implementing a MySQL proxy in TrafficScript The state machine authenticates and inspects the client connection before deciding which pool to direct the connection to. The rule needs to know the encrypted password and desired pool for each user. The virtual server should be configured to send traffic to the built-in 'discard' pool by default.
1. 2. 3. 4. 5. 6. 7. 8.
sub encpassword( $user ) { # From the mysql users table - double-SHA1 of the password # Do not include the leading '*' in the long 40-byte encoded password if( $user == "mysqlmaster" ) return "B17453F89631AE57EFC1B401AD1C7A59EFD547E5"; if( $user == "mysqlslave" ) return "14521EA7B4C66AE94E6CFF753453F89631AE57EF"; } sub pool( $user ) {
9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62.
if( $user == "mysqlmaster" ) return "SQL Master"; if( $user == "mysqlslave" ) return "SQL Slaves"; } $state = connection.data.get( "state" ); if( !$state ) { # First time in; we've just recieved a fresh connection $salt1 = randomBytes( 8 ); $salt2 = randomBytes( 12 ); connection.data.set( "salt", $salt1.$salt2 );
$server_hs = "\0\0\0\0" . # length - fill in below "\012" . # protocol version "Stingray Proxy v0.9\0" . # server version "\01\0\0\0" . # thread 1 $salt1."\0" . # salt(1) "\054\242" . # Capabilities "\010\02\0" . # Lang and status "\0\0\0\0\0\0\0\0\0\0\0\0\0" . # Unused $salt2."\0"; # salt(2) $l = string.length( $server_hs )-4; # Will be <= 255 $server_hs = string.replaceBytes( $server_hs, string.intToBytes( $l, 1 ), 0 ); connection.data.set( "state", "wait for clienths" ); request.sendResponse( $server_hs ); break; } if( $state == "wait for clienths" ) { # We've recieved the client handshake. $chs = request.get( 1 ); $chs_len = string.bytesToInt( $chs ); $chs = request.get( $chs_len + 4 ); # user starts at byte 36; password follows after $i = string.find( $chs, "\0", 36 ); $user = string.subString( $chs, 36, $i-1 ); $encpasswd = string.subString( $chs, $i+2, $i+21 ); $passwd2 = string.hexDecode( encpassword( $user ) ); $salt = connection.data.get( "salt" ); $passwd1 = string_xor( $encpasswd, string.hashSHA1( $salt.$passwd2 ) ); if( string.hashSHA1( $passwd1 ) != $passwd2 ) { log.warn( "User '" . $user . "': authentication failure" ); connection.data.set( "state", "authentication failed" ); connection.discard(); }
63. connection.data.set( "user", $user ); 64. connection.data.set( "passwd1", $passwd1 ); 65. connection.data.set( "clienths", $chs ); 66. 67. connection.data.set( "state", "wait for serverhs" ); 68. request.set( "" ); 69. 70. # Select pool based on user 71. pool.select( pool( $user ) ); 72. 73. break; 74. } 75. 76. if( $state == "wait for client data" ) { 77. # Write the client handshake we remembered from earlier to the server, 78. # and piggyback the request we've just recieved on the end 79. $req = request.get(); 80. 81. 82. $chs = connection.data.get( "clienths" ); 83. $passwd1 = connection.data.get( "passwd1" ); 84. $salt = connection.data.get( "salt" ); 85. 86. $encpasswd = string_xor( $passwd1, 87. string.hashSHA1( $salt . string.hashSHA1( $passwd1 ) ) ); 88. 89. $i = string.find( $chs, "\0", 36 ); 90. $chs = string.replaceBytes( $chs, $encpasswd, $i+2 ); 91. 92. connection.data.set( "state", "do authentication" ); 93. request.set( $chs.$req ); 94. 95. break; 96. } 97. 98. # Helper function 99. 100. sub string_xor( $a, $b ) { 101. $r = ""; 102. while( string.length( $a ) ) { 103. $a1 = string.left( $a, 1 ); $a = string.skip( $a, 1 ); 104. $b1 = string.left( $b, 1 ); $b = string.skip( $b, 1 ); 105. 106. $r = $r . chr( ord( $a1 ) ^ ord ( $b1 ) ); 107. } 108. return $r; 109. }
1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42.
$state = connection.data.get( "state" ); $authok = "\07\0\0\2\0\0\0\02\0\0\0"; if( $state == "wait for serverhs" ) { # Read server handshake, remember the salt $shs = response.get( 1 ); $shs_len = string.bytesToInt( $shs )+4; $shs = response.get( $shs_len ); $salt1 = string.substring( $shs, $shs_len-40, $shs_len-33 ); $salt2 = string.substring( $shs, $shs_len-13, $shs_len-2 ); connection.data.set( "salt", $salt1.$salt2 ); # Write an authentication confirmation now to provoke the client # to send us more data (the first query). This will prepare the # state machine to write the authentication to the server connection.data.set( "state", "wait for client data" ); response.set( $authok ); break; } if( $state == "do authentication" ) { # We're expecting two responses. # The first is the authentication confirmation which we discard. $res = response.get(); $res1 = string.left( $res, 11 ); $res2 = string.skip( $res, 11 ); if( $res1 != $authok ) { $user = connection.data.get( "user" ); log.info( "Unexpected authentication failure for " . $user ); connection.discard(); } connection.data.set( "state", "complete" ); response.set( $res2 ); break; }
Check the 'current connections' list in the Stingray UI to see how Stingray has connected each session to a back-end database server. If you encounter problems, try the following steps: Ensure that trafficscript!variable_pool_use is set to 'Yes' in the Global Settings page on the UI. This setting allows you to use non-literal values in pool.use() and pool.select() TrafficScript functions. Turn on the log!client_connection_failures and log!server_connection_failures settings in the Virtual Server > Connection Management configuration page; these settings will configure the traffic manager to write detailed debug messages to the Event Log whenever a connection fails. Then review your Traffic Manager Event Log and your mysql logs in the event of an error. Stingray's access logging can be used to record every connection. You can use the special *{name}d log macro to record information stored using connection.data.set(), such as the username used in each connection.
Conclusion
This article has demonstrated how to build a fairly sophisticated protocol parser where the Stingray-based proxy performs full authentication and inspection before making a load-balancing decision. The protocol parser then performs the authentication again against the chosen back-end server. Once the client-side and server-side handshakes are complete, Stingray will simply forward data back and fro between the client and the server. This example addresses the problem of scaling out your MySQL database, giving load-balancing and redundancy for database reads ('SELECTs'). It does not address the problem of scaling out your master 'write' server - you need to address that by investing in a sufficiently powerful server, architecting your database and application to minimise the number and impact of write operations, or by selecting a full clustering solution.
The solution leaves a single point of failure, in the form of the master database. This problem could be effectively dealt with by creating a monitor that tests the master database for correct operation. If it detects a failure, the monitor could promote one of the slave databases to master status and reconfigure the 'SQLMaster' pool to direct write (UPDATE) traffic to the new MySQL master server.
Acknowledgements
Ian Redfern's MySQL protocol description was invaluable in developing the proxy code. Appendix - Password Problems? This example assumes that you are using MySQL 4.1.x or later (it was tested with MySQL 5 clients and servers), and that your database has passwords in the 'long' 41-byte MySQL 4.1 (and later) format (see http://dev.mysql.com/doc/refman/5.0/en/password-hashing.html) If you upgrade a pre-4.1 MySQL database to 4.1 or later, your passwords will remain in the pre-4.1 'short' format. You can verify what password format your MySQL database is using as follows:
mysql> select password from mysql.user where user='username'; +------------------+ | password | +------------------+ | 6a4ba5f42d7d4f51 | +------------------+ 1 rows in set (0.00 sec) mysql> update mysql.user set password=PASSWORD('password') where user='username'; Query OK, 1 rows affected (0.00 sec) Rows matched: 1 Changed: 1 Warnings: 0 mysql> select password from mysql.user where user='username'; +-------------------------------------------+ | password | +-------------------------------------------+ | *14521EA7B4C66AE94E6CFF753453F89631AE57EF | +-------------------------------------------+ 1 rows in set (0.00 sec) If you can't create 'long' passwords, your database may be stuck in 'short' password mode. Run the following command to resize the password table if necessary: $ mysql_fix_privilege_tables --password=admin password Check that 'old_passwords' is not set to '1' (see here) in your my.cnf configuration file. Check that the mysqld process isn't running with the --old-passwords option. Finally, ensure that the privileges you have configured apply to connections from the Stingray proxy. You may need to GRANT... TO 'user'@'%' for example. - See more at: http://splash.riverbed.com/docs/DOC1512#sthash.eV78uvsH.dpufhttp://splash.riverbed.com/docs/DOC-1512
Pgina 1 de 7
05/11/2011
Pgina 2 de 7
El proceso de transferencia de datos desde el servidor hacia el cliente deber esperar a que el servidor inicie la conexin al puerto de datos especificado ( en modo activo ) y luego de ello transferir los datos en funcin a los parmetros de conexin especificados anteriormente.
Modo Activo#
El modo activo generalmente es conocido tambin como modo estndar y este opera de la siguiente forma. Se establecen dos conexiones distintas, la primera conexin establece una comunicacin para la transmisin de comandos a travs de un puerto aleatorio mayor que el 1024 del cliente FTP hacia el puerto 21 del servidor FTP y por esa misma conexin se le notifica al servidor FTP cual es el puerto de nuestro cliente FTP que esta a la espera de los datos. Entonces y para comprender mejor, si usted descarga algn archivo mediante la ayuda de algn cliente de FTP, es el servidor FTP el que inicia la transmisin de datos, desde su puerto 20 al puerto que aleatoriamente el cliente FTP le ha indicado. Se le llama modo activo porque la transmisin de datos es iniciada por el propio servidor FTP.
Modo Pasivo#
Esto se logra cuando el cliente FTP inicia la conexin con el servidor FTP mediante el envi del comando PASV en este punto el cliente FTP establece una comunicacin mediante un canal de control el cual generalmente utiliza un puerto aleatorio mayor al 1024 para comunicarse con el servidor FTP a travs de su puerto 21. Al pasar a modo pasivo el cliente FTP pedir al servidor FTP que habr un puerto, el cual deber ser aleatorio y mayor al 1024, recibida la contestacin, ser el cliente FTP el que establezca la conexin de datos al servidor FTP a travs del puerto especificado anteriormente.
Acceso Annimo#
El acceso annimo a un servidor FTP se caracteriza porque este no pide ningn tipo de autenticacion al cliente FTP ( login y password ) para entrar en el. Generalmente este tipo de accesos son implementados para que cualquier usuario tenga acceso a los recursos que ah se comparten, los cuales normalmente solo pueden ser ledos o copiados , restringiendo a los usuarios la funcin de crear o modificar dichos recursos.
Acceso de Usuario#
Este tipo de acceso se caracteriza porque este si requiere autenticacion del cliente FTP ( login y password ) ante el servidor FTP. Generalmente estos accesos son implementados para un grupo selecto de usuarios, los cuales tendrn ciertos privilegios sobre los
05/11/2011
Pgina 3 de 7
recursos del servidor como podra ser modificar, eliminar, crear , subir o descargar archivos o carpetas. Otra caracterstica de este acceso es que permite al usuario FTP acceder a cualquier parte del sistema operativo, lo cual es un grave fallo de seguridad.
Acceso de Invitado#
El acceso de invitado bien podra ser un hbrido entre el acceso annimo y el acceso de usuario, ya que en este tipo de acceso de requiere autenticacion del cliente FTP ( login y password ) ante el servidor FTP, lo que lo diferencia de los ltimos dos es que el usuario FTP solo podr trabajar en un directorio de trabajo destinado exclusivamente para el, evitando as que el usuario FTP tenga acceso a otras partes del sistema operativo, pero sin restringir los privilegios que tiene sobre su propio directorio de trabajo. Proceso de instalacin del servidor FTP
Instalando VSFTPD#
La instalacin de VSFTPD es relativamente sencilla , solo debe teclear en terminal el siguiente comando. [root@ localhost ~]# yum install -y vsftpd Recuerde que este comando se debe ejecutar como root
El siguiente paso sera editar y configurar los ficheros que previamente creamos.
Configuracin del fichero vsftpd.conf#
Para llevar a cabo la configuracin de este fichero le recomendamos usar el editor de textos VIM. A continuacin le presentamos las diferentes opciones que pueden ser habilitadas o negadas en el fichero de configuracin vsftpd.conf
Habilitando o negando accesos annimos al servidor FTP Al haber abierto el fichero trate de buscar la linea siguiente: Para habilitar el acceso annimo al servidor FTP solo deber teclear la palabra YES , caso contrario si usted desea tener deshabilitada esta opcin solo deber teclear la palabra NO.
anonymous_enable=YES|NO
05/11/2011
Pgina 4 de 7
Para habilitar o negar los accesos autenticados de los usuarios locales en el servidor FTP deber buscar la siguiente linea:
local_enable=YES|NO Deber teclear la palabra YES para habilitar la autenticacion , caso contrario si usted desea tener deshabilitada esta opcin solo deber teclear la palabra NO.
Habilitar o negar la escritura en el servidor FTP Para habilitar o negar la escritura en el servidor FTP deber buscar la siguiente linea
write_enable=YES|NO Una vez ubicada esta linea recuerde borrar ( si es que esta ) el signo de numero (#) para habilitar esta funcin. Establezca el valor YES o NO de acuerdo a lo que se requiera.
Estableciendo un mensaje de bienvenida en el servidor FTP Este parmetro sirve para establecer un mensaje de bienvenida el cual ser mostrado cada vez que un usuario acceda al servidor de archivos. Una vez ubicada esta linea recuerde borrar ( si es que esta ) el signo de numero (#) para habilitar esta funcin. Para agregar este mensaje al servidor FTP deber buscar la siguiente linea y editarla.
ftpd_banner=Bienvenido al Servidor FTP de Linux Para Todos
Habilitar el acceso de invitado para ciertos usuarios de FTP Para limitar a los usuarios a trabajar en su propia carpeta de trabajo se debern editar las siguientes lineas del fichero vsftpd.conf
chroot_list_enable=YES |NO Una vez ubicada esta linea recuerde borrar ( si es que esta ) el signo de numero (#) para habilitar esta funcin. Habilitar este parmetro indicara al servidor FTP que el usuario solo podr trabajar dentro de su carpeta de trabajo, para ello solo habr que teclear la palabra YES, en caso contrario use la palabra NO El siguiente parmetro se encuentra en funcin del anterior, de forma que si usted lo habilito tambin tendr que habilitar este ultimo, para ello solo deber borrar el caracter de numero (#) chroot_list_file=/etc/vsftpd/chroot_list El parmetro /etc/vsftpd/chroot_list indica la ruta en la cual se encuentra el fichero con los nombres de los usuarios que sern limitados a trabajar en su propia carpeta de trabajo Recuerde que usted creo previamente este fichero
Habilitar al usuario annimo la funcin de subir contenido al servidor FTP Para habilitar o negar al usuario annimo el subir datos al servidor FTP deber buscar la siguiente linea:
anon_upload_enable=YES|NO Una vez ubicada esta linea recuerde borrar ( si es que esta ) el signo de numero (#) para habilitar esta funcin. Establezca el valor YES o NO de acuerdo a lo que se requiera.
Habilitar al usuario annimo la funcin de crear carpetas en servidor FTP Para habilitar o negar al usuario crear carpetas en servidor FTP deber buscar la siguiente linea:
05/11/2011
Pgina 5 de 7
anon_mkdir_write_enable=YES|NO Una vez ubicada esta linea recuerde borrar ( si es que esta ) el signo de numero (#) para habilitar esta funcin. Establezca el valor YES o NO de acuerdo a lo que se requiera.
Estableciendo permisos de escritura, lectura y ejecucin al contenido albergado en el servidor FTP La siguiente linea Indica que los archivos subidos al servidor quedarn con los permisos 022, es decir, slo escritura para el grupo y los dems.
local_umask=022 Si tu deseas agregar otro tipo de permisos sobre el contenido que sera albergado en tu servidor FTP solo debers modificar el valor 022 por el que tu creas mas conveniente. Nosotros recomendamos usar el permiso 664 local_umask=664 es decir, lectura y escritura para el propietario del fichero, y slo lectura para el grupo y los dems
Limitando la tasa de transferencia a los usuarios annimos Usted puede limitar la tasa de transferencia ( en bytes ) para los usuarios annimos, solamente deber agregar la siguiente linea al final del archivo
anon_max_rate=10240 Como podemos observar hemos limitado la tasa de transferencia a solo 10 Kb para los usuarios annimos, usted podr definir ese parmetro de acuerdo a sus necesidades.
Limitando la tasa de transferencia a los usuarios autenticados Usted puede limitar la tasa de transferencia ( en bytes ) para los usuarios annimos, solamente deber agregar la siguiente linea al final del archivo
local_max_rate=10240 Como podemos observar hemos limitado la tasa de transferencia a solo 10 Kb para los usuarios autenticados, usted podr definir ese parmetro de acuerdo a sus necesidades.
Limitando el numero de conexiones hacia el servidor FTP Usted podr establecer un numero mximo de conexiones que podrn acceder simultneamente al servidor FTP, para ello solo habr que aadir la siguiente linea al final de archivo.
max_clients=3 Como podemos observar hemos limitado el acceso a solamente 3 clientes FTP
Limitando el numero de conexiones por IP hacia el servidor FTP Usted podr establecer un numero mximo de conexiones desde una misma direccin IP que podrn acceder simultneamente al servidor FTP, para ello solo habr que aadir la siguiente linea al final de archivo.
max_per_ip=3 Como podemos observar hemos limitado el acceso a simultaneo a solamente 3 IPs .
05/11/2011
Pgina 6 de 7
Igualmente existen opciones ya sea para reiniciar, detener, recargar o conocer el status en el que se encuentra el servidor FTP. Estas opciones pueden ser consultadas en la siguiente tabla:
start stop restart Inicia el servicio Detiene el servicio Reinicia el servicio.-La diferencia con reload radica en que al ejecutar un restart este mata todos los procesos relacionado con el servicio y los vuelve a generar de nueva cuenta Recarga el servicio.-La diferencia con restart radica en que al ejecutar un reload este solamente carga las actualizaciones hechas al fichero de configuracin del servicio sin necesidad de matar los procesos relacionados con el mismo, por lo que podra entenderse que hace el cambio en caliente.
reload
condrestartReinicio Condicional.- Solamente se inicia si el servicio se encuentra ejecutndose. status Da a conocer el estado en el que se encuentra el servicio Como alternativa tambin podemos ocupar el siguiente comando para iniciar el servidor FTP [root@ localhost ~]# service vsftpd start
Y de igual manera podemos usar las opciones antes descritas en la tabla anterior. Recuerde que estos comandos se ejecutan como root.
-d |
Carpeta de trabajo que sera asignado al usuario Ejemplos: a) -d /home/usuario1 --home b) -d /home/cmartinez c) -d /home/icastillo -s /sbin/nologin El usuario no podr logearse en el sistema. Ideal para usuarios con acceso a Samba o FTP pero sin --shell acceso al interprete de comandos.
-s |
05/11/2011
Pgina 7 de 7
Vuelva a escribir la nueva UNIX contrasea:xxxxxxxxxx passwd: todos los tokens de autenticacin se actualizaron exitosamente.
Ejemplo:
[root@ localhost ~]# useradd -d /home/ftp/javier -s /sbin/nologin \ > javier Explicacin: Como podemos observar, estamos creando una cuenta en el servidor ftp, para ello estamos usando el comando useradd El parmetro siguiente es -d /home/ftp/javier Este parmetro le indica a Linux que la carpeta de trabajo de javier esta ubicada en la ruta /home/ftp/javier, el ultimo parmetro -s /sbin/nologin Le indica a Linux que el usuario no podr logearse en el sistema lo cual es ideal para usuarios con acceso a FTP pero sin acceso al interprete de comandos. 0 archivos adjuntos 28581 Accesos
Promedio (2 Votos)
Comentarios
05/11/2011
Pgina 1 de 11
Sobre LAMP#
Un servidor LAMP es un conjunto de aplicaciones instaladas en un servidor Linux los cuales, al trabajar en conjunto logran dar vida a una aplicacin mucho mas grande y robusta
De ah el nombre de servidor LAMP Algunas aplicaciones que hacen uso de un servidor LAMP son las siguientes:
Zimbra.-Servidor de Correo Electrnico Openfire.-Servidor de Mensajera Instantnea CMS.- Gestores de Contenidos (Joomla,Drupal,Wordpress)
Abra una consola y teclee lo siguiente para llevar a cabo la instalacin de los paquetes del servidor LAMP
[root@ localhost ~]# yum install -y httpd mysql mysql-server php-mysql php-cli php-common Recuerde que este comando se debe ejecutar como root Por ultimo solo deber iniciar (o en su caso reiniciar) servicios como el servidor web apache asi como tambin el manejador de bases de datos MySQL [root@ localhost ~]# /etc/init.d/httpd start [root@ localhost ~]# /etc/init.d/mysql start
05/11/2011
Pgina 2 de 11
Descargando Joomla#
Descargue Joomla del siguiente portal web: [http://www.joomlaspanish.org/]
Como puede observarse usted puede descargar Joomla de tres formas distintas, la nica diferencia radica en la forma en la que esta empaquetado el paquete. Le recomendamos descargar Joomla a la carpeta de root
------> /root/Joomla_1.5.9-Spanish-pack_completo.tar.gz
NOTA: No extraiga o desempaquete el gestor de contenidos, solo descarguelo en la ruta antes mencionada , posteriormente se le indicara donde debe ser extrado el contenido de este paquete
La creacin de dominios virtuales sobre un servidor web como apache tiene una vital importancia cuando se trata de dar hospedaje a varios sitios web dentro del mismo servidor. Lograr implementar de manera correcta los dominios virtuales sobre el servidor web apache es tarea sencilla por lo que le recomendamos primero haber ledo todas las directivas que pueden ser aplicadas al fichero
httpd.conf
A partir de este punto comenzaremos a crear los dominios virtuales, es por ello que pedimos tu total concentracin y paciencia para que leas poco a poco estos puntos.
La funcin de esta directiva sirve para indicar la direccin IP en la que se esta brindando el servicio o bien insertando un asterisco (*) para que est activa en cualquier interfaz del servidor que es como nosotros lo debemos tener.
05/11/2011
Pgina 3 de 11
por cada dominio se deber crear un directorio, dicho directorio sera nombrado de la misma forma que el dominio, solo omitiendo el www. [root@ [root@ [root@ [root@ [root@ localhost localhost localhost localhost localhost ~]# ~]# ~]# ~]# ~]# mkdir mkdir mkdir mkdir mkdir turbolinux.com.mx comerciolinux.com escuelalinux.edu linuxunido.org linuxbloger.net
Estos directorios debern ser creados dentro de la ruta /var/www/ Al final estos directorios debern quedar de la siguiente manera /var/www/turbolinux.com.mx /var/www/comerciolinux.com /var/www/escuelalinux.edu /var/www/linuxunido.org /var/www/linuxbloger.net Si no estn en la ruta antes descrita solo debe moverlos con el comando mv. Lo siguiente sera crear dentro de cada uno de estos directorios la estructura bsica que debe llevar cada uno de estos dominios. Esta estructura estar conformada por cuatro directorios: html cgi-bin icons error
por lo que deber crear estos cuatro directorios para cada uno de los directorios de dominio. Ejemplo para el dominio turbolinux.com.mx
# # # # mkdir mkdir mkdir mkdir /var/www/turbolinux.com.mx/html /var/www/turbolinux.com.mx/cgi-bin /var/www/turbolinux.com.mx/icons /var/www/turbolinux.com.mx/error
Paso 3.- Creacin y modificacin de los ficheros de configuracin de los dominios virtuales #
Una vez creadas las carpetas de dominios asi como tambin la estructura de cada uno pasaremos al ultimo paso, crear los ficheros de configuracin correspondientes a cada dominio.
Nuevamente por cada dominio se deber crear un fichero de configuracin, dicho fichero sera nombrado de la misma forma que el dominio, solo omitiendo el www.
[root@ [root@ [root@ [root@ [root@ localhost localhost localhost localhost localhost ~]# ~]# ~]# ~]# ~]# mkdir mkdir mkdir mkdir mkdir turbolinux.com.mx.conf comerciolinux.com.conf escuelalinux.edu.conf linuxunido.org.conf linuxbloger.net.conf
05/11/2011
Pgina 4 de 11
VirtualHost
La funcin de esta directiva sirve para indicar la direccin IP en la que se esta brindando o bien insertando un asterisco(*) para que est activa en cualquier interfaz del servidor que es como nosotros lo debemos tener. ServerAdmin Esta directiva especifica la persona a la que se le debe notificar los problemas referentes al portal web , esto a travs de su cuenta de correo. DocumentRootEsta directiva indica al servidor web la ruta en donde se encuentran almacenados los ficheros web de tu sitio principal. Esta directiva especifica el nombre y puerto que el servidor utiliza para identificarse. Con una correcta configuracin, este valor se puede determinar ServerName automticamente, pero es recomendable especificarlo explciatamente para evitar problemas durante el arranque. ServerAlias Esta directiva sirve para que el mismo sitio web sea accesible desde distintos nombres de dominio. Ejemplo: turbolinux.com.mx ---> www.turbolinux.com.mx
Lo siguiente sera extraer el contenido del paquete Joomla_1.5.9-Spanish-pack_completo.tar.gz dentro del directorio html de cada uno de los dominios virtuales
[root@ localhost ~]# tar -xzvf Joomla_1.5.9-Spanish-pack_completo.tar.gz
Al terminar deber borrar el paquete Joomla_1.5.9-Spanish-pack_completo.tar.gz de cada uno de los directorios html de cada dominio El siguiente paso sera configurar el servidor de base de datos MySQL para que funcione en sincrona con Joomla
Configurando MySQL#
Acerca de MySQL#
MySQL es un sistema de gestin de base de datos relacional, multihilo y multiusuario con ms de seis millones de instalaciones. Por un lado se ofrece bajo la GNU GPL para cualquier uso compatible con esta licencia, pero las empresas que quieran incorporarlo en productos privativos pueden comprar a la empresa una licencia especfica que les permita este uso. Est desarrollado en su mayor parte en ANSI C.
Al contrario que proyectos como Apache, donde el software es desarrollado por una comunidad pblica y el copyright del cdigo est en poder del autor individual, MySQL es propiedad y est patrocinado por una empresa privada, que posee el copyright de la mayor parte del cdigo. Esto es lo que posibilita el esquema de licenciamiento anteriormente mencionado. Adems de la venta de licencias privativas, la compaa ofrece soporte y servicios. Para sus operaciones contratan trabajadores alrededor del mundo que colaboran va Internet. MySQL AB fue fundado por David Axmark, Allan Larsson, y Michael Widenius y desde enero de 2008 es una subsidiaria de Sun Microsystems
Para asignar un password al usuario root solo bastara con teclear la siguiente sentencia SQL
05/11/2011
Pgina 5 de 11
Obviamente deber cambiar la palabra PASSWORD por la contrasea que desea asignar a root. Si todo marcho, salga del manejador de datos MySQL y trate de logearse nuevamente a MySQL pero ahora proporcionando la contrasea que acaba de asignar mediante el uso del parmetro -p
[root@localhost]# mysql -u root -p Enter password: xxxxxxxx Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 2 Server version: 5.0.67 Source distribution Type 'help;' or '\h' for help. Type '\c' to clear the buffer. mysql>
Una vez ledo lo anterior comenzaremos por crear la base de datos que usara el gestor de contenidos Joomla asi como tambin el alta de la cuenta de administrador de Joomla y la asignacin de un password para el mismo, para ello abriremos una terminal y nos pasaremos al modo consola de MySQL como se muestra a continuacin:
[root@localhost]# mysql -u root -p Enter password: **************** Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 4 Server version: 5.0.45 Source distribution Type 'help;' or '\h' for help. Type '\c' to clear the buffer. mysql>
Una vez dentro creamos la base de datos que usara Joomla. Para generar la base de datos solo basta teclear lo siguiente:
Mysql> CREATE DATABASE joomla; Query OK, 1 row affected (0.00 sec) mysql>
El siguiente paso es asignarle al administrador de joomla una cuenta dentro de MySQL y luego de ello asignarle a este usuario permisos de lectura, escritura y ejecucin sobre la base de datos que antes creamos, esto se consigue de la siguiente manera.
mysql> GRANT ALL ON joomla.* TO 'adminjoomla'@'localhost' IDENTIFIED BY 'PASSWORD' WITH GRANT OPTION; Query OK, 0 rows affected (0.00 sec) mysql> FLUSH PRIVILEGES; Query OK, 0 rows affected (0.00 sec) mysql>
Obviamente deber cambiar la palabra PASSWORD por la contrasea que desea asignar al usuario adminjoomla. Al terminar teclee la palabra exit para salir de MySQL.
mysql>exit Bye Por ultimo,solo tendr que reiniciar el servidor de bases de datos MySQL asi como tambin el de apache [root@ localhost ~]# /etc/init.d/httpd restart [root@ localhost ~]# /etc/init.d/mysql restart
05/11/2011
Pgina 6 de 11
Solo para recordar lo antes visto te posteo una tabla de bastante utilidad
Nombre de la cuenta del adminsitrador de Joomla adminjoomla Contrasea asignada a adminjoomla Recuerde que esta contrasea la asigna usted Nombre de la base de datos asignada a Joomla joomla
NOTA: Si usted olvido la contrasea que asigno para el administrador de Joomla no se preocupe, el fichero
.mysql_history
Guarda el histrico de las acciones que se llevaron a cabo en el servidor de base de datos de MySQL por lo que podr consultarlo para obtener la contrasea si es que la olvido. Generalmente este fichero se encuentra depositado en el directorio de trabajo de root
Instalacin de Joomla #
Al llegar a este punto usted deber contar con su servidor web configurado para dominios virtuales y dentro de cada dominio virtual tener depositado el contenido del paquete de Joomla, asi mismo tambin debe contar con la base de datos de Joomla activas.
Una vez confirmada esta informacin podemos continuar con la ultima parte de este capitulo, nos referimos a la instalacin del gestor de contenidos Joomla
Sobre Joomla#
Joomla es un sistema de administracin de contenidos de cdigo abierto construido con PHP bajo una licencia GPL. Este administrador de contenidos se usa para publicar portales web en Internet mediante la implementacion de un servidor LAMP. En Joomla se incluyen caractersticas como:
Indexamiento web Feed RSS Versiones imprimibles de pginas Flash con noticias Blogs Foros Encuestas Calendario Bsqueda en el sitio web
Instalando Joomla#
El proceso para llevar a cabo la instalacin de Joomla sera el siguiente:
Abra un navegador web, de preferencia que sea Morilla Firmale y en la barra de direcciones teclee el nombre de alguno de los sitios web virtuales que configuramos en el servidor de apache, nosotros elegimos acceder al portal web
www.turbolinux.com.mx
Usted puede acceder a cualquiera de los otros cuatro que se crearon. Una vez dentro del portal web podremos visualizar el Instalador de Joomla el cual consta de 7 pasos para su instalacin Estos pasos son:
Paso 1) Seleccionando el idioma para la instalacin #
Este paso es relativamente sencillo, solo debemos elegir el idioma en el cual queremos que se instale Joomla, es este caso nuestra eleccin sera es-ES-Spanish (Espaol Internacional) y dar clic Siguiente.
El paso 2 se encarga de verificar que las bases da datos creadas para Joomla asi como algunas caractersticas mas estn activas y en perfecto funcionamiento, aqu solo deberemos dar clic en siguiente.
05/11/2011
Pgina 7 de 11
Aqu solo habr que aceptar la licencia bajo la cual se distribuye Joomla y dar nuevamente clic en siguiente.
05/11/2011
Pgina 8 de 11
Daremos clic en siguiente y si todo marcha bien nos direccionara a otra pagina.
Paso 5) Configurando el FTP#
Este paso es irrelevante para este capitulo por lo que daremos clic nuevamente en siguiente:
Este paso es el mas importante de todos, aqu usted tedra que llenar algunos campos relevantes para la configuracin de Joomla. La primera seccin consta de lo siguiente: Nombre del Sitio Web: En este campo usted tendr que teclear el nombre del portal web, en este caso nosotros pondremos www.turbolinux.com.mx
Confirmacin del correo electrnico y contrasea del usuario admin: Aqu usted tendr que llenar los campos referentes al correo electrnico de la persona que sera el administrador de este portal web asi como tambin la asignacin de una contrasea para el mismo. Con esta contrasea y el usuario admin podr ingresar al rea de administracin una vez finalizada la instalacin.
Subir datos de ejemplo, restaurar o migrar contenido de respaldo: Se recomienda a los principiantes que instalen el contenido de ejemplo en espaol o en su idioma. Para esto es necesario seleccionar esa opcin y hacer clic sobre el botn Instalar los datos de ejemplo predefinidos y luego de ello hacer clic en siguiente.
05/11/2011
Pgina 9 de 11
Para finalizar la instalacin debe eliminar completamente el directorio de instalacin de Joomla ya que por motivos de seguridad no podr avanzar ms all de esa pantalla hasta que el directorio "installation" sea removido completamente. Esta es una caracterstica de seguridad de Joomla. La ruta del directorio installation la podemos ubicar en:
/var/www/turbolinux.com.mx/html/ -----> installation
el mismo procedimiento tendr que ser ejecutado para los dems dominios en los que instalemos Joomla. Una vez borrado el directorio podremos dar clic en el botn Portada, el cual nos direccionara a la pagina principal de turbolinux.com.mx
En ella tendremos que teclear el nombre de usuario del administrador de Joomla asi como la contrasea que asignamos en el paso 6
Nombre de Usuario---> admin (Este login esta predefinido por Joomla) Contrasea ---> Esta contrasea fue creada por usted Al haber pasado la autenticacion nos direccionara a la siguiente pantalla
05/11/2011
Pgina 10 de 11
En esta consola podr modificar los atributos visuales y de administracin de su portal web.
Accediendo a nuestro portal web#
Para acceder a la pagina principal de nuestro portal web solo habr que teclear en la barra de direcciones de cualquier navegador web (preferenteme firefox) el nombre de nuestro portal web, en este caso www.turbolinux.com.mx el cual deber lucir asi:
05/11/2011
Pgina 11 de 11
0 archivos adjuntos
8599 Accesos
Promedio (0 Votos)
Comentarios
05/11/2011
Pgina 1 de 17
1 Como empez todo 2 Proceso de instalacin del servidor web Apache 2.1 Instalando el servidor web apache 2.2 Archivos de configuracin del servidor web Apache 2.2.1 Configuracin del fichero httpd.conf 2.3 Iniciar , detener o reiniciar el servidor web Apache 3 Creacin de dominios virtuales en Apache 3.1 Paso 1.- Activando la directiva NameVirtualHost 3.2 Paso 2.- Estructura de directorios para dominios virtuales 3.3 Paso 3.- Creacin y modificacin de los ficheros de configuracin de los dominios virtuales 4 Como empez todo 5 Proceso de instalacin del servidor web Apache 5.1 Instalando el servidor web apache 5.2 Archivos de configuracin del servidor web Apache 5.2.1 Configuracin del fichero httpd.conf 5.3 Iniciar , detener o reiniciar el servidor web Apache 6 Creacin de dominios virtuales en Apache 6.1 Paso 1.- Activando la directiva NameVirtualHost 6.2 Paso 2.- Estructura de directorios para dominios virtuales 6.3 Paso 3.- Creacin y modificacin de los ficheros de configuracin de los dominios virtuales
Como dato adicional, cabe menciona que apache es el servidor web numero uno a nivel mundial el cual abarca cerca de un 52.26 % del mercado total de Internet desbancando a servidores web como el IIS (Internet Information Server) de Microsoft. Estos cifras pueden ser verificadas visitando el portal de Netcraft: http://news.netcraft.com/ Existe tambin una fundacin dedicada a dar soporte legal y financiero al desarrollo de los proyectos relacionados con Apache , el nombre de esta fundacin es Apache Software Foundation, la cual actualmente esta conformada por una comunidad de desarrolladores los cuales da a da contribuyen a la expansin y mejora de proyectos. Entre los proyectos mas destacados de esta fundacin podemos encontrar los siguientes:
Http Server.- Servidor Web Apache http://www.apache.org/ Jakarta.- Proyectos en el lado del servidor basados en Java
05/11/2011
Pgina 2 de 17
http://tomcat.apache.org/ mod_perl.- Modulo de apache para la programacin dinmica en Perl http://perl.apache.org/ SpamAssin.- Sistema de deteccin de Spam http://spamassassin.apache.org/
El contenido del fichero httpd.conf esta compuesto por un gran numero de secciones es por ello que solo describiremos las mas relevantes del mismo, usted podr habilitar o deshabilitar cada una de las funciones que describiremos segn su necesidad.
Directiva ServerTokens Esta directiva limita la cantidad de informacin que sera mostrada por nuestro servidor web apache como puede ser, la version del servidor web apache que tenemos instalado o los servicios que corren paralelamente con apache como php o MySQL. Para delimitar la cantidad de informacin mostrada por el sistema existen cuatro opciones:
ServerTokens ProductOnly Solo mostrara el nombre del servidor web instalado. Ejemplo: Server Apache ServerTokens Minimal Muestra el nombre asi como la version de apache instalada. Ejemplo: Server Apache 2.1 ServerTokens OS Mostrara el nombre, version y sistema operativo sobre el cual se encuentra montado:
Directiva ServerRoot
05/11/2011
Pgina 3 de 17
Esta directiva le indica al servidor web la ubicacin donde se almacenan los ficheros de configuracin de apache. El valor por defecto es:
ServerRoot /etc/httpd Si usted quisiera ubicar estos ficheros en otra ruta diferente solo deber especificarla, aunque no es recomendable
Directiva Timeout Esta directiva indica el nmero de segundos antes de que se cancele un conexin por falta de respuesta. Su valor por defecto es 120
Timeout 120
Directiva KeepAlive Esta directiva indica si se permiten o no las conexiones persistentes, es decir ms de una peticin por conexin. Puede tomar los valores de On u Off.
KeepAlive On|Off
Directiva MaxKeepAliveRequests Esta directiva indica el mximo nmero de peticiones que se permiten en conexiones persistentes. Un valor 0 permite un nmero ilimitado. Se recomienda dejar esta valor elevado para obtener un mayor rendimiento. Por ejemplo100
MaxKeepAliveRequests 100
Directiva KeepAliveTimeout Esta directiva indica el nmero de segundos de espera para la siguiente peticin del mismo cliente con la misma conexin. Por ejemplo 15
KeepAliveTimeout 15
Directiva Listen Listen permite asociar Apache a una direccin y/o puerto especfico adems del predeterminado. Ejemplo:
Listen 192.168.1.1:8080 Listen 80
Directiva Include
Include conf.d/*.conf Esta directiva indica al servidor web la ruta en donde se encuentran almacenados los ficheros de configuracin adicionales de apache como por ejemplo los dominios virtuales. Es habitual dejar el fichero de configuracin con las caractersticas globales que no se tienen que modificar en el fichero principal e incluir los ficheros que pueden estar sujetos a modificacin en el directorio /etc/httpd/conf.d De esta forma para aadir o quitar algn fichero de configuracin de apache slo tenemos que borrarlo del directorio /etc/httpd/conf.d
Directiva LoadModule
05/11/2011
Pgina 4 de 17
Esta directiva corresponde al soporte de Dynamic Shared Object (Objetos Dinmicos Compartidos). Son mdulos que incorporan ciertas funcionalidades que se le incorporan al servidor Apache. Para que un mdulo sea funcional tienen que estar construido como un DSO e incorporar la correspondiente directiva `LoadModule' antes de que se a utilizada. Los mdulos compilados de forma esttica no es necesario incluirlos. Ejemplo:
LoadModule LoadModule LoadModule LoadModule LoadModule auth_basic_module modules/mod_auth_basic.so auth_digest_module modules/mod_auth_digest.so authn_file_module modules/mod_authn_file.so authn_alias_module modules/mod_authn_alias.so authn_anon_module modules/mod_authn_anon.so
Directiva User Esta directiva especifica qu usuario es el que ejecuta los procesos del servidor web y en consecuencia los permisos de lectura y escritura que se aplican sobre los recursos.
User apache
Directiva Group Esta directiva especifica qu grupo es el que ejecuta los procesos del servidor web y en consecuencia los permisos de lectura y escritura que se aplican sobre los recursos.
Group apache
Directiva ServerAdmin Esta directiva especifica la persona a la que se le debe notificar los problemas referentes al portal web , esto a travs de su cuenta de correo. Ejemplo:
ServerAdmin administrador@tuDominio.net
Directiva ServerName Esta directiva especifica el nombre y puerto que el servidor utiliza para identificarse. Con una correcta configuracin, este valor se puede determinar automticamente, pero es recomendable especificarlo explciatamente para evitar problemas durante el arranque.
ServerName www.tuDominio.net:80
Directiva UseCanonicalName UseCanonicalName determina como Apache construye las autoreferencias de URL y las variables SERVER_NAME y SERVER_PORT. Cuando est directiva esta como "Off" apache usa los valores suministrados por el cliente. Cuando est como "On" , apache usa la directiva ServerName. UseCanonicalName On|Off Directiva DocumentRoot Esta directiva indica al servidor web la ruta en donde se encuentran almacenados los ficheros web de tu sitio principal
DocumentRoot "/var/www/html"
05/11/2011
Pgina 5 de 17
Directiva Options La directiva Options indica varias posibles opciones de comportamiento y estas pueden ser aplicadas a un directorio concreto. Un claro ejemplo de aplicacin de estas directiva se puede observar en el siguiente cuadro:
Directory /web/docs> Options Indexes FollowSymLinks </Directory> <Directory /web/docs/spec> Options Includes </Directory>
Las opciones que podemos observar se explican con mas detalle en el siguiente cuadro:
All ExecCGI FollowSymLinks Includes Indexes MultiViews Todas las opciones salvo MultiViews Se permite la ejecucin de scripts CGI El servidor seguir los enlaces simblicos. Tener esta opcin activa aumenta el rendimiento ya que el servidor no comprueba si un fichero o directorio es un enlace simblico y es ms rpido, pero en algunos casos puede presentar problemas de inseguridad. Se permiten incluir Server-side. Si una URL solicita un directorio y no existe DirectoryIndex (v.g., index.html) en ese directorio, el servidor devolver una lista del contenido del directorio. Se permite mostrar contenido negociado en funcin de diversos valores.
SymLinksIfOwnerMatchSe sigue un enlace simblico slo si los propietarios del enlace y del destino coinciden.
Directiva AllowOverride La directiva AllowOverride controla qu directivas se pueden situar el los ficheros .htaccess y estas pueden ser aplicadas igualmente a un directorio concreto. Un claro ejemplo de aplicacin de estas directiva se puede observar en el siguiente cuadro:
<Directory "/var/www/icons"> Options Indexes MultiViews FollowSymLinks AllowOverride None Order allow,deny Allow from all </Directory> Los valores de AllowOverride pueden ser "All", "None", o una combinacin de: Permitir el uso de directivas de autorizacin (AuthDBMGroupFile, AuthDBMUserFile, AuthGroupFile, AuthName, AuthType, AuthUserFile, Require, etc). Permitir el uso de directivas de control de tipo de documentos (DefaultType, ErrorDocument, ForceType, LanguagePriority, SetHandler, SetInputFilter, SetOutputFilter, etc). Permitir el uso de directivas que controlan los ndices de directorios (AddDescription, AddIcon, AddIconByEncoding, AddIconByType, DefaultIcon, DirectoryIndex, FancyIndexing, HeaderName, IndexIgnore, IndexOptions, ReadmeName, etc). Permitir el uso de directivas de acceso de hosts (Allow, Deny y Order). Permitir el uso de las opciones antes vistas en la directiva Options
Directiva Allow La directiva Allow indica al sistema los equipos que pueden acceder a una determinada rea del servidor. El acceso se puede controlar por nombre, IP, rango de IP, igualmente pueden ser aplicadas a un directorio concreto. El primer argumento de esta directiva es siempre "from". Los siguientes argumentos pueden tener diferentes formas: All permite el acceso a todos los equipos excepto los especificados en Deny y
05/11/2011
Pgina 6 de 17
Order que se ver ms adelante. Para permitir el acceso a un dominio en especifico solo se deber especificar el antes mencionado Ejemplo:
Allow from linuxparatodos.net Tambin puede aplicarse esa misma regla usando direcciones IP Ejemplo: Allow from 207.249.24.61
Directiva Deny La directiva Deny indica al sistema los equipos que no podrn acceder al servidor web. El acceso se puede controlar por nombre, IP, rango de IP, igualmente pueden ser aplicadas a un directorio concreto El primer argumento de esta directiva es siempre "from". Los siguientes argumentos pueden tener diferentes formas: Para denegar el acceso a un dominio en especifico solo se deber especificar el antes mencionado Ejemplo:
Deny from microsoft.com Tambin puede aplicarse esa misma regla usando direcciones IP Ejemplo: Allow from 207.249.0.60
Directiva Order Esta directiva trabaja en conjunto con las dos directivas anteriores asi mismo se encarga de controlar el orden en que se ejecutan las antes descritas. Igualmente pueden ser aplicadas a un directorio concreto Ejemplo 1:
Order Deny,Allow En este ejemplo se evalu primero Deny, de esta forma se permite el acceso a cualquier equipo que no este listado en Deny, de esta forma el acceso se garantiza por defecto. Ejemplo 2: Order Allow,Deny En este ejemplo se evalu primero Allow, de esta forma se niega el acceso a cualquier equipo que no este listado en Allow, de esta forma el acceso se niega por defecto.
Directiva Alias La directiva Alias permite alojar ficheros fuera del directorio especificado en DocumentRoot , igualmente pueden ser aplicadas a un directorio concreto. La sintaxis necesaria para aplicar la directiva Alias es la siguiente:
Alias directorioAlternativo /vaw/www/manual Ejemplo Alias /home/gerencia /var/www/gerencia
Directiva ErrorLog ErrorLog indica la ubicacin del fichero de registro de errores en las consultas. Es conveniente especificar un fichero de registro en cada VirtualHost con el nombre asociado a ese servidor. De esta forma podemos separar los registros de los distintos dominios que tengamos albergados en el servidor web. Ejemplo:
ErrorLog logs/error_log
05/11/2011
Pgina 7 de 17
Directiva ErrorLevel LogLevel Controla el nmero de mensajes registrados en error_log. Puede ser: debug, info, notice, warn, error, crit, alert, emerg. Directiva Redirect La directiva Redirect permite indicar al cliente que un documento ha sido modificado o actualizado. Ejemplo:
Redirect permanent /portal1 ] [http://www.ies-bezmiliana/portal2
Recarga el servicio.-La diferencia con restart radica en que al ejecutar un reload este solamente carga las actualizaciones hechas al fichero de configuracin del servicio sin necesidad de matar los procesos relacionados con el mismo, por lo que podra entenderse que hace el cambio en caliente. condrestartReinicio Condicional.- Solamente se inicia si el servicio se encuentra ejecutndose. reload status Da a conocer el estado en el que se encuentra el servicio Como alternativa tambin podemos ocupar el siguiente comando para iniciar el servidor FTP [root@ localhost ~]# service httpd start Y de igual manera podemos usar las opciones antes descritas en la tabla anterior. Recuerde que estos comandos se ejecutan como root.
05/11/2011
Pgina 8 de 17
La funcin de esta directiva sirve para indicar la direccin IP en la que se esta brindando el servicio o bien insertando un asterisco(*) para que est activa en cualquier interfaz del servidor que es como nosotros lo debemos tener.
Estos directorios debern ser creados dentro de la ruta /var/www/ Al final estos directorios debern quedar de la siguiente manera /var/www/turbolinux.com.mx /var/www/comerciolinux.com /var/www/escuelalinux.edu /var/www/linuxunido.org /var/www/linuxbloger.net Si no estn en la ruta antes descrita solo debe moverlos con el comando mv Lo siguiente sera crear dentro de cada uno de estos directorios la estructura bsica que debe llevar cada uno de estos dominios. Esta estructura estar conformada por cuatro directorios: html cgi-bin icons error
por lo que deber crear estos cuatro directorios para cada uno de los directorios de dominio. Ejemplo para el dominio turbolinux.com.mx
# # # # mkdir mkdir mkdir mkdir /var/www/turbolinux.com.mx/html /var/www/turbolinux.com.mx/cgi-bin /var/www/turbolinux.com.mx/icons /var/www/turbolinux.com.mx/error
Paso 3.- Creacin y modificacin de los ficheros de configuracin de los dominios virtuales #
Una vez creadas las carpetas de dominios asi como tambin la estructura de cada uno pasaremos al ultimo paso, crear los ficheros de configuracin correspondientes a cada dominio. Nuevamente por cada dominio se deber crear un fichero de configuracin, dicho fichero sera nombrado de la misma forma que el dominio, solo omitiendo el www. [root@ [root@ [root@ [root@ [root@ localhost localhost localhost localhost localhost ~]# ~]# ~]# ~]# ~]# mkdir mkdir mkdir mkdir mkdir turbolinux.com.mx.conf comerciolinux.com.conf escuelalinux.edu.conf linuxunido.org.conf linuxbloger.net.conf
05/11/2011
Pgina 9 de 17
Como dato adicional, cabe menciona que apache es el servidor web numero uno a nivel mundial el cual abarca cerca de un 52.26 % del mercado total de Internet desbancando a servidores web como el IIS (Internet Information Server) de Microsoft. Estos cifras pueden ser verificadas visitando el portal de Netcraft: http://news.netcraft.com/ Existe tambin una fundacin dedicada a dar soporte legal y financiero al desarrollo de los proyectos relacionados con Apache , el nombre de esta fundacin es Apache Software Foundation, la cual actualmente esta conformada por una comunidad de desarrolladores los cuales da a da contribuyen a la expansin y mejora de proyectos. Entre los proyectos mas destacados de esta fundacin podemos encontrar los siguientes:
Http Server.- Servidor Web Apache http://www.apache.org/ Jakarta.- Proyectos en el lado del servidor basados en Java http://tomcat.apache.org/ mod_perl.- Modulo de apache para la programacin dinmica en Perl http://perl.apache.org/ SpamAssin.- Sistema de deteccin de Spam http://spamassassin.apache.org/
05/11/2011
Pgina 10 de 17
El contenido del fichero httpd.conf esta compuesto por un gran numero de secciones es por ello que solo describiremos las mas relevantes del mismo, usted podr habilitar o deshabilitar cada una de las funciones que describiremos segn su necesidad.
Directiva ServerTokens Esta directiva limita la cantidad de informacin que sera mostrada por nuestro servidor web apache como puede ser, la version del servidor web apache que tenemos instalado o los servicios que corren paralelamente con apache como php o MySQL. Para delimitar la cantidad de informacin mostrada por el sistema existen cuatro opciones:
ServerTokens ProductOnly Solo mostrara el nombre del servidor web instalado. Ejemplo: Server Apache ServerTokens Minimal Muestra el nombre asi como la version de apache instalada. Ejemplo: Server Apache 2.1 ServerTokens OS Mostrara el nombre, version y sistema operativo sobre el cual se encuentra montado:
Directiva ServerRoot Esta directiva le indica al servidor web la ubicacin donde se almacenan los ficheros de configuracin de apache. El valor por defecto es:
ServerRoot /etc/httpd Si usted quisiera ubicar estos ficheros en otra ruta diferente solo deber especificarla, aunque no es recomendable
Directiva Timeout Esta directiva indica el nmero de segundos antes de que se cancele un conexin por falta de respuesta. Su valor por defecto es 120
Timeout 120
Directiva KeepAlive
05/11/2011
Pgina 11 de 17
Esta directiva indica si se permiten o no las conexiones persistentes, es decir ms de una peticin por conexin. Puede tomar los valores de On u Off.
KeepAlive On|Off
Directiva MaxKeepAliveRequests Esta directiva indica el mximo nmero de peticiones que se permiten en conexiones persistentes. Un valor 0 permite un nmero ilimitado. Se recomienda dejar esta valor elevado para obtener un mayor rendimiento. Por ejemplo100
MaxKeepAliveRequests 100
Directiva KeepAliveTimeout Esta directiva indica el nmero de segundos de espera para la siguiente peticin del mismo cliente con la misma conexin. Por ejemplo 15
KeepAliveTimeout 15
Directiva Listen Listen permite asociar Apache a una direccin y/o puerto especfico adems del predeterminado. Ejemplo:
Listen 192.168.1.1:8080 Listen 80
Directiva Include
Include conf.d/*.conf Esta directiva indica al servidor web la ruta en donde se encuentran almacenados los ficheros de configuracin adicionales de apache como por ejemplo los dominios virtuales. Es habitual dejar el fichero de configuracin con las caractersticas globales que no se tienen que modificar en el fichero principal e incluir los ficheros que pueden estar sujetos a modificacin en el directorio /etc/httpd/conf.d De esta forma para aadir o quitar algn fichero de configuracin de apache slo tenemos que borrarlo del directorio /etc/httpd/conf.d
Directiva LoadModule Esta directiva corresponde al soporte de Dynamic Shared Object (Objetos Dinmicos Compartidos). Son mdulos que incorporan ciertas funcionalidades que se le incorporan al servidor Apache. Para que un mdulo sea funcional tienen que estar construido como un DSO e incorporar la correspondiente directiva `LoadModule' antes de que se a utilizada. Los mdulos compilados de forma esttica no es necesario incluirlos. Ejemplo:
LoadModule LoadModule LoadModule LoadModule LoadModule auth_basic_module modules/mod_auth_basic.so auth_digest_module modules/mod_auth_digest.so authn_file_module modules/mod_authn_file.so authn_alias_module modules/mod_authn_alias.so authn_anon_module modules/mod_authn_anon.so
Directiva User
05/11/2011
Pgina 12 de 17
Esta directiva especifica qu usuario es el que ejecuta los procesos del servidor web y en consecuencia los permisos de lectura y escritura que se aplican sobre los recursos.
User apache
Directiva Group Esta directiva especifica qu grupo es el que ejecuta los procesos del servidor web y en consecuencia los permisos de lectura y escritura que se aplican sobre los recursos.
Group apache
Directiva ServerAdmin Esta directiva especifica la persona a la que se le debe notificar los problemas referentes al portal web , esto a travs de su cuenta de correo. Ejemplo:
ServerAdmin administrador@tuDominio.net
Directiva ServerName Esta directiva especifica el nombre y puerto que el servidor utiliza para identificarse. Con una correcta configuracin, este valor se puede determinar automticamente, pero es recomendable especificarlo explciatamente para evitar problemas durante el arranque.
ServerName www.tuDominio.net:80
Directiva UseCanonicalName UseCanonicalName determina como Apache construye las autoreferencias de URL y las variables SERVER_NAME y SERVER_PORT. Cuando est directiva esta como "Off" apache usa los valores suministrados por el cliente. Cuando est como "On" , apache usa la directiva ServerName. UseCanonicalName On|Off Directiva DocumentRoot Esta directiva indica al servidor web la ruta en donde se encuentran almacenados los ficheros web de tu sitio principal
DocumentRoot "/var/www/html" NOTA:Esta directiva cambia cuando se implementan sitios virtuales
Directiva Options La directiva Options indica varias posibles opciones de comportamiento y estas pueden ser aplicadas a un directorio concreto. Un claro ejemplo de aplicacin de estas directiva se puede observar en el siguiente cuadro:
Directory /web/docs> Options Indexes FollowSymLinks </Directory> <Directory /web/docs/spec> Options Includes </Directory>
05/11/2011
Pgina 13 de 17
Las opciones que podemos observar se explican con mas detalle en el siguiente cuadro:
All ExecCGI FollowSymLinks Includes Indexes MultiViews Todas las opciones salvo MultiViews Se permite la ejecucin de scripts CGI El servidor seguir los enlaces simblicos. Tener esta opcin activa aumenta el rendimiento ya que el servidor no comprueba si un fichero o directorio es un enlace simblico y es ms rpido, pero en algunos casos puede presentar problemas de inseguridad. Se permiten incluir Server-side. Si una URL solicita un directorio y no existe DirectoryIndex (v.g., index.html) en ese directorio, el servidor devolver una lista del contenido del directorio. Se permite mostrar contenido negociado en funcin de diversos valores.
SymLinksIfOwnerMatchSe sigue un enlace simblico slo si los propietarios del enlace y del destino coinciden.
Directiva AllowOverride La directiva AllowOverride controla qu directivas se pueden situar el los ficheros .htaccess y estas pueden ser aplicadas igualmente a un directorio concreto. Un claro ejemplo de aplicacin de estas directiva se puede observar en el siguiente cuadro:
<Directory "/var/www/icons"> Options Indexes MultiViews FollowSymLinks AllowOverride None Order allow,deny Allow from all </Directory> Los valores de AllowOverride pueden ser "All", "None", o una combinacin de: Permitir el uso de directivas de autorizacin (AuthDBMGroupFile, AuthDBMUserFile, AuthGroupFile, AuthName, AuthType, AuthUserFile, Require, etc). Permitir el uso de directivas de control de tipo de documentos (DefaultType, ErrorDocument, ForceType, LanguagePriority, SetHandler, SetInputFilter, SetOutputFilter, etc). Permitir el uso de directivas que controlan los ndices de directorios (AddDescription, AddIcon, AddIconByEncoding, AddIconByType, DefaultIcon, DirectoryIndex, FancyIndexing, HeaderName, IndexIgnore, IndexOptions, ReadmeName, etc). Permitir el uso de directivas de acceso de hosts (Allow, Deny y Order). Permitir el uso de las opciones antes vistas en la directiva Options
Directiva Allow La directiva Allow indica al sistema los equipos que pueden acceder a una determinada rea del servidor. El acceso se puede controlar por nombre, IP, rango de IP, igualmente pueden ser aplicadas a un directorio concreto. El primer argumento de esta directiva es siempre "from". Los siguientes argumentos pueden tener diferentes formas: All permite el acceso a todos los equipos excepto los especificados en Deny y Order que se ver ms adelante. Para permitir el acceso a un dominio en especifico solo se deber especificar el antes mencionado Ejemplo:
Allow from linuxparatodos.net Tambin puede aplicarse esa misma regla usando direcciones IP Ejemplo: Allow from 207.249.24.61
Directiva Deny La directiva Deny indica al sistema los equipos que no podrn acceder al servidor web. El acceso se puede controlar por nombre, IP, rango de IP, igualmente pueden ser aplicadas a un directorio concreto El primer argumento de esta directiva es siempre "from". Los siguientes argumentos pueden tener diferentes formas: Para denegar el acceso a un dominio en especifico solo se deber especificar el antes mencionado Ejemplo:
05/11/2011
Pgina 14 de 17
Deny from microsoft.com Tambin puede aplicarse esa misma regla usando direcciones IP Ejemplo: Allow from 207.249.0.60
Directiva Order Esta directiva trabaja en conjunto con las dos directivas anteriores asi mismo se encarga de controlar el orden en que se ejecutan las antes descritas. Igualmente pueden ser aplicadas a un directorio concreto Ejemplo 1:
Order Deny,Allow En este ejemplo se evalu primero Deny, de esta forma se permite el acceso a cualquier equipo que no este listado en Deny, de esta forma el acceso se garantiza por defecto. Ejemplo 2: Order Allow,Deny En este ejemplo se evalu primero Allow, de esta forma se niega el acceso a cualquier equipo que no este listado en Allow, de esta forma el acceso se niega por defecto.
Directiva Alias La directiva Alias permite alojar ficheros fuera del directorio especificado en DocumentRoot , igualmente pueden ser aplicadas a un directorio concreto. La sintaxis necesaria para aplicar la directiva Alias es la siguiente:
Alias directorioAlternativo /vaw/www/manual Ejemplo Alias /home/gerencia /var/www/gerencia
Directiva ErrorLog ErrorLog indica la ubicacin del fichero de registro de errores en las consultas. Es conveniente especificar un fichero de registro en cada VirtualHost con el nombre asociado a ese servidor. De esta forma podemos separar los registros de los distintos dominios que tengamos albergados en el servidor web. Ejemplo:
ErrorLog logs/error_log
Directiva ErrorLevel LogLevel Controla el nmero de mensajes registrados en error_log. Puede ser: debug, info, notice, warn, error, crit, alert, emerg. Directiva Redirect La directiva Redirect permite indicar al cliente que un documento ha sido modificado o actualizado. Ejemplo:
Redirect permanent /portal1 ] [http://www.ies-bezmiliana/portal2
05/11/2011
Pgina 15 de 17
Recarga el servicio.-La diferencia con restart radica en que al ejecutar un reload este solamente carga las actualizaciones hechas al fichero de configuracin del servicio sin necesidad de matar los procesos relacionados con el mismo, por lo que podra entenderse que hace el cambio en caliente. condrestartReinicio Condicional.- Solamente se inicia si el servicio se encuentra ejecutndose. reload status Da a conocer el estado en el que se encuentra el servicio Como alternativa tambin podemos ocupar el siguiente comando para iniciar el servidor FTP [root@ localhost ~]# service httpd start Y de igual manera podemos usar las opciones antes descritas en la tabla anterior. Recuerde que estos comandos se ejecutan como root.
05/11/2011
Pgina 16 de 17
Estos directorios debern ser creados dentro de la ruta /var/www/ Al final estos directorios debern quedar de la siguiente manera /var/www/turbolinux.com.mx /var/www/comerciolinux.com /var/www/escuelalinux.edu /var/www/linuxunido.org /var/www/linuxbloger.net Si no estn en la ruta antes descrita solo debe moverlos con el comando mv Lo siguiente sera crear dentro de cada uno de estos directorios la estructura bsica que debe llevar cada uno de estos dominios. Esta estructura estar conformada por cuatro directorios: html cgi-bin icons error
por lo que deber crear estos cuatro directorios para cada uno de los directorios de dominio. Ejemplo para el dominio turbolinux.com.mx
# # # # mkdir mkdir mkdir mkdir /var/www/turbolinux.com.mx/html /var/www/turbolinux.com.mx/cgi-bin /var/www/turbolinux.com.mx/icons /var/www/turbolinux.com.mx/error
Paso 3.- Creacin y modificacin de los ficheros de configuracin de los dominios virtuales #
Una vez creadas las carpetas de dominios asi como tambin la estructura de cada uno pasaremos al ultimo paso, crear los ficheros de configuracin correspondientes a cada dominio. Nuevamente por cada dominio se deber crear un fichero de configuracin, dicho fichero sera nombrado de la misma forma que el dominio, solo omitiendo el www. [root@ [root@ [root@ [root@ [root@ localhost localhost localhost localhost localhost ~]# ~]# ~]# ~]# ~]# mkdir mkdir mkdir mkdir mkdir turbolinux.com.mx.conf comerciolinux.com.conf escuelalinux.edu.conf linuxunido.org.conf linuxbloger.net.conf
Estos directorios debern ser creados dentro de la ruta /etc/httpd/conf.d/ Al final estos directorios debern quedar de la siguiente manera /etc/httpd/conf.d/turbolinux.com.mx.conf /etc/httpd/conf.d/comerciolinux.com.conf /etc/httpd/conf.d/escuelalinux.edu.conf /etc/httpd/conf.d/linuxunido.org.conf /etc/httpd/conf.d/linuxbloger.net.conf Si no estn en la ruta antes descrita solo debe moverlos con el comando mv. Lo siguiente sera crear dentro de cada uno de estos ficheros la estructura bsica que deben contener para que puedan ser ledos por el fichero principal de configuracin de apache, nos referimos al fichero httpd.conf. Esta estructura estar conformada por la siguiente configuracin bsica: Ejemplo de configuracin para el dominio turbolinux.com.mx
05/11/2011
Pgina 17 de 17
<VirtualHost *:80> ServerAdmin administrador@tuDominio.net DocumentRoot "/var/www/turbolinux.com.mx/html" ServerName www. turbolinux.com.mx ServerAlias turbolinux.com.mx </VirtualHost> Los parmetros usados son descritos en la siguiente tabla: La funcin de esta directiva sirve para indicar la direccin IP en la que se esta brindando o bien insertando un asterisco(*) para que est activa en cualquier interfaz del servidor que es como nosotros lo debemos tener. Esta directiva especifica la persona a la que se le debe notificar los problemas referentes al portal web , esto a travs de su cuenta de correo.
VirtualHost ServerAdmin
DocumentRoot Esta directiva indica al servidor web la ruta en donde se encuentran almacenados los ficheros web de tu sitio principal. Esta directiva especifica el nombre y puerto que el servidor utiliza para identificarse. Con una correcta configuracin, este ServerName valor se puede determinar automticamente, pero es recomendable especificarlo explciatamente para evitar problemas durante el arranque. ServerAlias Esta directiva sirve para que el mismo sitio web sea accesible desde distintos nombres de dominio. Ejemplo: turbolinux.com.mx ---> www.turbolinux.com.mx
/etc/httpd/conf.d/turbolinux.com.mx.conf /etc/httpd/conf.d/comerciolinux.com.conf /etc/httpd/conf.d/escuelalinux.edu.conf /etc/httpd/conf.d/linuxunido.org.conf /etc/httpd/conf.d/linuxbloger.net.conf Si no estn en la ruta antes descrita solo debe moverlos con el comando mv. Lo siguiente sera crear dentro de cada uno de estos ficheros la estructura bsica que deben contener para que puedan ser ledos por el fichero principal de configuracin de apache, nos referimos al fichero httpd.conf. Esta estructura estar conformada por la siguiente configuracin bsica: Ejemplo de configuracin para el dominio turbolinux.com.mx <VirtualHost *:80> ServerAdmin administrador@tuDominio.net DocumentRoot "/var/www/turbolinux.com.mx/html" ServerName www. turbolinux.com.mx ServerAlias turbolinux.com.mx </VirtualHost> Los parmetros usados son descritos en la siguiente tabla: La funcin de esta directiva sirve para indicar la direccin IP en la que se esta brindando o bien insertando un asterisco(*) para que est activa en cualquier interfaz del servidor que es como nosotros lo debemos tener. Esta directiva especifica la persona a la que se le debe notificar los problemas referentes al portal web , esto a travs de su cuenta de correo.
VirtualHost ServerAdmin
DocumentRoot Esta directiva indica al servidor web la ruta en donde se encuentran almacenados los ficheros web de tu sitio principal. Esta directiva especifica el nombre y puerto que el servidor utiliza para identificarse. Con una correcta configuracin, este ServerName valor se puede determinar automticamente, pero es recomendable especificarlo explciatamente para evitar problemas durante el arranque. ServerAlias Esta directiva sirve para que el mismo sitio web sea accesible desde distintos nombres de dominio. Ejemplo: turbolinux.com.mx ---> www.turbolinux.com.mx 15571 Accesos
0 archivos adjuntos
Promedio (0 Votos)
Comentarios
05/11/2011
Use MySQL Replication Like an Expert to Improve Performance and Enhance Availability
Posted by Anatoliy A. Dimitrov on Mon, Oct 10, 20112
By using MySQL replication, you can distribute MySQL queries over multiple servers to improve application performance, provide high availability (HA), and distribute data across diverse physical locations. The process involves one or more master servers, which send databases or tables asynchronously to slave servers. For all of its potential benefits, MySQL replication can cause serious trouble, especially in complex environments. Follow the advice here to get off to a healthy start. In MySQL replication each participating server may be a master, a slave, or both. Master servers handle database transactions and write them to a binary log (binlog). Slaves connect to masters and request copies of their binary logs. Servers can act both as master and slave thanks to features such as different auto increment, which sets the interval between successive column values. Theoretically, it is possible to have more than two masters. In such cases MySQL replicates changes in a circle. However, it is very hard to maintain and troubleshoot such circular replication. When the replication breaks (and such interruptions are unavoidable in the long term) it's hard to ensure the integrity of the information and resume fast operation with all the data. MySQL's developers recommend using no more than two masters. The number of MySQL slaves is not a concern, because slaves cannot make global changes and cannot cause deployment-wide problems.
A Replication Alternative Distributed Replicated Block Device (DRBD) replication is a non-MySQL-specific replication alternative. It copies the underlying block device that stores the MySQL data files. Block device-level replication is officially supported in the Linux kernel, so it can be used for replicating files for different applications. In DRBD replication, there is always only one master, though this master can be dynamically changed through another service, such as Heartbeat, in case of failure. DRBD replication is suitable for highavailability solutions.
Replicated MySQL data represents a statement that is successfully executed on the master and recorded to its binlog, and is a statement that makes a change, such as insert, update, or delete. Select statements are not logged in the binlog nor replicated unless they invoke stored functions that make changes. MySQL replication works in two modes. Commonly, statement-based updates are sent to slaves in the form of the original queries. Since version 5.1 MySQL also supports row-based replication, in which the master(s) informs the slave(s) which rows were affected and how they have been changed. This mode is considered more reliable because alerts appear even if a single row fails to be updated.
These directives instruct MySQL to write its data-changing queries to the binlog file /var/log/mysq/master-binlog.XXX under a default Linux configuration, where XXX is a sequential number for previous binlog files. This file's events will be sent to the slave server. server-id distinguishes the server from which the queries come. You must also create on the master server a MySQL user with privileges to get a dump of the binary log from the master:
master> CREATE USER replication_user; master> GRANT REPLICATION SLAVE ON *.* TO replication_user IDENTIFIED BY 'secret_password';
Next it's time to configure the replication on the slave server from its MySQL console:
You can then start slave replication by executing start slave. To ensure it is running correctly, execute show slave status on the slave server and ensure there are no errors in Last_Error column. If you see any errors you must resolve them before you can get replication working. This oversimplified example shows how easy it is to get basic MySQL replication started. Complex problems are not likely to appear in such a simple master/slave relation, but real-life scenarios may cause significant headaches, as we will see in a moment.
data, which will cause overhead too. Thus this technique can be a life-saver when complex statements compare values from millions of rows in order to update just a few. For simple update statements on numerous rows, row-based replication will cause more overhead, because it has to send all the rows to each slave instead of just a single command. A general rule is that MySQL replication always adds a little bit of overhead to the master server, and it's definitely not a universal scale-out solution. The best solution is first to try optimizing the application's code for faster MySQL queries, but this is not always feasible. In order not to increase queries' execution times, replication implementation has to be carefully designed.
Stop replication in either direction. On the inactive (second) master, execute SET SESSION SQL_LOG_BIN=0 to ensure that statements in the current session are not logged in the binlog, nor replicated. Then execute the necessary
commands on it. When you're done, enable logging again with SET SESSION SQL_LOG_BIN=1.
o
After the changes take effect, switch the application to work with the recently updated second master. On the first master, repeat the steps you followed on the inactive master: stop logging, execute commands, and reenable logging. Once you've completed all manual updates, start the replication again. Optionally switch the application to work again with the first master.
Many third-party solutions can enhance MySQL replication for HA and ease the burden of managing MySQL replication during failover and failback. Some are MySQL proxies such as MySQL proxy and GreenSQL; others are complete solutions, such as Tungsten replicator.
busy store that handles a large number of purchases in the interval the business needs to fix the replication. Such a bad scenario can lead to refunds and chargebacks, and ruin a store's reputation. When replication breaks you can see the exact error by running show slave status on the problematic server's MySQL console. The error will be in the column Last_Error in the result. One common error says, "Could not parse relay log event entry." This error indicates that the relay log file at the slave server is corrupted. This is usually caused by filesystem problems or lack of free space. To fix it, execute on the slave server show slave status and write down the values from the columns Exec_Master_Log_Pos as X and Master_Log_File as Y. Go to the master server and use mysqlbinlog to dump the statements from Master_Log_File into a text file. Open the newly created text file and search for the previously found value X. Write down the next position (pos value) as Z, the value to use as the place to restart the replication from. Finally, on the slave server run change master to master_log_file='Y',master_log_pos=Z, substituting Y and Z with your values. You may also see errors when a command cannot be executed on the slave server. The nature of such errors may vary greatly, from breaking constraints (foreign keys) to schema incompatibilities (different tables' structures). First you must address the reason for the error in order to preserve data consistency and integrity between the servers. You may decide that the command can be ignored; even though this is highly unrecommended it can be useful for temporary or noncritical data. In such cases there is a dirty trick to skip the failed statement: stop replication, execute on the slave server SET GLOBAL SQL_SLAVE_SKIP_COUNTER = 1, and start replication again. You can also ignore errors with same type number permanently by adding slave-skiperrors=number_of_error to your MySQL configuration file. This is rarely a good idea, but MySQL provides such an option. You can use it if you want to restore replication fast and plan to fix the errors later. MySQL replication is an extremely useful tool for implementing high availability and improving scalability. It is a complex and powerful tool, however, and has to be managed carefully.
building and maintaining a connection pool with high and low water marks transparent authentication (no extra auth against the proxy) deciding on Query Level which backend to use
and implement a transparent read/write splitter which sends all non-transactional Queries to the slaves and the rest to the master.
As the splitting is in the hands of the lua-scripting level you can use the same to implement sharding or other rules to route traffic on statement level.
Connection Pooling
For R/W Splitting we need a connection pooling. We only switch to another backend if we already have a authenticated connection open to that backend. The MySQL protocol first does a challenge-response handshake. When we enter the query/result stage it is too late to authenticate new connections. We have to make sure that we have enough open connections to operate nicely.
In the keepalive tutorial we spend quite some code on connection management. The whole connect_servers() function is only to create new connections for all pools. 1. create one connection to each backend 2. create new connections until we reach min-idle-connections 3. if the two above conditions are met, use a connection from the pool Lets take a glimpse at the code:
config connectionpool localmin_idle_connections=4 localmax_idle_connections=8 getaconnectiontoabackend aslongaswedon'thaveenoughconnectionsinthepool,createnewconnections functionconnect_server() makesurethatweconnecttoeachbackendatleastonesto keeptheconnectionstotheserversalive onread_querywecanswitchthebackendsagaintoanotherbackend localleast_idle_conns_ndx=0 localleast_idle_conns=0 fori=1,#proxy.serversdo locals=proxy.servers[i]
ifs.state~=proxy.BACKEND_STATE_DOWNthen trytoconnecttoeachbackendonceatleast ifs.idling_connections==0then proxy.connection.backend_ndx=i return end trytoopenatleastmin_idle_connections ifleast_idle_conns_ndx==0or (s.idling_connections<min_idle_connectionsand s.idling_connections<least_idle_conns)then least_idle_conns_ndx=i least_idle_conns=s.idling_connections end end end ifleast_idle_conns_ndx>0then proxy.connection.backend_ndx=least_idle_conns_ndx end ifproxy.connection.backend_ndx>0and proxy.servers[proxy.connection.backend_ndx].idling_connections>=min_idle_connectio nsthen wehave4idlingconnectionsinthepool,that'sgoodenough returnproxy.PROXY_IGNORE_RESULT end
openanewconnection end
The proxy.connection.backend_ndx = 0 we disconnect us from the current backend (lua starts indexing at index 1, 0 is out of bounds). If a second connection comes in now it can use this authed connection too as it is in the pool, idling. By setting proxy.connection.backend_ndx you control which backend is used to send your packets too. A backend is defined as a entry of the proxy.servers table. Each connection has (zero or) one backend. The backends all have a address, a type (RW or RO) and a state (UP or DOWN). As we also might have to many open connections in the pool we close them on shutdown again if necessary:
closetheconnectionsifwehaveenoughconnectionsinthepool @returnnilcloseconnection IGNORE_RESULTstoreconnectioninthepool functiondisconnect_client() ifproxy.connection.backend_ndx==0then currentlywedon'thaveaserverbackendassigned pickaserverwhichhastoomanyidlingconnectionsandcloseone fori=1,#proxy.serversdo locals=proxy.servers[i]
We only search for a backend which has to many open idling connections and use it before we enter the default behaviour of disconnect_client: shutdown the server connection. if
proxy.connection.backend_ndx==0then is the we dont have backend associated right now.
Read/Write Splitting
That is our maintainance of the pool. connect_server() adds new authed connections to the pool, disconnect_client() closes them again. The read/write splitting is part of the query/result cycle:
read/writesplitting functionread_query(packet) ifpacket:byte()==proxy.COM_QUITthen don'tsendCOM_QUITtothebackend.Wemanagetheconnection inallaspects. proxy.response={ type=proxy.MYSQLD_PACKET_ERR, errmsg="ignoredtheCOM_QUIT" } returnproxy.PROXY_SEND_RESULT end
asweswitchbetweendifferentconnenctionswehavetomakesurethat weusealwaysthesameDB ifpacket:byte()==proxy.COM_INIT_DBthen default_dbisconnectionglobal default_db=packet:sub(2) end ifproxy.connection.backend_ndx==0then wedon'thaveabackendrightnow let'spickamasterasagooddefault fori=1,#proxy.serversdo locals=proxy.servers[i] ifs.idling_connections>0and s.state~=proxy.BACKEND_STATE_DOWNand s.type==proxy.BACKEND_TYPE_RWthen proxy.connection.backend_ndx=i break end end end ifpacket:byte()==proxy.COM_QUERYanddefault_dbthen howcanIknowthedboftheserverconnection? proxy.queries:append(2,string.char(proxy.COM_INIT_DB)..default_db) end proxy.queries:append(1,packet)
dont forward COM_QUIT to the backend as he will close the connection on us intercept the COM_INIT_DB to know which DB the client wants to work on. If we switch to another backend we have to make sure the same DB is used.
send all non-transactional SELECTs to a slave everything else goes to the master
If we found a slave host which has a idling connection we pick it. If all slaves are busy or down, we just send the query to the master. As soon as we dont need this connection anymore give it backend to the pool:
aslongasweareinatransactionkeeptheconnection otherwisereleaseitsoanotherclientcanuseit functionread_query_result(inj) localres=assert(inj.resultset) localflags=res.flags ifinj.id~=1then ignoretheresultoftheUSE<default_db> returnproxy.PROXY_IGNORE_RESULT end is_in_transaction=flags.in_trans ifis_in_transaction==0then releasethebackend
The MySQL Protocol is nice and offers us a in-transaction-flag. This operates on the state of the transaction and works across all engines. If you want to make sure that several statements go to the same backend, open a transaction with BEGIN. No matter which storage engine you use.
Possible extensions
While we are here in this section of the code think about another use case:
if the master is down, ban all writing queries and only allow reading selects against the slaves.
It keeps your site up and running even if your master is gone. You only have to handle errors on write-statements and transactions.
Known Problems
We might have a race-condition that idling connection closes before we can use it. In that case we are in trouble right now and will close the connection to the client. We have to add queuing of connections and awaking them up when the connection becomes available again to handle this later.
Next Steps
Testing, testing, testing.
$mysqlproxy\ proxybackendaddresses=10.0.0.1:3306\ proxyreadonlybackendaddresses=10.0.0.10:3306\ proxyreadonlybackendaddresses=10.0.0.12:3306\ proxyluascript=examples/tutorialkeepalive.lua
The above code works for my tests, but I dont have any real load. Nor can I create all the error-cases you have in your real-life setups. Please send all your comments, concerns and ideas to the MySQL Proxy forum.
Another upcoming step is externalizing all the load-balancer code and move it into modules to make the code easier to understand and reuseable. mysql-proxy