共计 6958 个字符,预计需要花费 18 分钟才能阅读完成。
目录
- Nginx 概述
- Nginx 调度算法
- Nginx 指令使用
- Nginx 负载均衡配置参数
1. Nginx 概述
Nginx 是一个免费的,开源的,高性能的服务器和反向代理服务器软件,同时它也可以为 IMAP 和 POP3 服务器代理,以其高性能,稳定性,丰富的功能,结构简单,低资源消耗的特性换来广大运维者所喜爱。
Nginx 与传统的服务器不同,不依赖线程来处理请求。相反,它使用一个更可扩展事件驱动架构(异步)。这种结构资源消耗较小,但更重要的是,可以承受较大的请求负荷。即使你不希望处理成千上万的请求,你仍然可以受益于 Nginx 的高性能和小的内存占用,以及其丰富的功能。
1.1 Nginx 的反向代理
反向代理指以代理服务器来接受 Internet 上的连接请求,然后将请求转发给内部网络上的服务器,并将从服务器上得到的结果返回给 Internet 上请求连接到客户端,此时代理服务器对外就表现为一个服务器,而此种工作模式类似于 LVS-NET 模型。
反向代理也可以理解为 web 服务器加速,它是一种通过在繁忙的 web 服务器和外部网络之间增加的一个高速 web 缓冲服务器,用来降低实际的 web 服务器的负载的一种技术。反向代理是针对 web 服务器提高加速功能,所有外部网络要访问服务器时的所有请求都要通过它,这样反向代理服务器负责接收客户端的请求,然后到源服务器上获取内容,把内容返回给用户,并把内容保存在本地,以便日后再收到同样的信息请求时,它会将本地缓存里的内容直接发给用户,已减少后端 web 服务器的压力,提高响应速度。因此 Nginx 还具有缓存功能。
1.2 反向代理的工作流程
- 用户通过域名发出访问请求,该域名被解析为反向代理服务器的 IP 地址;
- 反向代理服务器接收用户的请求;
- 反向代理服务器在本地缓存查找是否存在当前用户所请求的内容,找到则直接把内容返回给用户;
- 如果本地没有用户请求的内容,反向代理服务器会以自己的身份去后端服务器请求同样的信息内容,并把信息内容发给用户,如果信息内容是可以被缓存的,则会将该内容缓存在代理服务器的本地缓存中。
1.3 反向代理的好处
- 解决了网站服务器对外可见的问题,提高了网站服务器的安全性;
- 节约了有限的 IP 地址资源,后端服务器均可使用私有 IP 地址与代理服务器进行通信;
- 加速了网站的访问速度,减轻了真是 web 服务器的负荷。
2. Nginx 调度算法
Nginx 的 upstream 指令用于指定 proxy_pass 和 fastcgi_pass 所使用的后端服务器,即 nginx 的反向代理功能,因此可以将两者结合起来使用以达到负载均衡的目的,而 Nginx 也支持多种调度算法:
2.1 轮询(默认)
每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器 down 掉,则会跳过该服务器分配至下一个监控的服务器。并且它无需记录当前所有连接的状态,所以它是一种无状态调度。
2.2 Weight
指定在轮询的基础上加上权重,weight 和访问比率成正比,即用于表明后端服务器的性能好坏,若后端服务器性能较好则可将大部分请求分配给它,已实现其力所能及。
例如:
我后端服务器 172.23.136.148 配置:E55202 CPU,8G 内存
后端服务器 172.23.136.148 配置:Xeon(TM)2.80GHz 2,4G 内存
我希望在有 30 个请求到达前端时,其中 20 个请求交给 172.23.136.148 处理,剩余 10 个请求交给 172.23.136.149 处理,就可做如下配置:
upstream web_poll {
server 172.23.136.148 weight=10;
server 172.23.136.149 weight=5;
}
2.3 ip_hash
每个请求按访问 ip 的 hash 结果分配,当新的请求到达时,先将其客户端 IP 通过哈希算法进行哈希出一个值,在随后的请求客户端 IP 的哈希值只要相同,就会被分配至同一个后端服务器,该调度算法可以解决 session 的问题,但有时会导致分配不均即无法保证负载均衡。
例如:
upstream web_pool {
ip_hash;
server 172.23.136.148:80;
server 172.23.136.149:80;
}
2.4 fair(第三方)
按后端服务器的响应时间来分配请求,响应时间短的优先分配。
upstream web_pool {
server 172.23.136.148;
server 172.23.136.149;
fair;
}
2.5 url_hash(第三方)
按访问 url 的 hash 结果来分配请求,使每个 url 定向到同一个后端服务器,后端服务器为缓存时比较有效。
例:在 upstream 中加入 hash 语句,server 语句中不能写入 weight 等其他的参数,hash_method 是使用的 hash 算法
upstream web_pool {
server squid1:3128;
server squid2:3128;
hash $request_uri;
hash_method crc32;
}
每个设备的状态设置为:
- down 表示当前的 server 不参与负载, 用于 ip_hash 中
- weight 默认为 1.weight 越大,负载的权重就越大。
- max_fails 允许请求失败的次数默认为 1. 设为 0 则表示关闭该项功能,当超过最大次数时,返回 proxy_next_upstream 模块定义的错误
- fail_timeout 在 max_fails 定义的失败次数后,暂停的时间。
- backup 可以将其理解为备机,其它所有的非 backup 机器 down 或者忙的时候,才会将请求分配给 backup 机器。所以这台机器压力会最轻。
nginx 支持同时设置多组的负载均衡,用来给不用的 server 来使用。
3. Nginx 指令使用
1. upstream
声明一组可以被 proxy_pass 和 fastcgi_pass 引用的服务器;这些服务器可以使用不同的端口,并且也可以使用 Unix Socket;也可以为服务器指定不同的权重。如:
upstream web_pool {
server coolinuz.9966.org weight=5;
server 172.23.136.148:8080 max_fails=3 fail_timeout=30s;
server unix:/tmp/backend3;
}
2. server
语法:server name [parameters]
其中的 name 可以是 FQDN,主机地址,端口或 unix 套接字;如果 FQDN 解析的结果为多个地址,则每个地址都会被用到。
3. proxy_pass
语法:proxy_pass URL;
该指令用于指定代理服务器的地址和 URL 将被映射为的 URL 或地址和端口。即用来指定后端服务器的地址或 URL[端口]。
4. proxy_set_header
语法:proxy_set_header header value;
该指令允许重新定义和添加一些将被转移到被代理服务器的请求头部信息。
例如:
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_add_x_forwarded_for 包含客户端请求头中的 ”X-Forwarded-For”,与 $remote_addr 用逗号分开,如果没有 ”X-Forwarded-For” 请求头,则 $proxy_add_x_forwarded_for 等于 $remote_addr
5. proxy_read_timeout
语法:proxy_read_timeout time;
这个指令设置 Nginx 与后端服务器建立连接后。等待后端服务器的响应时间
6. proxy_send_timeout
语法:roxy_send_timeout time;
该指令指定请求转移到后端服务器的超时时间。整个传输的要求时间不超过超时时间,但只有两次写操作之间。如果在此时间之后的后端服务器将不采取新的数据,然后 nginx 将关闭连接。
7. proxy_connect_timeout
语法:proxy_connect_timeout time;
该指令用来设置分配到后端服务器的连接超时时间。
8. proxy_buffers
语法: proxy_buffers the_number is_size;
该指令设置缓冲区的数目和大小,缺省情况下,一个缓冲区的大小和页面大小相同。
9. proxy_buffer_size
语法:proxy_buffer_size buffer_size;
代理缓冲区,该指令用于保存用用户的头部信息。
10. proxy_busy_buffers_size
语法:proxy_busy_buffers_size size;
用于当系统负载较大,缓冲区不够用时,可以申请更大的 proxy_buffers
11. proxy_temp_file_write_size
语法:proxy_temp_file_write_size size;
用于指定缓存临时文件的大小
4. Nginx 负载均衡配置参数
# 设定 http 服务器,利用它的反向代理功能提供负载均衡支持
http {
#设定 mime 类型, 类型由 mime.type 文件定义
include /etc/nginx/mime.types;
default_type application/octet-stream;
#设定日志格式
access_log /var/log/nginx/access.log;
#省略上文有的一些配置节点
#... ... ...
#设定负载均衡的服务器列表
upstream mysvr {
#weigth 参数表示权值,权值越高被分配到的几率越大
server 192.168.8.1x:3128 weight=5;
#本机上的 Squid 开启 3128 端口, 不是必须要 squid
server 192.168.8.2x:80 weight=1;
server 192.168.8.3x:80 weight=6;
}
upstream mysvr2 {
#weigth 参数表示权值,权值越高被分配到的几率越大
server 192.168.8.x:80 weight=1;
server 192.168.8.x:80 weight=6;
}
#第一个虚拟服务器
server {
#侦听 192.168.8.x 的 80 端口
listen 80;
server_name 192.168.8.x;
#对 aspx 后缀的进行负载均衡请求
location ~ .*.aspx$ {
#定义服务器的默认网站根目录位置
root /root;
#定义首页索引文件的名称
index index.php index.html index.htm;
#请求转向 mysvr 定义的服务器列表
proxy_pass http://mysvr ;
#以下是一些反向代理的配置可删除.
proxy_redirect off;
#后端的 Web 服务器可以通过 X -Forwarded-For 获取用户真实 IP
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
#允许客户端请求的最大单文件字节数
client_max_body_size 10m;
#缓冲区代理缓冲用户端请求的最大字节数,client_body_buffer_size 128k;
#nginx 跟后端服务器连接超时时间(代理连���超时)
proxy_connect_timeout 90;
#连接成功后,后端服务器响应时间(代理接收超时)
proxy_read_timeout 90;
#设置代理服务器(nginx)保存用户头信息的缓冲区大小
proxy_buffer_size 4k;
#proxy_buffers 缓冲区,网页平均在 32k 以下的话,这样设置
proxy_buffers 4 32k;
#高负荷下缓冲大小(proxy_buffers*2)proxy_busy_buffers_size 64k;
#设定缓存文件夹大小,大于这个值,将从 upstream 服务器传
proxy_temp_file_write_size 64k;
}
}
}
附 1. Nginx 的内置变量
- $args, 请求中的参数;
- $is_args, 如果已经设置 $args,则该变量的值为“?”,否则为“”。
- $content_length, HTTP 请求信息头里的 ”Content-Length”;
- $content_type, 请求信息头里的 ”Content-Type”;
- $document_root, 针对当前请求所属的 root 指令设置的根目录路径;
- $document_uri, 与 $uri 相同;
- $host, 请求信息中的 ”Host”,如果请求中没有 Host 行,则等于设置的服务器名;
- $limit_rate, 对连接速率的限制;
- $request_method, 请求的方法,比如 ”GET”、”POST” 等;
- $remote_addr, 客户端地址;
- $remote_port, 客户端端口号;
- $remote_user, 客户端用户名,认证用;
- $request_filename, 当前请求的文件路径名
- $request_body_file, 客户端请求主体的临时文件名。
- $request_uri, 请求的 URI,带参数;
- $query_string, 与 $args 相同;
- $scheme, 所用的协议,比如 http 或者是 https,比如 rewrite ^(.+)$ $scheme://example.com$1 redirect;
- $server_protocol, 请求的协议版本,”HTTP/1.0″ 或 ”HTTP/1.1″;
- $server_addr, 服务器地址,如果没有用 listen 指明服务器地址,使用这个变量将发起一次系统调用以取得地址(造成资源浪费);
- $server_name, 请求到达的服务器名;
- $server_port, 请求到达的服务器端口号;
- $uri, 请求的 URI,可能和最初的值有不同,比如经过重定向之类的。
附 2. 正则表达式匹配
- ~ 为区分大小写匹配
- ~* 为不区分大小写匹配
- !~ 和!~* 分别为区分大小写不匹配及不区分大小写不匹配
附 3. 文件及目录匹配
- - f 和!- f 用来判断是否存在文件
- - d 和!- d 用来判断是否存在目录
- - e 和!- e 用来判断是否存在文件或目录
- - x 和!- x 用来判断文件是否可执行
附 4. flag 标记
- last 相当于 Apache 里的 [L] 标记,表示完成 rewrite
- break 终止匹配, 不再匹配后面的规则
- redirect 返回 302 临时重定向 地址栏会显示跳转后的地址
- permanent 返回 301 永久重定向 地址栏会显示跳转后的地址
下面关于 Nginx 的文章您也可能喜欢,不妨参考下:
Nginx 403 forbidden 的解决办法 http://www.linuxidc.com/Linux/2017-08/146084.htm
CentOS 7 下 Nginx 服务器的安装配置 http://www.linuxidc.com/Linux/2017-04/142986.htm
CentOS 上安装 Nginx 服务器实现虚拟主机和域名重定向 http://www.linuxidc.com/Linux/2017-04/142642.htm
CentOS 6.8 安装 LNMP 环境(Linux+Nginx+MySQL+PHP)http://www.linuxidc.com/Linux/2017-04/142880.htm
Linux 下安装 PHP 环境并配置 Nginx 支持 php-fpm 模块 http://www.linuxidc.com/Linux/2017-05/144333.htm
Nginx 服务的 SSL 认证和 htpasswd 认证 http://www.linuxidc.com/Linux/2017-04/142478.htm
Ubuntu 16.04 上启用加密安全的 Nginx Web 服务器 http://www.linuxidc.com/Linux/2017-07/145522.htm
Linux 中安装配置 Nginx 及参数详解 http://www.linuxidc.com/Linux/2017-05/143853.htm
Nginx 日志过滤 使用 ngx_log_if 不记录特定日志 http://www.linuxidc.com/Linux/2014-07/104686.htm
CentOS 7.2 下 Nginx+PHP+MySQL+Memcache 缓存服务器安装配置 http://www.linuxidc.com/Linux/2017-03/142168.htm
CentOS6.9 编译安装 Nginx1.4.7 http://www.linuxidc.com/Linux/2017-06/144473.htm
Nginx 的详细介绍:请点这里
Nginx 的下载地址:请点这里
本文永久更新链接地址:http://www.linuxidc.com/Linux/2017-11/148379.htm