凌峰创科服务平台

Apache如何搭建图片服务器?

目录

  1. 第一步:环境准备
    • 安装 Apache 服务器
    • 准备图片存储目录
  2. 第二步:基础配置(让 Apache 能访问图片)
    • 创建虚拟主机
    • 设置目录权限
    • 测试访问
  3. 第三步:优化配置(关键步骤)
    • 启用 mod_rewrite 实现伪静态(美化 URL)
    • 配置 mod_expires 设置浏览器缓存
    • 配置 mod_headers 启用 Gzip 压缩
  4. 第四步:高级配置(可选)
    • 配置防盗链
    • 配置目录列表
  5. 第五步:自动化部署(使用 Nginx 反向代理)
    • 为什么需要 Nginx?
    • Nginx 配置示例

第一步:环境准备

安装 Apache 服务器

以 CentOS/RHEL 系统为例:

Apache如何搭建图片服务器?-图1
(图片来源网络,侵删)
# 更新软件包列表
sudo yum update -y
# 安装 Apache (httpd)
sudo yum install -y httpd
# 启动 Apache 服务
sudo systemctl start httpd
# 设置开机自启
sudo systemctl enable httpd
# 检查服务状态和端口监听
sudo systemctl status httpd
ss -tulnp | grep :80

以 Ubuntu/Debian 系统为例:

# 更新软件包列表
sudo apt update
# 安装 Apache (apache2)
sudo apt install -y apache2
# 启动 Apache 服务
sudo systemctl start apache2
# 设置开机自启
sudo systemctl enable apache2
# 检查服务状态和端口监听
sudo systemctl status apache2
ss -tulnp | grep :80

准备图片存储目录

我们需要一个专门存放图片的目录,为了安全和管理的方便,建议放在 Web 根目录之外,然后通过符号链接或 Apache 的 Alias 指令指向它。

# 创建一个用于存放图片的目录,/data/images
sudo mkdir -p /data/images
# 为了方便管理,将当前用户添加到 apache 用户组(假设当前用户为 www)
# CentOS/RHEL 用户组通常是 apache
# Ubuntu/Debian 用户组通常是 www-data
sudo usermod -a -G apache $USER
# 或者
sudo usermod -a -G www-data $USER
# 修改目录所有者和组
sudo chown -R $USER:apache /data/images
# 或者
sudo chown -R $USER:www-data /data/images
# 设置正确的目录权限
# 所有者有读写执行权限,组和其他用户有读和执行权限(进入目录)
sudo chmod -R 755 /data/images

将一些测试图片放入 /data/images 目录中。


第二步:基础配置(让 Apache 能访问图片)

我们有两种主要方式来让 Apache 提供图片服务:基于默认站点的 Alias 或创建一个独立的虚拟主机,推荐使用虚拟主机,因为它更清晰、更灵活。

Apache如何搭建图片服务器?-图2
(图片来源网络,侵删)

创建虚拟主机配置文件

