Iloo

https://iloo.wordpress.com

Archivos por Etiqueta: CentOS

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

 

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

 

Ruby on Rails: RVM is not a function

Ruby_on_Rails_logo

Los detalles:

  • CentOS 6
  • RVM
  • Rails 1.9.3

Los pasos.

  1. Instalación RVM, todo correcto.
  2. Instalación ruby 1.9.3, todo correcto.

En la aplicación instalación de gemas y demás:

bundle install

Your Ruby version is 2.1.0, but your Gemfile specified 1.9.3

Cambiar la versión de ruby usada en rvm:

rvm use 1.9.3

RVM is not a function, selecting rubies with ‘rvm use …’ will not work.

La solución, cambiar la shell por defecto:

chsh -s /bin/bash usuario

CentOS: “daemonizar” scripts PHP

Un problema con el que estuve sufriendo peleando por un buen rato fue el de tener scripts PHP funcionando todo el tiempo.

El problema era que no se podía usar cronjobs, ya que los scripts funcionaban con gearman (del cual escribiré en otro post) y tenían que estar a la espera de ser invocados y realizar una determinada tarea, la cual tiene un tiempo variable y por tanto no se puede usar cron.

Las características debían ser de poder iniciar los scripts PHP y tenerlos como servicios o demonios, a demás de poder pararlos en cualquier momento, generalmente para hacer alguna modificación.

Después de buscar por un rato llegue con estas dos soluciones:

  1. Usar System_Daemon.
  2. Usar Supervisor.

Obviamente ninguna de las dos formas funciono, la verdad es que no pude instalar ninguno de ellos (por problemas de dependencias, alertas, etc). Entonces la solución sería hacer uno mismo el script, y aquí lo tenemos:

#!/bin/sh
# description: start php script

. /etc/rc.d/init.d/functions

pathworker=/home/user/public_html/script.php

start() {
        echo -n "Starting script"
        daemon php "$pathworker&"
}

stop() {
        echo -n "Stopping script"
        killproc php "$pathworker"
}

case "$1" in
    start)
        start
        ;;
    stop)
        stop
        ;;
    restart)
        stop
        start
        ;;
    *)
        echo $"Usage: $prog {start|stop|restart}"
esac

Es claro que el script es bastante sencillo pero cumple con su función y eso es lo importante, supongamos que lo llamamos phpd, tiene que estar en /etc/init.d. Claro antes tiene que tener permisos de ejecución:

sudo chmod +x /etc/init.d/phpd

Para iniciar el demonio:

/etc/init.d/phpd start

Para pararlo:

/etc/init.d/phpd stop

Y eso sería prácticamente todo, ahora si se quiere daemonizar varios scripts PHP a la vez se puede modificar el script quedando de la siguiente manera:

#!/bin/sh
# description: start php script

. /etc/rc.d/init.d/functions

pathworker=/home/user/public_html/list

start() {
        echo -n "Starting script"
        daemon "$pathworker&"
}

stop() {
        echo -n "Stopping script"
        killproc php "$pathworker"
}

case "$1" in
    start)
        start
        ;;
    stop)
        stop
        ;;
    restart)
        stop
        start
        ;;
    *)
        echo $"Usage: $prog {start|stop|restart}"
esac

Donde el archivo list contendría los scripts PHP que se desean daemonizar:

#!/bin/sh
php /home/user/public_html/script1.php &&
php /home/user/public_html/script2.php &&
php /home/user/public_html/script3.php;

Nota: al hacer esto hay un problema y es que no se pueden parar todos los demonios iniciados con el comando stop, si no que habría que hacerlo manualmente.