linux Nginx优化缓存镜像集群

一. Nginx的优化

1. 工作进程优化

# Nginx是主进程+⼯作进程模型(保证每个CPU内核一个进程)
worker_processes 4; ⼯作进程数量 按CPU的总核⼼调整
worker_cpu_affinity 0001 0010 0100 1000; CPU的亲和⼒
worker_connections 1024; ⼀个⼯作进程的并发数

cat /proc/cpuinfo | grep "flags" | wc -l    #查看CPU的内核数量
ps -eo psr,pid,args | grep "nginx"    #查看Nginx进程是否均匀分布在内核上

2. 长连接优化

# http协议属于TCP协议
# 优化⽬标:减少三次握⼿和四次断开的次数
keepalive_timeout 5; ⻓连接时间
keepalive_requests 8192; 每个⻓连接接受最⼤请求数

3. 数据压缩优化

gzip on;      (启⽤ gzip 压缩功能)                                                                         
gzip_proxied any; (nginx 做前端代理时启⽤该选项,表示⽆论后端服务器的headers头返回什么信息,都⽆条件启⽤压缩)                              
gzip_min_length 1024; (最⼩压缩的⻚⾯,如果⻚⾯过于⼩,可能会越压越⼤,这⾥规定⼤于1K的⻚⾯才启⽤压缩)                                     
gzip_buffers     4 8k; (设置系统获取⼏个单位的缓存⽤于存储gzip的压缩结果数据流 按照原始数据⼤⼩以8K为单位申请4倍内存空间)                        
gzip_comp_level 3; (压缩级别,1压缩⽐最⼩处理速度最快,9压缩⽐最⼤但处理最慢,同时也最消耗CPU,⼀般设置为3就可以了)                              
gzip_types       text/plain text/css application/x-javascript application/javascript application/xml;

4. 客户端缓存优化

语法: expires [time|epoch|max|off]
默认值: expires off
作⽤域: http, server, location
location ~.*\.(js|css)?$
   {
  expires 1h;
 }            

二. Nginx缓存和镜像服务器

1. 缓存和镜像包部署

#Nginx包获得(http://nginx.org)
#缓存模块包下载(http://labs.frickle.com/files/)

[root@web01 ~]# cd /usr/local/src/
[root@web01 ~]# wget http://nginx.org/download/nginx-1.15.8.tar.gz	#nginx 源码包
[root@web01 ~]# wget http://labs.frickle.com/files/ngx_cache_purge-2.3.tar.gz	#nginx 缓存模块
[root@web01 ~]# useradd -r www -s /sbin/nologin	#新建 nginx 管理账号
[root@web01 ~]# tar -zxvf nginx-1.15.8.tar.gz	#nginx 安装---解压源码包
[root@web01 ~]# tar -zxvf ngx_cache_purge-2.3.tar.gz	#nginx 安装---解压源码包
[root@web01 ~]# yum -y install pcre-* openssl-*	#nginx 安装---安装依赖
            
[root@web01 ~]#	cd nginx-1.15.8
[root@web01 nginx-1.15.8]# ./configure --prefix=/usr/local/nginx --user=www --group=www --add-module=../ngx_cache_purge-2.3 --with-http_stub_status_module	#nginx 安装---配置 nginx
[root@web01 nginx-1.15.8]# make -j4	#nginx 安装---编译
[root@web01 nginx-1.15.8]# make install	#nginx 安装---安装

2. nginx缓存服务配置

#实现方式:nginx 反向代理+缓存机制
#数据存储:key=value⽅式
[root@web01 ~]# mkdir -p /cache/proxy_temp_dir	#新建缓存目录
[root@web01 ~]# chown -R www:www /cache	#设置缓存目录的属主和属组
#如下为编辑nginx配置文件的关键操作
user www;	#修改运行nginx的用户

#http配置
proxy_temp_path /cache/proxy_temp_dir;	#设置缓存临时路径
proxy_cache_path /cache/proxy_dir levels=1:2 keys_zone=cache0:10m inactive=1d max_size=30g;	#缓存路径及配置
	#levels=1:2 缓存目录分为两级,第一级文件夹命名用一个字母,第二级文件夹用两个字母命名,最多三级。
	#keys_zone=cache0:10m 内存缓存区域 10M	名字为 cache0。在共享内存中设置一块存储区域来存放缓存的 key 和 metadata,这样 nginx 可以快速判断一个request 是否命中或者未命中缓存,1m 可以存储 8000 个 key,10m 可以存储80000 个 key
	#inactive=1d 有效期为 1 天,如果缓存内容在一天中没人访问则被删除
	#max_size=30g 硬盘空间中的 30G 做磁盘缓存,如果不指定,会使用掉所有disk	space,当达到配额后,会删除最少使用的 cache 文件
     
#server配置     
location / {    #缓存配置								
	proxy_pass http://www.test.com;;
	proxy_cache cache0;
	proxy_cache_valid 200 304 30m;
	proxy_cache_valid any 1m;
	proxy_cache_key $host$uri$is_args$args;
	proxy_set_header Host $host;
	proxy_set_header X-Forwarded-For $remote_addr;
	expires 60m;    #开启客户端浏览器缓存
	}

