Nginx 自建 CDN 反代加速节点

cdn-graph.jpg

CDN:CDN 的全称是 Content Delivery Network,即内容分发网络。其基本思路是尽可能避开互联网上有可能影响数据传输速度和稳定性的瓶颈和环节,使内容传输的更快、更稳定。其目的是使用户可就近取得所需内容,解决 Internet 网络拥挤的状况,提高用户访问网站的响应速度。

安装 Nginx

需要在所有 CDN 服务器节点安装 Nginx,推荐使用 OneinStack 或军哥的 lnmp.org 一键包,如何安装 Nginx 自行参考脚本官网就行了。

反向代理配置

反向代理通俗点你把它理解成 CDN 节点就行了,这里用一台服务器作为解释,

源站:192.168.1.100

CDN:192.168.1.101

假如我需要对 inwao.com 搭建 CDN 节点,数据放在 192.168.1.100,需要先修改 hosts 指向,告知 CDN 节点从那里去获取网站数据,也就是回源地址,需要在 CDN 做如下修改:

vi /etc/hosts
192.168.1.100   inwao.com

在 CDN 下创建 nginx 配置文件 inwao.com.conf

#创建缓存目录
mkdir -p /usr/local/nginx/caches/inwao.com
#设置缓存目录权限
chown -R www:www /usr/local/nginx/caches/inwao.com
#创建inwao.com.conf
vi /usr/local/nginx/conf/vhost/inwao.com.conf

在 inwao.com.conf 中添加下面的内容,缓存目录/缓存时间请根据实际情况调整,后面会详细说明各参数含义。

proxy_cache_path /usr/local/nginx/caches/inwao.com levels=1:2 keys_zone=xiaoz:50m inactive=30m max_size=50m;
server {
    listen 80;
    server_name inwao.com;
    charset utf-8,gbk;
        location / {
        proxy_set_header Accept-Encoding "";
           proxy_pass https://inwao.com;
           proxy_redirect off;
           proxy_set_header X-Real-IP $remote_addr;
           proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
           proxy_cache xiaoz;
           proxy_cache_valid  200 304  30m;
           proxy_cache_valid  301 24h;
           proxy_cache_valid  500 502 503 504 0s;
           proxy_cache_valid any 1s;
           proxy_cache_min_uses 1;
           expires 12h;
    }
}
  • /usr/local/nginx/caches/inwao.com:为缓存目录。
  • levels:指定该缓存空间有两层 hash 目录,第一层目录为 1 个字母,第二层为 2 个字母。
  • keys_zone=inwao:50m:为缓存空间起个名字,这里取名为“inwao”,后面的 50m 指内存缓存空间。
  • inactive=30m:如果 30 分钟内该资源没有被访问则删除。
  • max_size=50m:指硬盘缓存大小为 50MB.
  • proxy_cache_valid:指定状态码缓存时间,前面写状态码,后面写缓存时间。

重载 nginx 命令:

/etc/init.d/nginx restart

以上是 Http 站点的 Nginx 反代设置,如果你是想反代 Https 站点,参考如下配置进行调整即可:

https CDN 配置:

proxy_cache_path /usr/local/nginx/caches/inwao.com levels=1:2 keys_zone=inwao:50m inactive=30m max_size=50m;
server {
    listen 443 ssl http2;
    ssl_certificate /usr/local/nginx/conf/ssl/inwao.com/fullchain.cer;
    ssl_certificate_key /usr/local/nginx/conf/ssl/inwao.com/inwao.com.key;
    ssl_session_timeout 1d;
    ssl_session_cache builtin:1000 shared:SSL:10m;
    ssl_dhparam /usr/local/nginx/conf/ssl/dhparam.pem;
    add_header Strict-Transport-Security "max-age=63072000; includeSubdomains; preload";
    ssl_protocols TLSv1.1 TLSv1.2 TLSv1.3;
    ssl_ciphers "TLS-CHACHA20-POLY1305-SHA256:TLS-AES-256-GCM-SHA384:TLS-AES-128-GCM-SHA256:EECDH+CHACHA20:EECDH+CHACHA20-draft:EECDH+ECDSA+AES128:EECDH+aRSA+AES128:RSA+AES128:EECDH+ECDSA+AES256:EECDH+aRSA+AES256:RSA+AES256:EECDH+ECDSA+3DES:EECDH+aRSA+3DES:RSA+3DES:!MD5";

    ssl_prefer_server_ciphers on;

    ssl_stapling on;
    ssl_stapling_verify on;

    server_name inwao.com;
    access_log /usr/local/nginx/caches/inwao.com_nginx.log combined;

    charset utf-8,gbk;
        location / {
        proxy_set_header Accept-Encoding "";
           proxy_pass https://inwao.com;
           proxy_redirect off;
           proxy_set_header X-Real-IP $remote_addr;
           proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
           proxy_cache inwao;
           proxy_cache_valid  200 304  30m;
           proxy_cache_valid  301 24h;
           proxy_cache_valid  500 502 503 504 0s;
           proxy_cache_valid any 1s;
           proxy_cache_min_uses 1;
           expires 12h;
    }
}

