Skip to content

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

具备缓存功能的反向代理服务

实战:用Nginx搭建一个具备缓存功能的反向代理服务-2025.1.9

目录

[toc]

环境

这是装在一台linux机器还是两台机器啊 很模糊啊 这一段

作者回复:1台测试机,通过不同的端口开了2个Nginx服务。

1、把之前创建的这个服务作为上游服务器

端口前加上127.0.0.1后,代表只能通过本机的ip来访问这个服务:

image-20250109110127537

停止nginx,再打开nginx:

image-20250109110421973

再次访问,可以看到原来的页面无法访问了:(因为nginx拒绝了浏览器发过去的链接)

image-20250109110513184

2、搭建下nginx的反向代理

之前nginx用的是nginx1.14版本:

而反向代理我们使用openresty:

image-20250109110904537

image-20250109110940834

验证:

image-20250109111010749

image-20250109111037386

关于http_proxy_module:

image-20250109111252484

3、如何配置一个缓存服务器

关于proxy_cache:

image-20250109111431906

image-20250109141407635

这些缓存如何使用呢?

image-20250109141536606

测试下:

把上游站点停掉后,看访问是否能获取到访问结果呢?

image-20250109141707930

可以看到,仍然可以访问这个站点:(是因为反向代理做了缓存了的。)

image-20250109141739460

FAQ

老师没提供源码

难搞哦。。。

老师之前已经安装好了openresty,课堂上没带我们部署;

关于相关的配置文件,老师也没提供;

案例:缓存面向的是全部response

老师您好,缓存功能只能使用于静态资源服务吗?我配置的反向代理到web应用,生成了nginxcache这个目录,但是目录里面没有任何东西。

作者回复:缓存只用于反向代理。必须上游响应符合缓存条件才会存储到该目录。第四部分有3节课会深入这块

nginx的proxy_cache_path缓存后端的资源 这个缓存的是后端的静态资源的吧 如果静态资源都放在了nginx本地或者不是在后端,后端全是动态的逻辑处理 那这个缓存就用不上了了吧???

作者回复:缓存面向的是全部response,nginx不关心上游是动态生成的response还是磁盘上读取的静态资源。所以缓存的应用范围很广的,当上游宕机时也可以仍然使用stale缓存的。第4部分的课程有详细介绍。

老师 proxy cache 缓存 对于动态页面php 如果后台页面更新 而缓存没更新 会不会造成客户端访问出现问题? 是需要手动清理缓存还是重新设置超时时间?

作者回复:动态页面自身会考虑下游有nginx、squid这样的缓存服务,所以它在response header里,会注明本页面是否需要缓存,缓存多长时间。例如Set-Cookie这样的response默认是不缓存的。第4部分对proxy cache有3节课都在讲用法。

案例:有什么方法可以获取到客户端请求的真实IP吗

老师你好,我们使用stream对tcp请求做代理,但是有个问题就是应用端拿不到客户端的真实IP,获取出来的IP是代理服务器的IP,请问有什么方法可以获取到客户端请求的真实IP吗?

作者回复:两个方案,

1、使用proxy_protocol协议,nginx作为客户端或者服务器时都支持该协议。第113课有详细介绍。

2、使用IP透传DSR方案,需要修改上游服务的路由表,这节课在第4部分最后一节课,大概春节前会上线,你可以关注下。

案例:Openresty

我找不到Openresty配置目录,不仅要安装nginx还要安装Openresty是吗

作者回复:openresty里含有nginx,你安装好openresty后,如果你没有改prefix,那么nginx.conf就会在/usr/local/openresty/nginx/conf目录下。

老师 没有看到启动openresty呢

作者回复:Openresty启动后进程名还是Nginx,它只是把Lua代码以Nginx模块的方式嵌入到Nginx进程中了

Openresty也是Nginx,只不过它增加了几个Nginx模块,特别是http模块。所以,包括配置文件、端口都是一样的;

陶辉老师你好,生产环境如何判断是该使用nginx呢?还是openresty呢?

作者回复:如果不需要使用openresty提供的独有功能,那么尽量使用更稳定更轻量的nginx。


bash
参考Openresty官网(https:cdopenresty-VERSION/./configuremakesudomakeinstall示例中的VERSION替换成OpenResty的版本号,比如1.11.2.1】后;openresty中的nginx默认安装路径是【/usr/local/openresty/nginx】;如需将nginx内容设置为linux托管开机自启,可参考:https:http{includemime.types;default_typeapplication/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;proxy_cache_path/tmp/nginxcachelevels=1:2keys_zone=my_cache:10mmax_size=10ginactive=60muse_temp_path=off;sendfileon;#tcp_nopush on;#keepalive_timeout 0;keepalive_timeout65;#对传输内容进行压缩,节省宽带gzipon;gzip_min_length1;gzip_comp_level2;gzip_typestext/plainapplication/javascripttext/cssapplication/xmltext/javascriptapplication/x-httpd-phpimage/jpegimage/gifimage/png;#代理上游的服务器组upstreamlocal{server127.0.0.1:8080;}server{listen8081;server_namelocalhost;#charset koi8-r;#access_log logs/host.access.log main;#代理配置location/{proxy_set_headerHost$host;proxy_set_headerX-Real-IP$remote_addr;proxy_set_headerX-Forward-For$proxy_add_x_forwarded_for;proxy_cachemy_cache;proxy_cache_key$host$uri$is_args$args;proxy_cache_valid2003043022d;proxy_passhttp:#root html;#index index.html index.htm;}}

案例:server块里面配置一次,每个location会自动继承的

image-20250109171112182

作者回复:server块里面配置一次,每个location会自动继承的

案例:Nginx自定义的http头部优先级最高

老师您好, 请问nginx的cache机制和http的Cache-Control头部在使用上是否有优先顺序,或是冲突的地方? 谢谢老师的解答^^

作者回复:有的,比如Nginx自定义的http头部优先级最高,其次是cache control,再次是cache valid指令,等等。

案例:$host和$http_host有啥区别

老师我用反向代理一些有跳转的页面的时候会出现CSS样式加载不出来 然后我使用'$http_host就可以加载出来,想问一下$host和$http_host有啥区别上网找资料没看明白

作者回复:

这两个变量的生成方式不同:

http_host只会从请求头部中的Host:xxx中取值,

而host有三种取值方式:

1、先从请求行中取,比如http:

版权:此文章版权归 One 所有,如有转载,请注明出处!

链接:可点击右上角分享此页面复制文章链接

上次更新时间:

最近更新