Configuración de servidor de imágenes con Nginx y vsftpd

Para implementar un servidor de imágenes funcional, es necesario compilar Nginx desde el código fuente con sus dependencias correspondientes, junto con un servicio FTP para la gestión de archivos.

Preparación de dependencias

Antes de compilar Nginx, se deben instalar tres bibliotecas esenciales:

  • zlib: Compresión gzip
  • PCRE: Expresiones regulares para reescritura de URLs
  • OpenSSL: Soporte para conexiones seguras

Compilación de PCRE

wget https://sourceforge.net/projects/pcre/files/pcre/8.45/pcre-8.45.tar.gz
tar -zxvf pcre-8.45.tar.gz
cd pcre-8.45
./configure
make && make install

Compilación de OpenSSL

wget https://www.openssl.org/source/openssl-1.1.1w.tar.gz
tar -zxvf openssl-1.1.1w.tar.gz
cd openssl-1.1.1w
./config
make && make install

Compilación de zlib

wget https://zlib.net/zlib-1.3.tar.gz
tar -zxvf zlib-1.3.tar.gz
cd zlib-1.3
./configure
make && make install

Instalación de Nginx

Descargar y descomprimir la versión deseada:

wget https://nginx.org/download/nginx-1.24.0.tar.gz
tar -zxvf nginx-1.24.0.tar.gz
cd nginx-1.24.0

Configurar con rutas personalizadas:

./configure \
    --prefix=/opt/nginx \
    --sbin-path=/opt/nginx/bin/nginx \
    --conf-path=/opt/nginx/conf/nginx.conf \
    --pid-path=/var/run/nginx.pid \
    --error-log-path=/var/log/nginx/error.log \
    --http-log-path=/var/log/nginx/access.log \
    --with-http_gzip_static_module \
    --with-http_ssl_module \
    --with-pcre \
    --with-zlib \
    --with-openssl \
    --http-client-body-temp-path=/var/cache/nginx/client \
    --http-proxy-temp-path=/var/cache/nginx/proxy \
    --http-fastcgi-temp-path=/var/cache/nginx/fastcgi

Nota importante: Crear previamente los directorios de caché:

mkdir -p /var/cache/nginx/{client,proxy,fastcgi}

Compilar e instalar:

make && make install

Operaciones básicas

Acción Comando
Iniciar /opt/nginx/bin/nginx
Detener /opt/nginx/bin/nginx -s stop
Recargar configuración /opt/nginx/bin/nginx -s reload

Si aparece el error "open() /var/run/nginx.pid failed", crear el directorio correspondiente.

Configuración del servicio FTP

Instalación de vsftpd

yum install vsftpd
systemctl start vsftpd
systemctl enable vsftpd

Creación de usuario dedicado

useradd imgadmin
passwd imgadmin

Esto genera automáticamente el directorio /home/imgadmin. Dentro de él, crear la estructura de carpetas para las imágenes:

mkdir -p /home/imgadmin/publico/imagenes

Ajustes de seguridad

Editar /etc/vsftpd/vsftpd.conf:

anonymous_enable=NO
local_enable=YES
write_enable=YES
local_umask=022
pasv_enable=YES
pasv_min_port=40000
pasv_max_port=40050

Configurar el firewall:

firewall-cmd --permanent --add-port=21/tcp
firewall-cmd --permanent --add-port=40000-40050/tcp
firewall-cmd --reload

Integración Nginx-FTP

Modificar /opt/nginx/conf/nginx.conf para servir cotnenido desde el directorio FTP:

server {
    listen 8080;
    server_name _;
    
    location /imagenes/ {
        alias /home/imgadmin/publico/imagenes/;
        autoindex off;
        expires 30d;
        add_header Cache-Control "public, immutable";
    }
}

Subida automatizada de archivos

Ejemplo de utilidad Java para transferencia FTP:

import org.apache.commons.net.ftp.FTP;
import org.apache.commons.net.ftp.FTPClient;

public class GestorImagenes {
    
    public static void subirArchivo(
            String servidor,
            int puerto,
            String usuario,
            String clave,
            String rutaRemota,
            String nombreArchivo,
            InputStream datos) throws IOException {
        
        FTPClient cliente = new FTPClient();
        try {
            cliente.connect(servidor, puerto);
            cliente.login(usuario, clave);
            cliente.setFileType(FTP.BINARY_FILE_TYPE);
            cliente.enterLocalPassiveMode();
            
            cliente.makeDirectory(rutaRemota);
            cliente.changeWorkingDirectory(rutaRemota);
            
            cliente.storeFile(nombreArchivo, datos);
        } finally {
            cliente.disconnect();
        }
    }
}

Caso de uso:

@Test
public void probarSubida() throws Exception {
    FileInputStream flujo = new FileInputStream("D:\\foto.jpg");
    GestorImagenes.subirArchivo(
        "192.168.88.142",
        21,
        "imgadmin",
        "claveSegura",
        "/publico/imagenes/2024/03/15",
        "foto.jpg",
        flujo
    );
}

Acceso mediante navegador:

http://192.168.88.142:8080/imagenes/2024/03/15/foto.jpg

Etiquetas: Nginx vsftpd FTP linux java

Publicado el 9-8 09:24