凌峰创科服务平台

linux 搭建图片服务器

在Linux系统中搭建图片服务器是一个常见的需求,无论是个人博客、企业官网还是大型电商平台,都需要一个稳定、高效的图片存储和访问服务,本文将详细介绍如何在Linux环境下搭建一个功能完善的图片服务器,包括环境准备、软件安装、配置优化以及安全加固等环节。

环境准备

首先需要选择合适的Linux发行版,推荐使用Ubuntu Server 20.04或CentOS 7/8,这两个版本拥有丰富的软件包和社区支持,硬件方面,建议至少配备2GB内存、双核CPU以及500GB以上的存储空间,如果需要处理高并发访问,建议增加内存并使用SSD硬盘,网络带宽也是关键因素,根据预估的访问量选择合适的带宽配置。

在开始之前,需要更新系统软件包并安装必要的依赖工具,以Ubuntu为例,执行以下命令:

sudo apt update && sudo apt upgrade -y
sudo apt install -y nginx unzip curl wget

对于CentOS系统,可以使用:

sudo yum update -y
sudo yum install -y nginx unzip curl wget epel-release

安装配置Web服务器

Nginx是一个高性能的HTTP和反向代理服务器,非常适合作为图片服务器,安装完成后,需要创建专门的配置文件来处理图片请求,在Ubuntu中,Nginx配置文件位于/etc/nginx/sites-available/,在CentOS中位于/etc/nginx/conf.d/

创建一个新的配置文件,例如image_server.conf如下:

server {
    listen 80;
    server_name images.example.com;
    root /var/www/images;
    index index.html;
    location / {
        expires 30d;
        add_header Cache-Control "public, immutable";
        try_files $uri $uri/ =404;
    }
    location ~* \.(jpg|jpeg|png|gif|webp|svg)$ {
        expires 365d;
        add_header Cache-Control "public, immutable";
        access_log off;
        log_not_found off;
    }
    error_page 404 /404.html;
    location = /404.html {
        internal;
    }
}

这个配置文件设置了图片的缓存时间为365天,并关闭了访问日志以减少I/O压力,配置完成后,需要创建网站根目录并设置正确的权限:

sudo mkdir -p /var/www/images
sudo chown -R www-data:www-data /var/www/images
sudo chmod -R 755 /var/www/images

安装配置图片处理软件

为了支持图片的动态处理(如缩放、裁剪等),可以安装ImageMagick或GraphicsMagick,以ImageMagick为例:

# Ubuntu
sudo apt install -y imagemagick
# CentOS
sudo yum install -y ImageMagick

安装完成后,可以创建一个简单的PHP脚本来处理图片请求(如果需要动态处理功能),安装PHP-FPM:

# Ubuntu
sudo apt install -y php-fpm php-common
# CentOS
sudo yum install -y php-fpm php-common

创建PHP处理脚本/var/www/images/process.php

<?php
$allowed_formats = ['jpg', 'jpeg', 'png', 'gif'];
$format = pathinfo($_SERVER['REQUEST_URI'], PATHINFO_EXTENSION);
if (!in_array($format, $allowed_formats)) {
    header("HTTP/1.1 403 Forbidden");
    exit;
}
$image_path = '/var/www/images' . $_SERVER['REQUEST_URI'];
if (!file_exists($image_path)) {
    header("HTTP/1.1 404 Not Found");
    exit;
}
header('Content-Type: image/' . $format);
readfile($image_path);
?>

配置存储方案

根据需求选择合适的存储方案,对于小规模应用,可以直接使用本地存储;对于大规模应用,建议使用分布式存储如MinIO或Ceph,这里介绍MinIO的安装配置:

  1. 下载并安装MinIO:

    wget https://dl.min.io/server/minio/release/linux-amd64/minio
    chmod +x minio
    sudo mv minio /usr/local/bin/
  2. 创建数据目录并配置服务:

    sudo mkdir -p /mnt/data/minio
    sudo useradd -r minio-user
    sudo chown minio-user:minio-user /mnt/data/minio
  3. 创建systemd服务文件/etc/systemd/system/minio.service

    [Unit]
    Description=MinIO
    After=network.target

[Service] Type=simple User=minio-user Group=minio-user ExecStart=/usr/local/bin/minio server /mnt/data/minio Restart=on-failure

[Install] WantedBy=multi-user.target


4. 启动并启用MinIO服务:
```bash
sudo systemctl daemon-reload
sudo systemctl start minio
sudo systemctl enable minio

安全加固

为了确保图片服务器的安全性,需要进行以下配置:

  1. 配置防火墙:
    # Ubuntu
    sudo ufw allow 80/tcp
    sudo ufw allow 443/tcp

CentOS

sudo firewall-cmd --permanent --add-service=http sudo firewall-cmd --permanent --add-service=https sudo firewall-cmd --reload


2. 配置SSL证书(推荐使用Let's Encrypt):
```bash
sudo apt install -y certbot python3-certbot-nginx
sudo certbot --nginx -d images.example.com
  1. 禁用目录列表: 在Nginx配置中添加autoindex off;指令。

  2. 限制上传文件类型: 在Nginx配置中添加:

    location ~* \.(php|pl|py|jsp|asp|sh|cgi)$ {
     deny all;
    }

性能优化

  1. 启用Gzip压缩: 在Nginx配置中添加:

    gzip on;
    gzip_types image/jpeg image/png image/gif image/webp image/svg+xml;
  2. 配置缓存: 使用Nginx的proxy_cache功能或配置CDN加速。

  3. 负载均衡: 如果有多台服务器,可以使用Nginx的upstream模块进行负载均衡。

监控与维护

定期检查服务器状态,可以使用htopdf -h等命令监控资源使用情况,配置日志轮转以避免日志文件过大:

sudo logrotate -f /etc/logrotate.d/nginx

相关问答FAQs

问题1:如何限制图片上传的大小? 解答:在Nginx配置中添加client_max_body_size指令,

client_max_body_size 10M;

这个设置限制上传文件的最大大小为10MB,如果使用PHP处理上传,还需要在php.ini中设置upload_max_filesizepost_max_size参数。

问题2:如何实现图片的防盗链? 解答:可以通过Nginx的valid_referers指令实现防盗链,在Nginx配置文件中添加:

location ~* \.(jpg|jpeg|png|gif|webp|svg)$ {
    valid_referers none blocked server_names *.example.com;
    if ($invalid_referer) {
        return 403;
    }
    expires 365d;
    add_header Cache-Control "public, immutable";
}

这个配置只允许来自example.com及其子域名的请求访问图片,其他来源的请求将返回403错误。

分享:
扫描分享到社交APP
上一篇
下一篇