技术面试官总结Nginx常见架构,原来你经常忽略这些问题

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/Java__xiaoze/article/details/100015686

常见的nginx中间件架构

1、静态资源web服务(文件读取sendfile、tcp_nopush、tcp_nodelay、压缩,预读gzip模块) 2、代理服务 3、负载均衡调度器SLB 4、动态缓存(添加cache-control、expires头) 

静态资源处理

静态资源访问、压缩

  • nginx配置
server{ listen 80; server_name localhost; sendfile on; access_log /var/log/nginx/log/static_access.log main; #匹配图片 location ~ .*\.(jpeg|jpg|gif|png)$ { #gzip on; #gzip_http_version 1.1; #gzip_comp_level 2; #gzip_types text/plain application/javascript application/x-javascript text/css application/xml text/javascript application/x-httpd-php image/jpeg image/gif image/png; root /home/project/nginx-code/images; } #匹配文本 location ~ .*\.(txt|xml)$ { gzip on; gzip_http_version 1.1; gzip_comp_level 2; gzip_types text/plain application/javascript application/x-javascript text/css application/xml text/javascript application/x-httpd-php image/jpeg image/gif image/png; root /home/project/nginx-code/doc; } #相当于预先压缩文件,这个文件夹下的可以由其他脚本生成压缩文件访问 location ~ ^/download$ { gzip_static on; tcp_nopush on; root /home/project/nginx-code; } } 
  • linux命令
#测试配置文件 nginx -tc /etc/nginx/nginx.conf #重新加载配置文件 nginx -s reload -c /etc/nginx/nginx.conf 
  • 结果

开启压缩前:

开启压缩后:

其实gzip对于图片的压缩效率可能没那么高,大家可以试下对文件的压缩,会更高一些

  • 总结

开启压缩主要是为了减少网络传输消耗,浏览器会对压缩的文件进行解压缩,这个过程要快很多。

nginx缓存配置

  • nginx配置
server{ listen 80; server_name localhost; location ~ .*\.(html|htm)$ { #缓存开关 expires 24h; root /home/project/nginx-code; } } 
  • 结果

没加缓存之前的请求:

加了缓存第一次请求:

加了缓存第二次请求:

结论

  1. 没加缓存前服务端每次都会响应200。
  2. 加了缓存
  3. 2.1 如果cache-control生效,那么浏览器在这段时间内都不会向服务器请求,直接返回数据。
  4. 2.2 如果cache-control不生效,即客户端强制和服务端确定是否过期校验(比如chrome设置max-age=0),确认成功后,服务端返回304,客户端再读取缓存。

跨域配置

server{ listen 80; server_name localhost; location ~ .*\.(html|htm)$ { add_header Access-Control-Allow-Origin *; add_header Access-Control-Allow-Methods GET,POST,PUT,DELETE,OPTIONS; root /home/project/nginx-code; } } 

防盗链

location ~ .*\.(jpeg|jpg|gif|png)$ {  #gzip on;  #gzip_http_version 1.1;  #gzip_comp_level 2;  #gzip_types text/plain application/javascript application/x-javascript text/css application/xml text/javascript application/x-httpd-php image/jpeg image/gif image/png;  #防盗链配置 valid_referers none blocked 允许ip 可以设置正则表达式; valid_referers none blocked 127.0.0.1 ~/google\./w;  if($invalid_referer) { return 403; } root /home/project/nginx-code/images; } 

代理服务

正向代理(为客户端服务)、反向代理(为服务端服务)

正向代理

正向代理的做法和反向代理基本差不多,下面统一起讲,只是把nginx安装在客户端,浏览器设置代理,可用于翻墙用,当然翻墙可以用方便一点的类似shadowsocks。

反向代理

最简单的配置

#定义markdown-server upstream markdown-server { server localhost:8089; } server { listen 80; server_name localhost; #80端口全部转发到8089 location / { proxy_pass http://markdown-server; } } #定义markdown-server upstream markdown-server { server localhost:8089; } server { listen 80; server_name localhost; #80端口全部转发到8089 location / { proxy_pass http://markdown-server; proxy_redirect default; #可以设置相应的请求头 proxy_set_header Host $http_host; proxy_set_header X-Real-IP $remote_addr; #设置链接超时时间 proxy_connect_timeout 30; proxy_send_timeout 60; proxy_read_timeout 60; #缓存等 proxy_buffer_size 32k; proxy_buffering on; proxy_buffers 4 128k; proxy_busy_buffers_size 256k; proxy_max_temp_file_size 256k; } } 

nginx负载均衡

nginx作为负载均衡的场景下主要涉及到2点:第一点是如何选择配置nginx相关的负载均衡算法,第二点是nginx负载均衡时的参数配置。

- nginx负载均衡算法

配置说明轮询默认按照时间顺序分配加权轮询weight越大,访问到的几率越高ip_hash按照ip hash结果分配,注意ip是可能变化的least_conn最少连接数url_hash按照url hashhash关键数值hash自定义key

- upstream配置项

配置说明down当前的server暂时不参与负载均衡backup预留的备份服务器max_fails允许请求失败的次数fail_timeout经过max_fails次失败后,服务暂停的时间max_conns限制最大的接收的连接数

  • 配置参考
upstream markdown-server { #按照url hash,如果是ip_hash直接填上就行了。 hash $request_uri; #配置参数直接跟后面 #如果是加权轮询加上weight。 #server localhost:8081 weight=5; server localhost:8082; server localhost:8083 backup; server localhost:8084 down; } server { listen 80; server_name localhost; #80端口全部转发到markdown-server location / { proxy_pass http://markdown-server; } } 

nginx缓存服务(代理缓存)

  • 清除指定缓存
  1. rm -rf 缓存目录内容
  2. 使用第三方扩展模块ngx_cache_purge
  • 自定义某些路径不缓存(见下)

参考配置

upstream markdown-server { server localhost:8081; server localhost:8082; server localhost:8083; } #说明:缓存地址/data/nginx/cache,目录2层,创建nginx_cache缓存最大10m,所有缓存最大10g,不活跃的缓存60m删除,不使用临时文件路径 proxy_cache_path /data/nginx/cache levels=1:2 keys_zone=nginx_cache:10m max_size=10g inactive=60m use_temp_path=off; #当匹配不缓存的url的时候,设置变量nginx_nocache=1 if($request_uri ~ ^/(login|admin|password\/reset)) { set $nginx_nocache 1; } server { listen 80; server_name localhost; location / { #nginx_cache需要和上面设置的keys_zone对应上 proxy_cache nginx_cache; proxy_pass http://markdown-server; #200 和304的缓存有效期12h proxy_cache_valid 200 304 12h; #其他缓存有效期10m proxy_cahce_valid any 10m; #缓存的维度,可以看成是某个连接缓存的key proxy_cache_key $host$uri$is_args$args; #自定义头 add_header Nginx-Cache "$upstream_cache_status"; #自定义不缓存的url proxy_no_cache $nginx_nocache; #当服务出现500的时候,自动切换到下一服务 proxy_next_upstream error timeout invalid_header http_500 http_502 http_503 http_504; } }

猜你喜欢

转载自blog.csdn.net/Java__xiaoze/article/details/100015686