nginx常见架构

常见的nginx中间件架构

1、静态资源web服务(文件读取sendfile、tcpnopush、tcpnodelay、压缩,预读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. 加了缓存 2.1 如果cache-control生效,那么浏览器在这段时间内都不会向服务器请求,直接返回数据。 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 hash

hash关键数值

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

原文发布于微信公众号 - Linyb极客之路(gh_c420b2cf6b47)

原文发表时间:2018-06-24

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏linux运维学习

linux学习第五十二篇: exportfs命令,NFS客户端问题,FTP介绍,使用vsftpd搭建ftp服务

exportfs命令 常用选项 -a 全部挂载或者全部卸载 -r 重新挂载 -u 卸载某一个目录 -v 显示共享目录 以下操作在服务端上 vim /et...

2048
来自专栏pangguoming

两台centos之间传送文件

最近在CentOS系统中(主机A)读数据。由于A主机只是作为数据读取,具体的Deep Learning 实验,需要在主机B( CentOS )中进行,需要将主机...

1393
来自专栏Android相关

Linux编程--文件原子操作

当多个进程同时访问一个文件的时候,普通的write/read在执行的时候,无法保证操作的原子性,可能会导致文件被污染,达不到预期的结果。

1873
来自专栏散尽浮华

通过Nethogs查看服务器网卡流量情况

在日常运维工作中,会碰到服务器带宽飙升致使网站异常情况。作为运维人员,我们要能非常清楚地了解到服务器网卡的流量情况,观察到网卡的流量是由哪些程序在占用着。 今天...

39710
来自专栏我是攻城师

小知识之Linux系统中的最大进程数,最大文件描述,最大线程数

3994
来自专栏Linux运维学习之路

day8、 显示Linux路由表、各列信息

要用到的命令是 route  route 命令    显示和设置Linux路由表 -A:设置地址类型; -C:打印将Linux核心的路由缓存; -v:详细信息模...

2099
来自专栏磨磨谈

CentOS GRUB损坏修复方法

博客很久没有更新了,一个原因就是原来存放部署博客的环境坏了,硬盘使用的是SSD,只要读取到某个文件,整个磁盘就直接识别不到了,还好博客环境之前有做备份,最近一直...

1053
来自专栏博客园

Nginx各种配置

   nginx压缩技术为gzip,这种压缩技术可以使得网页大小压缩成原来的30%

2423
来自专栏奔跑的蛙牛技术博客

Java虚拟机加载类文件大全-精细版

类加载器存在父子关系 例如系统类加载器要加载java.util.ArrayList,首先要求扩展类进行加载,然后扩展类加载器要求引导类加载器进行加载。

721
来自专栏北京马哥教育

基础拾遗--【转】df与du不一致情况分析

df 显示的已使用磁盘占用率比du 统计出来的结果要大很多。原因,主要是由于两者计算结果的方式不同。 一、实验情况 1、创建并删除文件 创建文件前的磁盘容量情况...

2237

扫码关注云+社区