nginx的proxy代理缓存
nginx本身就有缓存功能,能够缓存静态对象,比如图片、CSS、JS等内容直接缓存到本地,下次访问相同对象时,直接从缓存即可,无需访问后端静态服务器以及存储存储服务器,当然现在企业中大多数也是以redis作为缓存来使用,所以这里简单记录一下
现在准备一台web服务器,一台nginx代理服务器,现在我们先配制好代理服务器
http {
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 /var/log/nginx/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;
tcp_nodelay on;
keepalive_timeout 65;
types_hash_max_size 2048;
include /etc/nginx/mime.types;
default_type application/octet-stream;
include /etc/nginx/conf.d/*.conf;
server {
listen 80 default_server;
listen [::]:80 default_server;
server_name _;
root /usr/share/nginx/html;
# Load configuration files for the default server block.
include /etc/nginx/default.d/*.conf;
location / {
proxy_cache my_cache;
proxy_cache_key $host$uri$is_args$args;
proxy_cache_valid 200 304 302 1d;
proxy_pass http://192.168.50.132;
}
error_page 404 /404.html;
location = /40x.html {
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
}
}
}
在http段里面配置好缓存的一些配置,比如配置存储位置,缓存文件大小等等。然后在location规则配置关于proxy_cache的相关配置。保存好,并reload一下。
把web服务器也配置好,现在我们可以访问一下代理服务器
第一次访问之后会把这些内容缓存起来,然后现在我们把web服务器关闭掉,再次访问网页,会发现依然可以访问。因为现在访问是从缓存里面拿取得数据。这就是缓存的作用。
一些问题总结:
1、使用tcp做代理,有什么方法获取真实客户端的ip地址?
使用stream对tcp请求做代理,但是有个问题就是应用端拿不到客户端的真实IP,获取出来的IP是代理服务器的IP,请问有什么方法可以获取到客户端请求的真实IP吗?
两个方案
1、使用proxy_protocol协议,nginx作为客户端或者服务器时都支持该协议。第113课有详细介绍。
2、使用IP透传DSR方案,需要修改上游服务的路由表,这节课在第4部分最后一节课,大概春节前会上线,你可以关注下。
2、在做反向代理的时候,如果想启用gzip压缩,是应该在反向代理上做,还是web服务器上的nginx上配置?
环境如果是nginx->nginx,前者是负载均衡的作用,后者是静态资源的作用的话,如果是这样,建议后者。
3、生产环境如何判断是该使用nginx呢?还是openresty呢?
如果不需要使用openresty提供的独有功能,那么尽量使用更稳定更轻量的nginx
4、请问nginx的cache机制和http的Cache-Control头部在使用上是否有优先顺序,或是冲突的地方?
有的,比如Nginx自定义的http头部优先级最高,其次是cache control,再次是cache valid指令,等等
5、如果后端开启了gzip,同时后端的静态资源更新了,然后缓存还未失效,该如何处理呢?
你是说上游资源更新了,但Nginx上缓存还未过期,该怎么办吗?
如果缓存时间没到,那么客户端一定拿到过期缓存。如何设置缓存的定时更新倒是有很多办法,你可以参考第四部分课程。但如果定时设得过长,一定会导致用户使用到过期缓存,与gzip无关。
6、我这边架构是nginx反向代理+nginx webserver+应用server 。1.webserver和应用server需要物理拆分吗?如果是物理拆分,只要在web server里指定fast_cgi ip(应用server):port 就可以把请求传给应用server吗?2.能否讲一下lnmp 架构拆分场景?3.nginx作为代理层和nginx web 层,他们的配置应该不一样吧?是否能够讲解一下具体配置?
如果没有scalability需求,尽量不要拆分,每多一个环节,性能就会由于网络栈导致下降