nginx负载均衡

负载均衡配置

1、负载均衡配置
1、upstream 负载均衡模块说明
upstream是Nginx的HTTP Upstream模块,这个模块通过一个简单的调度算法来实现客户端IP到后端服务器的负载均衡。在下面示例的设定中,通过upstream指令指定了一个负载均衡器的名称a.com。这个名称可以任意指定,在后面需要用到的地方直接调用即可。
案例:
下面设定负载均衡的服务器列表。 pools名字可以自己任意指定
upstream pools{
ip_hash;
server 192.168.10.13:80;
server 192.168.10.14:80 down;
server 192.168.10.15:8009 max_fails=3 fail_timeout=20s;
server 192.168.10.16:8080;
}
server {
server_name www.lala.com;
location / {
proxy_pass http://pools;
proxy_set_header Host $host; #把主机header头发送给轮询的主机
proxy_set_header X-Forwarded-For $remote_addr; #获取真实的ip
}
}
upstream是定义在server{ }之外的,不能定义在server{ }内部。定义好upstream之后,用proxy_pass引用一下即可。
2、upstream 支持的负载均衡算法
负载均衡算法
1、轮询(默认)
每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器down掉,能自动剔除。

    2、weight
        指定轮询几率,weight和访问比率成正比,用于后端服务器性能不均的情况。
        例如:
        upstream bakend {
            server 192.168.159.10 weight=10;
            server 192.168.159.11 weight=10;
        }

    3、ip_hash
        每个请求按访问ip的hash结果分配,这样每个访客固定访问一个后端服务器,可以解决session的问题。
        例如:
        upstream resinserver{
            ip_hash;
            server 192.168.159.10:8080;
            server 192.168.159.11:8080;
        }


    4、fair(第三方)
        按后端服务器的响应时间来分配请求,响应时间短的优先分配。
        upstream resinserver{
            server server1;
            server server2;
            fair;
        }


    5、url_hash(第三方)
    按访问url的hash结果来分配请求,使每个url定向到同一个后端服务器,后端服务器为缓存时比较有效。
    例:在upstream中加入hash语句,server语句中不能写入weight等其他的参数,hash_method是使用的hash算法

    upstream resinserver{
        server squid1:3128;
        server squid2:3128;
        hash $request_uri;
        hash_method crc32;
    }

3、upstream 支持的状态参数
    在HTTPUpstream模块中,可以通过server指令指定后端服务器的IP地址和端口,同时还可以设定每个后端服务器在负载均衡调度中的状态。常用的状态有:

    down,表示当前的server暂时不参与负载均衡。
    weight 默认为1.weight越大,负载的权重就越大。
    backup,预留的备份机器。当其他所有的非backup机器出现故障或者忙的时候,才会请求backup机器,因此这台机器的压力最轻。
    max_fails,允许请求失败的次数,默认为1。当超过最大次数时,返回proxy_next_upstream 模块定义的错误。
    fail_timeout,在经历了max_fails次失败后,暂停服务的时间。max_fails可以和fail_timeout一起使用。
    当负载调度算法为ip_hash时,后端服务器在负载均衡调度中的状态不能是weight和backup。

工作原理

nginx工作原理

1、nginx工作原理
Nginx由内核和模块组成,其中,内核的设计非常微小和简洁,完成的工作也非常简单,仅仅通过查找配置文件将客户端请求映射到一个location block(location是Nginx配置中的一个指令,用于URL匹配),而在这个location中所配置的每个指令将会启动不同的模块去完成相应的工作。
Nginx本身做的工作实际很少,当它接到一个HTTP请求时,它仅仅是通过查找配置文件将此次请求映射到一个locationblock,而此location中所配置的各个指令则会启动不同的模块去完成工作,因此模块可以看做Nginx真正的劳动工作者。通常一个location中的指令会涉及一个handler模块和多个filter模块(当然,多个location可以复用同一个模块)。handler模块负责处理请求,完成响应内容的生成,而filter模块对响应内容进行处理。

2、nginx进程模型
Nginx在启动后,会有一个master进程和多个worker进程。
master进程
主要用来管理worker进程,包含:接收来自外界的信号,向各worker进程发送信号,监控worker进程的运行状态,当worker进程退出后(异常情况下),会自动重新启动新的worker进程。
worker进程:
而基本的网络事件,则是放在worker进程中来处理了。多个worker进程之间是对等的,他们同等竞争来自客户端的请求,各进程互相之间是独立的。一个请求,只可能在一个worker进程中处理,一个worker进程,不可能处理其它进程的请求。

