用Nginx搭建一个具备缓存功能的反向代理服务
具备缓存功能的反向代理服务
实战:用Nginx搭建一个具备缓存功能的反向代理服务-2025.1.9
目录
[toc]
环境
这是装在一台linux机器还是两台机器啊 很模糊啊 这一段
作者回复: 1台测试机,通过不同的端口开了2个Nginx服务。
1、把之前创建的这个服务作为上游服务器
端口前加上127.0.0.1后,代表只能通过本机的ip来访问这个服务:
停止nginx,再打开nginx:
再次访问,可以看到原来的页面无法访问了:(因为nginx拒绝了浏览器发过去的链接)
2、搭建下nginx的反向代理
之前nginx用的是nginx1.14版本:
而反向代理我们使用openresty:
验证:
关于http_proxy_module:
3、如何配置一个缓存服务器
关于proxy_cache:
这些缓存如何使用呢?
测试下:
把上游站点停掉后,看访问是否能获取到访问结果呢?
可以看到,仍然可以访问这个站点:(是因为反向代理做了缓存了的。)
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。
参考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
详细信息
配置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会自动继承的
作者回复: 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里取。你应该根据其含义也选择使用:-)
关于我
我的博客主旨:
- 排版美观,语言精炼;
- 文档即手册,步骤明细,拒绝埋坑,提供源码;
- 本人实战文档都是亲测成功的,各位小伙伴在实际操作过程中如有什么疑问,可随时联系本人帮您解决问题,让我们一起进步!
🍀 个人网站
🍀 微信二维码
x2675263825 (舍得), qq:2675263825。
🍀 微信公众号
《云原生架构师实战》
🍀 csdn
https://blog.csdn.net/weixin_39246554?spm=1010.2135.3001.5421
🍀 知乎
https://www.zhihu.com/people/foryouone
最后
如果你还有疑惑,可以去我的网站查看更多内容或者联系我帮忙查看。
如果你有更好的方式,评论区留言告诉我。谢谢!
好了,本次就到这里了,感谢大家阅读,最后祝大家生活快乐,每天都过的有意义哦,我们下期见!