《nginx静态算法动态算法》
一、解决方案
在使用Nginx时,处理静态资源和动态请求的分发是关键。对于静态资源,如图片、CSS、JavaScript文件等,可以利用Nginx高效的静态文件处理能力直接响应;而动态请求则需要转发给后端的应用服务器(如PHP - FPM、Java应用服务器等)进行处理。通过配置不同的算法来优化这两种请求的处理效率,从而提高整个Web服务的性能。
二、基于location块区分静态与动态资源
这是最常见的一种思路。
nginx
server {
listen 80;
server_name localhost;</p>
<pre><code># 静态资源匹配
location ~* .(jpg|jpeg|png|gif|css|js)$ {
root /usr/share/nginx/html; # 静态资源存放目录
expires 7d; # 设置缓存过期时间
add_header Cache-Control "public";
}
# 动态请求匹配
location / {
# 使用反向代理将动态请求转发给后端服务器
proxy_pass http://127.0.0.1:9000; # 假设后端服务器地址为127.0.0.1:9000
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 - Nginx - Proxy true;
}
}
在这个配置中,通过正则表达式~* .(jpg|jpeg|png|gif|css|js)$
来精确匹配静态资源的请求路径,当请求符合这个模式时,Nginx会直接从指定的根目录读取文件并返回给客户端,并设置合适的缓存头。而对于其他不符合静态资源匹配规则的请求,则认为是动态请求,通过proxy_pass
指令将其转发给后端服务器。
三、根据文件是否存在判断静态或动态
有时我们希望先尝试查找静态文件,如果不存在再作为动态请求处理。
nginx
server {
listen 80;
server_name localhost;</p>
<pre><code>location / {
root /usr/share/nginx/html;
try_files $uri $uri/ @dynamic;
}
location @dynamic {
proxy_pass http://127.0.0.1:9000;
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 - Nginx - Proxy true;
}
}
这里使用了try_files
指令,它会按照顺序尝试匹配文件。如果请求的URI对应的文件存在,则直接作为静态文件返回;如果不存在,则交给名为@dynamic的命名location来处理,这个命名location里面是动态请求转发的逻辑。
四、基于URL参数或请求方法区分
在某些场景下,可以根据URL中的特定参数或者HTTP请求方法来决定是静态还是动态请求。
例如,如果是GET请求且没有特定的动态参数,就认为是静态请求;否则为动态请求。
nginx
server {
listen 80;
server_name localhost;</p>
<pre><code>location / {
if ($request_method = GET) {
set $is_static 1;
}
if ($arg_dynamic_param) { # 如果有名为dynamic_param的参数
set $is_static 0;
}
if ($is_static = 1) {
rewrite ^(.*)$ /static/$1 break;
}
if ($is_static = 0) {
proxy_pass http://127.0.0.1:9000;
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 - Nginx - Proxy true;
}
}
location /static/ {
alias /usr/share/nginx/html/;
expires 7d;
add_header Cache-Control "public";
}
}
以上代码中,通过多个if
语句组合判断请求是否为静态请求。需要注意的是,在Nginx中使用if
语句要谨慎,因为它可能会带来一些意想不到的问题,如变量作用域等问题,所以在实际生产环境中使用时要充分测试。