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.
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:
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.
[“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.
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
yServerAlias
trabajo. - RPAF_SetHTTPS – Establece el
HTTPS
variable de entorno basada en el valor contenido enX-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:
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.