PHP 5.3 elimino varios DLL's de su instalación por default, estos los puedes descargar en la siguiente dirección
http://downloads.php.net/pierre/
agrégalos al php.ini, reinicia apache y listo
jueves, 13 de diciembre de 2012
viernes, 7 de diciembre de 2012
Ejecutar mysql desde shell
Algunas veces necesitamos ejecutar un Query SQL en un script de shell
Solo remplacen lo que esta en rojo y listo.
#mysql --host=127.0.0.1 -u elusuario --password=lacontrasena -e 'SELECT * from mi tabla`;' labasededatos
Solo remplacen lo que esta en rojo y listo.
Como saber si mi dominio esta boletinado como spam
Para verificar si un dominio se encuentra boletinado como fuente de spam les dejo estas páginas
y para verificar la ip de un servidor es:
otro sitio interesante es
Espero les sirva
jueves, 6 de diciembre de 2012
Respaldando KJots
KJots es una aplicación para hacer anotaciones, permitiendo organizarlas dentro de carpetas y notas por separado, en mi caso muy practico porque me gusta tener anotaciones de todo lo que hago.
Todo lo capturado se almacena en :
/root/.kde/share/apps/kjots
Basta con copiar los archivos para tener un respaldo
lunes, 3 de diciembre de 2012
Como leer wtmp
El archivo /var/log/wtmp cuenta con información de acceso al servidor de ftp, pero este archivo se encuentra en binario.
para leerlo escribes
# utmpdump /var/log/wtmp
y para enviar el resultado a un archivo es
# utmpdump /var/log/wtmp > archivo.txt
y listo
viernes, 16 de noviembre de 2012
Como crear un diseño para envio por email
Para crear un diseño agradable para nuestro boletín de noticias les presento esta página
http://www.campaignmonitor.com/templates/
Espero la disfruten
http://www.campaignmonitor.com/templates/
Espero la disfruten
martes, 30 de octubre de 2012
Limtar cantidad máxima de correos por envio
Para limitar la cantidad máxima de correos hay que seguir los siguientes pasos:
Cpanel
Ingresa a WHM / Exim Configuration Manager / Avances Editor
agregar:
recipients_max = 20
botón Save, y listo
Plesk
Ingresa a shell y edita o crea el archivo /var/qmail/control/maxrcpt y se agrega la cantidad de destinatarios máximos como un numero; reinicia qmail y listoTIP
En lo personal opino que un limite de 20-25 correos simultáneos es más que suficiente; para los que desean notificar a todos los clientes o empleados el camino correcto son grupos y listas de correos, así como otros sistemas de envíomiércoles, 17 de octubre de 2012
monitoreo de interrupciones en linux
¿Qué son las interrupciones?
En cuestión hardware es solo una terminal (conexión física) del procesador la cual recibe señales de todos los componentes del hardware (disco duro, red, usb, serial, etc) notificando que necesita ser atendido. Esta señal física es enviada al sistema operativo ( windows, linux, mac os, iOS, android, BB, etc) quien decide que software atiende la petición de recibir o enviar información al dispositivo indicado.
Ejemplo practico
Abres un documento de word y este le envía la petición al disco duro que lo busque y entregue la información, cuando el disco duro termina de leer el archivo activa una interrupción y le avisa que ya esta listo. Al mismo tiempo tienes interrupciones de la tarjeta de red esperando información, de la tarjeta de sonido escuchando música, del teclado y mouse... y muchas otras...Monitoreo de interrupciones
Este lo puedes hacer de un modo comodo con el software itop para linux, este lo descargas de https://github.com/kargig/itopAquí una captura de pantalla
IRQs/Second
Device (IRQ) TOTAL
IO-APIC-edge timer ( 0): 0
IO-APIC-edge i8042 ( 1): 0
IO-APIC-edge ( 4): 0
IO-APIC-edge parport ( 7): 0
IO-APIC-edge rtc0 ( 8): 0
IO-APIC-fasteoi acpi ( 9): 0
IO-APIC-edge i8042 ( 12): 0
IO-APIC-edge ata_pii ( 14): 0
IO-APIC-edge ata_pii ( 15): 0
xen-dyn-event xenbus ( 16): 0
xen-dyn-event blkif ( 17): 4
xen-dyn-event blkif ( 18): 0
xen-dyn-event blkif ( 19): 0
xen-dyn-event eth0 ( 20): 0
xen-dyn-event eth1 ( 21): 228
xen-dyn-event eth2 ( 22): 0
IO-APIC-fasteoi uhci ( 23): 0
xen-dyn-event eth3 ( 24): 0
xen-dyn-event eth4 ( 25): 0
Function call interr (CAL): 0
(ERR): 0
Local timer interrup (LOC): 604
Machine check except (MCE): 0
Machine check polls (MCP): 0
(MIS): 0
Non-maskable interru (NMI): 0
Performance monitori (PMI): 0
Performance pending (PND): 0
Rescheduling interru (RES): 894
Spurious interrupts (SPU): 0
Threshold APIC inter (THR): 0
TLB shootdowns (TLB): 1496
Thermal event interr (TRM): 0
Ejemplo de interpretación, eth1 tiene actualmente 228 interrupciones por segundo, si alguna vez recibes un ataque de red tal ves las interrupciones suban a 2000, 3000, 5000. si tu procesador es muy interrumpido parecerá que tu hardware esta lento; no solo puede ser por ataques si no por fallas del hardware, por ejemplo un disco duro dañado intentando varias veces leer la información
martes, 16 de octubre de 2012
instalar mod_pagespeed en centos, cpanel o plesk
crear archivo /etc/yum.repos.d/mod-pagespeed.repo y agregar
RHEL/CentOS/Fedora 32-Bit
[mod-pagespeed] name=mod-pagespeed baseurl=http://dl.google.com/linux/mod-pagespeed/rpm/stable/i386 enabled=1 gpgcheck=0
RHEL/CentOS/Fedora 64-Bit
[mod-pagespeed] name=mod-pagespeed baseurl=http://dl.google.com/linux/mod-pagespeed/rpm/stable/x86_64 enabled=1 gpgcheck=0
Ejecutar en shell
# yum --enablerepo=mod-pagespeed install mod-pagespeed
reinicia apache y listo...
para comprobarlo revisa en phpinfo
HTTP Response Headers | |
---|---|
X-Mod-Pagespeed | 1.0.22.7-2003 |
Existen muchos parámetros a personalizar, aquí pueden ver ejemplos en acción
http://www.modpagespeed.com/
Almacenar el cache en RAM
Para ello editamos /etc/fstab y agregamos
tmpfs /var/www/mod_pagespeed/cache tmpfs size=256m,mode=0775,uid=httpd,
// en shell
# mv /var/www/mod_pagespeed/cache /var/www/mod_pagespeed/cache_bak
# mkdir /var/www/mod_pagespeed/cache
# chown apache:apache /var/www/mod_pagespeed/cache
# mount -a
en donde 256m es la cantidad de memoria asignada a la unidad virtual en RAM; la cantidad necesaria puede variar mucho según nuestras necesidades, un modo es ver cuanto espacio en disco ocupa despues de trabajar un rato con el comando
# du -hs /var/www/mod_pagespeed/cache
Esto puede tomar algunos minutos dependiendo el tipo de sitios alojados, en mi caso ocupo 500M así que pondré 700M para asegurar que tendré lo suficiente
Desactivando y Activando mod_pagespeed con .htaccess
La sintaxis es:<IfModule pagespeed_module>
ModPagespeed off
</IfModule>
o
<IfModule pagespeed_module>
ModPagespeed off
</IfModule>
o personalizar parámetros como:
<IfModule pagespeed_module>
ModPagespeed on
...
ModPagespeedDisableFilters inline_css,inline_javascript
ModPagespeedEnableFilters move_css_to_head
ModPagespeedEnableFilters rewrite_css,rewrite_javascript
ModPagespeedEnableFilters outline_css,outline_javascript
...
</IfModule>
Leer un campo de un iframe con jquery
Si tenemos un html con un iframe y dentro de este hay un campo input que deseamos leer el código es:
$("#idframe").contents().find("input#idcampo").val()
así de fácil
$("#idframe").contents().find("input#idcampo").val()
así de fácil
miércoles, 10 de octubre de 2012
Re Calcular estadisticas en Plesk
Para regenerar las estadísticas de un dominio es por medio del comando:
# /usr/local/psa/admin/sbin/statistics --calculate-one --domain-name=midominio.com
Si deseas todos los dominios crea el siguiente script:
cd /var/www/vhosts
find * -maxdepth 0 -type d -name "*" | while read FILENAME
do
echo "Procesando ..."
echo ${FILENAME}
/usr/local/psa/admin/sbin/statistics --calculate-one --domain-name=${FILENAME}
done
Pero si deseas todos los dominios y tienes problemas de carga ya sea porque es un equipo pequeño o tienes demasiados dominios la solución es este script
cd /var/www/vhosts
find * -maxdepth 0 -type d -name "*" | while read FILENAME
do
echo "Procesando ..."
echo ${FILENAME}
/usr/local/psa/admin/sbin/statistics --calculate-one --domain-name=${FILENAME} &
sleep 2
ionice -c3 -p $(ps ax | grep "logrotate" | grep -v grep | awk '{ print $1 }')
renice 13 -p $(ps ax | grep "logrotate" | grep -v grep | awk '{ print $1 }')
ionice -c3 -p $(ps ax | grep "webali" | grep -v grep | awk '{ print $1 }')
renice 15 -p $(ps ax | grep "webali" | grep -v grep | awk '{ print $1 }')
ionice -c3 -p $(ps ax | grep "awstat" | grep -v grep | awk '{ print $1 }')
renice 27 -p $(ps ax | grep "awstat" | grep -v grep | awk '{ print $1 }')
sleep 55
done
# /usr/local/psa/admin/sbin/statistics --calculate-one --domain-name=midominio.com
Si deseas todos los dominios crea el siguiente script:
cd /var/www/vhosts
find * -maxdepth 0 -type d -name "*" | while read FILENAME
do
echo "Procesando ..."
echo ${FILENAME}
/usr/local/psa/admin/sbin/statistics --calculate-one --domain-name=${FILENAME}
done
Pero si deseas todos los dominios y tienes problemas de carga ya sea porque es un equipo pequeño o tienes demasiados dominios la solución es este script
cd /var/www/vhosts
find * -maxdepth 0 -type d -name "*" | while read FILENAME
do
echo "Procesando ..."
echo ${FILENAME}
/usr/local/psa/admin/sbin/statistics --calculate-one --domain-name=${FILENAME} &
sleep 2
ionice -c3 -p $(ps ax | grep "logrotate" | grep -v grep | awk '{ print $1 }')
renice 13 -p $(ps ax | grep "logrotate" | grep -v grep | awk '{ print $1 }')
ionice -c3 -p $(ps ax | grep "webali" | grep -v grep | awk '{ print $1 }')
renice 15 -p $(ps ax | grep "webali" | grep -v grep | awk '{ print $1 }')
ionice -c3 -p $(ps ax | grep "awstat" | grep -v grep | awk '{ print $1 }')
renice 27 -p $(ps ax | grep "awstat" | grep -v grep | awk '{ print $1 }')
sleep 55
done
Este ultimo script realiza el trabajo más lento y con menos prioridad, ademas si se traba en un dominio por algún archivo corrupto este seguirá procesando los demás dominios.
TIP:
en algunas actualizaciones presenta el siguiente error:
error: error accessing /usr/share/tomcat6/logs: No such file or directory
error: tomcat:1 glob failed for /usr/share/tomcat6/logs/*.log
Esto se soluciona creando el directorio /usr/share/tomcat6/logs/
.
lunes, 8 de octubre de 2012
Falla nginx con plesk 500 dominio
Sintomas:
1-
nginx no responde al actualizar
2- al ejecutar
# /usr/local/psa/admin/bin/nginxmng --disable
muestra el error PHP Fatal error: Allowed memory size of 134217728 bytes exhausted (tried to allocate 40961 bytes) in /usr/local/psa/admin/plib/Template/Processor.php on line 20
Solución
Editar /usr/local/psa/admin/conf/php.ini , cambiar memory_limit = 256M y reiniciar psa.
después ejecutamos
# /usr/local/psa/admin/bin/nginxmng --disable
# /usr/local/psa/admin/bin/nginxmng --enable
y listo
Técnicas MySQL para Alta Disponibilidad
Encontré esta diapositiva con un muy buen resumen sobre esta temática.
Alternativas de alta disponiblidad en MySQL - MySQL Meetup - Montevideo - Marzo 2012 from Nelson Calero
sábado, 6 de octubre de 2012
Montar CD ISO en Linux
Para visualizar los archivos de una imagen ISO se tiene que montar
# mount -o loop /ruta/mi_imagen.iso /mnt/mi_imagen
este comando da igual si es CD o DVD
# mount -o loop /ruta/mi_imagen.iso /mnt/mi_imagen
este comando da igual si es CD o DVD
martes, 31 de julio de 2012
Mover cola de correo de qmail a ramdisk para disminuir iowait en plesk
Si tu actividad de correo es muy intensa posiblemente se te eleve el iowait por causa del correo
una opción es pasar la cola de correo a una unidad en RAM y aquí te presento como hacerlo
edita /etc/fstab
# nano /etc/fstab
y agrega
none /ram_qmailqueue tmpfs defaults,size=100m,nr_inodes=999k,mode=775 0 0
en este caso se le asignaron 100Mb de RAM a esa unidad virtual; con la experiencia a futuro aumentaras o disminuirás la cantidad según sean tus necesidades
ahora para terminar de configurar ejecutamos:
# mkdir /ram_qmailqueue
# mount -a
# chmod 750 /ram_qmailqueue
# chown qmailq:qmail /ram_qmailqueue
# cd /var/qmail/
# mv queue queue_bak
# ln -s /ram_qmailqueue /var/qmail/queue
# rsync -av /var/qmail/queue_bak/* /ram_qmailqueue
IMPORTANTE, al reiniciar el servidor el disco en RAM estara vacio, asi que es importante volver a ejecutar el rsync; un modo comodo es editar /etc/init.d/qmail buscar start(){ y despues incluir el comando; asi cada vez que inicie se verificara que existan los archivos necesarios
una opción es pasar la cola de correo a una unidad en RAM y aquí te presento como hacerlo
edita /etc/fstab
# nano /etc/fstab
y agrega
none /ram_qmailqueue tmpfs defaults,size=100m,nr_inodes=999k,mode=775 0 0
en este caso se le asignaron 100Mb de RAM a esa unidad virtual; con la experiencia a futuro aumentaras o disminuirás la cantidad según sean tus necesidades
ahora para terminar de configurar ejecutamos:
# mkdir /ram_qmailqueue
# mount -a
# chmod 750 /ram_qmailqueue
# chown qmailq:qmail /ram_qmailqueue
# cd /var/qmail/
# mv queue queue_bak
# ln -s /ram_qmailqueue /var/qmail/queue
# rsync -av /var/qmail/queue_bak/* /ram_qmailqueue
IMPORTANTE, al reiniciar el servidor el disco en RAM estara vacio, asi que es importante volver a ejecutar el rsync; un modo comodo es editar /etc/init.d/qmail buscar start(){ y despues incluir el comando; asi cada vez que inicie se verificara que existan los archivos necesarios
viernes, 13 de julio de 2012
apache No space left on device y si hay espacio en disco
Situación: Apache no inicia el log muestra
Cantidad de semáforos configurados actualmente:
[Fri Jul 13 22:03:17 2012] [emerg] (28)No space left on device: mod_fcgid: Can't create global fcgid-pipe mutex
[Fri Jul 13 22:07:05 2012] [notice] suEXEC mechanism enabled (wrapper: /usr/sbin/suexec)
[Fri Jul 13 22:07:05 2012] [error] (28)No space left on device: Cannot create SSLMutex
Configuration Failed
pero si hay espacio en disco
# df -h
S.ficheros Size Used Avail Use% Montado en
/dev/xvda2 77G 17G 57G 23% /
tmpfs 1,5G 0 1,5G 0% /dev/shm
/dev/xvda1 97M 49M 44M 53% /boot
y si hay nodos
# df -hi
S.ficheros Inodes IUsed IFree IUse% Montado en
/dev/xvda2 4,9M 224K 4,7M 5% /
tmpfs 367K 1 367K 1% /dev/shm
/dev/xvda1 26K 44 26K 1% /boot
El problema esta en los semáforos, los cuales se terminaron;
¿Qué es un semáforo? En palabras sencillas es una bandera que esta en el sistema operativo la cual utiliza para pausar ejecuciones con la finalidad de sincronizarlas; por ejemplo una aplicación pudiera estar esperando un semáforo de un servicio de disco duro indicándole que la información esta lista, tan pronto el semáforo se pone en verde la aplicación continua su ejecución.
Comprobar si el problema son semáforos:
Cantidad de semáforos ejecutados globalmente
# ipcs -s | grep -c .
Cantidad de semáforos ejecutados por apache
# ipcs -s |grep apache | grep -c .
# sysctl -a | grep sem
kernel.sem = 200 32000 32 128
Solución
Ejecutar:
# ipcs -s | grep apache | awk ' { print $2 } ' | xargs ipcrm sem
reiniciar apache y listo.
en lo personal me agrada editar /etc/init.d/httpd
busquen start() y despúes de ahí agrego el comando de eliminar semáforos existentes
....
# when not running is also a failure. So we just do it the way init scripts
# are expected to behave here.
start() {
ipcs -s | grep apache | perl -e 'while (<STDIN>) { @a=split(/\s+/); print `ipcrm sem $a[1]`}',
....
....
Por otro lado si tu servidor cuenta con mucho tráfico se incremente la probabilidad de repetir el problema y para evitarlo podemos aumentar la cantidad de semáforos editando /etc/sysctl.conf , agrego:
kernel.sem = 250
y ejecuto:
# sysctl -p
el valor por default son 200, si realmente tienes mucha carga de trabajo puedes probar con una cantidad mayor, pero sin exagerar.
viernes, 6 de julio de 2012
Agregando mi sitio a google
Para agregar tu sitio a google es muy sencillo, solo rellena el siguiente formulario
http://www.google.com/addurl.html
y listo
http://www.google.com/addurl.html
y listo
como bloquear china, rusia, korea y otros países con iptables
Un gran problema son los contantes ataques y escaneos de bots, una solución es bloquear los países más conflictivos y que no contamos con relación comercial o similar con ellos.
Hace tiempo encontré un buen script, ya no recuerdo la fuente pero aquí se los dejo.
#EDITAR LISTAS DE PAISES DESEADOS
ISO="af cn ru nl pl kr"
### Set PATH ###
IPT=/sbin/iptables
WGET=/usr/bin/wget
EGREP=/bin/egrep
### No editing below ###
SPAMLIST="countrydrop"
ZONEROOT="/root/iptables"
DLROOT="http://www.ipdeny.com/ipblocks/data/countries"
cleanOldRules(){
$IPT -F
$IPT -X
$IPT -t nat -F
$IPT -t nat -X
$IPT -t mangle -F
$IPT -t mangle -X
$IPT -P INPUT ACCEPT
$IPT -P OUTPUT ACCEPT
$IPT -P FORWARD ACCEPT
}
# create a dir
[ ! -d $ZONEROOT ] && /bin/mkdir -p $ZONEROOT
# clean old rules
cleanOldRules
# create a new iptables list
$IPT -N $SPAMLIST
for c in $ISO
do
# local zone file
tDB=$ZONEROOT/$c.zone
# get fresh zone file
$WGET -O $tDB $DLROOT/$c.zone
Hace tiempo encontré un buen script, ya no recuerdo la fuente pero aquí se los dejo.
#EDITAR LISTAS DE PAISES DESEADOS
ISO="af cn ru nl pl kr"
### Set PATH ###
IPT=/sbin/iptables
WGET=/usr/bin/wget
EGREP=/bin/egrep
### No editing below ###
SPAMLIST="countrydrop"
ZONEROOT="/root/iptables"
DLROOT="http://www.ipdeny.com/ipblocks/data/countries"
cleanOldRules(){
$IPT -F
$IPT -X
$IPT -t nat -F
$IPT -t nat -X
$IPT -t mangle -F
$IPT -t mangle -X
$IPT -P INPUT ACCEPT
$IPT -P OUTPUT ACCEPT
$IPT -P FORWARD ACCEPT
}
# create a dir
[ ! -d $ZONEROOT ] && /bin/mkdir -p $ZONEROOT
# clean old rules
cleanOldRules
# create a new iptables list
$IPT -N $SPAMLIST
for c in $ISO
do
# local zone file
tDB=$ZONEROOT/$c.zone
# get fresh zone file
$WGET -O $tDB $DLROOT/$c.zone
# country specific log message
SPAMDROPMSG="$c Country Drop"
# get
BADIPS=$(egrep -v "^#|^$" $tDB)
for ipblock in $BADIPS
do
$IPT -A $SPAMLIST -s $ipblock -j LOG --log-prefix "$SPAMDROPMSG"
$IPT -A $SPAMLIST -s $ipblock -j DROP
done
done
# Drop everything
$IPT -I INPUT -j $SPAMLIST
$IPT -I OUTPUT -j $SPAMLIST
$IPT -I FORWARD -j $SPAMLIST
# call your other iptable script
# /path/to/other/iptables.sh
exit 0
creen un .sh con ese contenido, asignen permiso 700 o 755 y ejecuten, tardara varios minutos así que no desesperen
lunes, 2 de julio de 2012
myisam vs innodb, como decidir?
A simple vista la pregunta eterna, y he aquí una respuesta fácil y rápida
No te compliques si no tienes una necesidad muy especial
Utiliza innodb cuando tengas mucha escritura o requieres que se elimine o actualice información en cascada automáticamente.
Utiliza myisam cuando exista poca escritura y se notará mucho más rápido
así de fácil.
No te compliques si no tienes una necesidad muy especial
Utiliza innodb cuando tengas mucha escritura o requieres que se elimine o actualice información en cascada automáticamente.
Utiliza myisam cuando exista poca escritura y se notará mucho más rápido
así de fácil.
viernes, 22 de junio de 2012
buscar y localzar c99shell de modo automatico
Es común que los hosting compartidos tengan problemas con scripts como el c99shell, el cual permite administrar contenido, algunas cosas como instalar y ejecutar codigo y más; todo dependiendo de nuestra configuración
Aquí una captura
Les presento un script que permite buscar buscarlo y enviarnos un reporte por email el cual podemos colocar en cron
para cPanel
# find /home/*/public_html -name "*.php" -exec grep -i "c99shell" {} \; -print > /tmp/lista_shell.txt
# cat /tmp/lista_shell.txt | uuencode /tmp/lista_wp.txt | mail -s "c99shell encontrados" mi_correo@midominio.com
o para Plesk
# find /var/www/vhosts/*/httpdocs -name "*.php" -exec grep -i "c99shell" {} \; -print > /tmp/lista_shell.txt
# cat /tmp/lista_shell.txt | uuencode /tmp/lista_wp.txt | mail -s "c99shell encontrados" mi_correo@midominio.com
Aquí una captura
Les presento un script que permite buscar buscarlo y enviarnos un reporte por email el cual podemos colocar en cron
para cPanel
# find /home/*/public_html -name "*.php" -exec grep -i "c99shell" {} \; -print > /tmp/lista_shell.txt
# cat /tmp/lista_shell.txt | uuencode /tmp/lista_wp.txt | mail -s "c99shell encontrados" mi_correo@midominio.com
o para Plesk
# find /var/www/vhosts/*/httpdocs -name "*.php" -exec grep -i "c99shell" {} \; -print > /tmp/lista_shell.txt
# cat /tmp/lista_shell.txt | uuencode /tmp/lista_wp.txt | mail -s "c99shell encontrados" mi_correo@midominio.com
jueves, 21 de junio de 2012
script para detectar archivos malignos en wp-content/uploads
Un problema de wordpress son las fallas en versiones antiguas y plugins defectuosos haciendo que el atacante publique archivos en la carpeta wp-content/uploads con los cuales posteriormente realizara travesuras
les presento un script que sirve para detectarlos y enviar un reporte por email, creen un archivo.sh con lo siguiente, y ejecutenlo en cron para que les de un reporte diario a su correo
para Cpanel
du -a /home/*/www/wp-content/uploads | grep php > /tmp/lista_wp.txt
cat /tmp/lista_wp.txt | uuencode /tmp/lista_wp.txt | mail -s "Maliciosos Wordpress" mi_correo@midominio.com
les presento un script que sirve para detectarlos y enviar un reporte por email, creen un archivo.sh con lo siguiente, y ejecutenlo en cron para que les de un reporte diario a su correo
para Cpanel
du -a /home/*/www/wp-content/uploads | grep php > /tmp/lista_wp.txt
cat /tmp/lista_wp.txt | uuencode /tmp/lista_wp.txt | mail -s "Maliciosos Wordpress" mi_correo@midominio.com
para Plesk
du -a /var/www/vhosts/*/httpdocs/wp-content/uploads | grep php > /tmp/lista_wp.txt
cat /tmp/lista_wp.txt | uuencode /tmp/lista_wp.txt | mail -s "Maliciosos Wordpress" mi_correo@midominio.com
cat /tmp/lista_wp.txt | uuencode /tmp/lista_wp.txt | mail -s "Maliciosos Wordpress" mi_correo@midominio.com
agregenlo una vez por día en cron y listo.
proteger wordpress carpeta upload desactivando php
Un gran problema al administrar un servidor compartido es encontrar que subieron archivos a la carpeta wp-content/uploads y lo peor es que son archivos maliciosos en php, así que la solución es desactivar la ejecución de php y redireccionarlos a portada
Para ello agregamos lo siguiente en la configuración de apache
en cpanel
<Directory "/home/*/public_html/wp-content/uploads">
php_admin_flag engine off
AllowOverride None
DirectoryIndex Off
RewriteEngine On
RewriteRule \.php$ - [F,L]
</Directory>
#segundo disco con paginas
<Directory "/disco2/*/public_html/wp-content/uploads">
php_admin_flag engine off
AllowOverride None
DirectoryIndex Off
RewriteEngine On
RewriteRule \.php$ - [F,L]
</Directory>
en plesk
#plesk solo utiliza un disco
<Directory "/var/www/vhosts/*/httpdocs/wp-content/uploads">
php_admin_flag engine off
AllowOverride None
DirectoryIndex Off
RewriteEngine On
RewriteRule \.php$ - [F,L]
</Directory>
reiniciamos apache y listo.
Para ello agregamos lo siguiente en la configuración de apache
en cpanel
<Directory "/home/*/public_html/wp-content/uploads">
php_admin_flag engine off
AllowOverride None
DirectoryIndex Off
RewriteEngine On
RewriteRule \.php$ - [F,L]
</Directory>
#segundo disco con paginas
<Directory "/disco2/*/public_html/wp-content/uploads">
php_admin_flag engine off
AllowOverride None
DirectoryIndex Off
RewriteEngine On
RewriteRule \.php$ - [F,L]
</Directory>
en plesk
#plesk solo utiliza un disco
<Directory "/var/www/vhosts/*/httpdocs/wp-content/uploads">
php_admin_flag engine off
AllowOverride None
DirectoryIndex Off
RewriteEngine On
RewriteRule \.php$ - [F,L]
</Directory>
reiniciamos apache y listo.
jueves, 14 de junio de 2012
Optimizando el uso de swap
Algunas veces aun contando con suficiente memoria RAM vemos que existe algo de swap, he aquí un ejemplo
# free -m
total used free shared buffers cached
Mem: 2928 2869 59 0 26 1688
-/+ buffers/cache: 1154 1774
Swap: 2047 460 1587
# free -m
total used free shared buffers cached
Mem: 2928 2869 59 0 26 1688
-/+ buffers/cache: 1154 1774
Swap: 2047 460 1587
Se preguntaran como es posible que si hay 1774M de memoria libre exista 460M de memoria en swap, como verán existen 1688M en cache. ¿Porque Linux prefirio utilizar swap a vaciar el cache? Parte de la respuesta esta en este sitio, si no desean leerlo el resumen es: existen variables que dan preferencia de uso a la memoria.
¿Como forzar que prefiera la memoria RAM a swap?
Edita /etc/sysctl.conf y agrega:
vm.swappiness = 20
En el reportaje original utilizaron de valor en parámetro 30, pero en lo personal a mi me da mejor resultado 20 para servidores de hosting en los cuales tengo suficiente memoria RAM adicional
para aplicar el cambio ejecutemos lo siguiente :
# sysctl -p
El parametro acepta valores del 0 al 100, en donde 0 es procurar no utilizar swap y 100 es liberar RAM utilizando swap, y su valor predeterminado es 60.
lunes, 11 de junio de 2012
Plesk error log y sitios en blanco
Si tienes Plesk 8, Plesk 9 o Plesk 10 con 300, 500 , 1000 o más dominios posiblemente tendrás el problema de:
Causa: apache por default solo puede abrir hasta 1024 archivos, cada dominio requiere minimo 2 archivos para los logs, si es https requiere minimo 4.
Como ver puedo ver la cantidad de archivos abiertos? ejecuta:
# ls -l /proc/`pidof -s httpd`/fd | wc -l
lo mas probable es que estés poco arriba de 1024.
Solución: ejecutar en shell
Plesk 8 y 9
# mysql -uadmin -p`cat /etc/psa/.psa.shadow` psa -e "replace into misc (param,val) values ('apache_pipelog', 'true');"
# /usr/local/psa/admin/sbin/websrvmng --reconfigure-all
Referencia Técnica Plesk
- Falla webmail horde y atmail
- Algunos sitios en blanco
- Apache no inicia, error unable to open logs
Causa: apache por default solo puede abrir hasta 1024 archivos, cada dominio requiere minimo 2 archivos para los logs, si es https requiere minimo 4.
Como ver puedo ver la cantidad de archivos abiertos? ejecuta:
# ls -l /proc/`pidof -s httpd`/fd | wc -l
lo mas probable es que estés poco arriba de 1024.
Solución: ejecutar en shell
Plesk 8 y 9
# mysql -uadmin -p`cat /etc/psa/.psa.shadow` psa -e "replace into misc (param,val) values ('apache_pipelog', 'true');"
# /usr/local/psa/admin/sbin/websrvmng --reconfigure-all
Plesk 10
# mysql -uadmin -p`cat /etc/psa/.psa.shadow` psa -e "replace into misc (param,val) values ('apache_pipelog', 'true');"
# /usr/local/psa/admin/sbin/httpdmng --reconfigure-all
# /usr/local/psa/admin/sbin/httpdmng --reconfigure-all
Referencia Técnica Plesk
sábado, 9 de junio de 2012
Plesk ERROR: Sub client removal failed: Unable to find service node for web service on domain with id=51
Error de Plesk al eliminar dominio
Plesk ERROR: Sub client removal failed: Unable to find service node for web service on domain with id=51
Solución para eliminar:
ejecutar en mysql
update domains set htype='none' where id=51;
IMPORTANTE REMPLAZAR EL NUMERO DE ID
Plesk ERROR: Sub client removal failed: Unable to find service node for web service on domain with id=51
Solución para eliminar:
ejecutar en mysql
update domains set htype='none' where id=51;
IMPORTANTE REMPLAZAR EL NUMERO DE ID
qmail en segundo disco duro con Plesk
Primero editemos /etc/psa/psa.conf
# Qmail directory
QMAIL_ROOT_D /disco_correo/qmail
# Location of qmail maildirs
PLESK_MAILNAMES_D /disco_correo/qmail
Ejecutamos en shell
# rsync -vrplogDtH /var/qmail/mailnames/ /disco_correo/qmail
# service psa restart
# /usr/local/psa/admin/sbin/mchk --without-spam
# Qmail directory
QMAIL_ROOT_D /disco_correo/qmail
# Location of qmail maildirs
PLESK_MAILNAMES_D /disco_correo/qmail
Ejecutamos en shell
# rsync -vrplogDtH /var/qmail/mailnames/ /disco_correo/qmail
# service psa restart
# /usr/local/psa/admin/sbin/mchk --without-spam
# service qmail restart
# service courier-imap restart
y listo
Plesk, regenerando configuración de un dominio o todo el servidor
Para regenerar toda la configuración es:
# /usr/local/psa/admin/bin/httpdmng --reconfigure-all
o para regenerar un solo dominio es:
# /usr/local/psa/admin/bin/httpdmng --reconfigure-domain eldominio.com
# /usr/local/psa/admin/bin/httpdmng --reconfigure-all
o para regenerar un solo dominio es:
# /usr/local/psa/admin/bin/httpdmng --reconfigure-domain eldominio.com
Plesk, moviendo apache a otro disco duro
Primero editen /etc/psa/psa.conf
# Virtual hosts directory
HTTPD_VHOSTS_D /disco_2/web
El domando es sencillo, solo ejecuten:
# /usr/local/psa/bin/transvhosts.pl --source-dir /var/www --dest-dir /disco_2/web --correct-scripts
reinicien plesk y listo
# service psa restart
y listo
# Virtual hosts directory
HTTPD_VHOSTS_D /disco_2/web
El domando es sencillo, solo ejecuten:
# /usr/local/psa/bin/transvhosts.pl --source-dir /var/www --dest-dir /disco_2/web --correct-scripts
reinicien plesk y listo
# service psa restart
y listo
jueves, 7 de junio de 2012
Certificado SSL para panel Plesk
Importante: nota original aqui, este escrito es un copy&paste:
Os dejo un truco para instalar un certificado gratuito StartSSL en Plesk.
1.- Os validáis en plesk, vais al dominio y picáis en certificados
2.- Añadir nuevo certificado, rellenáis los datos (os recomiendo usar 2048 bits) y le dais a la opción solicitud. Ésto os generará la llave CSR y la llave privada.
3.- Id a Startssl.com, cread una cuenta y acceded al panel de control. Lo primero que tenéis que hacer es validar el dominio correspondiente en la opción validations wizard -> domain name validation.
4.- Entráis el dominio y os aparecerán varias direcciones de vinculadas al domnio (hostmaster, webmaster y las que puedan aparecer en los contactos del registro del dominio)
5.- Recibiréis en la cuenta seleccionada de email una clave que deberéis introducir en la casilla de verificación. Ya está validado el dominio.
6.- Validations wizard -> web server SSL certificate. En este paso os pide una nueva clave y el nivel de cifrado, pues bien, NO PONGÁIS NADA! Esta opción es para generar una llave que ya tenemos. Por lo tanto, dadle a la opción skip.
7.- Submit Certificate Request (CSR) -> Aquí pegáis la firma CSR que os ha generado Plesk.
8.- Seleccionáis el dominio y ponéis en subdominio www. Cuando acabáis obtenéis el certificado, el cual lo pasáis a pegar en plesk. Ojo, lo pegáis en “certificado”, no en “CA certificado”. Ya casi tenemos el certificado listo .
9.- Bajáis los dos certificados raíz de StartSSL. El primero es el intermediario (https://www.startssl.com/certs/sub.class1.server.ca.pem) y el segundo el raíz (https://www.startssl.com/certs/ca.pem).
10.- Copiáis los dos ficheros bajados en uno solo:
root# cat ca.pem sub.class1.server.ca.pem > catoot.pem
11.- Subís el fichero caroot.pem a Plesk, pero esta vez podéis usar la opción de enviar archivos de certificado. Una vez enviáis el archivo, ya tenéis el certificado completamente instalado.
12.- En Plesk os vais a servidor -> alias IP -> Seleccionáis la IP -> escogéis el nuevo certificado.
13.- Paráis apache y lo volvéis a iniciar (mejor que reiniciar) … y ya está !
14.- Abre todos los navegadores que tengas y comprueba tu trabajo
miércoles, 6 de junio de 2012
Distribucion linux para servidores
Muchos preguntan cual es la mejor distribución y eso es todo un tema de debate, así que para no entrar en debate eterno solo diré que prefiero CentOS por ser una distribución estable y con buen soporte tanto en aplicaciones de código abierto hasta en soluciones comerciales.
Ademas que parte de su filosofía es tener una larga vida útil, así no habrá problema que cada 3-6 meses sale una nueva versión en la cual el único camino es reinstalar.
¿y a ti cual te gusta y porque?
Ademas que parte de su filosofía es tener una larga vida útil, así no habrá problema que cada 3-6 meses sale una nueva versión en la cual el único camino es reinstalar.
¿y a ti cual te gusta y porque?
martes, 5 de junio de 2012
20 Consejos para Mejorar tu MySQL que quizás no conocías
Las operaciones sobre bases de datos suelen ser los principales cuellos de botella en las aplicaciones web. Por tanto es tarea de los programadores estructurar apropiadamente, escribir peticiones apropiadas, y programar mejor código. A continuación mostramos algunas técnicas de optimización MySQL.
1. Optimiza tus peticiones para la caché.
La mayoría de servidores MySQL tienen habilitado el sistema de caché. Es uno de los métodos más efectivos para mejorar el rendimiento, que vienen de la mano del motor de base de datos. Cuando la misma petición se ejecuta varias veces, el resultado se obtiene de la caché, que resulta mucho más rápida.
El problema es que, es tan sencillo y transparente para el programador, que la mayoría de nosotros tendemos a ignorarlo. Algunas cosas que hacemos de hecho pueden evitar que la caché haga su trabajo.
- //La cache NO funciona
- // La caché sí funciona
la razón por la que no funciona en el primer caso es por el uso de CURDATE(). Puede aplicarse a todas las funciones no deterministas, como NOW() y RAND(). Dado que el resultado retornado por la función puede cambiar, MySQL decide deshabitar la caché en esa consulta.
2. Usa EXPLAIN en tus consultas SELECT
Utilizar la palabra clave EXPLAIN te dará muchos detalles internos de lo que hace MySQL para ejecutar tu consulta. Esto te puede ayudar a detectar los cuellos de botella y otros problemas con tu query o la estructura de la tabla.
El resultado de una query EXPLAIN te mostrará los índices que se están utilizando, cómo se está explorando la tabla, cómo se está ordenando, etc…
Coge una consulta SELECT (preferiblemente una compleja, con uniones), y añade la palabra EXPLAIN al principio del todo. Puedes utilizar por ejemplo PhpMyAdmin para esto. Te devolverá los resultados en una sencilla tabla. Por ejemplo, pongamos que me he olvidado de poner un índice a una columna, con la que estoy ejecutando
Después de añadir el índice al campo group_id:
Ahora en lugar de escanear 7883 filas, sólo escaneará 9 y 16 filas de las dos tablas.
3. Usa LIMIT 1 Cuando sólo quieras una única fila.
A veces, cuando estás realizando consultas a tus tablas, ya sabes que sólo necesitas una única fila. En estos casos debes solicitar a la base de datos un único resultado, o de lo contrario comprobará todos y cada uno de las coincidencias de la cláusula WHERE.
En estos casos, añadir LIMIT 1 a tu query puede mejorar significativamente la velocidad. De esta forma la base de datos dejará de escanear resultados en el momento que encuentre uno, en lugar de recorrer toda la tabla o un índice.
- // Tengo usuarios de Valencia?
- // lo que NO hay que hacer:
- // …
- }
- // mucho mejor:
- // …
- }
4. Indexa los campos de Búsqueda
Los índices no son sólo para las claves primarias o las claves únicas. Si en tu tabla hay columnas sobre las que vas a realizar búsquedas, deberías indexarlas casi siempre.
Como puedes ver, esta regla se aplica también a las búsquedas parciales como “apellido LIKE ‘a%’”. Cuando se busca desde el comienzo de la cadena, MySQL es capaz de utilizar el índice de esta columna.
Deberías también comprender en qué tipos de búsqueda no pueden utilizarse índices normales. Por ejemplo, cuando buscas una palabra dentro de un texto (p.e. “WHERE contenido LIKE ‘%manzana%’”), no observarás ningún beneficio con un índice normal. En este caso sería mejor utilizar una búsqueda FULLTEXT o construir tu propia solución de indexación.
5. Indexa, y utiliza el mismo tipo de columna para los Join
Si tu aplicación contiene muchas sentencias JOIN debes asegurarte de que las columnas que unes están indexadas en ambas tablas. Esto afecta en cómo MySQL optimiza internamente las operaciones JOIN.
Además, las columnas que vas a unir deben ser del mismo tipo. Por ejemplo, si estás uniendo una columna de tipo DECIMAL con una columna de tipo INT de otra tabla, MySQL no será capaz de usar al menos uno de los dos índices. Incluso la codificación de caracteres necesita ser del mismo tipo para las columnas de tipo String.
- // buscando compañias en mi ciudad
- LEFT JOIN companyias ON (usuarios.ciudad = companyias.ciudad)
- WHERE usuarios.id = $user_id");
- // ambas columnas ciudad deben estar indexadas
- // y ambas deberían ser del mismo tipo y codificación de caracteres
- // o MySQL tendrá que hacer un escaneo total de las tablas
6. No uses ORDER BY RAND()
Éste es uno de esos truquillos que suenan muy bien a primera vista, y donde muchos programadores novatos suelen caer. Puede que no hayas caído en la cuenta del increíble cuello de botella que se puede provocar si utilizas esta técnica en tus peticiones.
Si en verdad necesitas tablas aleatorias para tu resultado, hay formas mucho mejores de hacerlo. Está claro que ocuparán más código, pero estarás previniendo un posible embotellamiento que aumenta exponencialmente a medida que tu contenido crece. El problema es que MySQL tendrá que ejecutar RAND() (que requiere de potencia de procesado) para cada una de las filas antes de ordenarlas y devolver una simple fila.
- // la forma de NO hacerlo:
- // mucho mejor:
De forma que seleccionas un número aleatorio inferior a la cantidad de resultados y lo usas como el desplazamiento en la cláusula LIMIT.
7. Evita SELECT *
Cuanta más información se lee de las tablas, más lenta se ejecutará la petición SQL. Aumenta el tiempo que toma para las operaciones en disco. Además cuando el servidor de bases de datos está separado del servidor web, tendrás mayores retrasos de red debido a que la información tiene que ser transferida entre ambos servidores.
Es un buen hábito especificar siempre las columnas que necesitas cuando estás haciendo un SELECT.
8. Ten casi siempre un campo identificativo
Ten en cada tabla una columna id con las propiedades PRIMARY KEY, AUTO_INCREMENT y alguna de las variantes de INT. Además es preferible que sea UNSIGNED (sin signo) ya que el valor nunca podrá ser negativo.
Incluso si tienes una tabla de usuarios cuyos nombres de usuario sean únicos, no los uses como clave primaria. Los campos VARCHAR como clave primaria son muy lentos. Y tendrás una mejor estructura en tu código si referencias a todos tus usuarios por sus ids internamente.
También hay una serie de operaciones internas que realiza el motor de MySQL por sí mismo, que usa la clave primaria, lo cual se hace incluso más importante cuanto más compleja sea la base de datos (clusters, particionados, etc…).
Una posible excepción a la regla son las “tablas de asociación”, utilizadas en las relaciones “muchos a muchos” entre dos tablas. Por ejemplo, una tabla “etiquetas_articulos” que contiene dos columnas: id_articulo, id_etiqueta, que es utilizada para las relaciones entre las tablas “articulos” y “etiquetas”. Estas tablas pueden tener una clave PRIMARY que contenga ambos campos.
9. Usa ENUM antes que VARCHAR
Las columnas de tipo ENUM son muy rápidas y compactas. Internamente se almacenan como TINYINT, aunque pueden contener y representar valores de cadenas. Esto las hace un perfecto candidato para algunos campos.
Si tienes un campo que contendrá sólo unos pocos valores distintos, utiliza ENUM en lugar de VARCHAR. Por ejemplo, podría ser una columna llamada “estado”, y sólo unos pocos valores como “activo”, “inactivo”, “pendiente”, “caducado”, etc…
De hecho hay una forma de obtener sugerencias del propio MySQL para reestructurar nuestra tabla. Cuando tienes un campo VARCHAR te puede sugerir que cambies ésa columna al tipo ENUM. Esto se hace utilizando la llamada a PROCEDURE ANALYSE(). Lo cual nos lleva a:
10. Obtén sugerencias con PROCEDURE ANALYSE()
PROCEDURE ANALYSE() permitirá a MySQL analizar la estructura de las columnas y los datos actuales que contienen para retornar ciertas sugerencias que serán de tu interés. Sólo es útil si hay información en las tablas, porque esto toma gran importancia en la toma de decisiones.
Por ejemplo, si creaste un campo INT para tu clave primaria, pero no tienes muchas filas, podría sugerirte que uses MEDIUMINT en su lugar. O si estas usando un campo VARCHAR, podría sugerirte que lo conviertas en ENUM, si sólo estás escribiendo unos pocos valores.
También puedes ejecutarlo pulsando en “Propose table structure” (proponer estructura de tabla) en la interfaz de PhpMyAdmin, en una de las vistas de tus tablas.
Ten presente que esto son sólo sugerencias. Y si tu tabla va a crecer mucho, podrían no ser buenas sugerencias a seguir. La decisión es tuya en última instancia.
11. Usa NOT NULL si puedes
A no ser que tengas una razón específica para usar el valor NULL, deberías establecer siempre tus columnas como NOT NULL.
En primer lugar, pregúntate a tí mismo si habría alguna diferencia entre tener una cadena vacía y un valor NULL (o para campos INT: 0 contra NULL). Si no hay problema entre los dos valores, no necesitas un campo NULL. (¿Sabías que Oracle considera a NULL y una cadena vacía como lo mismo?)
Las columnas NULL necesitan espacio adicional y pueden añadir complejidad a tus sentencias de comparación. Simplemente evítalas siempre que puedas. En cualquier caso, entiendo que en algunos casos muy específicos haya razón para usar columnas NULL, lo cual no es siempre algo malo.
Extraído de la documentación de MySQL:
“las columnas NULL requieren espacio adicional en la fila a grabar donde los valores son NULL. Para las tablas MyISAM, cada columna NULL toma un bit extra, redondeando hacia arriba al byte más cercano.”
12. Declaraciones preparadas
Existen múltiples beneficios al usar declaraciones preparadas, tanto a nivel de productividad como de seguridad.
Las declaraciones preparadas filtran las variables que le pasas por defecto, lo que es perfecto para proteger tu aplicación contra ataques de inyección SQL. Claro que puedes filtrar tus variables manualmente, pero estos métodos son propensos al error humano y al despiste del programador. Este problema no es tan acentuado cuando se utiliza algún tipo de Framework u ORM.
Ya que queríamos centrarnos en la productividad, deberíamos mencionar los beneficios que ofrece este area. Estos beneficios son más significativos cuando la misma consulta va a utilizarse varias veces en tu aplicación. Puedes asignar diferentes valores a una misma declaración, y MySQL sólo tendrá que analizarla una vez.
Además, las últimas versiones de MySQL transmiten declaraciones preparadas de forma binaria nativamente, más eficientes y que ayudan a reducir los retrasos de red.
Hubo un tiempo en que muchos programadores solían evitar las declaraciones preparadas a propósito, por una única razón: no estaban siendo cacheadas por la caché de consultas de MySQL. Pero aproximadamente en la versión 5.1, el cacheo de consultas también ha sido soportado.
Para utilizar declaraciones preparadas en PHP puedes echar un ojo a la extensión mysqli o utilizar una capa de abstracción de base de datos como PDO.
- // creamos la declaración preparada
- if ($stmt = $mysqli->prepare("SELECT nombre FROM usuarios WHERE ciudad=?")) {
- // pasamos los parámetros
- $stmt->bind_param("s", $ciudad);
- // ejecutamos
- $stmt->execute();
- // pasamos la variable de resultado
- $stmt->bind_result($nombre);
- // obtenemos el resultado
- $stmt->fetch();
- $stmt->close();
- }
13. Consultas fuera de buffer
Normalmente cuando estás ejecutando una consulta en un script, éste se esperará a que acabe la ejecución de esta consulta antes de que pueda continuar. Pero puedes cambiar este comportamiento sacando la consulta fuera del búffer.
Puedes echar un ojo a la genial explicación que hacen en la documentación de PHP para la función the mysql_unbuffered_query():
“mysql_unbuffered_query() envía la query SQL a MySQL, sin recuperar ni colocar en búfer las filas de resultado automáticamente, como mysql_query() lo hace. Por una parte, esto ahorra una considerable cantidad de memoria con las consultas SQL que producen conjuntos grandes de resultados y se puede empezar a trabajar con el conjunto de resultado inmediatamente después de que la primera fila ha sido recuperada: no necesita esperar hasta que la consulta SQL completa haya sido ejecutada. Para usar mysql_unbuffered_query() cuando se usan múltiples conexiones con la BD, se necesita indicar el parámetro opcional link_identifier para identificar que conexión se desea utilizar.”
Sin embargo los beneficios de mysql_unbuffered_query() tienen un precio: no poder usar mysql_num_rows() ni mysql_data_seek() en un conjunto de resultados devuelto por mysql_unbuffered_query(). También tendrás que recuperar todas las filas de resultado de una consulta SQL sin búfer antes de poder enviar una nueva consulta SQL a MySQL.
14. Almacena las direcciones IP como UNSIGNED INT
Muchos programadores crearían un campo VARCHAR(15) sin darse cuenta de que pueden almacenar las direcciones IP como números enteros. Cuando usas un INT sólo haces uso de 4 bytes en la memoria, y cuenta además con un tamaño fijo en la tabla.
Pero hay que asegurarse de que la columna sea UNSIGNED INT (entero sin signo) porque las direcciones IP hacen uso de todo el rango de 32 bits sin signo.
En tus consultas puedes utilizar la función INET_ATON() para convertir una dirección IP en entero, e INET_NTOA() para hacer lo contrario. También existen funciones parecidas en PHP llamadas ip2long() y long2ip().
- $r = "UPDATE users SET ip = INET_ATON(‘{$_SERVER['REMOTE_ADDR']}’) WHERE user_id = $user_id";
15. Las tablas de tamaño fijo (Estáticas) son más rápidas
Cuando cada una de las columnas en una tabla es de tamaña fijo (“fixed-length”), la tabla entera se considera “estática” o de “tamaño fijo”. Algunos ejemplos de tipos de columna que NO son de tamaño fijo son: VARCHAR, TEXT, BLOB. Si incluyes sólo uno de estos tipos de columna, la tabla dejará de ser de tamaño fijo y tendrá que ser tratada de forma distinta por el motor de MySQL.
Las tablas de tamaño fijo pueden incrementar la productividad porque para el motor de MySQL es más rápido buscar entre sus registros. Cuando quiere leer una fila en concreto de la tabla, puede calcular rápidamente la posición que ocupa. Si el tamaño de fila no es fijo, cada vez que tiene que buscar, ha de consultar primero el índice de la clave primaria.
También resultan más sencillas de cachear, y de reconstruir después de un accidente. Pero por otra parte también podrían ocupar más espacio. Por ejemplo, si conviertes un campo VARCHAR(20) en CHAR(20), siempre ocupará 20 bytes en la memoria independientemente de lo que contenga.
Usando técnicas de “Particionado Vertical”, puedes separar las columnas de tamaño variable en una tabla aparte. Lo cual nos lleva a:
16. Particionado Vertical
El particionado vertical es el acto de separar la estructura de tu tabla de forma vertical por razones de optimización.
Ejemplo 1: Seguramente tendrás una tabla de usuarios que contiene una dirección postal, la cual no se utiliza muy a menudo. Aquí podrías dividir la tabla y almacenar las direcciones en una tabla separada. De esta forma tu tabla de usuarios principal tendría un tamaño más ajustado. Como sabes, cuanto más pequeñas más rápidas son las tablas.
Ejemplo 2: Tienes un campo de “ultimo_acceso” en tu tabla. Se actualiza cada vez que un usuario accede a tu página. Pero cada acceso hace que la cache de consultas de esa tabla se libere. Lo que puedes hacer es colocar este campo en otra tabla para que las modificaciones en tu tabla de usuarios se mantenga al mínimo.
Pero también tienes que asegurarte de que no necesitas juntar las dos tablas constantemente después del particionado o sufrirás una caída en el rendimiento, justo lo contrario a lo que buscábamos.
17. Divide las consultas DELETE o INSERT grandes
Si necesitas ejecutar una consulta DELETE o INSERT que sea grande en una página web activa, tienes que tener cuidado de no alterar el tráfico web. Cuando una consulta grande como esas se ejecuta, puede bloquear tus tablas y paralizar tu aplicación web momentaneamente.
Apache ejecuta muchos procesos/hilos paralelamente. De ahí que funcione mucho más eficientemente cuando los scripts dejan de ejecutarse tan pronto como es posible, para que los servidores no experimenten muchas conexiones abiertas y procesos de una que consumen recursos, especialmente memoria primaria.
Si en algún momento bloqueas tus tablas en un periodo largo (como 30 segundos o más), en una web con mucho tráfico, causarás un apilamiento de procesos y consultas, que llevará mucho tiempo de concluir o que incluso podría estropear tu servidor web.
Si tienes algún script de mantenimiento que tiene que borrar una gran cantidad de filas, simplemente utiliza la cláusula LIMIT para hacerlo en porciones más pequeñas y así evitar la congestión.
- while (1) {
- // finalizado el borrado
- break;
- }
- // incluso viene bien parar un poco
- }
18. Las columnas pequeñas son más rápidas
En los motores de bases de datos, la memoria en disco probablemente sea el cuello de botella más significativo. En términos de productividad, mantener las cosas reducidas y más compactas suele ayudar a reducir la cantidad de transferencia desde disco.
La documentación de MySQL tiene una lista de Requerimientos de Almacenamiento para todos los tipos de dato.
Si está previsto que una tabla tenga muy pocos registros, no hay razón para usar un INT para la clave primaria, en lugar de un MEDIUMINT, SMALLINT o incluso en algunos casos TINYINT. Y si no necesitas el componente del tiempo, puedes utilizar DATE en lugar de DATETIME.
Simplemente, debes asegurarte de que dejas espacio razonable para poder crecer, o podrías acabar como Slashdot.
19. Escoge el motor de almacenamiento adecuado
Los dos principales motores en MySQL son MyISAM y InnoDB, Cada uno tiene sus pros y sus contras.
MyISAM is adecuado para aplicaciones con mucha lectura, pero no escala cuando hay muchas escrituras. Incluso si estás editando un campo de una fila, la tabla completa se bloquea, y ningún otro proceso puede siquiera leer hasta que la consulta ha finalizado. MyISAM es muy rápido calculando consultas de tipo SELECT COUNT(*).
Inno DB tiende a ser un motor más complicado y puede ser más lento que MyISAM para la mayoría de aplicaciones pequeñas. Pero soporta bloqueo basado en fila, lo cual escala mejor. También soporta algunas características más avanzadas como las transacciones.
20. Usa un Mapeador de objetos relacionales
Al usar un ORM (Object Relational Mapper), puedes conseguir algunas mejoras en la productividad. Cualquier cosa que puede hacer un ORM, puedes programarlo a mano también. Pero podría significar demasiado trabajo extra y requerir de un alto nivel de experiencia.
Los ORM son perfectos para la “carga perezosa”. Significa que se puede obtener valores sólo cuando se necesitan. Pero hay que tener cuidado porque podría acabar creando demasiadas mini peticiones que perjudicarían al rendimiento.
Los ORM también pueden agrupar tus consultas en transacciones, que operan mucho más rápido que enviar consultas individuales a la base de datos.
Actualmente un ORM recomendable para PHP es Doctrine. Puedes leer cómo instalarlo en este artículo (inglés).
21. Ten cuidado con las conexiones persistentes
El objetivo de las Conexiones Persistentes es reducir el esfuerzo de reabrir conexiones con MySQL. Cuando se crea una conexión persistente, queda abierta incluso después de que el script haya acabado de ejecutarse. Dado que Apache reutiliza sus procesos hijos, el siguiente script reutilizaría la misma conexión MySQL.
En la teoría suena muy bien. Pero desde mi experiencia personal (y la de muchos otros), esta característica acaba por no merecer la pena. Puedes tener serios problemas con los límites de conexión, problemas de memoria y mucho más.
Apache ejecuta de forma extremadamente paralela, y crea muchos procesos hijo. Esta es la principal razón por la que las conexiones persistentes no funcionan muy bien en este entorno. Antes de que consideres usar la función mysql_pconnect(), consulta a tu administrador de sistemas.
Este escrito fue Copy & Paste de : http://boozox.net/mysql/20-consejos-para-mejorar-tu-mysql-que-quizas-no-conocias/En lo personal no estoy de acuerdo en el punto 20, un ORM comúnmente disminuye el desempeño y solo se debe de utilizar en desarrollos multi-plataforma, si manejas 100% MySQL es 100% mejor las librerías nativas
Suscribirse a:
Entradas (Atom)
Como bloquera archivos adjuntos que son virus en postfix o plesk
Como bloquear adjuntos del correo en Plesk/Postfix 1- edita el archivo /etc/postfix/main.cf 2- busca el parametro mime_header_checks...
-
Activar en plesk nginx En plesk ir al dominio ir a Configuración de Apache y nginx desactivar Modo proxy...
-
Aquí les dejo un ejemplo de un query para mostrar el día de la semana (lunes, martes, miercoles,....) de una fecha almacenada en mysql ...
-
Como bloquear adjuntos del correo en Plesk/Postfix 1- edita el archivo /etc/postfix/main.cf 2- busca el parametro mime_header_checks...