Substituir Apache por nginx en Centos7 + Virtualmin

Somos fanáticos de NGINX, no podemos ocultarlo, es más complicado tunearlo pero los rendimientos son sorprendentes, entre los beneficios que nos da nginx es que no estamos limitados a correr servicios para PHP sino que tambien podemos usar Ruby o cualquier tipo de SOCKET.

Los pasos a seguir son los siguientes:

[bash]
service httpd stop ; chkconfig httpd off
yum install nginx
systemctl start nginx
yum install wbm-virtualmin-nginx wbm-virtualmin-nginx-ssl
[/bash]

 
Login to Virtualmin as root, and go to Webmin -> Servers -> Nginx Webserver and make sure that Nginx and its configuration files are found.
If not, click on the Module Config link and set the config and command paths correctly.

Return to Virtualmin, and go to System Settings -> Features and Plugins.

Un-check the “Apache website” , “SSL website” and “DAV Login”, “Mailman”, “Protected web directories”, “AWstats reporting” and “Subversion repositories” features.

Check the “Nginx website” and “Nginx SSL website” features, then click “Save”.

If Virtualmin reports that any other features cannot be used without Apache, go back and de-select them too.

Go to the System Information page and click Refresh system information in the top right.

Verify that Nginx is shown as running in the “Status” section.

Esto es todo amigos,..

FUENTE: https://www.virtualmin.com/documentation/web/nginx

Instalar un servidor web para alojar páginas webs desde cero

Hola amigos,

Hoy vamos a instalar un servidor web para dar servicio de páginas web y correo electrónico a nuestros clientes.
Lo primero que tenemos que hacer es conseguir un servidor, el mercado tiene un amplio abanico de posibilidades, si quereis algo para hacer unas pruebas, que no sea caro y podáis probar diferentes distribuciones os recomiendo echarle un vistazo a Digital Ocean, son una empresa con años de experiencia, pioneros en la tecnología que implementan y con una infraestructura verdaderamente robusta. Muy pronto van a contar con un Data Center en Gibraltar y la latencia para España va a ser extraordinaria.

La instalación es muy sencilla, los comando son muy pocos los que se necesitan para echar a andar el servidor web, al final de este POST teneis unas notas sobre que hacer después y por donde seguir.
Este post está dedicado a como hacerlo funcionar en un Centos, al día de hoy estamos usando la version 7 a 64bits, pero se puede hacer con Ubuntu el sistema recomendado por este panel de control es la de RedHat o en nuestro caso Centos7.
NOTA: Podeis seguir el ejemplo usando una máquina virtual con programas tales VirtualBox podeis bajaros la distro desde aqui: Centos Mirrors arrancar desde el CD e instalar la version mínima, son solo 600Mb.
Yo en mi caso dispongo de una distribución virtualizada para los desarrollos, luego solo tengo que exportar e importar el servidor virtual en el servidor de producción.

El único requerimiento previo antes de poder instalar el sistema es aseguraros de tener un nombre de HOST válido. Para ello debemos correr el siguiente comando hostname -f y os debe mostrar un nombre de internet válido tipo servidor.dominio.com. Este ha de tener una reversa o de lo contrario los clientes no podrán acceder a tu servidor. Este paso es el más importante. Piensa antes de decir que YES.

Una vez tengamos nuestro Centos7 64bits recien instalado, y hemos comprobado que el Hostname es válido, vamos a poceder a instalar todo nuestros paquetes para convertir este equipo en un autentico servidor web, para ello nos vamos a entrar por ssh al servidor, entra como root en nuestra nueva máquina y vamos a correr los siguientes comandos:

[code]
yum update
# si no teneis wget instalado porque no viene con la instalación mínima de Centos:::
yum install wget
# nos descargamos el instalador de nuestro servidor web
wget http://software.virtualmin.com/gpl/scripts/install.sh
/bin/sh install.sh
[/code]

Esto es todo, pasado unos minutos podemos acceder a nuestro recien creado webserver a través de la dirección https://servidor.dominio.com:10000, solo tendrás que substituir servidor.dominio.com por el hostname que hayas elegido.

Siguientes recomendaciones a seguir:

Cambiar la version de PHP5 a PHP7, podeis seguir este tutorial.
Cambiar la version de MariaDb5 a MariaDb10, tambien tenemos un tutorial a medida.
Cambiar Apache por Nginx, aqui teneis el tutorial (Este paso es para usuario avanzados).
Activar / Instalar FirewallD, la seguridad es muy importante, no menosprecies una buena configuración del firewall.
Instalar Fail2Ban, nos protege de ataques por fuerza bruta.

