用Nginx搭建具备缓存功能的反向代理服务

什么是反向代理

我们平时说的代理就是正向代理,隐藏的是客户端,服务端不知道真实的客户端是谁,客户端请求的服务都通过代理服务器来代替,然后由代理服务器把请求返回的相应结构再返回给真正的客户端。那么反向代理隐藏的是真实的服务端,客户端发出的请求,并不知道是哪台服务器在提供服务。

可以去知乎上看这个问题,解释的十分清楚: https://www.zhihu.com/question/24723688

配置上游服务

继续使用上一篇Nginx搭建静态资源Web服务器与GoAccess日志可视化中的资源和配置,将这个nginx作为上游服务器,需要在nginx.conf中做一下修改,将listen处修改为127.0.0.1:8080,注释掉server_name,表示只能本机访问8080端口。

1
2
3
4
5
6
7
server {
listen 127.0.0.1:8080;
#server_name localhost;

#charset koi8-r;

access_log logs/host.access.log main;

重启nginx:

1
2
$ nginx -s stop
$ nginx

我是使用虚拟机搭建的环境,这个时候只能在虚拟机内部访问8080端口了。

反向代理服务器

反向代理同样也是在一个虚拟机中,使用openresty采用不同的端口来搭建,关于openresty的安装我之前记录在从Hello World初识OpenResty

在openresty的nginx配置目录中做一些修改,增加upstream等信息:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
upstream local {
server 127.0.0.1:8080;
}

server {
listen 8000;
server_name 192.168.199.107;

#charset koi8-r;

access_log logs/host.access.log main;

location / {
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

proxy_pass http://local;
}

通过设置proxy_set_header的相关参数,可以将相关信息传递到上游服务器,在上游服务器和代理服务器中的host.access.log文件都可以看到。

关于proxy_set_header的解释可以在官方文档中找到:
http://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_set_header

配置完毕后重启一下:

1
$ openresty -p `pwd` -c conf/nginx.conf -s reload

此时可以成功访问192.168.199.107:8000端口,在控制台中也可以看到提供服务的是openresty。

配置缓存

在配置文件中增加proxy_cache_pathproxy_cache参数:

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
proxy_cache_path /tmp/nginxcache levels=1:2 keys_zone=my_cache:10m max_size=10g inactive=60m use_temp_path=off;

upstream local {
server 127.0.0.1:8080;
}

server {
listen 8000;
server_name 192.168.199.107;

#charset koi8-r;

access_log logs/host.access.log main;

location / {
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

proxy_cache my_cache;
proxy_cache_key $host$uri$is_args$args;
proxy_cache_valid 200 302 304 1d;

proxy_pass http://local;
}

proxy_cache_path的参数解释:
1)用户缓存的本地磁盘目录是/tmp/nginxcache;
2)levels在/tmp/nginxcache设置了一个两级层次结构的目录,如果levels参数没有配置,则nginx会将所有的文件放到同一个目录中;
3)keys_zone设置一个共享内存区,该内存区用于存储缓存键和元数据;
4)max_size设置了缓存的上限;
5)inactive指定了项目在不被访问的情况下能够在内存中保持的时间。像上面的配置,如果一个文件在60分钟之内没有被请求,则缓存管理将会自动将其在内存中删除,不管该文件是否过期;
6)use_temp_path=off命令会将缓存文件直接写入指定的cache文件中,而不是使用temp_path存储。

具体的参数解释在官方文档:
http://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_cache_path

http://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_cache

http://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_cache_key

http://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_cache_valid

重启openresty并且关闭上游nginx,现在只有openresty的nginx在运行:

1
2
3
4
5
6
7
8
$ ps -ef | grep nginx
root 7484 1 0 15:29 ? 00:00:00 nginx: master process /usr/local/openresty/nginx/sbin/nginx -g daemon on; master_process on;
nobody 10856 7484 0 16:36 ? 00:00:00 nginx: worker process
nobody 10857 7484 0 16:36 ? 00:00:00 nginx: worker process
nobody 10858 7484 0 16:36 ? 00:00:00 nginx: worker process
nobody 10859 7484 0 16:36 ? 00:00:00 nginx: worker process
nobody 10860 7484 0 16:36 ? 00:00:00 nginx: cache manager process
root 11094 2622 0 16:41 pts/0 00:00:00 grep --color=auto nginx

这个时候我们仍然可以成功访问8000端口看到dlib的文档,此时的状态码是304:

那么搭建具备缓存功能的反向代理服务的学习到这就先结束啦。

0%