Iloo

https://iloo.wordpress.com

Android: fallan las conexiones

Vamos indicando el entorno, se tiene una app en Android y que hace llamadas de tipo POST a un servidor para obtener datos, el servidor cuenta con SO Centos 6, apache, php 5.6, mysql, un servidor normal.

Lo que sucede, se tiene varios dispositivos de la misma red (6 dispositivos) trabajando con la app al mismo tiempo, cuando ingresa uno nuevo suceden dos cosas.

  • El ultimo simplemente deja de recibir la informacion del servidor por medio de la app.
  • Todas se bloquean excepto el primer dispositivo que uso la app.

Los mensajes de error en adroid son los siguientes:

org.apache.http.conn.HttpHostConnectException: Connection to https://xxx.com/ refused
java.net.SocketTimeoutException: failed to connect to xxx.com/111.222.333.444 (port 443) after 3000ms

La solucion en este caso fue desactivar el TCP timestamps de centos.

echo "0" > /proc/sys/net/ipv4/tcp_timestamps
Anuncios

Apache: KeepAlive On

apache_logo

Un caso de estudio

El servidor

  • Centos 6.
  • Apache.
  • PHP 5.6

Los clientes

  • MAC OS.
  • Windows.

El problema:

Se tiene una aplicacion en PHP sin frameworks mas que uno que otro generador, tablas, formularios, etc.

Cuando dos clientes (en la misma red) con SO MAC OS intentan ingresar a la aplicacion, esta responde correctamente al primer cliente pero con el segundo, se bloquea, y se pone tremendamente lenta, no se corta solo que la carga se pone demasiada lenta. Para los clientes Windows funciona correctamente

Despues de hacer varias pruebas en los clientes, desactivando caches, definiendo DNSs, probando con el TTFB, etc. Se intuye que el problema esta en el servidor.

Revisando la configuracion de Apache, se observa que el parametro KeepAlive  (la misma aplicacion corre en varios servidores y todos los servidores tienen la misma configuracion), se encuentra desactivado, se procede a encender la opcion y… funciona, todo solucionado.

KeepAlive Off

Captura de pantalla 2018-02-19 a las 22.31.45.png

KeepAlive On

Captura de pantalla 2018-02-19 a las 22.33.41.png

 

Ruby on Rails: Simple Form, remover opción nula

Explicando un poco lo que sucede, si bien se tiene una colección de registro en un arreglo por ejemplo:

options = ["option1", "option2", "option3"].

Luego se genera el elemento en la vista:

= f.input :options_selected, as: :select, include_blank: false, collection: options, input_html: {multiple: true}

Si los elementos seleccionados son option1 y option3, la manera en que se almacena es:

["", "option1", "option3"]

Aun cuando se incluyo la opción include_blank se tiene un elemento nulo. Para solucionar esto es necesario agregar una opción mas, include_hidden, y el elemento seria:

= f.input :options_selected, as: :select, include_blank: false, include_hidden: false, collection: options, input_html: {multiple: true}

Y cuando se guarden las mismas opciones se almacenara sin el elemento nulo:

["option1", "option3"]

Desarrollo: Atom / Sublime Text / Brackets / VS Code

Al momento de escoger un IDE ligero y rápido se pueden encontrar estas cuatro alternativas, sin hacer un resumen demasiado detallado, haré mención de las características que me parecieron las mas importantes (pros y contras) en general de estos cuatro editores.

En primer lugar, fueron usados principalmente en:

  • PHP
  • Ruby on Rails.

Visual Studio Code

Creo que es el mas nuevo de los 4, ligero y con muchas extensiones (plugins), varias de estas para php y en especial para RoR (haml, coffeescript), algo que me llamo la atención es que solo se puede que trabajar en un proyecto, si se quisiera trabajar en mas de un proyecto, es necesario crear una carpeta y mover los proyectos a la carpeta creada.

Vs Studio Code

Atom

Una de las características unica de este IDE es el  manejo de dos temas, uno para editor y otro para el core, personalmente me parece que tiene demasiadas opciones para el desarrollo y le quita la esencia de ser un IDE sencillo y fácil de manejar.

Atom

Brackets

La cantidad de plugins es algo limitada, recién instalado no tiene varios detalles que ya se incluyen en los otros editores. El soporte para RoR igualmente se queda relegado creo que a dos o tres plugins.

Brackets

Sublime Text

Que decir de este editor, el mas completo sin duda, con una cantidad de plugins enorme, el único punto a tomar en cuenta seria a diferencia de los anteriores, no es gratuito, si bien hay un versión gratuita, este viene con una alerta que salta cada cierto tiempo, molesto sin duda.

Sublime Text

PHP: error al subir archivos por FTP

php-logo

 

En este caso las características son las siguientes:

  • Servidor CenOS 6 (origen).
  • PHP 5.5.
  • iptables activado.

El script (resumido) que se esta usando para subir el archivo es:

$connection = ftp_connect($hostname, 21);
ftp_login($connection, $user, $password);
ftp_put($connection, $ftp_path, $local_file, FTP_ASCII);

El problema es que el script se detiene en la tercera linea, no se corta ni muestra un mensaje de error y por tanto no se sube el archivo ni termina de procesarse todo el código.

El primer paso seria desactivar iptables y verificar el código:

service iptables stop

Y ahora si, el script funciona perfectamente.

En este caso el problema esta en iptables, probamos que activando el modo pasivo para ftp de la siguiente manera:

modprobe ip_conntrack_ft

Y volver a verificar el script, si funciona entonces agregar el modulo cada vez que se inicie iptables, editar el siguiente archivo:

nano /etc/sysconfig/iptables-config

Y agregar el modulo propiamente dicho:

IPTABLES_MODULES="ip_conntrack_ftp"

Y reiniciar el servicio:

service iptables start