Limpiar la memoria cache en un servidor linux

Un buena manera de limpiar la cache de memoria sin usar es la siguiente, puede usarse en casi cualquier servidor linux, en mi caso yo uso Centos.

Añade la siguiente linea al cron de la cuenta de Root ejecuntado el comando “crontab -e” hay que entrar por ssh o por medio de la consola de comando si estamos trabajando con un servidor en local.

[bash]
0 * * * * /root/limpiacache.sh
[/bash]

Crea un archivo en la carpeta /root/ con el nombre ‘limpiacache.sh’ y añade las dos siguientes líneas

[bash]
#!/bin/sh
sync; echo 3 > /proc/sys/vm/drop_caches
[/bash]

Dale persmisos de escritura al archivo:

[bash]
chmod +x limpiacache.sh
[/bash]

Tuneando Apache Prefork MPM

Tuning the Apache Prefork MPM

Apache uses a set of values called the Prefork MPM to determine how many servers it will utilize and how many threads each server can process. Out of the box all Apache installations use the same values regardless of whether your server has 512Mb of RAM or 8Gb of RAM. It is important that as the server administrator you configure these values to work with your server load.

The Apache Prefork MPM can be found in the Apache configuration file; usually /etc/httpd/conf/httpd.conf. The default values are…


StartServers 2
MinSpareServers 3
MaxSpareServers 3
ServerLimit 75
MaxClients 75
MaxRequestsPerChild 1000

Each Directive taken from “http://httpd.apache.org/docs/trunk/mod/mpm_common.html” is detailed below.

– – – – – – – – – – – –

The StartServers directive sets the number of child server processes created on startup. As the number of processes is dynamically controlled depending on the load there is usually little reason to adjust this parameter.

– – – – – – – – – – – –

The MinSpareServers directive sets the desired minimum number of idle child server processes. An idle process is one which is not handling a request. If there are fewer than MinSpareServers idle then the parent process creates new children until satisfies the MinSpareServers setting.

– – – – – – – – – – – –

The MaxSpareServers directive sets the desired maximum number of idle child server processes. An idle process is one which is not handling a request. If there are more than MaxSpareServers idle, then the parent process will kill off the excess processes.

– – – – – – – – – – – –

The ServerLimit directive is only used if you need to set MaxClients higher than 256 (default). Do not set the value of this directive any higher than what you might want to set MaxClients to.

– – – – – – – – – – – –

The MaxClients directive sets the limit on the number of simultaneous requests that will be served. Any connection attempts over the MaxClients limit will normally be queued, up to a number based on the ListenBacklog directive. Once a child process is freed at the end of a different request, the connection will then be serviced.

For non-threaded servers (i.e., prefork), MaxClients translates into the maximum number of child processes that will be launched to serve requests. The default value is 256; to increase it, you must also raise ServerLimit.

– – – – – – – – – – – –

The MaxConnectionsPerChild directive sets the limit on the number of connections that an individual child server process will handle. After MaxConnectionsPerChild connections, the child process will die. If MaxConnectionsPerChild is 0, then the process will never expire.

Setting MaxConnectionsPerChild to a non-zero value limits the amount of memory that process can consume by (accidental) memory leakage.

– – – – – – – – – – – –

The single most important directive is MaxClients as this determines the amount of Apache child processes that will be launched to server requests. A simple calculation for MaxClients would be:

(Total Memory – Critical Services Memory) / Size Per Apache process

I define Critical Services as services such as mySQL, Plesk, Cpanel; any service that is required for proper operation of your server.

I’ve used the following commands via shell to determine values for Total Memory, OS Memory, MySQL Memory, and Apache Process Size

TOTAL MEMORY
[root@vps httpd]# free -m
total used free shared buffers cached
Mem: 1002 599 402 0 28 337
-/+ buffers/cache: 233 769
Swap: 2047 124 1922

MYSQL MEMORY
[root@vps httpd]# ps aux | grep ‘mysql’ | awk ‘{print $6}’
408
21440
704

APACHE PROCESS SIZE
[root@vps httpd]# ps aux | grep ‘httpd’ | awk ‘{print $6}’
22468
11552
41492
40868
41120
41696
39488
41704
15552
16076
16084
728

In this case the server has 1002Mb of memory allocated, xx used by the OS itself, 21Mb used by mySQL, and each Apache thread averages about 30Mb.

