Muchas veces queremos desplegar un servidor web con fines pedagógicos o experimentales, y por ende, nos estaríamos dispuestos a pagar un hosting por un sitio web que al cumplir su finalidad se arrume en el olvido. Aquí es donde entra la capa gratuita de Google Cloud para su service Compute Engine que nos permite montar una máquina virtual para configurarla a nuestro antojo.
Todos los clientes de Google Cloud pueden usar Compute Engine, Cloud Storage, y BigQuery gratis solo si lo usan dentro de los limites especificados:
El limite de la capa gratuita para instancias E2-micro se contabiliza sumando de manera global todos los servicios en todas las instancias usadas. La IP externa es gratuita. Mas info.
GC tiene un cliente CLI que podemos usar desde nuestra consola de Windows o Linux para administrar nuestros pryectos de GC o conectarnos a nuestras MV. Si bien noe s obligatorio ayudará y simplificará muchas tareas que impliquen proyectos en Google Cloud.
Instala el GC CLI para windows desde PoweShell [?]
(New-Object Net.WebClient).DownloadFile("https://dl.google.com/dl/cloudsdk/channels/rapid/GoogleCloudSDKInstaller.exe", "$env:Temp\GoogleCloudSDKInstaller.exe")
& $env:Temp\GoogleCloudSDKInstaller.exe
o para Linux
curl -O https://dl.google.com/dl/cloudsdk/channels/rapid/downloads/google-cloud-sdk-374.0.0-linux-x86_64.tar.gz
tar -xf google-cloud-sdk-374.0.0-linux-x86.tar.gz
./google-cloud-sdk/install.sh
./google-cloud-sdk/bin/gcloud init
Debemos primero que todo crear un proyecto Google Cloud y luego una instancia de MV:
'your_name_server'.'your_VM_zone'Opción 1: Cloud Shell desde web o GC CLI
VM_NAME='your_name_server'
ZONE='your_VM_zone'
PROJECT=$(gcloud config list --format 'value(core.project)' 2>/dev/null)
gcloud compute --project $PROJECT ssh --zone $ZONE $VM_NAME
Opción 2: Conectate a la máquina usando cliente SSH
OS Login [?]
gcloud compute instances add-metadata $VM_NAME --metadata enable-oslogin=TRUE --zone=$ZONE
OS Login para la cuenta de servicio [?]
PRINCIPAL='serviceAccount:'['your_service_account']
ROLE='roles/compute.osLogin'
gcloud compute instances add-iam-policy-binding $VM_NAME --zone=$ZONE --member=$PRINCIPAL --role=$ROLE
KEY_FILE_PATH=~/.ssh/uqbar_key
USER='faroseroc_unal_edu_co'
ssh-keygen -t rsa -f $KEY_FILE_PATH -C $USER -b 2048
cat $KEY_FILE_PATH
600 (-rw-------)
KEY_FILE_LOCAL_PATH=~/uqbar/google_cloud/uqbar_key
nano $KEY_FILE_LOCAL_PATH
#pega la llave del paso de arriba
ls -al $KEY_FILE_LOCAL_PATH
chmod 600 $KEY_FILE_LOCAL_PATH
ls -al $KEY_FILE_LOCAL_PATH
gcloud compute os-login ssh-keys add --key-file=$KEY_FILE_PATH.pub
Finalmente en tu máquina cliente SSH, concetate por SSH [?]
Opción 1: Cliente OpenSSH en Linux, WSL o CyGWin
KEY_FILE_LOCAL_PATH=~/uqbar/google_cloud/uqbar_key
USERNAME=faroseroc_unal_edu_co
EXTERNAL_IP=35.224.246.3
ssh -i $KEY_FILE_LOCAL_PATH $USERNAME@$EXTERNAL_IP
Opción 2: PuTTY
PuTTYgen cargamos la llave privada, seleccionamos RSA y 2048 bits y luego guardamos la llave pública como archivo .ppk.PuTTY, en el panel de la izquierda vamos a Conexión > SSH > Auth y cargamos el archivo .ppk.Session y en hostname ingresamos $USERNAME@$EXTERNAL_IP.Open para abrir la conexión SSH y aceptamos la nueva firma en nuestro equipo. sudo apt update
sudo apt install apache2
systemctl status apache2
sudo systemctl start apache2
systemctl status apache2
netstat -tulpn | grep :80
Notaremos un servicio TCP corriendo en el puerto 80: netstat -tulpn | grep :80
sudo a2enmod rewrite
sudo systemctl restart apache2
systemctl status apache2
grep IncludeOptional /etc/apache2/apache2.conf se incluyen sites-enabled/*.conf. El comando ls /etc/apache2/sites-enabled/*.conf nos arroja /etc/apache2/sites-enabled/000-default.conf el cual contiene la configuración del sitio web por defecto. El atributo DocumentRoot obtenido con grep DocumentRoot /etc/apache2/sites-enabled/000-default.conf es /var/www/html el cual contiene el archivo index.html que se entrega al hacer curl localhost:80. Podemos comprobar que son los mismos archivos con:
curl -s localhost:80 | md5sum
cat /var/www/html/index.html | md5sum
mkdir /home/user/www
echo "hola mundo!" > /home/user/www/index.html
sudo vim /etc/apache2/sites-enabled/000-default.conf
# DocumentRoot /home/user/www/
sudo apachectl configtest
# Sintax OK
sudo systemctl restart apache2
curl localhost y revisar el log con sudo tail -100 /var/log/apache2/error.log notaremos el mensaje client denied by server configuration:
<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<html><head>
<title>403 Forbidden</title>
</head><body>
<h1>Forbidden</h1>
<p>You don't have permission to access this resource.</p>
<hr>
<address>Apache/2.4.38 (Debian) Server at localhost Port 80</address>
</body></html>
Tenemos que dar permisos en /etc/apache2/sites-enabled/000-default.conf dentro del nodo <VirtualHost *:80> con
...
<Directory /home/faroseroc_unal_edu_co/www>
Options Indexes FollowSymLinks
AllowOverride None
Require all granted
</Directory>
...
curl localhost o visitar la ip pública en nuestro navegador
Hola mundo!