Windows 下编译 Nginx支持ngx_cache_purge

Windows 下编译 Nginx支持ngx_cache_purge

官方文档地址: https://nginx.org/en/docs/howto_build_on_win32.html

ngx_cache_purge源码: https://github.com/FRiCKLE/ngx_cache_purge

一. 安装环境支持

  • Microsoft Visual C compiler. Microsoft Visual Studio® 8 and 10 are known to work. (建议使用2015版本)
  • MSYS or MSYS2.
  • Perl, if you want to build OpenSSL® and nginx with SSL support. For example ActivePerl or Strawberry Perl.
  • Mercurial client. ( hg 命令拉取 nginx 源码,有 Git 可以不用安装)
  • PCRE, zlib and OpenSSL libraries sources. (依赖库)

部分软件安装完成时会提示添加到系统环境变量,记得允许. Microsoft Visual Studio需要根据安装目录搜索执行文件自行添加到环境变量中

二. 下载源码配置目录

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
# nginx 源码
# hg clone http://hg.nginx.org/
git clone https://github.com/nginx/nginx.git
cd nginx
mkdir objs
mkdir objs/lib

# 下载 最新稳定版本 依赖库
cd objs/lib
wget https://github.com/PCRE2Project/pcre2/releases/download/pcre2-10.40/pcre2-10.40.tar.gz
wget http://zlib.net/zlib-1.2.13.tar.gz
wget https://www.openssl.org/source/openssl-3.0.5.tar.gz

# 下载 ngx_cache_purge模块
wget https://github.com/FRiCKLE/ngx_cache_purge/archive/refs/tags/2.3.tar.gz

# 解压提取到 objs/lib 目录
tar -zxvf pcre2-10.40.tar.gz
tar -zxvf zlib-1.2.13.tar.gz
tar -zxvf openssl-3.0.5.tar.gz
tar -zxvf 2.3.tar.gz

三. 开始编译

启动MSYS,进入nginx的目录,执行脚本

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
auto/configure \
    --with-cc=cl \
    --with-debug \
    --prefix= \
    --conf-path=conf/nginx.conf \
    --pid-path=logs/nginx.pid \
    --http-log-path=logs/access.log \
    --error-log-path=logs/error.log \
    --sbin-path=nginx.exe \
    --http-client-body-temp-path=temp/client_body_temp \
    --http-proxy-temp-path=temp/proxy_temp \
    --http-fastcgi-temp-path=temp/fastcgi_temp \
    --http-scgi-temp-path=temp/scgi_temp \
    --http-uwsgi-temp-path=temp/uwsgi_temp \
    --with-cc-opt=-DFD_SETSIZE=1024 \
    --with-pcre=objs/lib/pcre2-10.40 \
    --with-zlib=objs/lib/zlib-1.2.13 \
    --with-openssl=objs/lib/openssl-3.0.5 \
    --with-openssl-opt=no-asm \
    --with-http_ssl_module \
    --with-ngx_cache_purge=objs/lib/ngx_cache_purge-2.3

缺少执行文件注意核查环境变量配置

执行脚本会提示目录不存在请自行添加配置目录

如果提示报错注意核查模块目录名称及位置配置是否正确

1
nmake

Nginx编译完成后。打开objs目录查看是否生成nginx.exe

四. 整理Nginx部署环境

将源码目录下的 conf、contrib、html、logs、tempobjs\nginx.exe 提取到一个目录,方便后期部署.

五. nginx.conf文件配置实例

#user  nobody;
worker_processes  1;

#error_log  logs/error.log;
#error_log  logs/error.log  notice;
#error_log  logs/error.log  info;

#pid        logs/nginx.pid;

events {
    worker_connections  1024;
}