MaxClients = (1002 – 21) / 30 therefore MaxClients = 32.7

The next important aspect is MaxConnectionsPerChild as this is the amount of threads that will be processed before the child is recycled.

A good calculation for MaxConnectionsPerChild would be:

(total amount of daily requests / total number of daily processes)

Determining these values is a bit more complex as it requires some type of statistics package or thorough knowledge of interpreting Apache access logs.

As this does not adversely effect memory usage, only cpu time to cycle the process if you are unable to determine this information the standard 1000 should be used.

Thus a good configuration for this server would be


StartServers 2
MinSpareServers 3
MaxSpareServers 3
ServerLimit 30
MaxClients 30
MaxRequestsPerChild 1000

Be sure once you’ve saved the file to perform a configuration test before restarting Apache.

[root@vps httpd]# service httpd configtest
Syntax OK

[root@vps httpd]# service httpd restart
Stopping httpd: [ OK ]
Starting httpd: [ OK ]

Algunos trucos para trabajar con el Firewall en Centos

Ver las entradas del firewall

Eliminar entradas del firewall si queremos hacer pruebas es muy sencillo. Para mostrar todas las reglas del firewall con el fin de ver quien tenemos baneados usamos:

[bash]iptables -L[/bash]

nos arrojaría un resultado parecido al siguiente

[bash]
Chain fail2ban-postfix (1 references)
target prot opt source destination
RETURN all — anywhere anywhere

Chain fail2ban-sasl (1 references)
target prot opt source destination
DROP all — xxx.xxx.xxx.xxx anywhere
RETURN all — anywhere anywhere
[/bash]

Eliminar entradas del firewall

Para eliminar la entrada que veamos oportuna podemos hacerlo con este comando substituyendo el nombre del filtro y la dirección ip:

[bash]iptables -D fail2ban-sasl -s xxx.xxx.xxx.xxx -j DROP[/bash]

Trucos para Fail2Ban en Centos

Fail2Ban es una excelente herramienta que se programa para revisar los logs de los distintos programas a intervalos periódicos, si encuentra a través de sus filtros registros que pueden ser sospechosos podemos tomar medidas de seguridad para bloquear el servicio a la ip en cuestión, incluso bloquear por X tiempo cualquier petición de dicha ip sospechosa, etc.

Instalar Fail2ban

Unos sencillos comandos para descargar, descomprimir, installar y configurar… merece la pena.

[bash]
wget https://github.com/downloads/fail2ban/fail2ban/fail2ban_0.8.7.1.orig.tar.gz
tar xzvf fail2ban_0.8.7.1.orig.tar.gz
cd fail2ban-0.8.7.1/
service fail2ban stop
python setup.py install
vi /etc/fail2ban/jail.conf
[/bash]

Configurar Fail2ban

Estos son algunos de los filtros que podemos activar en función de los servicios que corriendo en el servidor:
Para ello editamos el archivo jail.conf, segun la instalacion por defecto de cada distribucion el fichero se encuentra en /etc/fail2ban/jail.conf

[bash]

[ssh-iptables]

enabled = true
filter = sshd
action = iptables[name=SSH, port=ssh, protocol=tcp]
sendmail-whois[name=Fail2banSSH, dest=admin@email.com, sender=root@server.com]
logpath = /var/log/secure
maxretry = 2

[proftpd-iptables]

enabled = true
filter = proftpd
action = iptables[name=ProFTPD, port=ftp, protocol=tcp]
sendmail-whois[name=Fail2banProftp, dest=admin@email.com, sender=root@server.com]
logpath = /var/log/proftpd/ftp.log
maxretry = 3

[sasl-iptables]

enabled = true
filter = sasl
backend = polling
action = iptables[name=sasl, port=smtp, protocol=tcp]
sendmail-whois[name=Fail2banSASL, dest=kikopc@gmail.com, sender=root@s1.ksirve.com]
logpath = /var/log/maillog

[dovecot]

enabled = true
filter = dovecot
action = iptables-multiport[name=Dovecot, port="110,995,143,993,25", protocol=tcp]
sendmail-whois[name=Fail2Dovecot, dest=admin@email.com, sender=root@server.com]
logpath = /var/log/maillog
/var/log/secure
maxretry = 3

[postfix-tcpwrapper]

enabled = true
filter = postfix
action = iptables-multiport[name=postfix, port="110,995,143,993,25", protocol=tcp]
sendmail[name=Fail2banPostfix, dest=admin@email.com, sender=root@server.com]
logpath = /var/log/postfix.log
/var/log/maillog
bantime = 30000

