Nginx缓存静态页面

首先介绍一下弄这个的初衷。
其实初衷很简单公司需要这个,然后你就去实现没有什么更高大上的理由,原理什么的我也不打算介绍了, 个人不太喜欢这些咬文爵字的东西。
 
其次做这个需要用到ngx_cache_purge 缓存模块。
不清楚自己的nginx有没有添加这个模块的童鞋可以使用nginx -V查看具体如下:
[root@localhost sbin]# ./nginx -V
nginx version: nginx/1.10.3
built by gcc 4.8.5 20150623 (Red Hat 4.8.5-11) (GCC)
built with OpenSSL 1.0.1e-fips 11 Feb 2013
TLS SNI support enabled
configure arguments: --prefix=/usr/local/nginx --with-ipv6 --with-http_ssl_module --with-http_stub_status_module --with-ipv6 --with-http_ssl_module --with-http_realip_module --with-http_addition_module --with-http_dav_module --with-http_flv_module --with-http_mp4_module --with-http_gzip_static_module --add-module=/root/ngx_cache_purge-2.3 --with-http_perl_module --with-ld-opt=-Wl,-E

如果看到了ngx_cache_purge则已经添加了这个模块。你可以直接跳到最下面看看是不是你想要的, 好了,废话不多说。

一、编译安装Nginx


首先下载nginx和ngx_cache_purge 缓存模块
附:
nginx下载地址:http://nginx.org/download/nginx-1.10.3.tar.gz
ngx_cache_purge下载地址:http://labs.frickle.com/files/ngx_cache_purge-2.3.tar.gz
 
开始编译安装
cd /usr/local/
wget http://nginx.org/download/nginx-1.10.3.tar.gz
tar zxvf nginx-1.10.3.tar.gz
wget http://labs.frickle.com/files/ngx_cache_purge-2.3.tar.gz
tar -xvf ngx_cache_purge-2.3.tar.gz
./configure --prefix=/usr/local/nginx --add-module=../ngx_cache_purge-2.3 --with-ipv6 --with-http_ssl_module --with-http_stub_status_module --with-ipv6 --with-http_ssl_module --with-http_realip_module --with-http_addition_module --with-http_dav_module --with-http_flv_module --with-http_mp4_module --with-http_gzip_static_module --with-http_perl_module --with-ld-opt="-Wl,-E"


 附Nginx编译安装时可能遇到的问题:
/configure: error: the HTTP rewrite module requires the PCRE library.
解决方法:安装pcre
# yum -y install pcre pcre-devel

缺少ssl错误,错误信息如下:
./configure: error: the HTTP cache module requires md5 functions
from OpenSSL library. You can either disable the module by using
--without-http-cache option, or install the OpenSSL library into the system,
or build the OpenSSL library statically from the source with nginx by using
--with-http_ssl_module --with-openssl=<path> options.
解决方法:安装openssl
# yum -y install openssl openssl-devel

缺少编译器,错误信息如下:
./configure: error: C compiler cc is not found
解决方法:安装gcc-c++
# yum -y install gcc-c++ autoconf automake
autoconf是自动配置,automake是自动编译

缺少zlib包,错误信息如下:
./configure: error: the HTTP gzip module requires the zlib library.
You can either disable the module by using –without-http_gzip_module
option, or install the zlib library into the system, or build the zlib
library
statically from the source with nginx by using –with-zlib=<path> option.
解决方法:安装zlib
# yum install -y zlib-devel

缺少libxml2,错误信息如下:
./configure: error: the HTTP XSLT module requires the libxml2/libxslt
libraries. You can either do not enable the module or install the libraries.
解决方法:
# yum -y install libxml2 libxml2-dev
# yum -y install libxslt-devel

http_image_filter_module是nginx提供的集成图片处理模块,需要gd-devel的支持,错误信息如下:
./configure: error: the HTTP image filter module requires the GD library.
You can either do not enable the module or install the libraries.
解决方法:
# yum -y install gd-devel