3、nginx和fastcgi运行原理
fastcgi
FastCGI是一个可伸缩地、高速地在HTTPserver和动态脚本语言间通信的接口。多数流行的HTTPserver都支持FastCGI,包括Apache、Nginx和lighttpd等。同时,FastCGI也被许多脚本语言支持,其中就有PHP。
FastCGI的主要优点是把动态语言和HTTPServer分离开来,所以Nginx与PHP/PHP-FPM经常被部署在不同的服务器上,以分担前端Nginx服务器的压力,使Nginx专一处理静态请求和转发动态请求,而PHP/PHP-FPM服务器专一解析PHP动态请求。

 1)、FastCGI进程管理器php-fpm自身初始化,启动主进程php-fpm和启动start_servers个CGI 子进程。
       主进程php-fpm主要是管理fastcgi子进程,监听9000端口。
       fastcgi子进程等待来自Web Server的连接。
 2)、当客户端请求到达Web Server Nginx是时,Nginx通过location指令,将所有以php为后缀的文件都交给127.0.0.1:9000来处理,即Nginx通过location指令,将所有以php为后缀的文件都交给127.0.0.1:9000来处理。
  3)FastCGI进程管理器PHP-FPM选择并连接到一个子进程CGI解释器。Web server将CGI环境变量和标准输入发送到FastCGI子进程。
  4)、FastCGI子进程完成处理后将标准输出和错误信息从同一连接返回Web Server。当FastCGI子进程关闭连接时,请求便告处理完成。
  5)、FastCGI子进程接着等待并处理来自FastCGI进程管理器(运行在 WebServer中)的下一个连接。

CGI:来了就开火做饭
FAST-CGI:火一直开着呢,来了直接处理
php-fpm   :如果现在php配置文件修改,那么重启php-fpm,用来管理fast-cgi进程的进程管理器

nginx 配置文件

#定义Nginx运行的用户和用户组
user www www;

#nginx进程数,建议设置为等于CPU总核心数。
worker_processes 8;

#全局错误日志定义类型,[ debug | info | notice | warn | error | crit ]
error_log ar/loginx/error.log info;

#进程文件
pid ar/runinx.pid;

#一个nginx进程打开的最多文件描述符数目
worker_rlimit_nofile 65535;

#工作模式与连接数上限
events
{
#参考事件模型,use [ kqueue | rtsig | epoll | /dev/poll | select | poll ]; epoll模型是Linux 2.6以上版本内核中的高性能网络I/O模型,如果跑在FreeBSD上面,就用kqueue模型。
use epoll;
#单个进程最大连接数(最大连接数=连接数*进程数)
worker_connections 65535;
}