[/bash]

Configurar filtros en fail2ban

Cada uno deberá configurar los servicios que vea oportunos, también debemos asegurarnos de que los filtros funcionan, los filtros se encuentran en /etc/fail2ban/filter.d/ los podemos encontrar en formato Nombre_Filtro.conf. Un ejemplo que me he encontrado en un Centos usando Virtualmin es el filtro SASL por defecto viene erróneo, hay que ajustar el failregex dentro del archivo que podemos encontrar en /etc/fail2ban/filter.d/sasl.conf

[bash]
failregex = : warning: [-._\w]+\[<HOST>\]: SASL (?:LOGIN|PLAIN|(?:CRAM|DIGEST)-MD5) authentication failed$
#cambiamos por
failregex = (?i): warning: [-._\w]+\[<HOST>\]: SASL (?:LOGIN|PLAIN|(?:CRAM|DIGEST)-MD5) authentication failed

[/bash]

Si queremos probar si funciona correctamente podemos aplicar el filtro con el siguiente comando

Comprobar un filtro

[bash]

fail2ban-regex /var/log/maillog /etc/fail2ban/filter.d/sasl.conf

[/bash]

Para hacer reportes

[bash]

#resumen de ips y reglas
grep "Ban " /var/log/fail2ban.log | awk -F[\ \:] ‘{print $10,$8}’ | sort | uniq -c | sort -n
#Reporte del dia en curso
grep "Ban " /var/log/fail2ban.log | grep `date +%Y-%m-%d` | awk ‘{print $NF}’ | sort | awk ‘{print $1,"("$1")"}’ | logresolve | uniq -c | sort -n
#Resumen de vida de fail2ban
zcat /var/log/auth.log* | grep ‘Failed password’ | grep sshd | awk ‘{print $1,$2}’ | sort -k 1,1M -k 2n | uniq -c

[/bash]

Si quereis ver como configurar el firewall con algunos sencillos comandos, aqui los teneis.

Comandos Linux para FTP

Diferentes formas de comenzar la conexion a un servidor TFP mediante la linea de comandos son las siguientes
[bash]
ftp ftp.example.com
ftp 1.2.3.4
ftp user@ftp.example.com
[/bash]

Moverse a traves de las carpetas remotos
[bash]ftp> cd /tmp[/bash]

Mostrar contenido de carpetas remotas
[bash]ftp> ls[/bash]

Moverse a traves de los carpetas locales
[bash]ftp> lcd /tmp[/bash]

Mostrar contenido de carpetas locales
[ftp]ftp> lpwd[/ftp]

Descargar un archivo desde el servidor remoto via FTP
[bash]ftp> get archivo.pdf[/bash]

Descargar varios archivos desde el servidor remoto via FTP
[bash]ftp> mget *.pl[/bash]

Activar / Desactivar la ayuda interactiva
[bash]
ftp> prompt on
ftp> prompt off
[/bash]

Eliminar un archivo a traves de FTP
[bash]ftp> delete NombreArchivoRemoto[/bash]

Subir un archivo local mediante FTP
Si no se especifica nada el archivo subido al servidor remoto se llamara igual.
[bash]ftp> put NombreArchivoLocal NombreArchivoRemoto[/bash]

Subir multiples archivos mediante FTP
Este comando es muy util para subir un directorio completo y todos sus contenidos al servidor remoto.mpu
[bash]
ftp> mput *
ftp> mput *.pl
[/bash]

Para crear una carpeta
[bash]ftp> mkdir NombreCarpeta[/bash]

Para eliminar una carpeta
[bash]ftp> rmdir NombreCarpeta[/bash]

Activar el modo de transferencias ASCII
[bash]ftp> ascii[/bash]
Este tipo de formato es el conveniente para la mayoria de archivos como textos y docuentos.

Activar el modo de transferencia Binario
[bash]ftp> binary[/bash]
El modo binario se emplea para imagenes y archivos pesados porque tiene menos probabiliad de corrupcion de datos.

Para terminar la session FTP emplearemos el comando
[bash]ftp> quit[/bash]

Otros programas recomendados con mas opciones podemos encontrar:
ncftp Este nos permite hacer subidas de forma recursiva mediante ftp, por ejemplo mput -r *

25 de los comandos más utiles de SSH

