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