Introducción

Apache y Nginx son dos servidores web de código abierto populares que se utilizan a menudo con PHP. Puede resultar útil ejecutar ambos en la misma máquina virtual cuando se alojan varios sitios web que tienen requisitos variados. La solución general para ejecutar dos servidores web en un solo sistema es utilizar varias direcciones IP o diferentes números de puerto.

Los servidores que tienen direcciones IPv4 e IPv6 pueden configurarse para servir sitios Apache en un protocolo y sitios Nginx en el otro, pero esto no es práctico en la actualidad, ya que la adopción de IPv6 por parte de los ISP aún no está muy extendida. Tener un número de puerto diferente como 81 o 8080 para el segundo servidor web es otra solución, pero compartir URL con números de puerto (como http://example.com:81) no siempre es razonable o ideal.

En este tutorial, configurará Nginx como servidor web y como proxy inverso para Apache, todo en un solo servidor.

Dependiendo de la aplicación web, es posible que se requieran cambios de código para mantener Apache compatible con el proxy inverso, especialmente cuando se configuran sitios SSL. Para evitar esto, instalará un módulo de Apache llamado mod_rpaf que reescribe ciertas variables de entorno por lo que parece que Apache está manejando directamente las solicitudes de los clientes web.

Alojaremos cuatro nombres de dominio en un servidor. Dos serán atendidos por Nginx: example.com (el host virtual predeterminado) y sample.org. Los dos restantes, foobar.net y test.io, será servido por Apache. También configuraremos Apache para que sirva aplicaciones PHP mediante PHP-FPM, que ofrece un mejor rendimiento en mod_php.

Prerrequisitos

Para completar este tutorial, necesitará lo siguiente:

  • Un nuevo servidor Ubuntu 18.04 configurado siguiendo la configuración inicial del servidor con Ubuntu 18.04, con un usuario no root sudo y un firewall.
  • Cuatro nombres de dominio totalmente calificados configurados para apuntar a la dirección IP de su servidor. Consulte el Paso 3 de Cómo configurar un nombre de host con DigitalOcean para ver un ejemplo de cómo hacer esto. Si aloja el DNS de sus dominios en otro lugar, debe crear los registros A apropiados allí.

Paso 1: instalación de Apache y PHP-FPM

Comencemos instalando Apache y PHP-FPM.

Además de Apache y PHP-FPM, también instalaremos el módulo PHP FastCGI Apache, libapache2-mod-fastcgi, para admitir aplicaciones web FastCGI.

Primero, actualice su lista de paquetes para asegurarse de tener los paquetes más recientes.

A continuación, instale los paquetes Apache y PHP-FPM:

  • sudo apt install apache2 php-fpm

El módulo FastCGI Apache no está disponible en el repositorio de Ubuntu, así que descárguelo de kernel.org e instalarlo usando el dpkg mando.

  • wget https://mirrors.edge.kernel.org/ubuntu/pool/multiverse/liba/libapache-mod-fastcgi/libapache2-mod-fastcgi_2.4.7~0910052141-1.2_amd64.deb
  • sudo dpkg -i libapache2-mod-fastcgi_2.4.7~0910052141-1.2_amd64.deb

A continuación, cambiemos la configuración predeterminada de Apache para usar PHP-FPM.

Paso 2: configuración de Apache y PHP-FPM

En este paso, cambiaremos el número de puerto de Apache a 8080 y configurarlo para que funcione con PHP-FPM usando el mod_fastcgi módulo. Cambiar el nombre de Apache ports.conf archivo de configuración:

  • sudo mv /etc/apache2/ports.conf /etc/apache2/ports.conf.default

Crear un nuevo ports.conf archivo con el puerto establecido en 8080:

  • echo «Listen 8080» | sudo tee /etc/apache2/ports.conf

Nota: Los servidores web generalmente están configurados para escuchar 127.0.0.1:8080 al configurar un proxy inverso, pero al hacerlo, se establecería el valor de la variable de entorno de PHP SERVER_ADDR a la dirección IP de loopback en lugar de la IP pública del servidor. Nuestro objetivo es configurar Apache de tal manera que sus sitios web no vean un proxy inverso delante de él. Entonces, lo configuraremos para escuchar en 8080 en todas las direcciones IP.

A continuación, crearemos un archivo de host virtual para Apache. los La directiva de este archivo se configurará para servir sitios solo en el puerto 8080.

Deshabilite el host virtual predeterminado:

  • sudo a2dissite 000-default

Luego cree un nuevo archivo de host virtual, utilizando el sitio predeterminado existente:

  • sudo cp /etc/apache2/sites-available/000-default.conf /etc/apache2/sites-available/001-default.conf

Ahora abra el nuevo archivo de configuración:

  • sudo nano /etc/apache2/sites-available/001-default.conf

Cambie el puerto de escucha a 8080:

/etc/apache2/sites-available/000-default.conf

8080>
    ServerAdmin webmaster@localhost
    DocumentRoot /var/www/html
    ErrorLog ${APACHE_LOG_DIR}/error.log
    CustomLog ${APACHE_LOG_DIR}/access.log combined

Guarde el archivo y active el nuevo archivo de configuración:

  • sudo a2ensite 001-default

Luego recargue Apache:

  • sudo systemctl reload apache2

Verifique que Apache esté escuchando ahora 8080:

La salida debería verse como el siguiente ejemplo, con apache2 escuchando 8080:

Output

Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address     Foreign Address      State    PID/Program name
tcp        0      0 0.0.0.0:22        0.0.0.0:*            LISTEN   1086/sshd
tcp6       0      0 :::8080           :::*                 LISTEN   4678/apache2
tcp6       0      0 :::22             :::*                 LISTEN   1086/sshd

Una vez que verifique que Apache está escuchando en el puerto correcto, puede configurar el soporte para PHP y FastCGI.

Paso 3: configuración de Apache para usar mod_fastcgi

Apache sirve páginas PHP usando mod_php de forma predeterminada, pero requiere una configuración adicional para funcionar con PHP-FPM.

Nota: Si está probando este tutorial en una instalación existente de LAMP con mod_php, deshabilítelo primero con sudo a2dismod php7.2.

Agregaremos un bloque de configuración para mod_fastcgi que depende de mod_action. mod_action está deshabilitado de forma predeterminada, por lo que primero debemos habilitarlo:

Cambie el nombre del archivo de configuración FastCGI existente:

  • sudo mv /etc/apache2/mods-enabled/fastcgi.conf /etc/apache2/mods-enabled/fastcgi.conf.default

Cree un nuevo archivo de configuración:

  • sudo nano /etc/apache2/mods-enabled/fastcgi.conf

Agregue las siguientes directivas al archivo para pasar solicitudes de .php archivos al socket PHP-FPM UNIX:

/etc/apache2/mods-enabled/fastcgi.conf


  AddHandler fastcgi-script .fcgi
  FastCgiIpcDir /var/lib/apache2/fastcgi
  AddType application/x-httpd-fastphp .php
  Action application/x-httpd-fastphp /php-fcgi
  Alias /php-fcgi /usr/lib/cgi-bin/php-fcgi
  FastCgiExternalServer /usr/lib/cgi-bin/php-fcgi -socket /run/php/php7.2-fpm.sock -pass-header Authorization
  
    Require all granted
  

Guarde los cambios y realice una prueba de configuración:

Recargue Apache si Sintaxis correcta se visualiza:

  • sudo systemctl reload apache2

Si ves la advertencia Could not reliably determine the server's fully qualified domain name, using 127.0.1.1. Set the 'ServerName' directive globally to suppress this message., puede ignorarlo con seguridad por ahora. Configuraremos los nombres de los servidores más tarde.

Ahora asegurémonos de que podemos servir PHP desde Apache.

Paso 4: verificar la funcionalidad de PHP

Asegurémonos de que PHP funciona creando un phpinfo() archivo y accediendo a él desde un navegador web.

Crea el archivo /var/www/html/info.php que contiene una llamada al phpinfo función:

  • echo «» | sudo tee /var/www/html/info.php

Tenga en cuenta que si siguió la configuración inicial del servidor en el Prerrequisitos secciones, entonces probablemente habilitó el cortafuegos Apache. Sigamos adelante y asegurémonos de que podemos acceder a nuestra IP en el puerto 8080, que actualmente no es accesible. Restringiremos el acceso público a este puerto en Paso 10.

Primero permitir puerto 8080 a través del firewall:

Dado que vamos a proteger nuestros dominios Apache, sigamos adelante y asegurémonos de que el tráfico TLS en el puerto 443 puede entrar.

Permitir Apache Full para permitir el tráfico en los puertos 80 y 443:

  • sudo ufw allow «Apache Full»

Ahora verifique el estado de su firewall:

Si siguió los requisitos previos, el resultado se verá así:

Output

To                         Action      From
--                         ------      ----
OpenSSH                    ALLOW       Anywhere
Apache Full                ALLOW       Anywhere
8080                       ALLOW       Anywhere
OpenSSH (v6)               ALLOW       Anywhere (v6)
Apache Full (v6)           ALLOW       Anywhere (v6)
8080 (v6)                  ALLOW       Anywhere (v6)

Verás ese puerto 8080 y Apache Full se permiten junto con cualquier otra regla de firewall. Ahora veamos nuestro info.php página.

Para ver el archivo en un navegador, vaya a http://your_server_ip:8080/info.php. Esto le dará una lista de las opciones de configuración que usa PHP.

API del servidor phpinfo

Variables PHP phpinfo

En la parte superior de la página, compruebe que API del servidor dice FPM / FastCGI. Aproximadamente dos tercios del camino hacia abajo en la página, el Variables PHP la sección le dirá el SERVER_SOFTWARE es Apache en Ubuntu. Estos confirman que mod_fastcgi está activo y Apache está usando PHP-FPM para procesar archivos PHP.

Paso 5: creación de hosts virtuales para Apache

Creemos archivos de host virtual Apache para los dominios foobar.net y test.io. Para hacer eso, primero crearemos directorios raíz de documentos para ambos sitios y colocaremos algunos archivos predeterminados en esos directorios para que podamos probar fácilmente nuestra configuración.

Primero, cree los directorios raíz del documento:

  • sudo mkdir -v /var/www/foobar.net /var/www/test.io

Entonces crea un index archivo para cada sitio:

  • echo »

    Foo Bar

    » | sudo tee /var/www/foobar.net/index.html

  • echo »

    Test IO

    » | sudo tee /var/www/test.io/index.html

Entonces crea un phpinfo() para cada sitio para que podamos probar que PHP está configurado correctamente.

  • echo «» | sudo tee /var/www/foobar.net/info.php
  • echo «» | sudo tee /var/www/test.io/info.php

Ahora cree el archivo de host virtual para el foobar.net dominio:

  • sudo nano /etc/apache2/sites-available/foobar.net.conf

Agregue el siguiente código al archivo para definir el host:

/etc/apache2/sites-available/foobar.net.conf

    
        ServerName foobar.net
        ServerAlias www.foobar.net
        DocumentRoot /var/www/foobar.net
        foobar.net>
            AllowOverride All
        
    

La línea AllowOverride All habilita .htaccess apoyo.

Estas son solo las directivas más básicas. Para obtener una guía completa sobre cómo configurar hosts virtuales en Apache, consulte Cómo configurar hosts virtuales Apache en Ubuntu 16.04.

Guarde y cierre el archivo. Luego cree una configuración similar para test.io. Primero crea el archivo:

  • sudo nano /etc/apache2/sites-available/test.io.conf

Luego agregue la configuración al archivo:

/etc/apache2/sites-available/test.io.conf

    
        ServerName test.io
        ServerAlias www.test.io
        DocumentRoot /var/www/test.io
        test.io>
            AllowOverride All
        
    

Guarde el archivo y salga del editor.

Ahora que ambos hosts virtuales Apache están configurados, habilite los sitios usando el a2ensite mando. Esto crea un enlace simbólico al archivo de host virtual en el sites-enabled directorio:

  • sudo a2ensite foobar.net
  • sudo a2ensite test.io

Verifique Apache para ver si hay errores de configuración nuevamente:

Verás Sintaxis correcta se muestra si no hay errores. Si ve algo más, revise la configuración y vuelva a intentarlo.

Vuelva a cargar Apache para aplicar los cambios una vez que su configuración esté libre de errores:

  • sudo systemctl reload apache2

Para confirmar que los sitios funcionan, abra http://foobar.net:8080 y http://test.io:8080 en su navegador y verifique que cada sitio muestre su index.html archivo.

Verás los siguientes resultados:

página de índice de foobar.net

página de índice test.io

Además, asegúrese de que PHP esté funcionando accediendo al info.php archivos para cada sitio. Visitar http://foobar.net:8080/info.php y http://test.io:8080/info.php en su navegador.

Verá la misma lista de especificaciones de configuración de PHP en cada sitio que vio en el Paso 4.

Ahora tenemos dos sitios web alojados en Apache en el puerto 8080. Configuremos Nginx a continuación.

Paso 6: instalación y configuración de Nginx

En este paso instalaremos Nginx y configuraremos los dominios example.com y sample.org como hosts virtuales de Nginx. Para obtener una guía completa sobre la configuración de hosts virtuales en Nginx, consulte Cómo configurar bloques de servidor Nginx (hosts virtuales) en Ubuntu 18.04.

Instale Nginx usando el administrador de paquetes:

Luego, elimine el enlace simbólico del host virtual predeterminado, ya que ya no lo usaremos:

  • sudo rm /etc/nginx/sites-enabled/default

Más tarde crearemos nuestro propio sitio predeterminado (example.com).

Ahora crearemos hosts virtuales para Nginx usando el mismo procedimiento que usamos para Apache. Primero cree directorios raíz de documentos para ambos sitios web:

  • sudo mkdir -v /usr/share/nginx/example.com /usr/share/nginx/sample.org

Mantendremos los sitios web de Nginx en /usr/share/nginx, que es donde Nginx los quiere por defecto. Podrías ponerlos debajo /var/www/html con los sitios de Apache, pero esta separación puede ayudarlo a asociar sitios con Nginx.

Como hizo con los hosts virtuales de Apache, cree index y phpinfo() archivos para probar después de completar la instalación:

  • echo »

    Example.com

    » | sudo tee /usr/share/nginx/example.com/index.html

  • echo »

    Sample.org

    » | sudo tee /usr/share/nginx/sample.org/index.html

  • echo «» | sudo tee /usr/share/nginx/example.com/info.php
  • echo «» | sudo tee /usr/share/nginx/sample.org/info.php

Ahora cree un archivo de host virtual para el dominio example.com:

  • sudo nano /etc/nginx/sites-available/example.com

Llamadas Nginx server {. . .} áreas de un archivo de configuración bloques de servidor. Cree un bloque de servidor para el host virtual principal, example.com. los default_server La directiva de configuración lo convierte en el host virtual predeterminado que procesa las solicitudes HTTP que no coinciden con ningún otro host virtual.

/etc/nginx/sites-available/example.com

server {
    listen 80 default_server;

    root /usr/share/nginx/example.com;
    index index.php index.html index.htm;

    server_name example.com www.example.com;
    location / {
        try_files $uri $uri/ /index.php;
    }

    location ~ .php$ {
        fastcgi_pass unix:/run/php/php7.2-fpm.sock;
        include snippets/fastcgi-php.conf;
    }
}

Guarde y cierre el archivo. Ahora cree un archivo de host virtual para el segundo dominio de Nginx, sample.org:

  • sudo nano etc/nginx/sites-available/sample.org

Agregue lo siguiente al archivo:

/etc/nginx/sites-available/sample.org

server {
    root /usr/share/nginx/sample.org;
    index index.php index.html index.htm;

    server_name sample.org www.sample.org;
    location / {
        try_files $uri $uri/ /index.php;
    }

    location ~ .php$ {
        fastcgi_pass unix:/run/php/php7.2-fpm.sock;
        include snippets/fastcgi-php.conf;
    }
}

Guarde y cierre el archivo.

Luego habilite ambos sitios creando enlaces simbólicos al sites-enabled directorio:

  • sudo ln -s /etc/nginx/sites-available/example.com /etc/nginx/sites-enabled/example.com
  • sudo ln -s /etc/nginx/sites-available/sample.org /etc/nginx/sites-enabled/sample.org

Luego, pruebe la configuración de Nginx para asegurarse de que no haya problemas de configuración:

Luego recargue Nginx si no hay errores:

  • sudo systemctl reload nginx

Ahora acceda al phpinfo() archivo de sus hosts virtuales Nginx en un navegador web visitando http://example.com/info.php y http://sample.org/info.php. Mire debajo de las secciones de Variables PHP nuevamente.

Variables PHP de Nginx

[“SERVER_SOFTWARE”] debería decir nginx, lo que indica que los archivos fueron servidos directamente por Nginx. [“DOCUMENT_ROOT”] debe apuntar al directorio que creó anteriormente en este paso para cada sitio de Nginx.

En este punto, hemos instalado Nginx y creado dos hosts virtuales. A continuación, configuraremos Nginx para solicitudes de proxy destinadas a dominios alojados en Apache.

Paso 7: configuración de Nginx para los hosts virtuales de Apache

Creemos un host virtual Nginx adicional con varios nombres de dominio en el server_name directivas. Las solicitudes de estos nombres de dominio se enviarán a Apache.

Cree un nuevo archivo de host virtual Nginx para reenviar solicitudes a Apache:

  • sudo nano /etc/nginx/sites-available/apache

Agregue el siguiente bloque de código que especifica los nombres de ambos dominios de host virtual de Apache y envía sus solicitudes a Apache. Recuerde utilizar la dirección IP pública en proxy_pass:

/ etc / nginx / sites-available / apache

server {
    listen 80;
    server_name foobar.net www.foobar.net test.io www.test.io;

    location / {
        proxy_pass http://your_server_ip:8080;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }
}

Guarde el archivo y habilite este nuevo host virtual creando un enlace simbólico:

  • sudo ln -s /etc/nginx/sites-available/apache /etc/nginx/sites-enabled/apache

Pruebe la configuración para asegurarse de que no haya errores:

Si no hay errores, vuelva a cargar Nginx:

  • sudo systemctl reload nginx

Abra el navegador y acceda a la URL http://foobar.net/info.php en su navegador. Desplácese hacia abajo hasta Variables PHP sección y verifique los valores mostrados.

phpinfo de Apache a través de Nginx

Las variables SERVER_SOFTWARE y RAIZ DEL DOCUMENTO confirme que esta solicitud fue manejada por Apache. Las variables HTTP_X_REAL_IP y HTTP_X_FORWARDED_FOR fueron agregados por Nginx y deberían mostrar la dirección IP pública de la computadora que está utilizando para acceder a la URL.

Hemos configurado con éxito Nginx para enviar solicitudes de dominios específicos a Apache. A continuación, configuremos Apache para establecer el REMOTE_ADDR variable como si estuviera manejando estas solicitudes directamente.

Paso 8: instalación y configuración de mod_rpaf

En este paso, instalará un módulo de Apache llamado mod_rpaf que reescribe los valores de REMOTE_ADDR, HTTPS y HTTP_PORT basado en los valores proporcionados por un proxy inverso. Sin este módulo, algunas aplicaciones PHP requerirían cambios de código para funcionar sin problemas desde detrás de un proxy. Este módulo está presente en el repositorio de Ubuntu como libapache2-mod-rpaf pero está desactualizado y no admite determinadas directivas de configuración. En su lugar, lo instalaremos desde la fuente.

Instale los paquetes necesarios para construir el módulo:

  • sudo apt install unzip build-essential apache2-dev

Descargue la última versión estable de GitHub:

  • wget https://github.com/gnif/mod_rpaf/archive/stable.zip

Extraiga el archivo descargado:

Cambie al nuevo directorio que contiene los archivos:

Compile e instale el módulo:

A continuación, cree un archivo en el mods disponibles directorio que cargará el rpaf módulo:

  • sudo nano /etc/apache2/mods-available/rpaf.load

Agregue el siguiente código al archivo para cargar el módulo:

/etc/apache2/mods-available/rpaf.load

LoadModule rpaf_module /usr/lib/apache2/modules/mod_rpaf.so

Guarde el archivo y salga del editor.

Cree otro archivo en este directorio llamado rpaf.conf que contendrá las directivas de configuración para mod_rpaf:

  • sudo nano /etc/apache2/mods-available/rpaf.conf

Agregue el siguiente bloque de código para configurar mod_rpaf, asegurándose de especificar la dirección IP de su servidor:

/etc/apache2/mods-available/rpaf.conf

    
        RPAF_Enable             On
        RPAF_Header             X-Real-Ip
        RPAF_ProxyIPs           your_server_ip 
        RPAF_SetHostName        On
        RPAF_SetHTTPS           On
        RPAF_SetPort            On
    

A continuación, se ofrece una breve descripción de cada directiva. Ver el mod_rpaf LÉAME archivo para obtener más información.

  • RPAF_Header – El encabezado que se utilizará para la dirección IP real del cliente.
  • RPAF_ProxyIPs – La IP del proxy para la que se ajustarán las solicitudes HTTP.
  • RPAF_SetHostName – Actualiza el nombre de vhost para ServerName y ServerAlias trabajo.
  • RPAF_SetHTTPS – Establece el HTTPS variable de entorno basada en el valor contenido en X-Forwarded-Proto.
  • RPAF_SetPort – Establece el SERVER_PORT Variable ambiental. Útil para cuando Apache está detrás de un proxy SSL.

Salvar rpaf.conf y habilita el módulo:

Esto crea enlaces simbólicos de los archivos. rpaf.load y rpaf.conf en el mods-enabled directorio. Ahora haz una prueba de configuración:

Vuelva a cargar Apache si no hay errores:

  • sudo systemctl reload apache2

Acceder al phpinfo() paginas http://foobar.net/info.php y http://test.io/info.php en su navegador y verifique Variables PHP sección. los REMOTE_ADDR La variable ahora también será la de la dirección IP pública de su computadora local.

Ahora configuremos el cifrado TLS / SSL para cada sitio.

Paso 9: configuración de sitios web HTTPS con Let’s Encrypt (opcional)

En este paso configuraremos certificados TLS / SSL para ambos dominios alojados en Apache. Obtendremos los certificados a través de [Let’s Encrypt](https://letsencrypt.org]. Nginx admite la terminación SSL para que podamos configurar SSL sin modificar los archivos de configuración de Apache. los mod_rpaf El módulo garantiza que las variables de entorno necesarias se establezcan en Apache para que las aplicaciones funcionen sin problemas detrás de un proxy inverso SSL.

Primero separaremos el server {...} bloques de ambos dominios para que cada uno de ellos pueda tener sus propios certificados SSL. Abre el archivo /etc/nginx/sites-available/apache en su editor:

  • sudo nano /etc/nginx/sites-available/apache

Modifique el archivo para que se vea así, con foobar.net y test.io en su propio server bloques:

/ etc / nginx / sites-available / apache

    server {
        listen 80;
        server_name foobar.net www.foobar.net;

        location / {
            proxy_pass http://your_server_ip:8080;
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header X-Forwarded-Proto $scheme;
        }
    }
    server {
        listen 80;
        server_name test.io www.test.io;

        location / {
            proxy_pass http://your_server_ip:8080;
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header X-Forwarded-Proto $scheme;
        }
    }

Usaremos Certbot para generar nuestros certificados TLS / SSL. Su complemento Nginx se encargará de reconfigurar Nginx y volver a cargar la configuración cuando sea necesario.

Primero, agregue el repositorio oficial de Certbot:

  • sudo add-apt-repository ppa:certbot/certbot

prensa ENTER cuando se le solicite que confirme que desea agregar el nuevo repositorio. Luego actualice la lista de paquetes para recoger la información del paquete del nuevo repositorio:

Luego instale el paquete Nginx de Certbot con apto:

  • sudo apt install python-certbot-nginx

Una vez que esté instalado, use el certbot comando para generar los certificados para foobar.net y www.foobar.net:

  • sudo certbot –nginx -d foobar.net -d www.foobar.net

Este comando le dice a Certbot que use el nginx complemento, usando -d para especificar los nombres para los que nos gustaría que el certificado fuera válido.

Si esta es tu primera vez corriendo certbot, se le pedirá que ingrese una dirección de correo electrónico y acepte los términos del servicio. Después de hacerlo, certbot se comunicará con el servidor Let’s Encrypt y luego ejecutará un desafío para verificar que usted controla el dominio para el que solicita un certificado.

A continuación, Certbot le preguntará cómo le gustaría configurar sus ajustes HTTPS:

Output

Please choose whether or not to redirect HTTP traffic to HTTPS, removing HTTP access.
-------------------------------------------------------------------------------
1: No redirect - Make no further changes to the webserver configuration.
2: Redirect - Make all requests redirect to secure HTTPS access. Choose this for
new sites, or if you're confident your site works on HTTPS. You can undo this
change by editing your web server's configuration.
-------------------------------------------------------------------------------
Select the appropriate number [1-2] then [enter] (press 'c' to cancel):

Seleccione su elección, luego presione ENTER. La configuración se actualizará y Nginx se volverá a cargar para recuperar la nueva configuración.

Ahora ejecute el comando para el segundo dominio:

  • sudo certbot –nginx -d test.io -d www.test.io

Acceda a uno de los dominios de Apache en su navegador usando el https:// prefijo; visitar https://foobar.net/info.php y verás esto:

phpinfo ssl

Mira en el Variables PHP sección. La variable PUERTO DE SERVICIO se ha establecido en 443 y HTTPS ajustado a en, como si se accediera a Apache directamente a través de HTTPS. Con estas variables configuradas, las aplicaciones PHP no tienen que estar especialmente configuradas para trabajar detrás de un proxy inverso.

Ahora inhabilitemos el acceso directo a Apache.

Paso 10: bloqueo del acceso directo a Apache (opcional)

Dado que Apache está escuchando en el puerto 8080 en la dirección IP pública, es accesible para todos. Se puede bloquear trabajando con el siguiente comando de IPtables en su conjunto de reglas de firewall.

  • sudo iptables -I INPUT -p tcp –dport 8080 ! -s your_server_ip -j REJECT –reject-with tcp-reset

Asegúrese de utilizar la dirección IP de su servidor en lugar del ejemplo en rojo. Una vez puerto 8080 está bloqueado en su firewall, pruebe que Apache no esté accesible en él. Abra su navegador web e intente acceder a uno de los nombres de dominio de Apache en el puerto 8080. Por ejemplo: http: //example.com: 8080

El navegador debe mostrar un mensaje de error «No se puede conectar» o «La página web no está disponible». Con las IPtables tcp-reset opción en su lugar, un forastero no vería diferencia entre puerto 8080 y un puerto que no tiene ningún servicio.

Nota: Las reglas de IPtables no sobreviven al reinicio del sistema de forma predeterminada. Hay varias formas de preservar las reglas de IPtables, pero la más fácil es usar iptables-persistent en el repositorio de Ubuntu. Explore este artículo para obtener más información sobre cómo configurar IPTables.

Ahora configuremos Nginx para que sirva archivos estáticos para los sitios de Apache.

Paso 11: entrega de archivos estáticos con Nginx (opcional)

Cuando Nginx realiza un proxy de solicitudes de dominios de Apache, envía todas las solicitudes de archivo para ese dominio a Apache. Nginx es más rápido que Apache en el servicio de archivos estáticos como imágenes, JavaScript y hojas de estilo. Así que configuremos Nginx apache archivo de host virtual para servir directamente archivos estáticos pero enviar solicitudes PHP a Apache.

Abre el archivo /etc/nginx/sites-available/apache en su editor:

  • sudo nano /etc/nginx/sites-available/apache

Deberá agregar dos location bloques a cada bloque de servidor, así como modificar el existente location secciones. Además, deberá indicarle a Nginx dónde encontrar los archivos estáticos de cada sitio.

Si ha decidido no utilizar certificados SSL y TLS, modifique su archivo para que tenga este aspecto:

/ etc / nginx / sites-available / apache

server {
    listen 80;
    server_name test.io www.test.io;
    root /var/www/test.io;
    index index.php index.htm index.html;

    location / {
        try_files $uri $uri/ /index.php;
    }

    location ~ .php$ {
        proxy_pass http://your_server_ip:8080;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }

    location ~ /.ht {
        deny all;
    }
}

server {
    listen 80;
    server_name foobar.net www.foobar.net;
    root /var/www/foobar.net;
    index index.php index.htm index.html;

    location / {
        try_files $uri $uri/ /index.php;
    }

    location ~ .php$ {
        proxy_pass http://your_ip_address:8080;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }

    location ~ /.ht {
        deny all;
    }
}

Si también desea que HTTPS esté disponible, utilice la siguiente configuración en su lugar:

/ etc / nginx / sites-available / apache

server {
    listen 80;
    server_name test.io www.test.io;
    root /var/www/test.io;
    index index.php index.htm index.html;

    location / {
        try_files $uri $uri/ /index.php;
    }

    location ~ .php$ {
        proxy_pass http://your_server_ip:8080;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }

    location ~ /.ht {
        deny all;
    }

    listen 443 ssl;
    ssl_certificate /etc/letsencrypt/live/test.io/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/test.io/privkey.pem;
    include /etc/letsencrypt/options-ssl-nginx.conf;
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem;
}

server {
    listen 80;
    server_name foobar.net www.foobar.net;
    root /var/www/foobar.net;
    index index.php index.htm index.html;

    location / {
        try_files $uri $uri/ /index.php;
    }

    location ~ .php$ {
        proxy_pass http://your_ip_address:8080;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }

    location ~ /.ht {
        deny all;
    }

    listen 443 ssl;
    ssl_certificate /etc/letsencrypt/live/foobar.net/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/foobar.net/privkey.pem;
    include /etc/letsencrypt/options-ssl-nginx.conf;
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem;
}

los try_files La directiva hace que Nginx busque archivos en la raíz del documento y los sirva directamente. Si el archivo tiene un .php extensión, la solicitud se pasa a Apache. Incluso si el archivo no se encuentra en la raíz del documento, la solicitud se pasa a Apache para que las funciones de la aplicación, como los enlaces permanentes, funcionen sin problemas.

Advertencia: los location ~ /.ht la directiva es muy importante; esto evita que Nginx sirva el contenido de los archivos de configuración de Apache como .htaccess y .htpasswd que contienen información sensible.

Guarde el archivo y realice una prueba de configuración:

Vuelva a cargar Nginx si la prueba tiene éxito:

  • sudo service nginx reload

Para verificar que todo funciona, puede examinar los archivos de registro de Apache en /var/log/apache2 y ver el GET solicitudes para el info.php archivos de test.io y foobar.net. Utilizar el tail comando para ver las últimas líneas del archivo, y use el comando -f cambie para ver el archivo en busca de cambios:

  • sudo tail -f /var/log/apache2/other_vhosts_access.log

Ahora visita http://test.io/info.php en su navegador y luego mire la salida del registro. Verá que Apache está respondiendo:

Output

    test.io:80 your_server_ip - - [01/Jul/2016:18:18:34 -0400] "GET /info.php HTTP/1.0" 200 20414 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/47.0.2526.111 Safari/537.36"

Entonces visita el index.html página para cada sitio y no verá ninguna entrada de registro de Apache. Nginx les está sirviendo.

Cuando haya terminado de observar el archivo de registro, presione CTRL+C para dejar de seguirlo.

Con esta configuración, Apache no podrá restringir el acceso a archivos estáticos. El control de acceso para archivos estáticos debería configurarse en Nginx apache archivo de host virtual, pero eso está más allá del alcance de este tutorial.

Conclusión

Ahora tiene un servidor Ubuntu con servicio Nginx example.com y sample.org, junto con Apache que sirve foobar.net y test.io. Aunque Nginx actúa como un proxy inverso para Apache, el servicio de proxy de Nginx es transparente y las conexiones a los dominios de Apache parecen ser servidas directamente desde el propio Apache. Puede utilizar este método para ofrecer sitios seguros y estáticos.

Por itencore