OpenSSH es la versión gratuita de la herramienta para conectividad SSH que la mayoría de los usuarios utilizan con confianza. Es de los pocos protocolos que encriptan todo el trafico  incluida la autentificacion inicial. Esta pequeña pero potente herramienta se ha ganado el reconocimiento de la comunidad de Internet, incluyendo empresas de seguridad como Trend Micro. En definitiva una herramienta que cualquier administrador de sistemas ha de usar dia a día en las tareas cotidianas, Aquí os dejo una recopilación de los comando que mas me gustan:

1) Copia la clave de ssh a un servidor user@host para evitar meter la contraseña cada vez.

[bash]ssh-copy-id user@host[/bash]
ssh-keygen genera las claves de forma local.

2) Abre un túnel para acceder desde un puerto local a uno de un servidor remoto
[bash]ssh -N -L2001:localhost:80 somemachine[/bash]
Ahora puedes entrar al servidor remoto con la direccion http://localhost:2001/

3) Conecta tu micrófono al altavoz de un equipo remoto.
[bash]dd if=/dev/dsp | ssh -c arcfour -C username@host dd of=/dev/dsp[/bash]
La calidad no es del todo optima, pero escucharse, se escucha.

4)Compara un archivo remoto con uno local.
[bash]ssh user@host cat /path/to/remotefile | diff /path/to/localfile -[/bash]
Util para comparar diferencias entre los archivos locales y remotos.

5) Monta el directorio/systemadearchivos via SSH
[bash]sshfs name@server:/path/to/folder /path/to/mount/point[/bash]
Para instalar SSHFS ir a  http://fuse.sourceforge.net/sshfs.html
Para montar archivos por Internet de forma segura.

6) Conexion SSH a traves de un tercer equipo
[bash]ssh -t reachable_host ssh unreachable_host[/bash]
Queremos conectar a un equipo al que no tenemos acceso y tenemos que conectarnos a través del equipo que puede acceder a dicho equipo de forma local. Este comando creaa una conexion al equipo que no tenemos acceso de forma oculta a través del equipo que si tiene acceso.

7) Copia del Host1 al Host2 a traves de nuestro equipo
[bash]ssh root@host1 "cd /somedir/tocopy/ &amp;&amp; tar -cf – ." | ssh root@host2 "cd /samedir/tocopyto/ &amp;&amp; tar -xf -"[/bash]
Útil si tenemos acceso al host1 y host2, pero ellos no tienen acceso entre si, y tampoco tienen acceso a nosotros (ncat no funciona)

8)Ejecuta un programa con interfaz gráfica de forma remota
[bash]ssh -fX @[/bash]
La configuración SSH necesita que:

X11Forwarding yes # por defecto en Debian

Aunque también es conveniente dejar activado:
Compression delayed

9) Crear una conexión persistente a un equipo
[bash]ssh -MNf @[/bash]
Crea una conexion persistente SSH a un equipo. Combinado con la configuracion en nuestro ~/.ssh/config:
Host host
ControlPath ~/.ssh/master-%r@%h:%p
ControlMaster no
Todas las conexiones SSH hacia el equipo irán por la conexion persistente en el Socket. Esto es muy util si estamos usando SSH para sincronizar archivos (usando rsync/sftp/cvs/svn) de forma regular porque no crea un socket nuevo cada vez que abre una conexion SSH.

10) Conectar la pantalla via SSH
[bash]ssh -t remote_host screen -r[/bash]
Con este comando podemos ajuntar un monitor local a una conexión remota vía ssh

11) Llamada a puertos!
[bash]knock 3000 4000 5000 &amp;&amp; ssh -p user@host &amp;&amp; knock 5000 4000 3000[/bash]
Llama a puertos para abrir un servicio (ssh por ejemplo) y llama de nuevo al puerto para cerrar el puerto, hay que tener instalado knockd.
Ejemplo del archivo de configuración:
[options]
logfile = /var/log/knockd.log
[openSSH]
sequence = 3000,4000,5000
seq_timeout = 5
command = /sbin/iptables -A INPUT -i eth0 -s %IP% -p tcp –dport 22 -j ACCEPT
tcpflags = syn
[closeSSH]
sequence = 5000,4000,3000
seq_timeout = 5
command = /sbin/iptables -D INPUT -i eth0 -s %IP% -p tcp –dport 22 -j ACCEPT
tcpflags = syn

12) Elimina una linea en un archivo de texto. Útil para solucionar problemas
[bash]ssh-keygen -R[/bash]
En este caso es mejor usar herramientas dedicadas.