#设定http服务器
http
{
include mime.types; #文件扩展名与文件类型映射表
default_type application/octet-stream; #默认文件类型
#charset utf-8; #默认编码
server_names_hash_bucket_size 128; #服务器名字的hash表大小
client_header_buffer_size 32k; # 客户端头信息缓冲区大小
large_client_header_buffers 64k; #最大客户端头信息缓冲区大小
client_max_body_size 8m; #客户端请求的最大文件大小
sendfile on; #开启高效文件传输模式,sendfile指令指定nginx是否调用sendfile函数来输出文件,对于普通应用设为 on,如果用来进行下载等应用磁盘IO重负载应用,可设置为off,以平衡磁盘与网络I/O处理速度,降低系统的负载。注意:如果图片显示不正常把这个改成off。
autoindex on; #开启目录列表访问
tcp_nopush on; #防止网络阻塞
tcp_nodelay on; #防止网络阻塞
keepalive_timeout 120; #长连接超时时间,单位是秒

#FastCGI相关参数是为了改善网站的性能:减少资源占用,提高访问速度。
fastcgi_connect_timeout 300;  
fastcgi_send_timeout 300;  
fastcgi_read_timeout 300;  
fastcgi_buffer_size 64k;  
fastcgi_buffers 64k;  
fastcgi_busy_buffers_size 128k;  
fastcgi_temp_file_write_size 128k;  

#gzip模块设置  
gzip on; #开启gzip压缩输出  
gzip_min_length 1k; #最小压缩文件大小  
gzip_buffers 4 16k; #压缩缓冲区  
gzip_http_version 1.0; #压缩版本(默认1.1,前端如果是squid2.5请使用1.0)  
gzip_comp_level 2; #压缩等级  
gzip_types text/plain application/x-javascript text/css application/xml;  
#压缩类型,默认就已经包含text/html,所以下面就不用再写了  

upstream blog.haha.com {  
    #upstream的负载均衡,weight是权重,可以根据机器配置定义权重。weigth参数表示权值,权值越高被分配到的几率越大。  
    server 192.168.80.121:80 weight=3;  
    server 192.168.80.122:80 weight=2;  
    server 192.168.80.123:80 weight=3;  
}  

#虚拟主机的配置  
server  
{  
    #监听端口  
    listen 80;  
    #域名可以有多个,用空格隔开  
    server_name www.haha.com haha.com;  
    index index.html index.htm index.php;  
    root /data/www/haha;  
    location ~ .*.(php|php5)$  
    {  
        fastcgi_pass 127.0.0.1:9000;  
        fastcgi_index index.php;  
        include fastcgi.conf;  
    }  
    #图片缓存时间设置  
    location ~ .*.(gif|jpg|jpeg|png|bmp|swf)$  
    {  
        expires 10d;  
    }  
    #JS和CSS缓存时间设置  
    location ~ .*.(js|css)?$  
    {  
        expires 1h;  
    }     
    #定义本虚拟主机的访问日志  
    access_log ar/loginx/hahaaccess.log access;  

    #对 "/" 启用反向代理  
    location / {  
        proxy_pass http://127.0.0.1:88;  
        proxy_redirect off;  
        proxy_set_header X-Real-IP $remote_addr;  
        #后端的Web服务器可以通过X-Forwarded-For获取用户真实IP  
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;  
        #以下是一些反向代理的配置,可选。  
        proxy_set_header Host $host;  
        client_max_body_size 10m; #允许客户端请求的最大单文件字节数  
        client_body_buffer_size 128k; #缓冲区代理缓冲用户端请求的最大字节数,  
        proxy_connect_timeout 90; #nginx跟后端服务器连接超时时间(代理连接超时)  
        proxy_send_timeout 90; #后端服务器数据回传时间(代理发送超时)  
        proxy_read_timeout 90; #连接成功后,后端服务器响应时间(代理接收超时)  
        proxy_buffer_size 4k; #设置代理服务器(nginx)保存用户头信息的缓冲区大小  
        proxy_buffers 4 32k; #proxy_buffers缓冲区,网页平均在32k以下的设置  
        proxy_busy_buffers_size 64k; #高负荷下缓冲大小(proxy_buffers*2)  
        proxy_temp_file_write_size 64k;  
        #设定缓存文件夹大小,大于这个值,将从upstream服务器传  
    }  

    #本地动静分离反向代理配置   
    location ~ \.(php)$ {  
        proxy_set_header Host $host;  
        proxy_set_header X-Real-IP $remote_addr;  
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;  
        proxy_pass http://127.0.0.1:8080;  
    }  
    #所有静态文件由nginx直接读取  
    location ~ .*.(htm|html|gif|jpg|jpeg|png|bmp|swf|ioc|rar|zip|txt|flv|mid|doc|ppt|pdf|xls|mp3|wma)$  
    { expires 15d; }  
    location ~ .*.(js|css)?$  
    { expires 1h; }  
}  

}

nginx优化

nginx优化

隐藏版本号
在http里面添加一行
server_tokens off;

