Practica 2 - Configuración de Nginx
Introducción
En este artículo te explicaré cómo instalar y configurar Nginx en un VPS de Digital Ocean. Además, veremos cómo instalar PHP, Composer y configurar un proyecto Laravel. También incluiremos configuraciones para proxy y load balancing, y te mostraremos ejemplos de archivos de configuración (como laravel.conf, ssl.conf y default.conf).
1. NGINX
Nginx es un servidor web de código abierto que se utiliza para servir contenido web estático y dinámico. Es conocido por su alto rendimiento, estabilidad, bajo uso de recursos y configuración sencilla. En este artículo, aprenderemos a instalar y configurar Nginx en un VPS de Digital Ocean.
Documentación oficial de Nginx.
1.1 Instalación de Nginx
Sigue estos pasos para instalar Nginx en tu VPS:
Instalar prerequisitos y crear el repositorio de Nginx:
- Instalar los prerequisitos de YUM
1
sudo yum install yum-utils
- Crear el archivo de repositorio de Nginx
1
nano /etc/yum.repos.d/nginx.repo
- Instalar los prerequisitos de YUM
Agregar el siguiente contenido al archivo
nginx.repo
:1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
[nginx-stable] name=nginx stable repo baseurl=http://nginx.org/packages/centos/$releasever/$basearch/ gpgcheck=1 enabled=1 gpgkey=https://nginx.org/keys/nginx_signing.key module_hotfixes=true [nginx-mainline] name=nginx mainline repo baseurl=http://nginx.org/packages/mainline/centos/$releasever/$basearch/ gpgcheck=1 enabled=0 gpgkey=https://nginx.org/keys/nginx_signing.key module_hotfixes=true
Actualizar repositorios e instalar Nginx:
1
sudo yum update -y && sudo yum install nginx -y
1.2 Reiniciar y Habilitar Nginx
Verificar el estado del servicio:
1 2
sudo systemctl status nginx sudo service nginx status
Iniciar el servicio:
1 2
sudo systemctl start nginx sudo service nginx start
Habilitar Nginx para que inicie con el sistema:
1 2
sudo systemctl enable nginx sudo service nginx enable
1.3 Comprobación de Conexiones
Mostrar conexiones activas:
1
sudo netstat -ptona
Verificar conexión en un puerto específico:
1
sudo netstat -tuln | grep {puerto}
Cambiar el puerto de escucha de Nginx (si es necesario):
1
sudo semanage port -a -t http_port_t -p tcp {port}
1.4 Archivo de Configuración Default
El archivo por defecto se encuentra hecho de esta forma:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
server {
listen 80;
server_name localhost;
#access_log /var/log/nginx/host.access.log main;
location / {
root /usr/share/nginx/html;
index index.html index.htm;
}
#error_page 404 /404.html;
# redirect server error pages to the static page /50x.html
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}
# proxy the PHP scripts to Apache listening on 127.0.0.1:80
#
#location ~ \.php$ {
# proxy_pass http://127.0.0.1;
#}
# pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
#
#location ~ \.php$ {
# root html;
# fastcgi_pass 127.0.0.1:9000;
# fastcgi_index index.php;
# fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name;
# include fastcgi_params;
#}
# deny access to .htaccess files, if Apache's document root
# concurs with nginx's one
#
#location ~ /\.ht {
# deny all;
#}
}
1.5 Reiniciar el Servicio de Nginx
Después de checar la configuración, reinicia el servicio:
1
2
3
4
5
6
7
8
9
10
11
sudo systemctl restart nginx
sudo service nginx restart
# Verificar la configuración
sudo nginx -t
# Recargar la configuración sin reiniciar
sudo nginx -s reload
# Agregar al usuario al grupo de Nginx (opcional)
sudo gpasswd -a {user} nginx
2. PHP y Composer
2.1 Instalación de PHP y Composer
Actualizar repositorios e instalar repositorios adicionales:
1 2 3
sudo dnf update -y sudo dnf install epel-release -y sudo dnf install dnf-utils http://rpms.remirepo.net/enterprise/remi-release-9.rpm -y
Resetear y habilitar el módulo de PHP (ejemplo con PHP 8.2):
1 2
sudo dnf module list reset php -y sudo dnf module enable php:remi-8.2
Instalar PHP y extensiones necesarias:
1
sudo dnf install php php-common php-xml php-json curl unzip php-fpm php-mysqlnd php-opcache php-gd php-pgsql php-mbstring php-zip -y
Actualizar cache de repositorios:
1
sudo dnf makecache
Instalar Composer:
1 2 3
sudo curl -sS https://getcomposer.org/installer | php sudo mv composer.phar /usr/local/bin/composer sudo chmod +x /usr/local/bin/composer
2.2 Configuración de PHP
Editar el archivo
/etc/php.ini
:1 2 3 4 5 6 7
# Configurar la zona horaria y otros parámetros date.timezone = America/Monterrey cgi.fix_pathinfo = 0 expose_php = Off # Opcionales: memory_limit = 256M upload_max_filesize = 5M
Editar el archivo de PHP-FPM
/etc/php-fpm.d/www.conf
:1 2 3 4 5 6 7 8
user = {user} group = nginx listen.owner = {user},nginx listen.group = nginx listen.mode = 0660 security.limit_extensions = .php .php3 .php4 .php5 .php7
Reiniciar y habilitar PHP-FPM:
1 2
sudo systemctl start php-fpm sudo systemctl enable php-fpm
3. Laravel
3.1 Configuración del Proyecto Laravel
Instalar Node.js (opcional, se puede hacer con NVM o RPM):
Con NVM (no recomendado):
1 2 3 4 5
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.1/install.sh | bash source ~/.bashrc nvm ls-remote nvm install {node-version} source ~/.bashrc
O instalar Node.js usando RPM:
1 2
curl -fsSL https://rpm.nodesource.com/setup_20.x | sudo bash - sudo dnf install nodejs -y
Clonar el repositorio de Laravel:
1 2
sudo dnf install git unzip -y git clone {repo}
Configurar el archivo
.env
:Copia el archivo
.env.example
a.env
y ajusta las siguientes variables:1 2 3
APP_ENV=production APP_URL=http://{ip} ASSET_URL=http://{ip}
Instalar dependencias:
- Composer
1
composer install
- Node.js
1
npm install
- Composer
Optimizar y generar la key de Laravel:
1 2
php artisan optimize:clear php artisan key:generate
Construir los archivos de Node.js:
1
npm run build
3.2 Configurar Permisos en el Proyecto
Asignar permisos adecuados:
1 2
sudo chmod 750 /home/{user} sudo chown -R {user}:nginx /home/{user}
Habilitar el acceso a la red para el usuario de Nginx:
1
sudo setsebool -P httpd_can_network_connect on
Ajustar etiquetas de SELinux para el proyecto Laravel:
1
sudo chcon -R -t httpd_sys_rw_content_t /home/{user}/{project-laravel-folder}
Reiniciar servicios:
1 2
sudo systemctl restart nginx sudo systemctl restart php-fpm
Ajustar permisos finales en el proyecto:
1 2 3
sudo chmod -R 750 /home/{user}/{project-laravel-folder} sudo chmod -R 770 /home/{user}/{project-laravel-folder}/storage sudo chmod -R 770 /home/{user}/{project-laravel-folder}/bootstrap/cache
3.3 Comprobar Logs
Verifica los logs para asegurarte de que todo funcione correctamente:
- Logs de Nginx
1
sudo tail -f /var/log/nginx/error.log
- Logs de PHP-FPM
1
sudo tail -f /var/log/php-fpm/error.log
- Logs del sistema
1 2
sudo journalctl -u nginx sudo journalctl -u php-fpm
4. Proxy
4.1 Configuración de Proxy con Nginx
Crear el archivo de configuración
proxy.conf
:Crea el archivo
proxy.conf
y coloca el siguiente contenido:1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
server { listen {port}; listen {[::] o host-ip-pub/priv}:{port}; server_name {dominio}; location / { proxy_connect_timeout 1s; proxy_send_timeout 1s; proxy_read_timeout 1s; proxy_next_upstream error timeout http_500 http_502 http_503 http_504; 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; proxy_pass http://{upstream-name}$request_uri; } # Redirigir errores del servidor a /50x.html error_page 500 502 503 504 /50x.html; location = /50x.html { root /usr/share/nginx/html; internal; } }
Permitir el tráfico saliente en SELinux para Nginx:
1
sudo setsebool -P httpd_can_network_connect 1
Reiniciar Nginx para aplicar los cambios:
1
sudo systemctl restart nginx
5. Load Balancer
5.1 Configuración del Load Balancer con Nginx
Crear el archivo de configuración
load-balancer.conf
:- Crea el archivo
load-balancer.conf
con el siguiente contenido:
1 2 3 4 5 6 7
upstream {upstream-name} { least_conn; server {ip-1/host}:{port}; server {ip-2/host}:{port}; server {ip-3/host}:{port}; server {ip-4/host}:{port} backup; }
- Crea el archivo
Reiniciar Nginx:
1
sudo systemctl restart nginx
6. Archivos Adicionales de Configuración de Nginx
6.1 laravel.conf
Utiliza este archivo para configurar Nginx con un proyecto Laravel. Crea el archivo laravel.conf
con el siguiente contenido:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
server {
listen {port};
listen {[::] o host-ip-pub/priv}:{port};
server_name {host-ip-pub/priv/domain};
server_tokens off;
root /home/{user}/{laravel}/public;
index index.php index.html index.htm;
charset utf-8;
gzip on;
gzip_types text/css application/javascript text/javascript application/x-javascript image/svg+xml text/plain text/xsd text/xsl text/xml image/x-icon;
add_header X-Frame-Options "SAMEORIGIN" always;
add_header X-XSS-Protection "1; mode=block" always;
add_header X-Content-Type-Options "nosniff" always;
location / {
try_files $uri $uri/ /index.php?$query_string;
}
location = /favicon.ico {
access_log off;
log_not_found off;
}
location = /robots.txt {
access_log off;
log_not_found off;
}
error_page 404 /index.php;
location ~* \.php$ {
fastcgi_pass unix:/var/run/php-fpm/www.sock;
fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;
include fastcgi_params;
fastcgi_hide_header X-Powered-By;
}
location ~ /\.(?!well-known).* {
allow all;
}
}
6.2 ssl.conf
Crea el archivo ssl.conf
para configurar SSL:
1
2
3
4
5
6
7
8
server {
listen 443 ssl http2;
listen [::]:443 ssl http2;
server_name {domain_name};
ssl_certificate /etc/nginx/ssl/origin_certificate.pem;
ssl_certificate_key /etc/nginx/ssl/private_key.pem;
}
Conclusiones
En este artículo hemos aprendido cómo instalar y configurar Nginx en un VPS de Digital Ocean. También hemos visto cómo instalar PHP, Composer y configurar un proyecto Laravel. Además, hemos incluido configuraciones para proxy y load balancing, y te hemos mostrado ejempjsones de archivos de configuración como laravel.conf, ssl.conf y default.conf.
Cualquier duda o comentario, agregarla en la sección de comentarios abajo de cada publicación.