26 de enero de 2021

Nginx + php para novatos.

Luego de entender cómo debe configurarse nginx para servir páginas seguras con HTTPS me vi en la necesidad de hacer que tuviera también la capacidad de soportar scripts. 

¿La razón? En este servercito tengo un proxy squid corriendo, tengo youtube.com bloqueado por default. El caso es que encontré una serie de cursos para dibujar que precisamente sólo están en YT. 
Intendé configurar estas excepciones en el proxy pero no tuve éxito. De ahí se me ocurrió probar con la configuración de archivos pac (Proxy Auto Configuration). 

Desde el inico pensé en un esquema ocmo el de CGI en el cual podía hacer que incluso un script de shell pudiera ejecutarse. Luego de buscarle un rato encontré algunas alternativas pero no me sentí cómodo con ninguna por lo que decidí la vieja confiable web server +ssl. 

Hace un montón de años, cuando PHP 5 era el último gruto de l amoda dejé de trabajar con estas soluciones. Imagínense. Me encontré con que php ya va en la versión 7. Como sea, no iba a instalar Apache para configurarlo otra ves con ssl y ahora, php. Lo más lógico era buscar cómo ponerle phpp al nginx. 

Pues bueno, encontré otro tutorial (How to Install Nginx + PHP5-FPM + MySEL on Linuxmint 18 / Linux Mint 17) a partir del cual me basé . Valga aclarar que tengo un Linux Mint 19.3 (Tricia)

Ok, primer paso, descargar el software. 

# apt-get install php-fpm php-cli

Segundo: Editar /etc/php/7.2/fpm/php.ini 
Busque  cgi.fix_pathinfo y póngalo a cero
cgi.fix_pathinfo=0

Tercero: Editar /etc/php/7.2/fpm/pool.d/www.conf
Busque listen y póngalo así: 
listen = /run/php/php7.2-fpm.sock

Cuarto: Agregar el soporte de php a nginx
Originalmente mi servidor web tenía definido un bloque server para abos puertos 80 y 443. 
Decidí separarlos y quedó así: 

        server {
                listen              443;
                server_name         192.168.100.109;
                root /var/www/html;
                index index.html index.htm index.php;
                ssl on;
                ssl_certificate     tudominio.crt;
                ssl_certificate_key tudominio.key;
        }

        server {
                listen  80;
                server_name     192.168.100.109;
                root /var/www/html;
                location / {
                        index index.html index.php;
                }
                location ~ \.(php|pac|html)$ {
                        include /etc/nginx/fastcgi_params;
                        fastcgi_pass unix:/run/php/php7.2-fpm.sock;
                        fastcgi_index index.php;
                        fastcgi_param SCRIPT_FILENAME /var/www/html$fastcgi_script_name;
                }
        }

Hecho lo cual hice un archivo de texto desde el que se deberían importar las ligas, localizado en 
/var/www/html/excepciones.txt con el siguiente contenido: 

https://www.youtube.com/watch?v=H4jo3DYkniE
https://www.youtube.com/watch?v=5HBcEsXIxYw
https://www.youtube.com/watch?v=EuHpVPI7h_4

De ahí, hice el archivo .pac, que como vimos arriba es una de las extensiones asociadas a php:

function FindProxyForURL(url,host) {
        if (shExpMatch(host,"192.168.100.107")) {
                return "DIRECT";
        }
<?php
        $ifp=fopen("/opt/proxy/leo/etc/clasesSep.txt","r");
        while ($linea=rtrim(fgets($ifp))) {
                printf(" else if (url.endsWith(\"%s\")) {\n",$linea);
                printf("\t\treturn \"DIRECT\";\n\t }");
        }
        fclose($ifp);
?>
 else {
                return "PROXY 192.168.100.109:32008";
        }
}

La cosa es que devuelve el siguiente archivo de texto que es el que se le envía al nevagdor o sistema operativo para configurar el proxy

