Nginx 全局变量为 Nginx 的配置带来了极大的灵活性和智能化,通过合理应用这些变量,你可以创建更加精细和高效的服务器配置。下面,我将分享几个实战案例,展示如何利用全局变量来优化配置,从而提升性能、安全性和功能性。
1. 条件性内容分发:基于用户地理位置的优化
假设你需要根据用户所在地理位置显示不同版本的网站内容,可以通过 $geo 变量实现:
geo $country {
default us;
include geoip.conf; # 这里引入 GeoIP 数据库配置
}
server {
listen 80;
server_name example.com;
if ($country = cn) {
set $root "/var/www/china";
} else {
set $root "/var/www/global";
}
location / {
root $root;
}
}
在这个例子中,我们首先定义了一个地理位置变量 $country,然后根据该变量设置不同的文档根目录,从而实现基于地理位置的内容分发。
2. 安全加固:拒绝特定 IP 地址访问
利用 $remote_addr 可以拒绝特定 IP 地址的访问,提高安全性:
if ($remote_addr in $banned_ips) {
return 403;
}
为了使上面的代码生效,你需要事先定义一个包含黑名单 IP 的变量 $banned_ips,通常会从外部文件读取,如:
set $banned_ips "";
include /etc/nginx/ban.list;
3. 动态设置超时时间
你可以根据不同的请求类型或来源动态设定超时时间,这有助于提升服务器响应速度和资源利用率:
if ($request_method ~* POST) {
set $timeout 60s;
} else {
set $timeout 15s;
}
proxy_connect_timeout $timeout;
proxy_read_timeout $timeout;
proxy_send_timeout $timeout;
4. 日志精细化:按时间段分割日志文件
通过 $time_iso8601 或其他时间相关的变量,你可以实现按天或按小时分割日志文件:
access_log /var/log/nginx/access.log main format;
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" $request_time';
# 使用 date 匹配实现按天切割
error_log /var/log/nginx/error.$time_local.log;
5. 内容压缩:基于请求类型自动开启 GZIP
利用 $http_accept_encoding 变量判断浏览器是否支持 GZIP,从而智能决定是否启用压缩:
gzip on;
if ($http_accept_encoding ~* gzip) {
gzip_types application/json text/plain text/css image/jpeg;
}
6. 优化静态资源缓存
利用 $uri 变量识别出静态资源,并对其设置较长的缓存过期时间:
location ~* \.(jpg|jpeg|png|gif|ico|js|css)$ {
expires max;
}
总之,Nginx 全局变量的应用范围广泛,涉及日志管理、安全性增强、性能调优等多个层面。通过巧妙地利用这些变量,可以使 Nginx 配置变得更加智能和高效,进一步提升网站的稳定性和用户体验。务必确保在实践中测试和验证每一步更改,以避免潜在的配置冲突或错误。