清理 Nginx 缓存需要 ngx_cache_purge 模块帮助,可输入命令nginx -V查看已经编译的模块,如果没有 ngx_cache_purge 说明模块没有安装,则需要重新编译一下 Nginx。

ngx_cache_purge 编译教程:LNMP1.5 安装 ngx_cache_purge 缓存清除组件

在 nginx.conf 的 server 段内加入下面的配置,并重载 Nginx,下面的 inwao 请与 keys_zone 定义的值保持一致,否则 nginx 将无法启动。

location ~ /purge(/.*) {
allow all;
proxy_cache_purge inwao $proxy_host$1$is_args$args;
error_page 405 =200 /purge$1;
}

如果想清理缓存,添加 dcache 参数即可,如 https://inwao.com/dcache/xxx.png 如果一直出现 404 错误,请检查配置。

对于 typecho 博客,如果启用 CDN 后页面被缓存,用户提交评论后无法马上显示出来,可以使用 Ajax 异步请求 ngx_cache_purge 接口,当用户提交评论的时候则清除该页面缓存。只需要下面的这段 js 添加到 footer.php 即可。

<script>
        $(document).ready(function(){
            $("#submit").click(function(){
                var uri = "https://inwao.com/purge" + window.location.pathname;
                $.get(uri,function(data,status){
                    return true;
                });
            });
        });
</script>

以下是 CDN 完整配置,仅供参考,你需要替换好 Keys_zone、SSL 路径、域名等:

proxy_cache_path /usr/local/nginx/caches/inwao.com levels=1:2 keys_zone=inwao:100m inactive=30m max_size=100m;
server
    {
    listen 443 ssl http2;
    listen [::]:443 ssl http2;
    ssl on;
    ssl_certificate /usr/local/nginx/conf/ssl/inwao.com/fullchain.cer;
    ssl_certificate_key /usr/local/nginx/conf/ssl/inwao.com/inwao.com.key;
    ssl_session_timeout 1d;
    ssl_session_cache shared:SSL:50m;
    ssl_session_tickets off;
    ssl_protocols TLSv1.1 TLSv1.2 TLSv1.3;
    ssl_ciphers "TLS-CHACHA20-POLY1305-SHA256:TLS-AES-256-GCM-SHA384:TLS-AES-128-GCM-SHA256:EECDH+CHACHA20:EECDH+CHACHA20-draft:EECDH+ECDSA+AES128:EECDH+aRSA+AES128:RSA+AES128:EECDH+ECDSA+AES256:EECDH+aRSA+AES256:RSA+AES256:EECDH+ECDSA+3DES:EECDH+aRSA+3DES:RSA+3DES:!MD5";
    # openssl dhparam -out /usr/local/nginx/conf/ssl/dhparam.pem 2048
    ssl_dhparam /usr/local/nginx/conf/ssl/dhparam.pem;
    add_header Strict-Transport-Security "max-age=63072000; includeSubdomains; preload";

    ssl_prefer_server_ciphers on;
    ssl_stapling on;
    ssl_stapling_verify on;

    server_name     inwao.com;
    charset utf-8,gbk;

   #删除缓存
    location ~ /dcache(/.*) {
    allow all;
    proxy_cache_purge inwao $proxy_host$1$is_args$args;
    error_page 405 =200 /purge$1;
    }

       location / {
       #proxy_set_header Accept-Encoding "";
       proxy_pass https://inwao.com;
       proxy_redirect off;
       proxy_set_header X-Real-IP $remote_addr;
       proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
       proxy_cache inwao;
       proxy_cache_valid  200 304  30m;
       proxy_cache_valid  301 24h;
       proxy_cache_valid  500 502 503 504 0s;
       proxy_cache_valid any 1s;
       #达到第几次被缓存?
       proxy_cache_min_uses 1;
       expires 12h;
       proxy_cache_key    $uri$is_args$args;
    }
}
server
{
    listen 80;
    server_name inwao.com;
    rewrite ^(.*) https://inwao.com$1 permanent;
}

启用 CDN 后无法获取真实 IP

如果是 typecho 用户,当你启用了 Nginx CDN 加速后,你会发现后台获取到的用户评论 IP 都变成了 CDN 节点的,解决这个问题也很简单,在 typecho 的根目录的 config.inc.php 插入以下代码即可。

if (isset($_SERVER['HTTP_X_REAL_IP'])) {
$_SERVER['REMOTE_ADDR'] = $_SERVER['HTTP_X_REAL_IP'];
}

本站已开启 hong kong CDN 加速节点,已实现全站资源自动更新缓存,在开启 CDN 加速的情况下评论会及时异步请求显示,评论信息获取真实 IP.


标签: nginx自建cdn

添加新评论