在 Apache 的配置目录下(通常是 /etc/httpd/conf.d//etc/apache2/sites-available/),创建一个新的配置文件,images.conf

# CentOS/RHEL
sudo vim /etc/httpd/conf.d/images.conf
# Ubuntu/Debian
sudo vim /etc/apache2/sites-available/images.conf

在文件中写入以下内容:

# 定义虚拟主机
<VirtualHost *:80>
    # ServerName 可以是您的域名,如果是本地测试,可以写一个假的
    # ServerName images.yourdomain.com
    # 使用 Alias 指令将 URL 路径映射到实际的图片目录
    # 访问 http://your_server/images/... 时,会指向 /data/images/...
    Alias /images "/data/images"
    # 设置 /images 路径的权限和选项
    <Directory "/data/images">
        # 允许所有主机访问
        Require all granted
        # 可以显示目录列表(生产环境建议关闭)
        # Options Indexes
        # 生产环境建议关闭
        Options -Indexes
        # 如果图片中有 .htaccess 文件,则忽略它
        AllowOverride None
        # 设置默认字符集
        AddDefaultCharset UTF-8
    </Directory>
</VirtualHost>

设置目录权限

确保 Apache 进程用户对 /data/images 目录有读取和执行权限。

# CentOS/RHEL
sudo chown -R apache:apache /data/images
sudo chmod -R 755 /data/images
# Ubuntu/Debian
sudo chown -R www-data:www-data /data/images
sudo chmod -R 755 /data/images

测试访问

  1. 重启 Apache 服务 使配置生效。

    Apache如何搭建图片服务器?-图3
    (图片来源网络,侵删)
    # CentOS/RHEL
    sudo systemctl restart httpd
    # Ubuntu/Debian
    sudo systemctl restart apache2
  2. 在浏览器中访问您的图片,假设您的服务器 IP 是 168.1.100,并且您在 /data/images 下放了一张名为 test.jpg 的图片,那么访问地址就是:

    http://192.168.1.100/images/test.jpg

如果图片能正常显示,说明基础配置已经成功。


第三步:优化配置(关键步骤)

一个生产级的图片服务器必须进行优化,否则会浪费带宽和服务器资源。

启用 mod_rewrite 实现伪静态

虽然不是必须,但伪静态可以让 URL 更友好,http://your_server/images/2025/10/abc.jpg

# 在 images.conf 的 <Directory> 块内添加
<Directory "/data/images">
    # ... 其他配置 ...
    # 启用 URL 重写引擎
    RewriteEngine On
    # 示例:将 /images/2025/10/abc.jpg 映射到 /data/images/2025/10/abc.jpg
    # 这条规则确保了路径的正确性,同时保持了 URL 的美观
    RewriteRule ^images/(.*)$ /data/images/$1 [L,PT]
</Directory>

注意: 在这个简单的例子中,Alias 已经实现了映射,RewriteRule 更多是用于更复杂的逻辑,但对于规范化 URL 和未来扩展非常有用。

配置 mod_expires 设置浏览器缓存

这是性能优化最关键的一步,通过设置 HTTP 头,让浏览器缓存图片,大幅减少重复请求,加快页面加载速度。

# 在 httpd.conf 或 apache2.conf 的全局配置中,或者在 images.conf 的虚拟主机块内添加
<IfModule mod_expires.c>
    ExpiresActive On
    # 为图片设置缓存时间为 30 天
    ExpiresByType image/jpeg "access plus 30 days"
    ExpiresByType image/gif "access plus 30 days"
    ExpiresByType image/png "access plus 30 days"
    ExpiresByType image/webp "access plus 30 days"
    ExpiresByType image/svg+xml "access plus 30 days"
    ExpiresByType image/x-icon "access plus 30 days"
</IfModule>

重启 Apache 后,用浏览器开发者工具查看网络请求,可以看到图片的响应头中会包含 Cache-ControlExpires 信息。

配置 mod_headers 启用 Gzip 压缩

虽然图片(如 JPG, PNG)本身就是压缩过的,但对一些矢量图(SVG)或文本文件(如 JSON API 响应)进行 Gzip 压缩仍然有效。

# 在 httpd.conf 或 apache2.conf 的全局配置中添加
<IfModule mod_deflate.c>
    # 开启输出压缩
    SetOutputFilter DEFLATE
    # 压缩等级 (1-9, 9是最高压缩,但最耗CPU)
    DeflateCompressionLevel 6
    # 压缩哪些类型的文件
    <IfModule mod_mime.c>
        # AddOutputFilterByType DEFLATE application/json
        # AddOutputFilterByType DEFLATE text/plain
        # AddOutputFilterByType DEFLATE text/css
        # AddOutputFilterByType DEFLATE application/javascript
        # AddOutputFilterByType DEFLATE application/xml+rss
    </IfModule>
</IfModule>

注意: 对图片进行 Gzip 压缩通常效果不佳,甚至会增大体积,mod_deflate 主要针对文本内容。


第四步:高级配置(可选)

配置防盗链

防止其他网站直接引用您的图片,消耗您的服务器带宽。

# 在 images.conf 的 <Directory> 块内添加
<Directory "/data/images">
    # ... 其他配置 ...
    # 防盗链配置
    # 允许的 referer (来源),根据您的域名填写
    SetEnvIfNoCase Referer "^http://yourdomain.com/" local_ref=1
    SetEnvIfNoCase Referer "^https://yourdomain.com/" local_ref=1
    # 允许直接访问图片(例如在浏览器地址栏输入)
    SetEnvIfNoCase Request_URI "^/images/" local_ref=1
    # referer 不匹配上面设置的,且不是直接访问,则返回 403 Forbidden
    <FilesMatch "\.(jpg|jpeg|png|gif|webp|svg)$">
        Order Allow,Deny
        Allow from env=local_ref
        # Deny from all
    </FilesMatch>
</Directory>

配置目录列表

如果希望访问一个目录时,能看到该目录下所有文件的列表,可以开启 Indexes

<Directory "/data/images">
    # ... 其他配置 ...
    # 开启目录列表
    Options Indexes FollowSymLinks
    # 可以自定义列表的标题和页脚
    IndexOptions FancyIndexing NameSort SizeSort SuppressIcon SuppressSize
    HeaderName /images/header.html
    ReadmeName /images/footer.html
</Directory>

警告: 在生产环境中,强烈不建议开启目录列表,它会暴露您的文件结构,带来安全隐患,如果必须开启,请确保目录中没有敏感文件。


第五步:自动化部署(使用 Nginx 反向代理)

对于高并发场景,Apache 虽然稳定,但在处理静态文件方面不如 Nginx 高效,最佳实践是使用 Nginx 作为反向代理和前端,专门处理静态文件请求,而 Apache 处理更复杂的动态请求。

为什么需要 Nginx?

  • 高性能:Nginx 处理静态文件请求速度更快,并发能力更强。
  • 反向代理:可以缓存来自 Apache 的响应,进一步减轻 Apache 的压力。
  • 负载均衡:如果未来需要扩展,可以轻松地将请求分发到多台 Apache 服务器。

Nginx 配置示例

确保您已经安装了 Nginx。

然后在 Nginx 的配置文件(如 /etc/nginx/conf.d/images_proxy.conf)中添加以下配置:

server {
    listen 80;
    server_name images.yourdomain.com; # 您的域名
    # 所有 /images/ 开头的请求都代理到后端的 Apache 服务器
    location /images/ {
        # Apache 服务器的地址和端口
        proxy_pass http://127.0.0.1:80/;
        # 设置一些代理头信息
        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;
        # 启用 Nginx 的缓存 (非常高效!)
        # 在 /var/cache/nginx 目录下创建一个名为 images_cache 的缓存区
        proxy_cache images_cache;
        # 对于 200 和 302 状态码的响应缓存 1 小时
        proxy_cache_valid 200 302 60m;
        # 对于 404 状态码的响应缓存 10 秒
        proxy_cache_valid 404 10s;
        # 如果缓存中没有,则转发到后端
        proxy_cache_use_stale error timeout updating http_500 http_502 http_503 http_504;
    }
}
# 在 http 块中定义缓存区
http {
    # ... 其他配置 ...
    proxy_cache_path /var/cache/nginx/images_cache levels=1:2 keys_zone=images_cache:10m inactive=60m use_temp_path=off;
}

工作流程

  1. 用户请求 http://images.yourdomain.com/images/test.jpg
  2. Nginx 接收到请求,发现匹配 location /images/
  3. Nginx 检查本地缓存 images_cache 中是否有 test.jpg
    • 如果有,且未过期,直接从本地缓存返回图片,非常快。
    • 如果没有,Nginx 将请求 http://127.0.0.1/images/test.jpg 发送给本地的 Apache 服务器。
  4. Apache 处理请求,返回图片。
  5. Nginx 将 Apache 返回的图片存入本地缓存,然后再返回给用户。

这样,后续所有对同一图片的请求都会被 Nginx 直接处理,完全不会惊动 Apache,极大地提升了性能。


通过以上步骤,您已经成功地搭建了一个从基础到优化的图片服务器:

  1. 基础搭建:安装 Apache,创建图片目录,并通过 Alias 或虚拟主机使其可访问。
  2. 性能优化:启用 mod_expires 设置浏览器缓存,这是减少服务器负载最有效的方法。
  3. 安全加固:通过配置目录权限和可选的防盗链,提升服务器的安全性。
  4. 生产级方案:引入 Nginx 作为反向代理,利用其处理静态文件的高性能和缓存能力,构建一个高性能、可扩展的图片服务架构。

根据您的实际需求(如访问量、是否需要防盗链等),可以选择性地应用这些配置,对于个人项目或小型网站,Apache + mod_expires 的方案已经足够优秀,对于大型网站,Nginx 反向代理是必经之路。

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