location ~/purge(/.*) {    #清空 URL配置
	allow 127.0.0.1;
	allow 192.168.31.0/24;
	proxy_cache_purge cache0 $host$1$is_args$args;
	}

3. 镜像服务器配置

#对于大文件的缓存则需要使用镜像服务器
#server配置
location / {
    root html;
    autoindex on;    #文件以目录的方式列出
    #index index.html index.php;
    proxy_store on;    #开启镜像服务
    proxy_store_access user:rw group:rw all:r;	#缓存本地存储文件的权限
    proxy_temp_path /usr/local/nginx/html/temp;	#本地临时缓存目录		 
    if ( !-e $request_filename ) {    #判断本地目录中是否有文件,没有就去取源	
        proxy_pass http://www.runoob.com;
	}
}

三. Nginx 集群实现

1. Nginx集群理论知识

# Nginx作为分发器,负载均衡的功能模块分为7层和4层:
1. ngx_http_upstream_module 基于应用层分发模块(常用)
    1) 轮询(默认) 每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器down掉,能自动剔除。
    2) weight 指定轮询几率,weight和访问比率成正比,用于后端服务器性能不均的情况。
    3) ip_hash 每个请求按访问ip的hash结果分配,这样每个访客固定访问一个后端服务 ,可以解决session的问题。 
    4) fair(第三方)按后端服务器的响应时间来分配请求,响应时间短的优先分配。
    5) url_hash(第三方) 按访问url的hash结果来分配请求,使每个url定向到同一个后端服务 ,后端服务器为缓存时比较有效。
2. ngx_stream_core_module 基于传输层分发模块 (1.9开始提供)

# Nginx业务服务器地址后可跟的状态:
1. down 表示当前server不参与负载。
2. weight 默认为1,weight值越大 ,负载的权重就越高。
3. max_fails :允许请求失败的次数,默认为1.当超过最大次数时,返回proxy_next_upstream模块定义的错误。
4. fail_timeout: 失败超时时间,默认为10s。在连接Server时,如果在超时时间之内超过max_fails指定的失败次数,会认为在fail_timeout时间内Server不可用。 
5. backup: 其它所有的非backup机器down或者忙的时候,才会请求backup机器。

2. Nginx集群相关功能配置举例

# 轮询分发配置举例
upstream web {
    server 192.168.31.16; 
    server 192.168.31.17;
}
server {
    listen 80;
    server_name localhost; 
    location / {
        proxy_pass http://web;
    } 
}
# 基于权重分发配置举例
upstream web {
    server 192.168.31.16 weight=1; 
    server 192.168.31.17 weight=2;
    }
server {
    listen 80;
    server_name localhost; 
    location / {
        proxy_pass http://web;
    } 
}
# 基于ip hash算法的分发配置举例
# ip_hash算法能够保证来 同样源地址的请求,都分发到同 台主机
upstream web { 
    ip_hash;
    server 192.168.31.16;
    server 192.168.31.17; 
    }
server { 
    listen 80;
    server_name localhost; 
    location / {
    proxy_pass http://web;
    } 
}
# 基于不同域名或主机的分发配置举例
http {
    upstream web1 {
        server 192.168.31.16;
        }
    upstream web2 {
        server 192.168.31.17;
        }
    server { 
        listen 80;
        server_name www.web1.com; 
        location / {
        proxy_pass http://web1; 
        }
    }
    server {
        listen 80;
        server_name www.web2.com; 
        location / {
            proxy_pass http://web2; 
            }
    }
}
# 基于开发语言的分发配置举例
http {
    upstream php {
        server 192.168.31.16; 
        }
    upstream html {
        server 192.168.31.17;
        }
server {
    location ~* \.php$ {
        proxy_pass http://php;
        } 
    location ~* \.html$ { 
        proxy_pass http://html;
        }
    }
}
#基于浏览器的分发配置举例
upstream elinks { 
    server 192.168.31.16; 
    } 
upstream chrome { 
    server 192.168.31.17; 
    } 
upstream any { 
    server 192.168.31.18; 
    }
server {
    listen 80;
    server_name www.web1.com;
    location / {
        proxy_pass http://any;
        if ( $http_user_agent ~* Elinks ) { 
            proxy_pass http://elinks;
            }
        if ( $http_user_agent ~* chrome ) { 
            proxy_pass http://chrome;
            } 
        }
}
# 基于源IP的分发配置举例
upstream bj.server { 
    server 192.168.31.16;
    }
upstream sh.server {
    server 192.168.31.17; 
    }
upstream default.server { 
    server 192.168.31.18;
    }
geo $geo {
    default default; 
    192.168.31.61/32 bj; 
    192.168.31.62/32 sh;
    }
location / {
    proxy_pass http://$geo.server$request_uri;
    }
posted @ 2020-04-05 20:51  IamJet  阅读(361)  评论(0编辑  收藏  举报