1、worker_processes
默认可以设置为CPU的核数相等,并发比较大的时候,可以设置为cpu核数*2
2、分配每一个进程使用一个核数
worker_cpu_affinity 0001 0010 0100 1000 #四核
worker_cpu_affinity 00000001 00000010 00000100 00001000 00010000 00100000 01000000 10000000 #八核心
3、事件处理模型优化
Nginx的连接处理机制在不同的操作系统会采用不同的I/O模型,在Linux下,Nginx使用epoll的I/O多路复用模型,在Freebsd中使用kqueue的I/O多路复用模型,在Solaris中使用/dev/poll方式的I/O多路复用模型,在Windows中使用的是icop,等等。
要根据系统类型选择不同的事件处理模型,可供使用的选择有“use[kqueue|rtsig|epoll|/dev/poll|select|poll];”
events {
use epoll;
}
4、调整Nginx单个进程允许的客户端最大连接数
worker_connects = 1024
总共处理能力 = worker_processes * worker_connects
5、开启sendfile
6、连接超时的参数设置
1. client_header_timeout
用于设置客户端连接保持会话的超时时间为60秒。超过这个时间,服务器会关闭该连接,此数值为参考值。
2. 设置参数:tcp_nodelay on;
用于激活tcp_nodelay功能,提高I/O性能。
参数作用:默认情况下当数据发送时,内核并不会马上发送,可能会等待更多的字节组成一个数据包,这样可以提高I/O性能。但是,在每次只发送很少字节的业务场景中,使用tcp_nodelay功能,等待时间会比较长。
3. 设置参数:client_header_timeout 15;
用于设置读取客户端请求头数据的超时时间。此处的数值15,其单位是秒,为经验参考值。
4. client_body_timeout 15;
用于设置读取客户端请求主体的超时时间,默认值是60。
参数作用:设置读取客户端请求主体的超时时间。这个超时仅仅为两次成功的读取操作之间的一个超时,非请求整个主体数据的超时时间,如果在这个超时时间内,客户端没有发送任何数据,Nginx将返回“Request time out(408)”错误,默认值是60
5. send_timeout 25;
用于指定响应客户端的超时时间。这个超时仅限于两个连接活动之间的时间,如果超过这个时间,客户端没有任何活动,Nginx将会关闭连接,默认值为60秒,可以改为参考值25秒。
7、上传文件大小的限制
client_max_body_size 8m
参数作用:设置最大的允许的客户端请求主体大小,在请求头域有“Content-Length”,如果超过了此配置值,客户端会收到413错误,意思是请求的条目过大,有可能浏览器不能正确显示。设置为0表示禁止检查客户端请求主体大小。此参数对提高服务器端的安全性有一定的作用。
8、FastCGI调优(图片)
https://wenku.baidu.com/content/38b81d255fbfc77da369b13c?m=677eb0dc3e26a59492c4441651619924&type=pic&src=517a8d367f3145e6bb6dea72a8b143ff.jpg
9、GZIP的压缩
gzip on
gzip_min_length  1k #设置允许压缩的页面最小字节数,页面字节数从header 头的 Content-Length 中获取
gzip_buffers     4 16k #压缩缓冲区大小。表示申请 4 个单位为 16K 的内存作为压缩结果流缓存,默认值是申请与原始数据大小相同的内存空间来存储
gzip_http_version 1.1 #压缩版本(默认 1.1 ,前端为 squid2.5 时使用 1.0 )
gzip_comp_level 2; #压缩比率。用来指定 gzip 压缩比, 1 压缩比最小,处理速度最快;
gzip_types  text/plain application/x-javascript text/css application/xml; #用来指定压缩的类型,“ text/html ”类型总是会被压缩
gzip_vary on #支持。该选项可以让前端的缓存服务器缓存经过 gzip 压缩的页面

1. Nginx gzip压缩功能介绍
Nginxgzip压缩模块提供了压缩文件内容的功能,用户请求的内容在发送到用户客户端之前,Nginx服务器会根据一些具体的策略实施压缩,以节约网站出口带宽,同时加快数据传输效率,来提升用户访问体验。

2. Nginx gzip压缩的优点
    提升网站用户体验:发送给用户的内容小了,用户访问单位大小的页面就加快了,用户体验提升了,网站口碑就好了。
    节约网站带宽成本:数据是压缩传输的,因此节省了网站的带宽流量成本,不过压缩时会稍微消耗一些CPU资源,这个一般可以忽略。
    此功能既能提升用户体验,又能使公司少花钱,一举多得。对于几乎所有的Web服务来说,这是一个非常重要的功能,Apache服务也有此功能。

3. 需要和不需要压缩的对象
    纯文本内容压缩比很高,因此,纯文本的内容最好进行压缩,例如:html、js、css、xml、shtml等格式的文件。
    被压缩的纯文本文件必须要大于1KB,由于压缩算法的特殊原因,极小的文件压缩后可能反而变大。
    图片、视频(流媒体)等文件尽量不要压缩,因为这些文件大多都是经过压缩的,如果再压缩很可能不会减小或减小很少,或者有可能增大,同时压缩时还会消耗大量的CPU、内存资源。

4. 参数介绍及配置说明
    此压缩功能与早期Apache服务的mod_deflate压缩功能很相似,Nginx的gzip压缩功能依赖于ngx_http_gzip_module模块,默认已安装。