# Apache

## Apache

Apache es un software de servidor web de código abierto ampliamente utilizado que sirve archivos HTML a través de Internet. Es altamente personalizable y admite varias funciones.

En Windows la mejor solución es softwaresintegrados como XAMPP o WAMP.

Para su instalación en terminal de Ubuntu simplemente:

```bash
sudo apt install apache2
```

Apache tiene un directorio de carpetas y archivos tal que así:

<figure><img src="https://539580950-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FiKvwltOme7zTxep3LVyW%2Fuploads%2Ff0Wo6TZyo1YDfQg1ky0B%2Fimage.png?alt=media&#x26;token=051f6e6e-a03d-47c9-9be6-04c5d416f0d5" alt=""><figcaption><p>Directorio principal</p></figcaption></figure>

Dentro de la jerarquía, su archivo principal de configuración es `httpd.conf` y en él encontramos parámetros importantes como el puerto de conexión, el host o los virtualhost que queremos configurar

Apache contiene funcionalidades como:

* **mod\_rewrite**: Reescriba las URL para mejorar el SEO o la facilidad de uso.

```apacheconf
RewriteEngine On
RewriteRule ^blog/([a-zA-Z0-9-]+)$ /index.php?slug=$1 [L]
```

* **archivo .htaccess:** Permite la configuración por directorio, útil para reescribir URL y otras configuraciones.

```apacheconf
<IfModule mod_rewrite.c>
    RewriteEngine On
    RewriteBase /
    RewriteRule îndex\.html$ / [R=301,L]
</IfModule>
```

* **Configuración SSL/TLS:** para conexiones HTTPS

```apacheconf
<VirtualHost *:443>
    ServerName secure.alex.com
    SSLEngine On
    SSLCertificateFile /path/to/cert.pem
    SSLCertificateKeyFile /path/to/private.key
</VirtualHost>
```

* **Autenticación y autorización:** protege directorios especificas con contraseñas

```apacheconf
<Directory "/var/www/private">
    AuthType Basic
    AuthName "Restricted Access"
    AuthUserFile /etc/apache2/.htpasswd
    Require valid-user
</Directory>
```

* **Uso de proxys**

<figure><img src="https://539580950-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FiKvwltOme7zTxep3LVyW%2Fuploads%2Fj3Pgh6cR3EmCs34IqQ0f%2Fimage.png?alt=media&#x26;token=788bc21c-e91c-4fdc-9bcf-6f84a4b955b0" alt=""><figcaption></figcaption></figure>

* **Equilibrio de carga:** Distribuye las solicitudes entrantes entre varios servidores para mejorar el rendimiento.

```apacheconf
<Proxy balancer://mycluster>
    BalancerMember http://server1:80
    BalancerMember http://server2:80
</Proxy>
ProxyPass "/myapp" "balancer://mycluster/myapp"
ProxyPassReverse "/myapp" "balancer://mycluster/myapp"
```

## Parámetros de conexión del servidor

### **Workers**

En el caso de Apache, tenemos tres módulos de procesamiento de múltiples hilos (MPM). Cada uno de estos MPMs tiene un enfoque diferente para manejar las solicitudes HTTP y gestionar los procesos y hilos asociados con la ejecución del servidor:

* `mpm_prefork` -> Adecuado para entornos donde la estabilidad y la simplicidad son prioritarias sobre la eficiencia en el uso de recursos.&#x20;
* `mpm_worker` -> Es especialmente útil en entornos donde se espera un alto volumen de solicitudes y se desea aprovechar la eficiencia de los hilos.
* `mpm_events` -> Es una opción adecuada para entornos donde se requiere un alto rendimiento y escalabilidad, especialmente en situaciones donde el número de conexiones simultáneas es alto.

Para saber qué modo está activado por defecto, tendremos que consultar el contenido de la carpeta **mods-enabled**.

```bash
ls -l /etc/apache2/mods-enabled/ | grep mpm
```

Para activar un modo distinto al habilitado procederemos de la siguiente forma:

```bash
a2dismod mpm_event
a2enmod mpm_prefork
service apache2 restart
```

Se puede modificar el número de workers en el fichero de configuración respectivo de cada módulo.

### **Puertos**

En este caso, con la configuración por defecto deberíamos editar el fichero **ports.conf** si queremos hacer una configuración general.

```bash
Listen 80

<IfModule ssl_module>
  Listen 443
</IfModule>

<IfModule mod_gnutls.c>
  Listen 443
</IfModule>
```

En el caso en el que tengamos una configuración con **VirtualHosts** , cada uno puede llevar su propia configuración de puertos.

### **Timeouts**

Referido al período máximo de inactividad permitido entre una solicitud y su correspondiente respuesta.

