搜文章
推荐 原创 视频 Java开发 iOS开发 前端开发 JavaScript开发 Android开发 PHP开发 数据库 开发工具 Python开发 Kotlin开发 Ruby开发 .NET开发 服务器运维 开放平台 架构师 大数据 云计算 人工智能 开发语言 其它开发
Lambda在线 > Linyb极客之路 > nginx常见架构

nginx常见架构

Linyb极客之路 2018-06-28

常见的nginx中间件架构

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

静态资源处理

静态资源访问、压缩

nginx配置

 
   
   
 
  1. server{

  2.    listen 80;

  3.    server_name localhost;

  4.    sendfile on;

  5.    access_log /var/log/nginx/log/static_access.log main;

  6.    #匹配图片

  7.    location ~ .*\.(jpeg|jpg|gif|png)$ {

  8.        #gzip on;

  9.        #gzip_http_version 1.1;

  10.        #gzip_comp_level 2;

  11.        #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;

  12.        root /home/project/nginx-code/images;

  13.    }

  14.    #匹配文本

  15.    location ~ .*\.(txt|xml)$ {

  16.        gzip on;

  17.        gzip_http_version 1.1;

  18.        gzip_comp_level 2;

  19.        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;

  20.        root /home/project/nginx-code/doc;

  21.    }

  22.    #相当于预先压缩文件,这个文件夹下的可以由其他脚本生成压缩文件访问

  23.    location ~ ^/download$ {

  24.        gzip_static on;

  25.        tcp_nopush on;

  26.        root /home/project/nginx-code;

  27.    }

  28. }

linux命令

 
   
   
 
  1. #测试配置文件

  2. nginx -tc /etc/nginx/nginx.conf

  3. #重新加载配置文件

  4. nginx -s reload -c /etc/nginx/nginx.conf

结果 
开启压缩前: 

nginx常见架构

开启压缩后: 

nginx常见架构

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

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

nginx缓存配置

nginx配置

 
   
   
 
  1. server{

  2.        listen 80;

  3.        server_name localhost;

  4.        location ~ .*\.(html|htm)$ {

  5.                #缓存开关

  6.                expires 24h;

  7.                root /home/project/nginx-code;

  8.        }

  9. }

结果 
没加缓存之前的请求: 

nginx常见架构

nginx常见架构

加了缓存第一次请求:

nginx常见架构

nginx常见架构

加了缓存第二次请求: 

结论

  1. 没加缓存前服务端每次都会响应200。

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


跨域配置

 
   
   
 
  1. server{

  2.        listen 80;

  3.        server_name localhost;

  4.        location ~ .*\.(html|htm)$ {

  5.          add_header Access-Control-Allow-Origin *;

  6.          add_header Access-Control-Allow-Methods GET,POST,PUT,DELETE,OPTIONS;

  7.          root /home/project/nginx-code;

  8.        }

  9. }

防盗链

 
   
   
 
  1. location ~ .*\.(jpeg|jpg|gif|png)$ {

  2.        #gzip on;

  3.        #gzip_http_version 1.1;

  4.        #gzip_comp_level 2;

  5.        #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;

  6.        #防盗链配置 valid_referers none blocked 允许ip 可以设置正则表达式;

  7.        valid_referers none blocked 127.0.0.1 ~/google\./w;

  8.        if($invalid_referer) {

  9.            return 403;

  10.        }

  11.        root /home/project/nginx-code/images;

  12.    }


代理服务

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


正向代理

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


反向代理

