nginx
反向代理
正向代理是代理客户端,反向代理是代理服务器
nginx 已经模块化,代理功能是代理模块提供的
配置文件详解
... #全局块
events { #events块
...
}
http #http块
{
... #http全局块
upstream{ #upstream块
}
server #server块
{
... #server全局块
location [PATTERN] #location块
{
...
}
location [PATTERN]
{
...
}
}
server
{
...
}
... #http全局块
}
1 全局块:配置影响nginx全局的指令。一般有运行nginx服务器的用户组,nginx进程pid存放路径,日志存放路径,配置文件引入,允许生成worker process数等。
2 events块:配置影响nginx服务器或与用户的网络连接。有每个进程的最大连接数,选取哪种事件驱动模型处理连接请求,是否允许同时接受多个网路连接,开启多个网络连接序列化等。
3 http块:可以嵌套多个server,配置代理,缓存,日志定义等绝大多数功能和第三方模块的配置。如文件引入,mime-type定义,日志自定义,是否使用sendfile传输文件,连接超时时间,单连接请求数等。
4 upstream块 配置负载均衡算法
5 server块:配置虚拟主机的相关参数,一个http中可以有多个server。
6 location块:配置请求的路由,以及各种页面的处理情况。
nginx 内置变量
$args 请求中的参数;
$binary_remote_addr 远程地址的二进制表示
$body_bytes_sent 已发送的消息体字节数
$content_length HTTP请求信息里的"Content-Length"
$content_type 请求信息里的"Content-Type"
$document_root 针对当前请求的根路径设置值
$document_uri 与$uri相同
$host 请求信息中的"Host",如果请求中没有Host行,则等于设置的服务器名;
$http_cookie cookie 信息
$http_referer 来源地址
$http_user_agent 客户端代理信息
$http_via 最后一个访问服务器的Ip地址
$http_x_forwarded_for 相当于网络访问路径。
$limit_rate 对连接速率的限制
$remote_addr 客户端地址
$remote_port 客户端端口号
$remote_user 客户端用户名,认证用
$request 用户请求信息
$request_body 用户请求主体
$request_body_file 发往后端的本地文件名称
$request_filename 当前请求的文件路径名
$request_method 请求的方法,比如"GET"、"POST"等
$request_uri 请求的URI,带参数
$server_addr 服务器地址,如果没有用listen指明服务器地址,使用这个变量将发起一次系统调用以取得地址(造成资源浪费)
$server_name 请求到达的服务器名
$server_port 请求到达的服务器端口号
$server_protocol 请求的协议版本,"HTTP/1.0"或"HTTP/1.1"
$uri 请求的URI,可能和最初的值有不同,比如经过重定向之类的
最简单的第一步 反向代理百度首页
代理百度首页
server {
listen 80;
server_name localhost;
#charset koi8-r;
#access_log logs/host.access.log main;
location / {
proxy_pass https://www.baidu.com;
}
#error_page 404 /404.html;
# redirect server error pages to the static page /50x.html
#
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
访问本地地址:127.0.0.1
或者 localhost
就相当于访问百度首页了
基于反向代理 负载均衡
需求:有2个后台应用服务器,分别标为A,B服务器,A的服务器性能是B的2倍,现在有300个访问请求,需要将200个访问请求引流到A服务器,100个请求引流到B服务器怎么办?
upstream backend {
# A服务器 权重为2
server 127.0.0.1:9001 weight=2;
# B服务器 权重为1
server 127.0.0.1:9002 weight=1;
}
server {
listen 80;
server_name localhost;
location / {
#代理至backend 块级指令代理
proxy_pass http://backend;
}
}
使用 NGINX 的 HTTP 模块,将请求分发到有 upstream 块级指令代理的 HTTP
服务器集群,实现负载均衡。其中weight表示权重,可以通过weight来控制服务器的压力。
其中upstream 定义一个目标服务器连接池,它可以是 UNIX 套接字、IP 地址、DNS 记录
或它们的混合使用配置。
负载均衡算法
- 轮询负载均衡算法
- 最少连接数负载均衡算法
- 最短响应时间负载均衡算法
- 基于Hash负载均衡算法
- IP_Hash负载均衡算法
轮询负载均衡算法
轮询负载均衡算法是nginx 默认负载均衡算法,在upstream模块设置权重,权重越大,分发的请求到该服务器的上的数量越大。
没有指明算法时,nginx使用该算法。
最少连接数负载均衡算法
upstream backend {
server 127.0.0.1:9001 ;
server 127.0.0.1:9002 ;
least_conn;
}
在upstream 添加`least_conn`字段,即可使用最少连接数负载均衡算法。
该算法根据打开连接数实现负载均衡,nginx根据连接数判读服务器当前性能好坏,将请求分配给性能最好(连接最少)的服务器
最短响应时间负载均衡算法(商业)
upstream backend {
server 127.0.0.1:9001 ;
server 127.0.0.1:9002 ;
least_time;
}
在upstream 添加`least_time`字段,即可使用最少连接数负载均衡算法。该算法只在nginx puls中有,即在nginx的商业版本中有。
nginx会将请求分发给平均响应时间更短的应用服务器。
基于Hash负载均衡算法
upstream backend {
server 127.0.0.1:9001 ;
server 127.0.0.1:9002 ;
hash $request_uri ;
}
在upstream 添加`hash $var`字段,其中var表示内置变量。如上代码则表示根据request_uri(http 路径参数)进行Hash。如果写`hash $request_method;`
则可以根据请求方法不同,分配不同的服务器。
hash后面跟的变量官方给的解释是:The administrator defines a hash with the given text, variables of the request or runtime, or both
意思是例如文本,变量,或者运行环境,或者这些的组合。
当有服务器被添加或者删除的时候会重新添加hash值进行分发,这个算法就是使用的是一致性hash算法。
IP_Hash负载均衡算法
upstream backend {
server 127.0.0.1:9001 ;
server 127.0.0.1:9002 ;
ip_hash ;
}
这个算法基于Hash负载均衡算法对访问者的ip求hash,从而实现负载均衡。这个可以保证没有办法存储session 或者session丢失的请求,只要ip不发生改变,
并且服务器可用的情况下,请求永远都负载同一台服务器上。