13) Ejecuta comando complejos de forma remota vía SSH, sin escapar las comillas
[bash]ssh host -l user $([/bash]
Más sencillo, más exportable: ssh host -l user “cat cmd.txt”

14) Copia una base de datos MySQL a un nuevo servidor via SSH en un solo comando
[bash]mysqldump –add-drop-table –extended-insert –force –log-error=error.log -uUSER -pPASS OLD_DB_NAME | ssh -C user@newhost "mysql -uUSER -pPASS NEW_DB_NAME"[/bash]
Dumps una base de datos MySQL a través de un túnel ssh comprimido y lo usa como entrada a mysql – i tener en cuenta que es el método más rápido de migrar una base de datos a un nuevo servidor.

15) Elimina una liea en un archivo de texto. Útil para arreglar advertencias de cambios de claves ssh
[bash]sed -i 8d ~/.ssh/known_hosts[/bash]
16) Comando para copiar nuestra clave pública ssh a un nuevo servidor y no tenemos el comando ssh-copy-id
[bash]cat ~/.ssh/id_rsa.pub | ssh user@machine "mkdir ~/.ssh; cat &gt;&gt; ~/.ssh/authorized_keys"[/bash]
Si usamos Mac OS X o cualquier otra variante *nix que no posee el comando ssh-copy-id, en una sola linea escribimos nuestra clave pública a un equipo remoto para no tener que meter la contraseña para logearnos.

17) Prueba de red para ver las condiciones de una conexion ssh
[bash]yes | pv | ssh $host "cat &gt; /dev/null"[/bash]
Conecta al equipo vía ssh y muestra la velocidad de transferencia, redirigiendo todos los datos transferidos a /dev/null
necesita tener pv instalado
Debian: ‘apt-get install pv’
Fedora: ‘yum install pv’ (puede que necesite los repos ‘extras’ habilitados)

18) Como establecer una conexion gáfica a la cual podamos conectarnos
[bash]ssh -t user@some.domain.com /usr/bin/screen -xRR[/bash]
Mucho antes de que las terminales tabbed, la gente ha estado usando esto para abrir múltiples shells a través de un mismo terminal de texto. Combinado con ssh, nos da la posibilidad para abrir tantos shells como queramos en las opciones anteriores. Si nos deconectamos con “Ctrl-a d” o se cierra por accidente nuestra sesión ssh, todos los procesos que estemos ejecutando permanecen activos. otros comando gráficos útiles son “Ctrl-a c” (abre nuevo shell) y “Ctrl-a a” (alternar entre shells). Más comando gráficos aquí: http://aperiodic.net/screen/quick_reference

19) Resumir una copia via scp de un arvhivo de gran tamaño
[bash]rsync –partial –progress –rsh=ssh $file_source $user@$host:$destination_file[/bash]
Puede resumir una copia fallida ( útil cuando se transfieren archivos grandes como db dumps a través de vpn ) usando rsync.
Necesita rsync instalado en ambos equipos.
rsync –partial –progress –rsh=ssh $file_source $user@$host:$destination_file local > remote
or
rsync –partial –progress –rsh=ssh $user@$host:$remote_file $destination_file remote > local

20) Analizar el tráfico remoto via ssh con wireshark
[bash]ssh root@server.com ‘tshark -f "port !22" -w -‘ | wireshark -k -i -[/bash]
Así capturamos trafico en un equipo remoto con tshark, envía los datos raw pcap a través del enlace ssh, y lo muestra en wireshark. Con ctrl+C paramos la captura pero tambien nos cierra la ventana de wireshark. Esto podemos evitarlo usando el comando -c # en tshark para solo capturar un número # de paquetes, o redirigiendo los datos a través de una named pipe en vez de directamente de ssh a wireshark. Recomiendo filtrar tanto como se pueda en el comando a tshark para preservar en ancho de banda. tshark puede ser substituido con tcpdump usando:
[bash]ssh root@server.com tcpdump -w – ‘port !22’ | wireshark -k -i -[/bash]

21) Tener una conexión ssh abierta de forma permanente
[bash]autossh -M50000 -t server.example.com ‘screen -raAd mysession'[/bash]
Abre una sesión ssh de forma permanente, fantástico para portátiles que pierden conectividad a Internet cuando se cambian de puntos de acceso inhalámbricos.

22) Clientes SSH más fuertes, rápidos y seguros
[bash]ssh -4 -C -c blowfish-cbc[/bash]
Con esto forzamos la compresion IPv4, especificamos el cifrado con Blowfish. Dejamos cosas como el master control sessions porque no es compatible con la mayoría de los shells y ademas acelera el proceso.