最简单的配置

 
   
   
 
  1. #定义markdown-server

  2. upstream markdown-server {

  3.    server localhost:8089;

  4. }

  5. server {

  6.    listen 80;

  7.    server_name localhost;

  8.    #80端口全部转发到8089

  9.    location / {

  10.        proxy_pass   http://markdown-server;

  11.    }

  12. }



 
   
   
 
  1. #定义markdown-server

  2. upstream markdown-server {

  3.    server localhost:8089;

  4. }

  5. server {

  6.    listen 80;

  7.    server_name localhost;

  8.    #80端口全部转发到8089

  9.    location / {

  10.        proxy_pass   http://markdown-server;

  11.        proxy_redirect default;

  12.        #可以设置相应的请求头

  13.        proxy_set_header Host $http_host;

  14.        proxy_set_header X-Real-IP $remote_addr;

  15.        #设置链接超时时间

  16.        proxy_connect_timeout 30;

  17.        proxy_send_timeout 60;

  18.        proxy_read_timeout 60;

  19.        #缓存等

  20.        proxy_buffer_size 32k;

  21.        proxy_buffering on;

  22.        proxy_buffers 4 128k;

  23.        proxy_busy_buffers_size 256k;

  24.        proxy_max_temp_file_size 256k;

  25.    }

  26. }


nginx负载均衡

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

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

- upstream配置项

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

配置参考

 
   
   
 
  1. upstream markdown-server {

  2.    #按照url hash,如果是ip_hash直接填上就行了。

  3.    hash $request_uri

  4.    #配置参数直接跟后面

  5.    #如果是加权轮询加上weight

  6.    #server localhost:8081 weight=5;

  7.    server localhost:8082;

  8.    server localhost:8083 backup;

  9.    server localhost:8084 down;

  10. }

  11. server {

  12.    listen 80;

  13.    server_name localhost;

  14.    #80端口全部转发到markdown-server

  15.    location / {

  16.        proxy_pass   http://markdown-server;

  17.    }

  18. }


nginx缓存服务(代理缓存)

     清除指定缓存

    1. 1、rm -rf 缓存目录内容

      2、使用第三方扩展模块ngx_cache_purge

    自定义某些路径不缓存(见下)

    参考配置

 
   
   
 
  1. upstream markdown-server {

  2.    server localhost:8081;

  3.    server localhost:8082;

  4.    server localhost:8083

  5. }

  6. proxy_cache_path /data/nginx/cache levels=1:2 keys_zone=nginx_cache:10m max_size=10g inactive=60m use_temp_path=off;

  7. #当匹配不缓存的url的时候,设置变量nginx_nocache=1

  8. if($request_uri ~ ^/(login|admin|password\/reset)) {

  9.    set $nginx_nocache 1;

  10. }

  11. server {

  12.    listen 80;

  13.    server_name localhost;

  14.    location / {

  15.        #nginx_cache需要和上面设置的keys_zone对应上

  16.        proxy_cache nginx_cache;

  17.        proxy_pass   http://markdown-server;

  18.        #200 304的缓存有效期12h

  19.        proxy_cache_valid 200 304 12h;

  20.        #其他缓存有效期10m

  21.        proxy_cahce_valid any 10m;

  22.        #缓存的维度,可以看成是某个连接缓存的key

  23.        proxy_cache_key $host$uri$is_args$args;

  24.        #自定义头

  25.        add_header Nginx-Cache "$upstream_cache_status";

  26.        #自定义不缓存的url

  27.        proxy_no_cache $nginx_nocache;

  28.        #当服务出现500的时候,自动切换到下一服务

  29.        proxy_next_upstream error timeout invalid_header http_500 http_502 http_503 http_504;

  30.    }

  31. }


版权声明:本站内容全部来自于腾讯微信公众号,属第三方自助推荐收录。《nginx常见架构》的版权归原作者「Linyb极客之路」所有,文章言论观点不代表Lambda在线的观点, Lambda在线不承担任何法律责任。如需删除可联系QQ:516101458

文章来源: 阅读原文

相关阅读

关注Linyb极客之路微信公众号

Linyb极客之路微信公众号:gh_c420b2cf6b47

Linyb极客之路

手机扫描上方二维码即可关注Linyb极客之路微信公众号

Linyb极客之路最新文章

精品公众号随机推荐

下一篇 >>

okhttp 缓存实践