所有请求发送至源站,不缓存任何文件

    location / {
    proxy_pass http://yuan.moe.ms;
    proxy_http_version  1.1;
    proxy_cache_bypass  $http_upgrade;

    proxy_set_header Upgrade           $http_upgrade;
    proxy_set_header Connection        "upgrade";
    proxy_set_header Host              $http_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;
    proxy_set_header X-Forwarded-Host  $host;
    proxy_set_header X-Forwarded-Port  $server_port;
    }

解释:

proxy_pass http://yuan.moe.ms;
源站的ip或域名

proxy_http_version 1.1;
定义用于代理的HTTP协议版本,默认情况下将其设置为1.0。对于Websocket和keepalive连接,您需要使用1.1版。

proxy_cache_bypass $http_upgrade;
设置websocket不从缓存中获取响应,而是直接通过应用。

proxy_set_header Host $http_host;
把原http请求的Header中的Host字段也放到转发的请求里

proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
如果您的应用程序使用Websockets,则这些字段是必填字段。

proxy_set_header X-Real-IP $remote_addr;
将真实的客户端地址转发到应用,如果没有设置,你应用获取到将会是Nginx服务器IP地址。

proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
转发客户端请求头的X-Forwarded-For字段到应用。如果客户端请求头中不存在X-Forwarded-For字段,则$proxy_add_x_forwarded_for变量等同于$remote_addr变量

proxy_set_header X-Forwarded-Proto $scheme;
这将会转发客户端所使用的HTTP协议或者是HTTPS协议。

proxy_set_header X-Forwarded-Host $host;
转发客户端请求的原始主机到应用。

proxy_set_header X-Forwarded-Port $server_port;
定义客户端请求的原始端口。

缓存所有文件

proxy_cache_path /www/wwwroot/moe/tmp levels=1:2 keys_zone=mycache:20m max_size=20g inactive=120m use_temp_path=off;

server {
    # ...
    location / {
    proxy_cache mycache;
    proxy_cache_revalidate on;
    proxy_cache_min_uses 2;
    proxy_cache_use_stale error timeout updating http_500 http_502 http_503 http_504;
    proxy_cache_background_update on;
    proxy_cache_lock on;
    
    proxy_pass http://yuan.moe.ms;
    }

解释:

proxy_cache_path
缓存文件存储目录/www/wwwroot/moe/tmp(自己自定义)

levels在缓存目录下设置一个两级目录层次的结构。在单个目录中包含大量文件会降低文件访问速度,因此我们建议对大多数部署使用两级目录层次结构。如果levels未包含参数,Nginx会将所有文件放在同一目录中。一般为1:2

keys_zone设置共享内存区域,用于存储缓存键和元数据,例如使用计时器。拥有内存中的密钥副本。Nginx可以快速确定请求是否是命中缓存HIT或MISS,而不必读取磁盘,从而加快了检查速度。

1MB区域可以存储大约8,000个密钥的数据,因此示例中配置的20MB区域可以存储大约160,000个密钥的数据。

max_size设置缓存大小的上限,在本例中为20G。它是可选的,不指定值(删除该代码)则允许缓存增长以使用所有可用磁盘空间。

当缓存大小达到限制时,一个称为缓存管理器的进程将删除最近最少使用的缓存,将大小恢复到限制之下。

inactive指定项目在未被访问的情况下可以保留在缓存中的时间长度。在此示例中,缓存管理器进程会自动从缓存中删除120分钟未请求过的文件。

无论其是否已过期。默认值为10分钟10m。非活动内容与过期内容不同。Nginx不会自动删除缓存中header定义为已过期内容,例如Cache-Control:max-age=120。

过期内容仅在指定时间内未被访问时被删除。访问过期内容时,Nginx会从原始服务器刷新它并重置inactive计时器。

use_temp_path=off
Nginx首先将发往高速缓​​存的文件写入临时存储区域,use_temp_path=off指令指示Nginx将它们写入将被高速缓存的相同目录。

我们建议您将此参数设置off为避免在文件系统之间进行不必要的数据复制。use_temp_path在Nginx 1.7.10中引入。

_

proxy_cache mycache;
指定keys_zone

proxy_cache_revalidate on;
指示Nginx重新验证缓存。If-Modified-Since字段包含在GET请求时。

Nginx从源服务器刷新内容。如果客户端请求的缓存与If-Modified-Since对比是过期的内容时,NGINX则将它发送到源服务器。

proxy_cache_min_uses 2;
设置Nginx在缓存该请求之前必须请求2次才被缓存。如果缓存不够使用的情况下,这将非常有用。

因为它可确保只将最常访问的请求添加到缓存中。默认的proxy_cache_min_uses设置为1。

proxy_cache_use_stale error timeout updating http_500 http_502 http_503 http_504;
proxy_cache_background_update on;
指示当客户端请求已过期或正在从原始服务器更新的缓存。

Nginx会发送缓存内容。所有更新都将在后台完成。在完全更新之前,将为所有请求返回缓存文件。

这两条命令更多解释请参考Nginx官网:传送1传送2

proxy_cache_lock on;
如果proxy_cache_lock启用,多个客户端请求的文件不在缓存中,只有第一个请求是通过原始服务器的。其余请求将等待第一个请求的缓存,然后从缓存中提取文件。

如果proxy_cache_lock未启用,将会使未命中缓存的所有请求都将直接发送到源服务器。

proxy_pass http://yuan.moe.ms;
源站的ip或域名

缓存与不缓存如何使用?

举例1:如果你的源站全是静态资源(图片,下载站等),那么就可以选择缓存所有文件的反代方式

举例2:如果你的源站是WordPress博客,那么就要结合使用缓存与不缓存

示例:

proxy_cache_path /www/wwwroot/moe/tmp levels=1:2 keys_zone=mycache:20m max_size=20g inactive=120m use_temp_path=off;

server
{
    listen 80;
    listen 443 ssl http2;
    listen [::]:443 ssl http2;
    listen [::]:80;
    server_name moe.ms *.moe.ms;
    index index.php index.html index.htm default.php default.htm default.html;
    root /www/wwwroot/moe;
    
    location / {
    proxy_pass https://yuan.moe.ms;
    proxy_http_version  1.1;
    proxy_cache_bypass  $http_upgrade;

    proxy_set_header Upgrade           $http_upgrade;
    proxy_set_header Connection        "upgrade";
    proxy_set_header Host              $http_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;
    proxy_set_header X-Forwarded-Host  $host;
    proxy_set_header X-Forwarded-Port  $server_port;
    }
    
    location /wp-content/uploads/ {
    proxy_cache mycache;
    proxy_cache_revalidate on;
    proxy_cache_min_uses 2;
    proxy_cache_use_stale error timeout updating http_500 http_502 http_503 http_504;
    proxy_cache_background_update on;
    proxy_cache_lock on;
    
    proxy_pass https://yuan.moe.ms;
    }

示例中不缓存情况下反代了全站,缓存情况下反代了/wp-content/uploads/目录下的所有文件,因为WordPress中你的图片全都存放在这个文件夹下,而图片又是静态文件

以此类推还可以反代其他路径(实际上AWS的cloudfront原理也类似)

对于宝塔用户,配置文件最底部的一些代码要删除,否则会报错(如下图圈出来的都删了)

只需要删除反代机这里的代码,源站不用

为啥不用宝塔自带的反代?因为宝塔的反代是最基础的,傻瓜式的,几乎没有优化。

评论已关闭