function FindProxyForURL(url,host) {
        if (shExpMatch(host,"192.168.100.107")) {
                return "DIRECT";
        }
 else if (url.endsWith("https://www.youtube.com/watch?v=H4jo3DYkniE")) {
                return "DIRECT";
         } else if (url.endsWith("https://www.youtube.com/watch?v=5HBcEsXIxYw")) {
                return "DIRECT";
         } else if (url.endsWith("https://www.youtube.com/watch?v=EuHpVPI7h_4")) {
                return "DIRECT";
         } else {
                return "PROXY 192.168.100.109:32008";
        }
}

Al final, no está funcionando ... pro bueno, estoy trabajando en ello. 

Hasta la próxima!

22 de enero de 2021

Nginx + ssl para novatos

Hace años trabajé como web master. Principalmente instalando, configurando y manteniendo soluciones LAMP. Luego de casi 8 años dejé eso por la paz y nada, mi exposición hacia nginx fue básicamente nula. Isn embargo comenzar fue muy sencillo. Tengo una pequeña laptop mini Dell, en la que instalé Linux Mint y al momento había usado como servidor Proxy con squid. Posteriormente le instalé nginx para explorarlo un poco. 

Hace unos meses me dio por jugar con AR y luego de buscar por un rato, decidí ir por una solución que platform agnostic. Ya saben, algunas soluciones fnuncionan bien para iOS pero no para Android y viceversa, entre las opciones me encontré con AR.js, que funciona para el web.  Como también tengo un poco de experiencia con html y codificando en php y perl, pues bueno. Aquí me metí. 

Aprendí que hay tres tipos de formas en que se detecta un lugar para desplegar un elemeno de AR.

  1. Image tracking 
  2. Location based
  3. Marker based.

De aquí, la segunda es la que más me interesó. 

Ahora, al probar el primer ejemplo del tutorial me encontré con que a partir del documento html el navegador del móvil debe mandar a abrir la cámara (evidentemente). En un inicio me marcó varios problemas:


Please activate Geolocation and refresh the page. If it is already active, please check permissions for this website. 

Bueno, pues habrá que darle el permiso, ¡pero, oh sorpresa! El permiso ya estaba condedido por lo que activé la opción de debug de la librería AR en el documento html y me encontré con un segundo mensaje de error:

Webcam Error
Name:
Message: WebRTC issue-! navigator.mediaDevices not present in your browser.


Luego de buscarle un rato encontré que efectivamente el problema era debido a que el navegador no puede abrir la cámara si el documento que lo solicita viene desde un sitio web http, debía usar https. 

Esto lo había configurado hace años en Apache solamente por lo que hab´ía que comenzar a buscar información. 


La primera parte ¿Cómo configurar el nginx para servir https? y la segunda ¿Cómo era eso de generar un certificado casero? 


Pararesolver ambos problemas, busqué otro rato en la web hasta que me encontré con este bonito tutorial, muy sencillo: Configurar un servidor HTTPS con Ngingx, de Miguel A Gómez Y se resume así: 


1. Crear la llave privada (.key)
cd /etc/nginx
openssl genrsa -des3 -out midominio.key 2048

2. Crear el certificado a partir de la llave privada. 
En est ecaso no generé la solicitud de certificado pues se trata de una prueba en la lan de la casa por lo que, de acuerdo con las instrucciones de OpenSSL Essentials: Working with SSL Certificates, Private Keys and CSRs me fuí directo a este paso. 

openssl req -newkey rsa:2048 -nodes -keyout midominio.key  -x509 -days 365 -out midominio.crt

3. Configurar nginx. Modifiqué el archivo de configuración, que por default está en /etc/nginx/nginx.conf y le inserté esta sección server

server {
    listen              80;
    listen              443;
    server_name         192.168.100.109;
    root /var/www/html;
    index index.html index.htm;
    ssl on;
    ssl_certificate     tudominio.crt;
    ssl_certificate_key tudominio.key;
}

4. Reinicié el webs erver y listo!