23) Ahorrar ancho de banda con cstream
[bash]tar -cj /backup | cstream -t 777k | ssh host ‘tar -xj -C /backup'[/bash]
Con esto comprimimos con bzips una carpeta y la transferimos a una conexion de 777k bit/s.
cstream hace mucho más, si quereis mas informacion podeis ir a: http://www.cons.org/cracauer/cstream.html#usage
por ejemplo:
[bash]echo w00t, i’m 733+ | cstream -b1 -t2[/bash]

24) Transferir nuestra clave SSH publica a otro equipo en uno solo paso
[bash]ssh-keygen; ssh-copy-id user@host; ssh user@host[/bash]
Este comando nos permite transferir en un sencillo paso nuestra clave publica ssh para acceder al equipo sin necesidad de contraseña. Tened cuidado si ya tenemos tenemos la clave publica en el directorio ~/.ssh directory, porque puede ser que ssh-keygen la sobrescriba. ssh-copy-id copia la clave y la introduce en el equipo remoto en el archivo ~/.ssh/authorized_keys.

25) Copiar stdin al bufer de X11
[bash]ssh user@host cat /path/to/some/file | xclip[/bash]
Si has tenido que scp un archivo al equipo de trabajo para enviarlo por mail como adjunto, xclip nos puede ayudar porque copia su stdin al buffer de x11, con ello solo tenemos que pulsar el botón central para pegar el contenido de ese archivo gigante.

Si tienes alguno mejor, déjalo en un comentario… iremos completando la entrada entre todos.

Las funciones mas usadas en WordPress

Crear taxonomías a medida

Las taxonomías son útiles cuando tenemos que asignar algunas características comunes a ciertos post, asi de forma sencilla podemos escoger ciertos valores especificos asi como si fuera un tag.

// === TAXONOMIAS A MEDIDA === //
function mis_taxonimias_a_medida() {
	register_taxonomy(
		'tecnologia',		// nombre interno = nombre de las taxonomia para las máquinas
		'trabajos',		// Objeto relacionado = post, página, link, or tipos de post a medida
		array(
			'hierarchical' => true,
			'label' => 'Tecnologias empleadas',	// Nombre a mostrar
			'query_var' => true,	// habilitar las busquedas por taxonomia
			'rewrite' => array( 'slug' => 'trabajos-por-tecnologia' ),	// enlace permanente slug.
		)
	);
	register_taxonomy(
		'portfolio-categorias',
		'trabajos',
		array(
			'hierarchical' => false,
			'label' => 'Categorías para trabajos',
			'query_var' => true,
			'rewrite' => array( 'slug' => 'trabajos-portfolio' ),
		)
	);
 
	register_taxonomy(
		'agencias',
		'trabajos',
		array(
			'hierarchical' => false,
			'label' => 'Agencias',
			'query_var' => true,
			'rewrite' => array( 'slug' => 'trabajos-agencias' ),
		)
	);
 
 
}
add_action('init', 'mis_taxonimias_a_medida', 0);

Crear nuestros post a medida

Con la siguiente funcion podemos crear un post a medida, nos aparece en el menu de la izquierda dentro del panel de control de WordPress, en este caso lo creamos con las taxonomías a mediad. Este es el que uso para crear mi portfolio.

// === POST A MEDIDA === //
function crear_post_a_medida() {
	register_post_type( 'trabajos',
		array(
			'labels' => array(
				'name' => __( 'Trabajos' ),
				'singular_name' => __( 'trabajo' ),
				'add_new_item' => 'Añadir Trabajo',
				'edit_item' => 'Editar Trabajo',
				'new_item' => 'Nuevo Trabajo',
				'search_items' => 'Buscar Trabajos',
				'not_found' => 'No se han encontrado trabajos',
				'not_found_in_trash' => 'No hay ningun trabajo en la papelera',
			),
			'_builtin' => false,
			'public' => true,
			'hierarchical' => false,
			'taxonomies' => array( 'tecnologia', 'portfolio-categorias'),
			'supports' => array(
				'title',
				'editor',
				'excerpt'
			),
			'rewrite' => array( 'slug' => 'trabajos', 'with_front' => false )
		)
	);
}
add_action( 'init', 'crear_post_a_medida' );

Añadir metaboxes a medida

