nginx缓存加速应用
# 概述
Nginx的缓存功能:Nginx支持类似于Squid的缓存功能,把URL以及相关信息当成key,使用MD5算法编码Hash后,把数据文件保存在硬盘上。Nginx可以为指定的URL或者状态码设置过期时间,但并不支持类似squid的purge命令来手动清除指定缓存页面。可通过第三方的ngx_cache_purge来清除指定的URL缓存。
Nginx的缓存加速功能是由proxy_cache和fastcgi_cache两个功能模块完成的。
Nginx缓存加速特点:Nginx缓存功能十分稳定,运行速度不逊于squid,对多核CPU的利用率比其他的开源软件要优秀很多,支持高并发请求数,能同时承受更多的访问请求。
# Nginx缓存加速案例
本案例通过Nginx的代理功能实现对后端网站访问的缓存加速,实验环境如下:
nginx:192.168.200.101/24 pcre-develnginxngx_cache_purge(第三方模块)**
web:192.168.200.102/24 httpd
# 1、安装Nginx及第三方插件
[root@nginx ~]# useradd -M -s /sbin/nologinnginx
[root@nginx ~]# yum -y install pcre-devel zlib-devel # nginx rewrite正则表达依赖于pcre库
[root@nginx ~]# wget http://labs.frickle.com/files/ngx_cache_purge-2.1.tar.gz
[root@nginx ~]# tar xf ngx_cache_purge-2.1.tar.gz -C /usr/src/
[root@nginx ~]# tar xf nginx-1.6.2.tar.gz -C /usr/src/
[root@nginx ~]# cd /usr/src/nginx-1.6.2/
[root@nginxnginx-1.6.2]# ./configure --prefix=/usr/local/nginx --user=nginx --group=nginx --with-http_stub_status_module --with-pcre --add-module=/usr/src/ngx_cache_purge-2.1/&&make && make install
[root@nginxnginx-1.6.2]# ln -s /usr/local/nginx/sbin/nginx /usr/local/sbin/
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 2、配置Nginx主配置文件
[root@nginxnginx-1.6.2]# cd /usr/local/nginx/conf/
[root@nginxconf]# cp nginx.conf{,.bak}
[root@nginxconf]# vim nginx.conf
# 以nginx用户和组运行
user nginx nginx;
# 启动进程数,根据物理CPU个数设置
worker_processes 1;
# 定义错误日志
error_log logs/error.log;
# 定义pid文件位置
pid logs/nginx.pid;
# 打开文件的最大句柄数,最好与ulimit -n的值保持一致,使用ulimit -SHn进行设置
worker_rlimit_nofile 65535;
events {
# Nginx 使用了最新的epoll网络I/O模型
use epoll;
# 每个工作进程允许最大的同时连接数
worker_connections10240;
}
http {
# mime.types内定义各文件类型映像
includemime.types;
# 设置默认类型是二进制流,若没有设置,比如加载PHP时,是不预解析,用浏览器访问则出现下载窗口
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"';
# 定义字符集
charset utf-8;
# 打开系统函数sendfile(),支持下载
sendfile on;
# 只有先打开Linux下的tcp_cork,sendfile打开时才有效
tcp_nopush on;
# 会话保持时间,设置的低一些可以让nginx持续工作的时间更长
keepalive_timeout 60;
# 不要缓存数据,而是一段一段的发送——当需要及时发送数据时,就应该设置这个属性,这样发送一小块数据信息时就不能立即得到返回值
tcp_nodelay on;
# 指定连接请求实体的缓存大小
client_body_buffer_size 512k;
# 代理连接超时时间,单位秒
proxy_connect_timeout 5;
# 代理接收超时
proxy_read_timeout 60;
# 代理发送超时
proxy_send_timeout 5;
# 代理缓存文件大小
proxy_buffer_size 16k;
# 代理缓存区的数量及大小,默认一个缓冲区大小与页面大小相等
proxy_buffers 4 64k;
# 高负荷下缓存区大小
proxy_busy_buffers_size 128k;
# 代理临时文件大小
proxy_temp_file_write_size 128k;
# 代理临时文件存放目录
proxy_temp_path /var/cache/nginx/cache_temp;
# 代理缓存存放路径,第一层目录只有一个字符,是由levels=1:2设置,总共二层目录,子目录名字由二个字符组成,键值名称为cache_one(名字随意),在内存中缓存的空间大小为200MB,1天内没有被访问的缓存将自动清除,硬盘缓存空间为30GB
proxy_cache_path /var/cache/nginx/proxy_cache levels=1:2 keys_zone=cache_one:200m inactive=1d max_size=30g;
# 注:proxy_temp_path与proxy_cache_path指定的路径必须在同一分区
# 上游服务器节点,权重1(数字越大权重越大),30秒内访问失败次数大于等于2次,将在30秒内停止访问此节点,30秒后计数器清零,可以重新访问。
upstream backend_server {
server 192.168.200.102:80 weight=1 max_fails=2 fail_timeout=30s;
}
server {
listen 80;
server_name www.crushlinux.com 192.168.200.101;
index index.html index.htm;
# 如果后端服务器返回502、504、错误等错误,自动跳转到upstream负载均衡池中的另一台服务器,实现故障转义
location / {
proxy_next_upstream http_502 http_504 error timeout invalid_header;
proxy_cache cache_one;
# 对不同的HTTP状态码设置不同的缓存时间
proxy_cache_valid 200 304 12h;
# 以域名、URI、参数组合成Web缓存的Key值,nginx根据Key值哈希,存储缓存内容到二级缓存目录内
proxy_cache_key $host$uri$is_args$args;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $remote_addr;
# 指定跳转服务器池,名字要与upstream设定的相同
proxy_pass http://backend_server;
expires 1d;
}
# 用于清除缓存
location ~ /purge(/.\*) {
# 设置允许清除缓存的主机IP或网段
allow 127.0.0.1;
allow 192.168.200.0/24;
deny all;
proxy_cache_purge cache_one $host$1$is_args$args;
}
# 扩展名以php、jsp、cgi结尾的动态应用程序不缓存
location ~ .\*\.(php|jsp|cgi)?$ {
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $remote_addr;
proxy_pass http://backend_server;
}
access_log off;
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
[root@nginxconf]# mkdir /var/cache/nginx
[root@nginxconf]# ulimit -SHn 65535
[root@nginxconf]# nginx -t #此时会自动生成两个缓存目录,属组为nginx
nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok
nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful
[root@nginxconf]# ll /var/cache/nginx/
总用量 8
drwx------ 2 nginx root 4096 6月 2 22:36 cache_temp
drwx------ 2 nginx root 4096 6月 2 22:36 proxy_cache
[root@nginx ~]# nginx
[root@nginx ~]# netstat -anpt |grep 80
tcp 0 0 0.0.0.0:80 0.0.0.0:\* LISTEN 4656/nginx
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# 3、安装Web服务器,建立测试页
[root@web ~]# yum -y install httpd
[root@web ~]# sed -i '276 s/#//' /etc/httpd/conf/httpd.conf
[root@web ~]# sed -n '276p' /etc/httpd/conf/httpd.conf
ServerName[www.example.com:80](http://www.example.com:80)
[root@web ~]# /etc/init.d/httpd start
正在启动httpd: [确定]
[root@web ~]# netstat -anpt |grep 80
tcp 0 0 :::80 :::\* LISTEN 1289/httpd
[root@web ~]# echo "www.crushlinux.com" > /var/www/html/index.html
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# 4、测试Nginx缓存服务器
[root@nginx ~]# ll /var/cache/nginx/proxy_cache/
总用量 0
1
2
3
2
3
浏览器访问:http://192.168.200.101/index.html
[root@nginx ~]#ll /var/cache/nginx/proxy_cache/
total 4
drwx------ 3 nginxnginx 4096 Dec 26 11:58 7
[root@nginx ~]#ll /var/cache/nginx/proxy_cache/7/cb/
total 4
-rw------- 1 nginxnginx 365 Dec 26 11:58 68d565d27704f1d83c1b4bb0d2178cb7
1
2
3
4
5
6
7
2
3
4
5
6
7
# 5、测试删除缓存文件
http://192.168.200.101/purge/index.html
[root@nginx ~]# ls /var/cache/nginx/proxy_cache/7/e0/
total 0
1
2
2
上次更新: 2022/06/12, 15:48:09