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://openresty.org/cn/installation.html)文档安装【tar -xzvf openresty-VERSION.tar.gz
cd openresty-VERSION/
./configure
make
sudo make install
示例中的 VERSION替换成 OpenResty的版本号, 比如 1.11.2.1】后;
openresty中的nginx默认安装路径是【/usr/local/openresty/nginx】;
如需将nginx内容设置为linux托管开机自启,可参考:https://blog.csdn.net/xiaochenXIHUA/article/details/130265983?spm=1001.2014.3001.5501
详细信息
bash
配置nginx具备缓存和代理功能的内容:
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;

    proxy_cache_path /tmp/nginxcache levels=1:2 keys_zone=my_cache:10m max_size=10g inactive=60m use_temp_path=off;

    sendfile        on;
    #tcp_nopush     on;

    #keepalive_timeout  0;
    keepalive_timeout  65;
    #对传输内容进行压缩,节省宽带
    gzip  on;
    gzip_min_length 1;
    gzip_comp_level 2;
    gzip_types text/plain application/javascript text/css application/xml text/javascript application/x-httpd-php image/jpeg image/gif image/png;
  #代理上游的服务器组
    upstream local {
        server 127.0.0.1:8080;
    }

    server {
        listen       8081;
        server_name  localhost;

        #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-Forward-For $proxy_add_x_forwarded_for;

            proxy_cache my_cache;

            proxy_cache_key $host$uri$is_args$args;
            proxy_cache_valid 200 304 302 2d;

            proxy_pass http://local;
            #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://xxx/index.htm;

2、如果1取不到,再从Host头部取;

3、如果2也取不到,从配置里的server_name里取。你应该根据其含义也选择使用:-)

关于我

我的博客主旨:

  • 排版美观,语言精炼;
  • 文档即手册,步骤明细,拒绝埋坑,提供源码;
  • 本人实战文档都是亲测成功的,各位小伙伴在实际操作过程中如有什么疑问,可随时联系本人帮您解决问题,让我们一起进步!

🍀 个人网站

image-20241231070836953

🍀 微信二维码

x2675263825 (舍得), qq:2675263825。

image-20230107215114763

🍀 微信公众号

《云原生架构师实战》

image-20230107215126971

🍀 csdn

https://blog.csdn.net/weixin_39246554?spm=1010.2135.3001.5421

image-20230107215149885

🍀 知乎

https://www.zhihu.com/people/foryouone

image-20230107215203185

最后

如果你还有疑惑,可以去我的网站查看更多内容或者联系我帮忙查看。

如果你有更好的方式,评论区留言告诉我。谢谢!

好了,本次就到这里了,感谢大家阅读,最后祝大家生活快乐,每天都过的有意义哦,我们下期见!

最近更新