Con la siguiente funcion podemos crear metaboxes, que son campos personalizados dentro de post a medida, páginas o post en general, necesitamos dos funciones extras, la que nos muestra el campo editable dentro del panel de control y el que guarda los datos en la base de datos.

// === META BOXES A MEDIDA === //
function meta_boxes_a_medida(){
	$post_id = $_GET['post'] ? $_GET['post'] : $_POST['post_ID'] ;
	// Podemos llamarlo por el post_ID
	if ($post_id == '111184')	{
		add_meta_box('nombre_del_meta_box', 'Nombre a mostar del meta box', 'meta_boxes_a_medida_print', 'page', 'normal', 'high');
	}
	$template_file = get_post_meta($post_id,'_wp_page_template',TRUE);
	// Llamamamos segun la plantilla que estemos usando
	if ($template_file == 'page.php' )	{
		add_meta_box('page_primarytext', 'Título de la página','meta_boxes_a_medida_page', 'page', 'normal', 'high');
		add_meta_box('page_secondarytext', 'Sub-título de la página','meta_boxes_a_medida_page', 'page', 'normal', 'high');
		add_action('save_post', array(&$this,'salvar_metaboxes_a_medida_pages') );
	}
	// tambien podemos añadirlos a nuestros tipos de post a medida a meta box for custom page types, en un array
	foreach (array('trabajos','post') as $type)
	{
		add_meta_box('imagen_principal', 'imagen principal','meta_boxes_a_medida_imagen', $type, 'normal', 'high');
		add_action('save_post','salvar_metaboxes_a_medida_trabajos');
	}
 
}
add_action( 'add_meta_boxes', 'meta_boxes_a_medida' );
 
// === MOSTRAMOS LAS BOXES A MEDIDA EN EL FORMULARIO === //
function meta_boxes_a_medida_page( $post ) {
  // Use nonce for verification
  wp_nonce_field( plugin_basename( __FILE__ ), 'trabajos_noncename' );
  // The actual fields for data entry
  echo '<label for="page_primarytext">Titulo de la Página</label> ';
  echo '<input type="text" id="page_primarytext" name="page_primarytext" value="" size="45" />';
  echo '<label for="page_primarytext">Sub-Titulo de la Página</label> ';
  echo '<input type="text" id="page_secondarytext" name="page_secondarytext" value="" size="45" />';
}
 
// === GUARDAMOS LOS METABOXES EN LA BASE DE DATOS === //
function salvar_metaboxes_a_medida_pages( $post_id ) {
	global $meta_box;
	// Verificamos si viene de un autosave  // si no hemos dado a guardar datos, no hacemos nada.
	if ( defined( 'DOING_AUTOSAVE' ) && DOING_AUTOSAVE ) 
	  return;
	// verificamos que proviene de nuestra ventana y los permisos de los usuarios.
	if ( !wp_verify_nonce( $_POST['trabajos_noncename'], plugin_basename( __FILE__ ) ) )
	  return;
	// Check permissions
	if ( 'page' == $_POST['post_type'] )   {
	if ( !current_user_can( 'edit_page', $post_id ) )
		return;
	}  else  {
	if ( !current_user_can( 'edit_post', $post_id ) )
		return;
	}
  	// OK, estamos dentro y lso permisos vienen bien, guardamos.
 
	foreach ($meta_box['fields'] as $field) {
        $old = get_post_meta($post_id, $field['id'], true);
        $new = $_POST[$field['id']];
 
        if ($new && $new != $old) {
            update_post_meta($post_id, $field['id'], $new);
        } elseif ('' == $new && $old) {
            delete_post_meta($post_id, $field['id'], $old);
        }
    }
 
}

Día 3 – Continuamos con los contenidos

Desde el último post no he tenido tiempo de trabajar en el contenido, la familia y los amigos también necesitan atenciones, como cualquier proyecto.
Hoy nos ponemos manos a la obra, Google ya tiene indexados los primeros contenidos pero no tengo los títulos y descripciones para el seo, hay que hacer algo al respecto, estoy usando “All in One SEO” lo uso en la mayoría de los trabajos sobre WordPress, tiene muy buen resultado y es sencillo de usar. También estoy usando “W3 Total Cache” lo que reduce el peso de la web a un 25%, Contact Form 7 para los formularios, y por último y no menos importante, para los efectos de imágenes y galerías el jCarousel y PrettyPhoto.

Seria bueno tener hoy, a no más tardar, el seo de las páginas indexadas por Google y los servicios más importantes, no queremos perder ningún cliente potencial por falta de servicios.

Nos vemos en el próximo capítulo.