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

# 更新软件包列表 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 的配置目录下(通常是 /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
测试访问
-
重启 Apache 服务 使配置生效。
(图片来源网络,侵删)# CentOS/RHEL sudo systemctl restart httpd # Ubuntu/Debian sudo systemctl restart apache2
-
在浏览器中访问您的图片,假设您的服务器 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-Control 和 Expires 信息。
配置 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;
}
工作流程:
- 用户请求
http://images.yourdomain.com/images/test.jpg。 - Nginx 接收到请求,发现匹配
location /images/。 - Nginx 检查本地缓存
images_cache中是否有test.jpg。- 如果有,且未过期,直接从本地缓存返回图片,非常快。
- 如果没有,Nginx 将请求
http://127.0.0.1/images/test.jpg发送给本地的 Apache 服务器。
- Apache 处理请求,返回图片。
- Nginx 将 Apache 返回的图片存入本地缓存,然后再返回给用户。
这样,后续所有对同一图片的请求都会被 Nginx 直接处理,完全不会惊动 Apache,极大地提升了性能。
通过以上步骤,您已经成功地搭建了一个从基础到优化的图片服务器:
- 基础搭建:安装 Apache,创建图片目录,并通过
Alias或虚拟主机使其可访问。 - 性能优化:启用
mod_expires设置浏览器缓存,这是减少服务器负载最有效的方法。 - 安全加固:通过配置目录权限和可选的防盗链,提升服务器的安全性。
- 生产级方案:引入 Nginx 作为反向代理,利用其处理静态文件的高性能和缓存能力,构建一个高性能、可扩展的图片服务架构。
根据您的实际需求(如访问量、是否需要防盗链等),可以选择性地应用这些配置,对于个人项目或小型网站,Apache + mod_expires 的方案已经足够优秀,对于大型网站,Nginx 反向代理是必经之路。