En Apache además de los parámetros genéricos **Timeout** y **KeepAliveTimeout** , podemos hacer uso de los parámetros incluidos en el módulo [**mod\_reqtimeout**](https://httpd.apache.org/docs/2.4/mod/mod_reqtimeout.html)**.**

### **Logs**

La configuración de los logs se realiza en el archivo de configuración principal del servidor, que comúnmente se llama `httpd.conf` en sistemas basados en Unix/Linux o `apache2.conf` en otros casos.

```apacheconf
# Available loglevels: trace8, ..., trace1, debug, info, notice, warn,
# error, crit, alert, emerg.
# It is also possible to configure the loglevel for particular
# modules, e.g.
#LogLevel info ssl:warn

ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
```

## Configuración de directivas Apache

El contenido del fichero `httpd.conf` está compuesto por un gran número de directivas de las que solo se describen a continuación algunas de ellas. Usalas según necesidades:

<table data-full-width="true"><thead><tr><th width="160">Directiva</th><th width="510">Función</th><th>Ejemplo</th></tr></thead><tbody><tr><td>ServerTokens</td><td>Según el parámetro que se introduzca a continuación:<br>- ProductOnly solo muestra el nombre del servidor web instalado<br>- Minimal muestra el nombre así como la versión de Apache instalada<br>- OS muestra el nombre, versión y sistema operativo<br>- Full muestra nombre, versión, sistema operativo así como los servicios que hacen uso del servidor web</td><td><code>ServerTokens full</code><br><br><code>Apache 2.1/(Linux)/PHP3/MySQL</code></td></tr><tr><td>ServerRoot</td><td>Indica al servidor web la ubicación donde se almacenan los ficheros de configuración de Apache.</td><td><code>ServerRoot "/etc/</code>httpd"</td></tr><tr><td>Timeout</td><td>Indica el número se segundos antes de que se cancele una conexión por falta de respuesta.</td><td><code>Timeout 120</code></td></tr><tr><td>KeepAlive</td><td>Indica si se permiten o no las conexiones persistentes, es decir más de una petición por servidor. Puede tomar los valores "On" u "Off"</td><td><code>KeepAlive On</code></td></tr><tr><td>Listen</td><td>Permite asociar Apache a una dirección y/o puerto especifico además del predeterminado.</td><td><code>Listen 192.168.1.1:6680</code></td></tr><tr><td>Include</td><td>Indica al servidor web la ruta en donde se encuentran almacenados los ficheros de configuración adicionales de Apache como, por ejemplo, los dominios virtuales.</td><td><code>Include conf.d/*.conf</code></td></tr><tr><td>User</td><td>Especifica que usuario es el que ejecuta los procesos del servidor de un y, por tanto, los permisos de lectura y escritura que se aplican sobre los recursos.</td><td><code>User usuario1.</code></td></tr><tr><td>Group</td><td>Igual que User pero con grupos</td><td><code>Group group1</code></td></tr><tr><td>ServerAdmin</td><td>Especfica la persona a la que se le debe notificar los problemas referentes al portal web, a través de su cuenta de correo.</td><td><code>ServerAdmin administrador@correo.com</code></td></tr><tr><td>ServerName</td><td>Especifica el nombre y puerto que se usa para identificar al servidor.</td><td><code>ServerName www.dominio.com:80</code></td></tr><tr><td>DocumentRoot</td><td>Indica al servidor al ruta en donde se encentran almacenados los ficheros web del sitio principal.</td><td><code>DocumentRoot "/var/www/html</code>"</td></tr><tr><td>Options</td><td>Indica varias opciones de comportamiento, pudiendo estas ser aplicadas a un directorio concreto.</td><td><code>&#x3C;Directory /web/images/></code><br><code>Options All</code></td></tr><tr><td>Allow</td><td>Indica al sistema los equipos que pueden acceder a una determinada área del servidor. El acceso se puede controlar por nombre, IP, rango de IP, etc. Igualmente pueden ser aplicadas a un directorio concreto. Así mismo, sirve para especificar, entre otras cosas, si se puede ejecutar CGI.</td><td><code>Allow from 150.100.25</code>5.166</td></tr><tr><td>Deny</td><td>Analoga a la anterior, pero para denegar el acceso.</td><td><code>Deny from DominioDenegado.com</code></td></tr></tbody></table>

## MariaDB (MySQL)

<figure><img src="https://539580950-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FiKvwltOme7zTxep3LVyW%2Fuploads%2FRLE5wBjNiG7XIab0pLb1%2FSQL-mindmap.png?alt=media&#x26;token=e4438afe-bf36-4096-8361-a1bfffcd17f9" alt=""><figcaption></figcaption></figure>

Referencias: <https://openwebinars.net/academia/aprende/servidor-apache/3345/>
