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