缺少ExtUtils,错误信息如下:
./configure: error: perl module ExtUtils::Embed is required
解决方法:
# yum -y install perl-devel perl-ExtUtils-Embed

缺少GeoIP,错误信息如下:
./configure: error: the GeoIP module requires the GeoIP library.
You can either do not enable the module or install the library.
解决方法:
# yum -y install GeoIP GeoIP-devel GeoIP-data

 

二、配置nginx.conf


安装完成后编辑nginx的配置文件位于/usr/local/nginx/conf/nginx.conf
# cd /usr/local/nginx/conf/
# cp nginx.conf nginx.conf.bak #先将nginx的配置文件进行备份

可以利用nginx -V查看是否添加了ngx_cache_purge 缓存模块(如何查看文章头部)
配置的一些详细的参数我在我的nginx配置文件中有详细的注释。
所以这里就不多讲,可以根据我的进行修改
最后附上自己的配置文件
[root@localhost sbin]# cat ../conf/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 {
#epoll是多路复用IO(I/O Multiplexing)中的一种方式,
#仅用于linux2.6以上内核,可以大大提高nginx的性能
use epoll;
worker_connections 1024; #单个后台worker process进程的最大并发链接数
# 并发总数是 worker_processes 和 worker_connections 的乘积
# 即 max_clients = worker_processes * worker_connections
# 在设置了反向代理的情况下,max_clients = worker_processes * worker_connections / 4 为什么
# 为什么上面反向代理要除以4,应该说是一个经验值
# 根据以上条件,正常情况下的Nginx Server可以应付的最大连接数为:4 * 8000 = 32000
# worker_connections 值的设置跟物理内存大小有关
# 因为并发受IO约束,max_clients的值须小于系统可以打开的最大文件数
# 而系统可以打开的最大文件数和内存大小成正比,一般1GB内存的机器上可以打开的文件数大约是10万左右
# 我们来看看360M内存的VPS可以打开的文件句柄数是多少:
# $ cat /proc/sys/fs/file-max
# 输出 34336
# 32000 < 34336,即并发连接总数小于系统可以打开的文件句柄总数,这样就在操作系统可以承受的范围之内
# 所以,worker_connections 的值需根据 worker_processes 进程数目和系统可以打开的最大文件总数进行适当地进行设置
# 使得并发总数小于操作系统可以打开的最大文件数目
# 其实质也就是根据主机的物理CPU和内存进行配置
# 当然,理论上的并发总数可能会和实际有所偏差,因为主机还有其他的工作进程需要消耗系统资源。
# ulimit -SHn 65535
}
http {
#设定mime类型,类型由mime.type文件定义
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; #sendfile 指令指定 nginx 是否调用 sendfile 函数(zero copy 方式)来输出文件,
#对于普通应用,必须设为 on,
#如果用来进行下载等应用磁盘IO重负载应用,可设置为 off,
#以平衡磁盘与网络I/O处理速度,降低系统的uptime.
#tcp_nopush on;
#keepalive_timeout 0;
keepalive_timeout 65; #连接超时时间
tcp_nodelay on;
gzip on; #开启gzip压缩
gzip_disable "MSIE [1-6].";
client_header_buffer_size 128k; #设定请求缓冲
large_client_header_buffers 4 128k;
proxy_buffering on; #开启代理缓存
proxy_connect_timeout 5; #连接超时时间,超时时间设置不要超过75秒,至于为什么i don't konw
proxy_read_timeout 60; #设置与代理服务器两次读取的间隔时间
proxy_send_timeout 5; #设置后端服务器数据回传时间就是在规定时间之内后端服务器必须传完所有的数据,如果超时nginx会关闭连接
proxy_buffer_size 16k; #设置nginx保存用户头部信息的缓存区大小
proxy_buffers 4 64k; #缓存区大小
proxy_busy_buffers_size 128k; #高负荷下缓冲大小(proxy_buffers*2)
proxy_temp_file_write_size 128k; #设定缓存文件夹大小,大于这个值,将从upstream服务器传
proxy_temp_path /tmp/temp_cache1; #临时缓存目录
proxy_cache_path /tmp/cache1 levels=1:2 keys_zone=cache_one:200m inactive=30d max_size=5g;
#注:proxy_temp_path和proxy_cache_path指定的路径必须在同一分区
#设置Web缓存区名称为cache_one,内存缓存空间大小为200MB,30天没有被访问的内容自动清除,硬盘缓存空间大小为5GB。

#定义反向代理
upstream backend_server {
server 192.168.58.139:80 weight=1 max_fails=2 fail_timeout=30s;
server 192.168.58.140:80 weight=1 max_fails=2 fail_timeout=30s;
}

server {
listen 80;
server_name localhost;

# #charset koi8-r;
# #access_log logs/host.access.log main;

#缓存html页面,可以缓存伪静态
location ~ .*\.html$ {
proxy_pass http://backend_server;
proxy_redirect off;
proxy_set_header Host $host;
proxy_cache cache_one;
proxy_next_upstream http_502 http_504 error timeout invalid_header; #如果后端的服务器返回502、504、执行超时等错误,自动将请求转发到upstream负载均衡池中的另一台服务器,实现故障转移。
proxy_cache_valid 200 302 1d; #状态为200、302的缓存1天
proxy_cache_valid 301 2d; #状态为301的缓存2天
proxy_cache_valid any 1m; #有效缓存大小
expires 1d; #浏览器过期时间设置1天
proxy_cache_key $host$uri$is_args$args; #以域名、URI、参数组合成Web缓存的Key值,Nginx根据Key值哈希,存储缓存内容到二级缓存目录内
proxy_ignore_headers "Cache-Control" "Expires" "Set-Cookie"; #忽略头部禁止缓存申明,类似与CDN的强制缓存功能
add_header Nginx-Cache "$upstream_cache_status"; #在header中插入缓存状态,命中缓存为HIT,没命中则为MISS
}

error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}

#禁止访问 .htxxx 文件
location ~ /\.ht {
deny all;
}

#用于清除缓存,假设一个URL为http://192.168.8.42/test.txt,通过访问http://192.168.8.42/purge/test.txt就可以清除该URL的缓存。
location ~ /purge(/.*) {
#设置只允许指定的IP或IP段才可以清除URL缓存。
allow 127.0.0.1;
allow 192.168.58.0/24;
deny all;
proxy_cache_purge cache_one $host$1$is_args$args;
}

#动态页面直接放过不缓存
location ~ .*\.(php|jsp|cgi)(.*){
proxy_pass http://backend_server;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}

#设置缓存黑名单,不缓存指定页面,比如wp后台或其他需要登录态的页面,用分隔符隔开
#location ~ ^/(wp-admin|system)(.*)$ {
# proxy_pass http://backend_server;
# proxy_set_header Host $host;
# proxy_set_header X-Real-IP $remote_addr;
# proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
#}

#location / {
# proxy_cache cache_one;
# proxy_next_upstream http_502 http_504 error timeout invalid_header; #如果后端的服务器返回502、504、执行超时等错误,自动将请求转发到upstream负载均衡池中的另一台服务器,实现故障转移。
# proxy_cache_valid 200 304 12h; #对不同的HTTP状态码设置不同的缓存时间
# proxy_cache_key $host$uri$is_args$args; #以域名、URI、参数组合成Web缓存的Key值,Nginx根据Key值哈希,存储缓存内容到二级缓存目录内
# proxy_set_header Host $host;
# proxy_set_header X-Forwarded-For $remote_addr;
# proxy_pass http://backend_server;
# expires 1d;
#}

}

}

打完收工....................

0 个评论

要回复文章请先登录注册