{"id":2485,"date":"2020-05-02T08:33:05","date_gmt":"2020-05-02T07:33:05","guid":{"rendered":"http:\/\/www.jmarior.net\/itank\/?p=2485"},"modified":"2020-05-09T16:35:05","modified_gmt":"2020-05-09T15:35:05","slug":"raspberry-pi-4-model-b-como-servidor-lamp-con-ubuntu-server-18-04-lts","status":"publish","type":"post","link":"https:\/\/www.jmarior.net\/itank\/raspberry-pi-4-model-b-como-servidor-lamp-con-ubuntu-server-18-04-lts\/","title":{"rendered":"Raspberry Pi 4 model B como servidor LAMP con Ubuntu Server 18.04 LTS"},"content":{"rendered":"<p><a href=\"https:\/\/www.jmarior.net\/itank\/files\/ubuntu-server-14.04-lamp.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-2581\" src=\"https:\/\/www.jmarior.net\/itank\/files\/ubuntu-server-14.04-lamp.jpg\" alt=\"\" width=\"1280\" height=\"720\" srcset=\"https:\/\/www.jmarior.net\/itank\/files\/ubuntu-server-14.04-lamp.jpg 1280w, https:\/\/www.jmarior.net\/itank\/files\/ubuntu-server-14.04-lamp-400x225.jpg 400w, https:\/\/www.jmarior.net\/itank\/files\/ubuntu-server-14.04-lamp-768x432.jpg 768w, https:\/\/www.jmarior.net\/itank\/files\/ubuntu-server-14.04-lamp-800x450.jpg 800w\" sizes=\"auto, (max-width: 1280px) 100vw, 1280px\" \/><\/a><\/p>\n<p>Sigo atentamente la evoluci\u00f3n del peque\u00f1o Raspberry Pi desde sus or\u00edgenes y finalmente lo voy a poner a prueba migrando algunos de mis servicios a \u00e9l.<\/p>\n<p><strong>Planificar los roles de servidor<\/strong><\/p>\n<p><a href=\"https:\/\/www.jmarior.net\/itank\/files\/server-roles.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-2562\" src=\"https:\/\/www.jmarior.net\/itank\/files\/server-roles.jpg\" alt=\"\" width=\"810\" height=\"456\" srcset=\"https:\/\/www.jmarior.net\/itank\/files\/server-roles.jpg 810w, https:\/\/www.jmarior.net\/itank\/files\/server-roles-400x225.jpg 400w, https:\/\/www.jmarior.net\/itank\/files\/server-roles-768x432.jpg 768w, https:\/\/www.jmarior.net\/itank\/files\/server-roles-800x450.jpg 800w\" sizes=\"auto, (max-width: 810px) 100vw, 810px\" \/><\/a><\/p>\n<ul>\n<li>Servidor LAMP (Linux + Apache + MySQL\/MariaDB + PHP)\n<ul>\n<li>Servidor web para mis dominios<\/li>\n<li>Servidor de base de datos (local)<\/li>\n<li>Servidor de ficheros con OwnCloud o su alternativa<\/li>\n<li>Monitor de recursos<\/li>\n<\/ul>\n<\/li>\n<li>Cliente de correo para una cuenta hosteada por GMail<\/li>\n<li>Servidor para aplicaciones autohosteadas\n<ul>\n<li>Magicpacket<\/li>\n<li><\/li>\n<\/ul>\n<\/li>\n<li>Servidor DNS para red local<\/li>\n<li>Sistema de Backup<\/li>\n<\/ul>\n<hr \/>\n<p><strong>El hardware: Raspberry Pi 4 Model B<\/strong><\/p>\n<p>La inversi\u00f3n total fue de 107\u20ac en los siguientes elementos:<\/p>\n<ul>\n<li>Raspberry Pi 4 Model B 4GB SDRAM (65\u20ac) con unas prestaciones magn\u00edficas:<\/li>\n<\/ul>\n<table class=\"tabla-datos\">\n<tbody>\n<tr>\n<th>Procesador<\/th>\n<td>ARM Cortex-A72<\/td>\n<\/tr>\n<tr>\n<th>Frecuencia de reloj<\/th>\n<td>1,5 GHz<\/td>\n<\/tr>\n<tr>\n<th>GPU<\/th>\n<td>VideoCore VI (con soporte para OpenGL ES 3.x)<\/td>\n<\/tr>\n<tr>\n<th>Memoria<\/th>\n<td>4 GB LPDDR4 SDRAM<\/td>\n<\/tr>\n<tr>\n<th>Conectividad<\/th>\n<td>Bluetooth 5.0, Wi-Fi 802.11ac, Gigabit Ethernet<\/td>\n<\/tr>\n<tr>\n<th>Puertos<\/th>\n<td>GPIO 40 pines, 2 x micro HDMI 4K, 2 x USB 2.0, 2 x USB 3.0, CSI (c\u00e1mara Raspberry Pi), DSI (pantalla t\u00e1cil), Micro SD, Conector de audio y jack USB-C para alimentaci\u00f3n.<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<ul>\n<li>Tarjeta de memoria SanDisk Extreme <span class=\"matches\">micro <\/span>SDXC 64 GB hasta 160 MB\/s, Class 10, U3 y V30 (17\u20ac)<\/li>\n<li>GeeekPi caja acrilico con ventilador y 4 disipadores (11\u20ac)<\/li>\n<li class=\"a-row\"><span id=\"productTitle\" class=\"a-size-large\">Fuente de alimentaci\u00f3n 5.1V 3A USB-C (10\u20ac)<br \/>\n<\/span><\/li>\n<li>Adaptador <a href=\"http:\/\/www.hiletgo.com\/ProductDetail\/2157047.html\">Hiletgo USB 2.0 TTL CP2102v serial converter<\/a> (4\u20ac)<\/li>\n<\/ul>\n<p>La caja incluye disipadores de aluminio y un ventilador y es importante porque reduce la temperatura de la CPU de 80\u00baC al entorno de 48\u00baC lo que beneficia indiscutiblemente al rendimiento.<\/p>\n\n\t\t<div id='gallery-1' class='gallery galleryid-2485 gallery-columns-3 gallery-size-thumbnail gallery1'><script type=\"text\/javascript\">\r\n\/\/ <![CDATA[\r\n\tjQuery(document).ready(function () {\r\n\t\tjQuery(\".gallery1 a\").attr(\"rel\",\"gallery1\");\t\r\n\t\tjQuery('a[rel=\"gallery1\"]').colorbox({maxWidth:\"95%\", maxHeight:\"95%\",title: function(){ return jQuery(this).children().attr(\"alt\"); }, });\r\n\t});\r\n\/\/ ]]>\r\n<\/script>\n<figure class=\"gallery-item\">\n<div class=\"gallery-icon\">\r\n<a href=\"https:\/\/www.jmarior.net\/itank\/files\/Raspberry-Pi-Logo.png\" title=\"\" rel=\"gallery1\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.jmarior.net\/itank\/files\/Raspberry-Pi-Logo-384x384.png\" width=\"384\" height=\"384\" alt=\"\" \/><\/a>\r\n<\/div><\/figure><figure class=\"gallery-item\">\n<div class=\"gallery-icon\">\r\n<a href=\"https:\/\/www.jmarior.net\/itank\/files\/raspberry-pi-4-model-b-placa.jpg\" title=\"\" rel=\"gallery1\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.jmarior.net\/itank\/files\/raspberry-pi-4-model-b-placa-384x384.jpg\" width=\"384\" height=\"384\" alt=\"\" \/><\/a>\r\n<\/div><\/figure><figure class=\"gallery-item\">\n<div class=\"gallery-icon\">\r\n<a href=\"https:\/\/www.jmarior.net\/itank\/files\/GeeekPi-caja-acrilico-para-Raspberry-Pi-4-Modelo-B-con-ventilador-y-4-disipadores.jpg\" title=\"\" rel=\"gallery1\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.jmarior.net\/itank\/files\/GeeekPi-caja-acrilico-para-Raspberry-Pi-4-Modelo-B-con-ventilador-y-4-disipadores-384x384.jpg\" width=\"384\" height=\"384\" alt=\"\" \/><\/a>\r\n<\/div><\/figure><figure class=\"gallery-item\">\n<div class=\"gallery-icon\">\r\n<a href=\"https:\/\/www.jmarior.net\/itank\/files\/Sandisk-Extreme-64GB.jpg\" title=\"\" rel=\"gallery1\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.jmarior.net\/itank\/files\/Sandisk-Extreme-64GB.jpg\" width=\"300\" height=\"218\" alt=\"\" \/><\/a>\r\n<\/div><\/figure><figure class=\"gallery-item\">\n<div class=\"gallery-icon\">\r\n<a href=\"https:\/\/www.jmarior.net\/itank\/files\/raspberry-pi-4-usb-c-5v-3a-official-power-supply.jpg\" title=\"\" rel=\"gallery1\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.jmarior.net\/itank\/files\/raspberry-pi-4-usb-c-5v-3a-official-power-supply-384x384.jpg\" width=\"384\" height=\"384\" alt=\"\" \/><\/a>\r\n<\/div><\/figure><figure class=\"gallery-item\">\n<div class=\"gallery-icon\">\r\n<a href=\"https:\/\/www.jmarior.net\/itank\/files\/Hitlego-USB-2-TTL-CP2102-serial-converter.jpg\" title=\"\" rel=\"gallery1\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.jmarior.net\/itank\/files\/Hitlego-USB-2-TTL-CP2102-serial-converter-384x384.jpg\" width=\"384\" height=\"384\" alt=\"\" \/><\/a>\r\n<\/div><\/figure>\r\n\t\t<\/div>\n\n<hr \/>\n<h2><strong>Instalar el sistema operativo<\/strong><\/h2>\n<h3><strong> Ubuntu Server 18.08 LTS para procesador ARM<br \/>\n<\/strong><\/h3>\n<p>Ubuntu es mi sistema operativo preferido para servidor y ya ofrece una imagen compilada con drivers preinstalados para el hardware de arquitectura ARM. En lugar de una instalaci\u00f3n tradicional que nos gu\u00eda pantalla a pantalla por el particionado, nombre de equipo, usuario, configuraci\u00f3n de red, paquetes&#8230; volcaremos una imagen del sistema a la tarjeta microSD para arrancar directamente con ella. Los pasos:<\/p>\n<ol>\n<li><a href=\"https:\/\/ubuntu.com\/download\/raspberry-pi\">Descargar Ubuntu Server como imagen preconfigurada para Raspberry Pi <\/a><\/li>\n<li>Volcarla en la micro SD empleando por ejemplo <a href=\"https:\/\/sourceforge.net\/projects\/win32diskimager\/\">Win32 Disk Imager<\/a><\/li>\n<li>Introducir la micro SD en la ranura de la Raspberry Pi.<\/li>\n<li>Para <a href=\"https:\/\/www.jmarior.net\/itank\/como-conectar-a-la-consola-de-raspberry-pi-usb-por-puerto-serie\/\">conectar con la consola de la Raspberry Pi us\u00e9 un adaptador de USB a puerto serie<\/a><\/li>\n<li>Por fin arrancamos el sistema.<\/li>\n<li>Si tenemos acceso al servidor DHCP para conocer la IP asignada podemos saltarnos el paso 4 y conectar mediante SSH.<\/li>\n<li>Para el primer login el par usuario\/contrase\u00f1a predeterminado es ubuntu\/ubuntu y el sistema solicitar\u00e1 un cambio de contrase\u00f1a inmediato.<\/li>\n<\/ol>\n<p><a href=\"https:\/\/www.jmarior.net\/itank\/files\/Putty-connected-to-Raspberry-Pi-01.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter wp-image-2542\" src=\"https:\/\/www.jmarior.net\/itank\/files\/Putty-connected-to-Raspberry-Pi-01.jpg\" alt=\"\" width=\"770\" height=\"450\" srcset=\"https:\/\/www.jmarior.net\/itank\/files\/Putty-connected-to-Raspberry-Pi-01.jpg 992w, https:\/\/www.jmarior.net\/itank\/files\/Putty-connected-to-Raspberry-Pi-01-400x234.jpg 400w, https:\/\/www.jmarior.net\/itank\/files\/Putty-connected-to-Raspberry-Pi-01-768x449.jpg 768w, https:\/\/www.jmarior.net\/itank\/files\/Putty-connected-to-Raspberry-Pi-01-800x468.jpg 800w\" sizes=\"auto, (max-width: 770px) 100vw, 770px\" \/><\/a><\/p>\n<p>Los primeros comandos siempre est\u00e1n orientados a actualizar el sistema:<\/p>\n<pre class=\"lang-bash prettyprint prettyprinted\"><code><span class=\"pln\"># apt update\r\n# apt full<\/span><span class=\"pun\">-<\/span><span class=\"pln\">upgrade\r\n# reboot<\/span><\/code><\/pre>\n<p>A continuaci\u00f3n la configuraci\u00f3n b\u00e1sica incluye:<\/p>\n<hr \/>\n<h3><strong>Reemplazar el usuario predeterminado por el nuestro<\/strong><\/h3>\n<p><code><span class=\"pln\"># adduser nuevousuario<\/span><\/code><\/p>\n<p>y lo a\u00f1adimos al grupo de sudoers, con derecho a ejecutar ocmandos con privilegios de root<\/p>\n<p><code><span class=\"pln\"># adduser nuevousuario sudo<\/span><\/code><\/p>\n<p>Hace logout (Ctrl + D) y login con el nuevo usuario para eliminar el predeterminado<\/p>\n<p><code><span class=\"pln\"># deluser ubuntu<\/span><\/code><\/p>\n<hr \/>\n<p><strong>Establecer el nombre del equipo<\/strong><\/p>\n<p># hostnamectl set-hostname host.domain.com<\/p>\n<hr \/>\n<h2><strong>Monitorizando el sistema<\/strong><\/h2>\n<blockquote><p><a href=\"https:\/\/www.jmarior.net\/itank\/files\/cpu-temperature.png\"><img loading=\"lazy\" decoding=\"async\" class=\" wp-image-2558 alignleft\" src=\"https:\/\/www.jmarior.net\/itank\/files\/cpu-temperature.png\" alt=\"\" width=\"93\" height=\"93\" srcset=\"https:\/\/www.jmarior.net\/itank\/files\/cpu-temperature.png 512w, https:\/\/www.jmarior.net\/itank\/files\/cpu-temperature-384x384.png 384w, https:\/\/www.jmarior.net\/itank\/files\/cpu-temperature-400x400.png 400w\" sizes=\"auto, (max-width: 93px) 100vw, 93px\" \/><\/a>Algo que me preocup\u00f3 desde el principio por la multitud de art\u00edculos que lo mencionaban es el incremento de temperatura de los nuevos modelos de Raspberry Pi 4, as\u00ed que busqu\u00e9 <a href=\"https:\/\/www.cyberciti.biz\/faq\/linux-find-out-raspberry-pi-gpu-and-arm-cpu-temperature-command\/\">c\u00f3mo medir la temperatura de la CPU desde la l\u00ednea de comandos<\/a> y veo que en condiciones normales se mantiene alrededor de los 48\u00baC<\/p><\/blockquote>\n<p>&nbsp;<\/p>\n<h3><strong>Mostrar la temperatura de la CPU al inicio de sesi\u00f3n<\/strong><\/h3>\n<p>Cuando se ejecuta una sesi\u00f3n interactiva de la shell bash, esta ejecuta comandos del directorio <code>\/etc\/profile<\/code> para a continuaci\u00f3n buscar y ejecutar s\u00f3lo el primero que encuentre de estos scripts en este orden:<\/p>\n<ol>\n<li><code>.bash_profile<\/code><\/li>\n<li><code>.bash_login<\/code><\/li>\n<li><code>.profile<\/code><\/li>\n<\/ol>\n<p>Como ya exist\u00eda edit\u00e9 <code>.profile<\/code> y a\u00f1ad\u00ed al final:<\/p>\n<pre>cpu=$(&lt;\/sys\/class\/thermal\/thermal_zone0\/temp)\r\necho \"CPU temperature is $((cpu\/1000))'C\"<\/pre>\n<h2><strong>Medir el rendimiento <\/strong><\/h2>\n<p><strong>Velocidad de la tarjeta micro SD<\/strong><\/p>\n<p>Partiendo de que la CPU y la RAM en una Raspberry Pi ya son de frecuencia limitada -aunque suficientes para un modesto servidor web- lo que m\u00e1s me preocupa es el cuello de botella que m\u00e1s limita: el disco. En esta caso el sistema operativo est\u00e1 montado en una ranura micro sd, as\u00ed que medimos su rendimiento:<\/p>\n<p><a href=\"https:\/\/www.jmarior.net\/itank\/files\/performance.png\"><img loading=\"lazy\" decoding=\"async\" class=\" wp-image-2570 alignleft\" src=\"https:\/\/www.jmarior.net\/itank\/files\/performance.png\" alt=\"\" width=\"98\" height=\"99\" \/><\/a><\/p>\n<pre># hdparm -tT \/dev\/mmcblk0p2\r\nTiming cached reads: 1822 MB in 2.00 seconds = 911.88 MB\/sec\r\nTiming buffered disk reads: 130 MB in 3.01 seconds = 43.17 MB\/sec<\/pre>\n<p>hay mucho que mejorar si comparamos con una medici\u00f3n sobre otro equipo que virtualiza con KVM sobre un ssd de gama media conectado por un bus SATA 2<\/p>\n<pre># hdparm -tT \/dev\/vda1\r\nTiming cached reads: 8012 MB in 2.00 seconds = 4009.17 MB\/sec\r\nTiming buffered disk reads: 478 MB in 3.02 seconds = 158.43 MB\/sec<\/pre>\n<h2><strong>Configurar la red en Ubuntu con netplan<\/strong><\/h2>\n<p>Tras m\u00e1s de 20 a\u00f1os configurando la red en Linux editando el fichero \/etc\/network\/interfaces desde Ubuntu 17.10 se debe usar <a href=\"https:\/\/ubuntu.com\/blog\/ubuntu-bionic-netplan\">netplan<\/a> con ficheros en formato YAML.<\/p>\n<p>Empezamos por editar el fichero:<\/p>\n<p><code># nano \/etc\/netplan\/50-cloud-init.yaml<\/code><\/p>\n<p>Para una red con IP din\u00e1mica adquirida por DHCP<\/p>\n<pre class=\"lang-yaml prettyprint prettyprinted\"><code><span class=\"pln\">network<\/span><span class=\"pun\">:<\/span><span class=\"pln\">\r\n    version<\/span><span class=\"pun\">:<\/span> <span class=\"lit\">2<\/span><span class=\"pln\">\r\n    ethernets<\/span><span class=\"pun\">:<\/span><span class=\"pln\">\r\n        eth0<\/span><span class=\"pun\">:<\/span><span class=\"pln\">\r\n            optional<\/span><span class=\"pun\">:<\/span> <span class=\"kwd\">t\r\nrue<\/span><span class=\"pln\">\r\n            dhcp4<\/span><span class=\"pun\">:<\/span> <span class=\"kwd\">true<\/span>\r\n    <span class=\"com\"># add wifi setup information here ...<\/span><span class=\"pln\">\r\n    wifis<\/span><span class=\"pun\">:<\/span><span class=\"pln\">\r\n        wlan0<\/span><span class=\"pun\">:<\/span><\/code> <code><span class=\"pln\">          dhcp4<\/span><span class=\"pun\">:<\/span> <span class=\"kwd\">true\r\n         <\/span><\/code><code><span class=\"pln\">optional<\/span><span class=\"pun\">:<\/span> <span class=\"kwd\">true\r\n          <\/span><span class=\"pln\">access<\/span><span class=\"pun\">-<\/span><span class=\"pln\">points<\/span><span class=\"pun\">:<\/span> \r\n             <em>your-wifi-ssid<\/em><span class=\"pun\"><em>:<\/em>\r\n            <\/span><span class=\"pln\"> password<\/span><span class=\"pun\">:<\/span> your-wifi-password <\/code><\/pre>\n<p>&nbsp;<\/p>\n<p>Para establecer una IP fija<\/p>\n<pre>network:\r\n  version: 2\r\n  ethernets:\r\n    eth0:\r\n      dhcp4: false\r\n      addresses: [192.168.0.24\/24]\r\n      gateway4: 192.168.0.1\r\n      nameservers:\r\n        addresses: [192.168.0.1]<\/pre>\n<p>Probar la configuraci\u00f3n<\/p>\n<p><code># netplan --debug try<\/code><\/p>\n<p>y si no hay errores la fijamos<\/p>\n<p><code># netplan --debug generate<\/code><\/p>\n<p>Otra forma es aplicar la configuraci\u00f3n directamente:<\/p>\n<p><code># netplan apply<\/code><\/p>\n<p>Aunque los <a href=\"https:\/\/www.oueta.com\/linux\/network-configuration-in-linux-ifconfig-net-tools-vs-ip-iproute2\/\">comandos de red bajo Linux se han modernizado<\/a>, son muchos a\u00f1os fiel a <code>ifconfig<\/code>, del paquete cl\u00e1sico de las net-tools que han obsoletizado<\/p>\n<p><code># apt install net-tools<\/code><\/p>\n<p>adem\u00e1s apunto una tabla de equivalencias con los comandos de iproute2 para ir acostumbr\u00e1ndome:<\/p>\n<table class=\"ifconfig_vs_ip\">\n<tbody>\n<tr>\n<th>net-tools<\/th>\n<th><\/th>\n<th>iproute2<\/th>\n<\/tr>\n<tr>\n<td><span class=\"red_text\">ifconfig<\/span><\/td>\n<td><\/td>\n<td><span class=\"dark_green_text\">ip -s link<\/span>, <span class=\"dark_green_text\">ip -s address<\/span><\/td>\n<\/tr>\n<tr>\n<td><span class=\"red_text\">route<\/span><\/td>\n<td><\/td>\n<td><span class=\"dark_green_text\">ip route<\/span><\/td>\n<\/tr>\n<tr>\n<td><span class=\"red_text\">arp<\/span><\/td>\n<td><\/td>\n<td><span class=\"dark_green_text\">ip neigh<\/span><\/td>\n<\/tr>\n<tr>\n<td><span class=\"red_text\">nameif<\/span><\/td>\n<td><\/td>\n<td><span class=\"dark_green_text\">ip link<\/span><\/td>\n<\/tr>\n<tr>\n<td>ipmaddr<\/td>\n<td><\/td>\n<td>ip maddress<\/td>\n<\/tr>\n<tr>\n<td>iptunnel<\/td>\n<td><\/td>\n<td>ip tunnel<\/td>\n<\/tr>\n<tr>\n<td>netstat<\/td>\n<td><\/td>\n<td>ss, nstat<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<h2>Configurar un mail relay de Gmail con Postfix<\/h2>\n<p>Para que tu servidor pueda enviar correos desde la l\u00ednea de comandos, la estrategia reside en configurar un mail ralay contra un servidor SMTP ya existente. Yo usar\u00e9 una cuenta de GMail<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignleft wp-image-2604\" src=\"https:\/\/www.jmarior.net\/itank\/files\/postfix-logo.png\" alt=\"\" width=\"268\" height=\"170\" \/><\/p>\n<p><code># apt-get install -y mailutils<br \/>\n# nano \/etc\/postfix\/main.cf<br \/>\n# nano \/etc\/postfix\/sasl_passwd<br \/>\n# postmap \/etc\/postfix\/sasl_passwd<br \/>\n# chown root:root \/etc\/postfix\/sasl_passwd \/etc\/postfix\/sasl_passwd.db<br \/>\n# chmod 0600 \/etc\/postfix\/sasl_passwd \/etc\/postfix\/sasl_passwd.db<br \/>\n# cat \/etc\/ssl\/certs\/thawte_Primary_Root_CA.pem | sudo tee -a \/etc\/postfix\/cacert.pem<br \/>\n$ echo \"Mail de prueba\" | mail -s \"probando\" user@domain.com<\/code><\/p>\n<h2><strong>Instalar el servidor DNS dnsmasq<br \/>\n<\/strong><\/h2>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignleft size-full wp-image-2611\" src=\"https:\/\/www.jmarior.net\/itank\/files\/dnsmask-logo.png\" alt=\"\" width=\"125\" height=\"68\" \/>El servidor DNS preferido por las \u00faltimas versiones de Ubuntu es bind9, es muy completo pero complejo de configurar, sib embargo <strong>dnsmasq<\/strong> es un viejo conocido mio que se configura r\u00e1pidamente.<\/p>\n<p>&nbsp;<\/p>\n<p><code># apt install dnsmasq<\/code><\/p>\n<p>Para configurar los hosts mi LAN basta con declararlos sin jerarqu\u00edas de dominios, editando<\/p>\n<p><code># nano \/etc\/hosts<\/code><\/p>\n<p>y muy importante para usar desde las m\u00e1uinas de la LAN es abrir en el firewall el puerto 53 por TCP y UDP<\/p>\n<p><code><br \/>\n# ufw allow 53\/tcp<br \/>\n# ufw allow 53\/udp<\/code><\/p>\n<h2><strong>Instalar servidor web Apache<\/strong><\/h2>\n<p><a href=\"https:\/\/www.jmarior.net\/itank\/files\/apache2.png\"><img loading=\"lazy\" decoding=\"async\" class=\" wp-image-2567 alignleft\" src=\"https:\/\/www.jmarior.net\/itank\/files\/apache2.png\" alt=\"\" width=\"95\" height=\"95\" \/><\/a><code># apt install apache2<br \/>\n# ufw allow http<br \/>\n# ufw allow https<\/code><\/p>\n<p><a href=\"https:\/\/www.jmarior.net\/itank\/files\/Apache2-Ubuntu-default-page.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter wp-image-2568\" src=\"https:\/\/www.jmarior.net\/itank\/files\/Apache2-Ubuntu-default-page.jpg\" alt=\"\" width=\"577\" height=\"921\" srcset=\"https:\/\/www.jmarior.net\/itank\/files\/Apache2-Ubuntu-default-page.jpg 823w, https:\/\/www.jmarior.net\/itank\/files\/Apache2-Ubuntu-default-page-400x639.jpg 400w, https:\/\/www.jmarior.net\/itank\/files\/Apache2-Ubuntu-default-page-768x1226.jpg 768w, https:\/\/www.jmarior.net\/itank\/files\/Apache2-Ubuntu-default-page-800x1277.jpg 800w\" sizes=\"auto, (max-width: 577px) 100vw, 577px\" \/><\/a><\/p>\n<p>Activamos los directorios de usuario, para que http:\/\/server\/~user sirva p\u00e1ginas web por \/home\/user\/public_html<\/p>\n<p><code># a2enmod userdir<\/code><\/p>\n<p>Activamos el m\u00f3dulo de reescritura de URL y los que sean necesarios.<\/p>\n<p><code># a2enmod rewrite<\/code><\/p>\n<p>y reiniciar el servicio<\/p>\n<p><code># systemctl restart apache2<\/code><\/p>\n<h2 class=\"code-pre command\"><strong>Instalar MySQL server<\/strong><\/h2>\n<p class=\"code-pre command\"><code><br \/>\n# apt install mysql-server<\/code><\/p>\n<pre class=\"code-pre command\"><code># mysql_secure_installation<\/code><\/pre>\n<p>&nbsp;<\/p>\n<h2 class=\"code-pre command\"><strong>Instalar PHP<br \/>\n<\/strong><\/h2>\n<pre class=\"code-pre command\"><code><a href=\"https:\/\/www.jmarior.net\/itank\/files\/php-logo.jpeg\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-2578 alignleft\" src=\"https:\/\/www.jmarior.net\/itank\/files\/php-logo.jpeg\" alt=\"\" width=\"94\" height=\"66\" srcset=\"https:\/\/www.jmarior.net\/itank\/files\/php-logo.jpeg 578w, https:\/\/www.jmarior.net\/itank\/files\/php-logo-400x281.jpeg 400w\" sizes=\"auto, (max-width: 94px) 100vw, 94px\" \/><\/a># apt install php libapache2-mod-php php-mysql<\/code><\/pre>\n<p>Con esto quedan habilitados los scripts PHP en el root del webserver. Probamos:<\/p>\n<div title=\"info.php\"><\/div>\n<div class=\"code-label \" title=\"info.php\"># nano \/var\/www\/html\/info.php<\/div>\n<p class=\"code-pre \"><code>&lt;?php<br \/>\nphpinfo();<br \/>\n?&gt;<\/p>\n<p>Desde el navegador web: http:\/\/servidor\/index.php<\/code> <a href=\"https:\/\/www.jmarior.net\/itank\/files\/PHP-v7.3.11-over-ubuntu-server-18.04.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter wp-image-2576\" src=\"https:\/\/www.jmarior.net\/itank\/files\/PHP-v7.3.11-over-ubuntu-server-18.04.jpg\" alt=\"\" width=\"667\" height=\"627\" srcset=\"https:\/\/www.jmarior.net\/itank\/files\/PHP-v7.3.11-over-ubuntu-server-18.04.jpg 968w, https:\/\/www.jmarior.net\/itank\/files\/PHP-v7.3.11-over-ubuntu-server-18.04-400x376.jpg 400w, https:\/\/www.jmarior.net\/itank\/files\/PHP-v7.3.11-over-ubuntu-server-18.04-768x722.jpg 768w, https:\/\/www.jmarior.net\/itank\/files\/PHP-v7.3.11-over-ubuntu-server-18.04-800x752.jpg 800w\" sizes=\"auto, (max-width: 667px) 100vw, 667px\" \/><\/a> pero de forma predeterminada PHP est\u00e1 deshabilitado en los directorios de usuario <span id=\"line-1-7\" class=\"anchor\"><\/span>sudo a2enmod userdir<\/p>\n<p>As\u00ed que hay que editarel archivo de configuraci\u00f3n web de PHP<\/p>\n<p><code># nano \/etc\/apache2\/mods-available\/php7.3.conf<\/code><\/p>\n<p>comentar las l\u00edneas<\/p>\n<p><code># Running PHP scripts in user directories is disabled by default<br \/>\n#<br \/>\n# To re-enable PHP in user directories comment the following lines<br \/>\n# (from &lt;IfModule ...&gt; to &lt;\/IfModule&gt;.) Do NOT set it to On as it<br \/>\n# prevents .htaccess files from disabling it.<br \/>\n# &lt;IfModule mod_userdir.c&gt;<br \/>\n# &lt;Directory \/home\/*\/public_html&gt;<br \/>\n# php_admin_flag engine Off<br \/>\n# &lt;\/Directory&gt;<br \/>\n# &lt;\/IfModule&gt;<\/code><\/p>\n<p>y reiniciar el servicio de Apache<\/p>\n<p><code># service apache2 restart<\/code><\/p>\n<div title=\"info.php\">M\u00e1s info https:\/\/wiki.ubuntu.com\/UserDirectoryPHP<\/div>\n<div title=\"info.php\"><\/div>\n<div class=\"code-label \" title=\"info.php\">info.php<\/div>\n<pre class=\"code-pre \"><code>&lt;?php\r\nphpinfo();\r\n?&gt;\r\n<\/code><\/pre>\n<p>&nbsp;<\/p>\n<hr \/>\n<h2><strong>Instalar el firewall<\/strong><\/h2>\n<h3><strong><span class=\"module__title__link\">Uncomplicated Firewall Ubuntu<br \/>\n<\/span><\/strong><\/h3>\n<p><a href=\"https:\/\/www.jmarior.net\/itank\/files\/firewall.png\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-2564 alignleft\" src=\"https:\/\/www.jmarior.net\/itank\/files\/firewall.png\" alt=\"\" width=\"81\" height=\"81\" srcset=\"https:\/\/www.jmarior.net\/itank\/files\/firewall.png 400w, https:\/\/www.jmarior.net\/itank\/files\/firewall-384x384.png 384w\" sizes=\"auto, (max-width: 81px) 100vw, 81px\" \/><\/a>Nada m\u00e1s sencillo de instalar<\/p>\n<p><code># apt install ufw<\/code><\/p>\n<p>&nbsp;<\/p>\n<p>Activarlo <code># ufw enable<\/code><\/p>\n<p>Abrir puertos conocidos <code># ufw allow ssh<\/code><\/p>\n<p>Abrir puertos espec\u00edficos (tcp o udp deben estibirse en min\u00fasculas)<\/p>\n<p><code># ufw allow 1010\/tcp<\/code><\/p>\n<p>Permitir acceso s\u00f3lo desde la LAN <code># ufw allow from 192.168.0.0\/24<\/code><\/p>\n<p>Comprobar el estado <code># ufw status numbered<\/code><\/p>\n<pre>Status: active\r\n\r\nTo Action From\r\n-- ------ ----\r\n[ 1] 80\/tcp ALLOW IN Anywhere \r\n[ 2] 22\/tcp ALLOW IN Anywhere \r\n[ 3] 53\/udp ALLOW IN Anywhere \r\n[ 4] 80\/tcp (v6) ALLOW Anywhere (v6) \r\n[ 5] 22\/tcp (v6) ALLOW Anywhere (v6) \r\n\r\nY para eliminar reglas innecesarias debe hacerse por id\r\n\r\n<code># ufw delete 5<\/code> Para m\u00e1s <a href=\"https:\/\/www.hostinger.es\/tutoriales\/como-configurar-firewall-ubuntu\">informaci\u00f3n sobre el firewall de Ubuntu<\/a> y en <a href=\"https:\/\/help.ubuntu.com\/community\/UFW\">help.ubuntu.com\/community\/UFW<\/a><\/pre>\n<hr \/>\n<h2><strong>Montar un disco SSD externo por USB 3.0<\/strong><\/h2>\n<p><a href=\"https:\/\/www.jmarior.net\/itank\/files\/ssd-icon.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-2571 alignleft\" src=\"https:\/\/www.jmarior.net\/itank\/files\/ssd-icon.jpg\" alt=\"\" width=\"134\" height=\"134\" srcset=\"https:\/\/www.jmarior.net\/itank\/files\/ssd-icon.jpg 400w, https:\/\/www.jmarior.net\/itank\/files\/ssd-icon-384x384.jpg 384w\" sizes=\"auto, (max-width: 134px) 100vw, 134px\" \/><\/a> 1. Localizar el disco reci\u00e9n conectado: # lshw -C disk<\/p>\n<pre> *-disk \r\ndescription: SCSI Disk\r\nvendor: SABRENT\r\nphysical id: 0.0.0\r\nbus info: scsi@0:0.0.0\r\nlogical name: \/dev\/sda\r\nversion: 0204\r\nserial: DB9876123456E\r\nsize: 232GiB (250GB)\r\ncapabilities: partitioned partitioned:dos\r\nconfiguration: ansiversion=6 logicalsectorsize=512 sectorsize=4096 signature=27e7f8ed\r\n\r\n<\/pre>\n<p>2. inicializar y particionar:<br \/>\n<code># fdisk \/dev\/sda<\/code><\/p>\n<p>n (add a new partition)<br \/>\np (primary)<br \/>\n1 (partition number)<br \/>\nw (write changes)<\/p>\n<p>3. Formatear la partici\u00f3n:<br \/>\n<code># mkfs -t ext4 \/dev\/sda1<\/code><\/p>\n<p>4. Eliminar el espacio reservado para el usuario root<br \/>\n<code># tune2fs -m 0 \/dev\/sda1<\/code><\/p>\n<p>5. Crear el punto de montaje y montar la nueva partici\u00f3n<br \/>\n<code># mkdir \/media\/ssd250gb<\/code><br \/>\n<code># mount \/dev\/sdc1 \/media\/ssd250gb<\/code><\/p>\n<p>Durante alguna de esta operaciones experiment\u00e9 tiempos de espera exagerados y la consola mostraba un mensaje<\/p>\n<pre>SG_IO: bad\/missing sense data, sb[]: 70 00 0b 00 00 00 00 0a 00<\/pre>\n<p>Que solucion\u00e9 con el comando<\/p>\n<p># hdparm &#8211;security-disable NULL \/dev\/sda<\/p>\n<p>6. Medir el rendimiento # sudo hdparm -tT \/dev\/sda1<\/p>\n<pre>Timing cached reads: 1866 MB in 2.00 seconds = 934.16 MB\/sec\r\nTiming buffered disk reads: 672 MB in 3.01 seconds = 223.50 MB\/<\/pre>\n<p>7. Registrarlo en fstab para que se monte al inicio del sistema<\/p>\n<p>Averiguar el UUID del nuevo disco <code># blkid<\/code><\/p>\n<pre>\/dev\/sda1: UUID=\"11111111-ddddd-4444-fffff-333333333\" TYPE=\"ext4\" PARTUUID=\"27eeee1-01\"<\/pre>\n<p># nano \/etc\/fstab<\/p>\n<p>podemos encontrarnos dos formatos de l\u00ednea, si se apunta a la partici\u00f3n<\/p>\n<p>UUID=11111111-ddddd-4444-fffff-333333333 \/dev\/sda1 ext4 defaults<\/p>\n<p>Para m\u00e1s <a href=\"https:\/\/help.ubuntu.com\/community\/Fstab\">info sobre c\u00f3mo utilizar fstab<\/a><\/p>\n<p>8. Probamos la nueva configuraci\u00f3n sin reiniciar # mount -a<\/p>\n<p>9. El disco se montar\u00e1 al inicio del sistema<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Sigo atentamente la evoluci\u00f3n del peque\u00f1o Raspberry Pi desde sus or\u00edgenes y finalmente lo voy a poner a prueba migrando algunos de mis servicios a \u00e9l. Planificar los roles de servidor Servidor LAMP (Linux + Apache + MySQL\/MariaDB + PHP) Servidor web para mis dominios Servidor de base de datos (local) Servidor de ficheros con [&hellip;]<\/p>\n","protected":false},"author":2,"featured_media":2581,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[5],"tags":[],"class_list":["post-2485","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-itank-ideas"],"views":304,"_links":{"self":[{"href":"https:\/\/www.jmarior.net\/itank\/wp-json\/wp\/v2\/posts\/2485","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.jmarior.net\/itank\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.jmarior.net\/itank\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.jmarior.net\/itank\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/www.jmarior.net\/itank\/wp-json\/wp\/v2\/comments?post=2485"}],"version-history":[{"count":0,"href":"https:\/\/www.jmarior.net\/itank\/wp-json\/wp\/v2\/posts\/2485\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.jmarior.net\/itank\/wp-json\/wp\/v2\/media\/2581"}],"wp:attachment":[{"href":"https:\/\/www.jmarior.net\/itank\/wp-json\/wp\/v2\/media?parent=2485"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.jmarior.net\/itank\/wp-json\/wp\/v2\/categories?post=2485"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.jmarior.net\/itank\/wp-json\/wp\/v2\/tags?post=2485"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}