Nginx 静态资源与日志管理
Nginx 静态资源服务与日志管理
在现代Web应用中,高效地提供静态资源(如HTML、CSS、JavaScript、图片等)和有效地管理服务器日志是至关重要的。Nginx以其卓越的性能,在这些方面表现出色。本章将详细介绍Nginx如何配置静态文件服务、优化浏览器缓存以及进行全面的日志管理。
核心概念
- 静态资源:指服务器直接发送给客户端,无需服务器端处理的文件,如图片、CSS、JS、HTML等。
- MIME类型:Multipurpose Internet Mail Extensions,多用途互联网邮件扩展类型,用于指定文件类型,浏览器根据MIME类型决定如何处理文件。
- 浏览器缓存:客户端浏览器将文件存储在本地,减少重复请求,提高访问速度。
- 访问日志:记录所有客户端对服务器的请求信息。
- 错误日志:记录Nginx运行过程中发生的错误和警告信息。
1. 配置静态资源服务
Nginx作为一款高性能的静态文件服务器,其配置非常简单高效。通过 root
或 alias
指令,可以指定静态文件的存放路径。
1.1 使用 root
指令
root
指令用于指定请求的根目录。当Nginx接收到请求时,它会将 root
指定的路径与 location
匹配到的URI拼接起来,形成完整的文件路径。
http {
server {
listen 80;
server_name static.example.com;
# 定义静态文件根目录
root /var/www/static_files;
location / {
# 尝试查找文件,如果找不到则返回404
try_files $uri $uri/ =404;
}
# 示例:访问 http://static.example.com/images/logo.png
# Nginx会在 /var/www/static_files/images/logo.png 查找文件
}
}
特点:
root
指令作用于http
、server
或location
块。- 拼接规则:
root
路径 +location
匹配的URI。
1.2 使用 alias
指令
alias
指令也用于指定文件路径,但它与 root
的行为有所不同。alias
会将 location
匹配到的URI部分替换为 alias
指定的路径。
http {
server {
listen 80;
server_name download.example.com;
location /downloads/ {
# 将 /downloads/ 替换为 /opt/software/
alias /opt/software/;
# 确保alias路径以斜杠结尾
# 尝试查找文件,如果找不到则返回404
try_files $uri $uri/ =404;
}
# 示例:访问 http://download.example.com/downloads/app.zip
# Nginx会在 /opt/software/app.zip 查找文件
}
}
特点:
alias
指令只能用于location
块。alias
路径必须以斜杠/
结尾,如果location
匹配的URI也以斜杠结尾。- 替换规则:
alias
路径替换location
匹配的URI部分。
何时使用 root
,何时使用 alias
?
- 当
location
匹配的是一个目录,且希望该目录下的文件直接映射到root
目录下的相应子目录时,使用root
。 - 当
location
匹配的是一个前缀,且希望将该前缀映射到另一个完全不同的目录时,使用alias
。
1.3 默认索引页
index
指令用于指定目录的默认索引文件。当请求一个目录时,Nginx会尝试查找这些文件。
server {
listen 80;
server_name example.com;
root /var/www/html;
index index.html index.htm default.html;
location / {
try_files $uri $uri/ =404;
}
}
1.4 MIME 类型配置
Nginx通过 mime.types
文件来识别文件类型并设置正确的 Content-Type
响应头。通常,这个文件会被 nginx.conf
中的 include mime.types;
指令引入。
# /etc/nginx/mime.types 示例片段
types {
text/html html htm shtml;
text/css css;
application/javascript js;
image/jpeg jpeg jpg;
image/png png;
application/json json;
# ... 更多类型
}
如果需要添加自定义MIME类型,可以直接在 http
块中添加 types
指令,或者修改 mime.types
文件。
http {
include mime.types;
default_type application/octet-stream;
# 自定义MIME类型
types {
application/x-font-woff woff;
application/vnd.ms-fontobject eot;
font/ttf ttf;
font/opentype otf;
image/svg+xml svg svgz;
}
}
2. 浏览器缓存配置
合理配置浏览器缓存可以显著减少服务器负载,提高用户访问速度。Nginx主要通过 expires
和 add_header Cache-Control
指令来控制缓存。
2.1 expires
指令
expires
指令用于控制HTTP响应头中的 Expires
和 Cache-Control
字段,指示浏览器缓存资源的有效期。
server {
listen 80;
server_name assets.example.com;
root /var/www/assets;
location ~* \.(jpg|jpeg|gif|png|svg|ico|css|js)$ {
expires 30d; # 缓存30天
# 相当于设置了 Cache-Control: max-age=2592000 和 Expires: (当前时间+30天)
access_log off; # 静态文件通常不需要记录访问日志
}
location ~* \.(html|htm)$ {
expires 1h; # HTML文件缓存1小时
add_header Cache-Control "public, must-revalidate";
}
location / {
# 默认不缓存或协商缓存
expires off;
add_header Cache-Control "no-cache, no-store, must-revalidate";
add_header Pragma "no-cache";
add_header Expires "0";
}
}
expires
参数说明:
off
:禁用缓存。epoch
:Expires
设置为1 January, 1970, 00:00:01 GMT
,强制浏览器不缓存。max
:Expires
设置为31 December, 2037, 23:59:59 GMT
,强制浏览器缓存最长时间。[time]
:指定缓存时间,如30s
(秒),1m
(分),1h
(小时),1d
(天),1w
(周),1M
(月),1y
(年)。@
[time]
:基于文件修改时间计算过期时间。
2.2 add_header Cache-Control
指令
Cache-Control
是HTTP/1.1中更强大的缓存控制头。add_header
指令可以添加自定义响应头。
location ~* \.(js|css|png|jpg|jpeg|gif|ico)$ {
expires 30d;
add_header Cache-Control "public, max-age=2592000"; # 明确设置max-age
}
location /api/ {
# API接口通常不缓存
add_header Cache-Control "no-cache, no-store, must-revalidate";
add_header Pragma "no-cache";
add_header Expires "0";
}
Cache-Control
常用值:
public
:响应可以被任何缓存区缓存。private
:响应只能被用户私有缓存(如浏览器)缓存。no-cache
:强制所有缓存区在向客户端提供缓存的响应之前,必须先验证其状态。no-store
:所有缓存区都不应存储关于客户端请求或服务器响应的任何内容。max-age=<seconds>
:设置缓存的最大生命周期,单位秒。s-maxage=<seconds>
:公共缓存(如CDN)的最大生命周期。must-revalidate
:缓存必须在使用过期资源前,向源服务器验证。
3. 日志管理
Nginx的日志功能非常强大,可以记录详细的访问信息和错误信息,这对于监控、故障排查和安全分析至关重要。
3.1 访问日志 (access_log
)
access_log
指令用于指定访问日志的路径和格式。通常在 http
、server
或 location
块中配置。
http {
# 定义日志格式
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
# 全局访问日志
access_log /var/log/nginx/access.log main;
server {
listen 80;
server_name example.com;
root /var/www/html;
# 特定server块的访问日志
access_log /var/log/nginx/example.com.access.log main;
location /images/ {
# 特定location块的访问日志,可以关闭或使用不同格式
access_log off;
}
}
}
log_format
常用变量:
$remote_addr
:客户端IP地址$remote_user
:客户端用户名称(用于HTTP认证)$time_local
:访问的时间和时区$request
:请求的URI和HTTP协议$status
:HTTP响应状态码$body_bytes_sent
:发送给客户端的字节数(不包括响应头)$http_referer
:HTTP Referer头$http_user_agent
:客户端浏览器信息$http_x_forwarded_for
:经过代理服务器的客户端IP地址$request_time
:请求处理时间
3.2 错误日志 (error_log
)
error_log
指令用于指定错误日志的路径和级别。错误日志对于调试和排查Nginx配置问题非常重要。
# 全局错误日志,通常在main块或http块中配置
error_log /var/log/nginx/error.log warn;
http {
server {
listen 80;
server_name example.com;
root /var/www/html;
# 特定server块的错误日志
error_log /var/log/nginx/example.com.error.log notice;
}
}
错误日志级别(从低到高):
debug
:调试信息,非常详细,用于开发和深度排查。info
:一般信息,如Nginx启动、停止等。notice
:需要注意的正常但重要的事件。warn
:警告信息,可能存在问题但不会影响正常运行。error
:错误信息,请求处理失败。crit
:严重错误,可能导致Nginx无法正常工作。alert
:警报,需要立即采取行动。emerg
:紧急,Nginx不可用。
建议在生产环境中使用 warn
或 error
级别,在调试时使用 info
或 debug
。
3.3 日志切割与管理
Nginx不会自动切割日志文件,长时间运行会导致日志文件过大。通常使用 logrotate
工具进行日志切割。
配置 logrotate
创建一个新的 logrotate
配置文件,例如 /etc/logrotate.d/nginx
:
/var/log/nginx/*.log {
daily # 每天切割
missingok # 如果日志文件不存在,不报错
rotate 7 # 保留7个旧日志文件
compress # 压缩旧日志文件
delaycompress # 延迟压缩,与compress一起使用
notifempty # 如果日志文件为空,不进行切割
create 0640 nginx adm # 创建新日志文件并设置权限
sharedscripts # 脚本只执行一次
postrotate # 切割后执行的脚本
# 向Nginx Master进程发送USR1信号,重新打开日志文件
if [ -f /var/run/nginx.pid ]; then
kill -USR1 `cat /var/run/nginx.pid`
fi
endscript
}
logrotate
常用选项:
daily
/weekly
/monthly
:按天/周/月切割。size <size>
:当日志文件达到指定大小时切割。rotate <count>
:保留的旧日志文件数量。compress
:压缩旧日志文件。delaycompress
:延迟压缩。notifempty
:空文件不切割。create <mode> <owner> <group>
:创建新文件并设置权限。postrotate
/endscript
:切割后执行的脚本。
3.4 实时查看日志
在调试或监控时,实时查看日志非常有用。
# 实时查看访问日志
tail -f /var/log/nginx/access.log
# 实时查看错误日志
tail -f /var/log/nginx/error.log
总结
本章详细介绍了Nginx在静态资源服务和日志管理方面的强大功能:
- 静态资源服务:通过
root
和alias
指令高效配置静态文件路径,并了解了index
和mime.types
的作用。 - 浏览器缓存:利用
expires
和add_header Cache-Control
指令优化浏览器缓存,显著提升用户体验和减轻服务器压力。 - 日志管理:配置
access_log
和error_log
以记录详细的服务器活动,并通过log_format
自定义日志格式,最后介绍了logrotate
进行日志切割和管理。
掌握这些配置对于构建高性能、可维护的Web服务至关重要。在下一章中,我们将深入探讨Nginx作为反向代理和负载均衡器的核心功能。