http {
    include       mime.types;
    default_type  application/octet-stream;

    #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  logs/access.log  main;

    sendfile        on;
    #tcp_nopush     on;
    #keepalive_timeout  0;
    keepalive_timeout  60;
    #gzip  on;
    # 关闭显示版本号
    server_tokens off;
    
    # upstream file.cn {
    #    server 192.168.0.10:9999;
    # }


    # 开始配置 nginx cache
    # 临时目录,缓存的响应首先写入临时文件,然后重命名该文件.
    ## 临时文件和缓存可以放在不同的文件系统上。在这种情况下,文件是跨两个文件系统复制的,而不是重命名操作。
    ## 建议缓存和保存临时文件的目录都放在同一个文件系统上。
    ## 临时文件的目录根据use_temp_path参数(1.7.10)设置,如果此参数被省略或设置为 value on,则将使用proxy_temp_path指令为给定位置设置的目录。如果该值设置为off,则临时文件将直接放在缓存目录中
    proxy_temp_path d:/nginx/tmp;
    
    # 缓存目录:
    ## proxy_cache_path 缓存存放路径
    ## levels 参数定义缓存的(目录)层次级别从 1 到 3,中间用 : 隔开,每个级别接受值(子目录名字符长短) 1 或 2。
	## key_zone mycache为缓存名字,可以在 location 或者 server 中通过 proxy_cache 引用; 100m 表示使用多少内存空间存储nginx key
	## max_size 最大使用缓存空间
	## inactive	缓存时间
    proxy_cache_path d:/nginx/cache  levels=1:2 keys_zone=file_cache:100m max_size=50g inactive=90d use_temp_path=on;
    # Nginx缓存KEY是键值存储,URL是键,文件路径是值。键值存储的速度就是加快在文件系统中查找的速度。所以,存储的key是哈希过的值
    proxy_cache_key $host$request_uri;

    server {
        listen       80;
        server_name  localhost;
        charset utf-8;
        
        # 静态 IP 可注释后,配置 location 中 proxy_pass 即可
        
        # 代理地址为动态 IP 请配置如下选项
        # 该地址可以指定为域名或 IP 地址,带有可选端口(1.3.1、1.2.2)版本以上。
        # 如果未指定端口,则使用端口 53。以循环方式查询名称服务器
        # 默认情况下,nginx 使用 DNS 响应的 TTL 值缓存时间。可选valid参数允许覆盖它
        resolver 223.5.5.5 valid=10s ipv6=off;
        # 设置名称解析的超时时间
        resolver_timeout 5s;
        set $backend "http://yourdomain:port/";

        location / {
			
			# 表示对客户端请求的 GET 和 HEAD 方法进行缓存
			proxy_cache_methods GET HEAD;
			# 将缓存是否命中结果返回
            add_header X-Cache $upstream_cache_status;
            # 将缓存服务器IP 返回
            add_header X-Via $server_addr;
            # 用于后端的real server区分不同的虚拟主机
			proxy_set_header Host $host;
			# 记录客户端真实ip地址,而不是代理服务器地址,需要后端web服务器开启日志相应功能接收
			proxy_set_header X-Real-IP $remote_addr;


            # 指定使用 file_cache 缓存
            proxy_cache file_cache;
            # 设置缓存的key
            proxy_cache_key $host$uri$is_args$args;
            
            # 缓存有效期
            proxy_cache_valid 90d;
            # 可以针对于不同的响应码进行缓存不同的时间设定;
			# proxy_cache_valid 200 302 10m;
			# proxy_cache_valid 404 1m;
			# proxy_cache_valid any 1m;
			# 指明哪种场景可以使用过期缓存,提升用户体验
			proxy_cache_use_stale error timeout invalid_header http_500 http_502 http_503 http_504;
			
			# 本地缓存过期会检查后端服务器该缓存是否存在,避免后端重传占据带宽;
			proxy_cache_revalidate on;
			
            # 开启后忽略不允许缓存
            proxy_ignore_headers Set-Cookie Cache-Control;
            
            # 请求被响应多少次才会被缓存,默认是1,生产环境可以根据使用情况配置
			proxy_cache_min_uses 1;
			
            # 反代地址
            proxy_pass $backend;
        }

		
        location ~ /purge(/.*) {
        	# proxy_cache_purge [缓存空间] [$host$1$is_args$args]
            proxy_cache_purge file_cache $host$1$is_args$args;
            # 允许使用清除缓存的地址,生产环境注意配置限制IP或IP段.
            allow all;
            # allow 127.0.0.1;
            # 拒绝其它地址使用清除缓存
            # deny all;
        }

        #error_page  404              /404.html;

        # redirect server error pages to the static page /50x.html
        #
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }

    }

}