Nginx反向代理详解
nginx反向代理是一种常用的服务器架构设计方案,其原理是将客户端请求先发送到反向代理服务器,反向代理服务器再将请求转发到后端真实服务器处理,并将处理结果返回给客户端,从而实现负载均衡、高可用、安全和减轻后端服务器压力等效果。
反向代理
代理其实就是一个中介,A和B本来可以直连,中间插入一个C,A借助C和B连接,C就是代理。刚开始的时候,代理多数是帮助client访问server端,也就是正向代理。后来又有了帮助server端响应client请求的反向代理。
特点:
- 代理的是server端
- server端对client是透明的不可见的
- client访问时,输入的是代理的地址(proxy)
下面是实现nginx反向代理的步骤:
-
安装nginx
可以查看本人的另一篇文章(Centos7安装配置nginx) -
配置反向代理
在nginx配置文件中添加以下内容:
location / {
proxy_pass http://backend_server;
}
其中,backend_server
为后端真实服务器地址。
- 配置负载均衡
在nginx配置文件中添加以下内容:
upstream backend_servers {
server backend_server_1;
server backend_server_2;
}
location / {
proxy_pass http://backend_servers;
}
其中,backend_server_1
和backend_server_2
为后端真实服务器地址,nginx会将请求轮流转发到这两台服务器上。
- 配置HTTPS
在nginx配置文件中添加以下内容:
server {
listen 443;
server_name domain.com;
ssl on;
ssl_certificate /path/to/cert.pem;
ssl_certificate_key /path/to/key.pem;
location / {
proxy_pass http://backend_servers;
}
}
其中,domain.com
为要代理的域名,/path/to/cert.pem
和/path/to/key.pem
为SSL证书和私钥的路径。
在这里给大家一个配置案例:
- 重启nginx
完成以上配置后,重启nginx服务即可生效。
upstream部分参数解释
server: 内容为ip地址,指定一个主机参与集群请求分发
weight: 内容为数字,权重比,数字越大,所获得的请求越多
max_fails: 内容为数字,nginx尝试连接该节点的失败次数
fail_timeout: 内容为数字单位秒,与失败次数联合使用,到达上述失败次数后间隔多长再次请求
backup: 备份机,当其他非备份机无法使用时请求分到备份机,在使用ip_hash时无效
down: 剔除,该机器不参与请求分发,只在使用ip_hash时有效
负载均衡(Load balancing),意思是将负载(工作任务,访问请求)进行平衡,用来在多个计算机(计算机集群)中分配负载,以达到集群系统整体的最优化资源使用、最大化吞吐率、最小化响应时间、同时避免过载的目的。
Nginx的负载均衡策略
轮询(默认)
-
优点:实现简单
-
缺点:不考虑每台服务器的处理能力
-
配置示例如下:
upstream 集群名 {
# 需要负载的server列表
server ip1:port;
server ip2:port;
server ip3:port;
}
权重(使用较多)
-
优点:考虑了每台服务器处理能力的不同,哪台机器性能高就给哪台机器的权重高一些
-
配置示例如下:
upstream 集群名 {
# 需要负载的server列表,weight表示权重
server ip1:port weight=1;
server ip2:port weight=2;
server ip3:port weight=4;
}
在这里说明一下,按照上面的配置意思就是(4+2+1)七次里面一定会出现1次ip1:port、2次ip2:port、4次ip3:port,而不是按照百分比(百分比的话就是这其次里可能全是ip1:port这就属于概率性问题了)
ip_hash
-
优点:根据用户的ip地址能实现同一个用户始终访问同一个服务器
-
缺点:根据 ip hash 不一定平均
-
配置示例如下:
upstream 集群名 {
ip_hash;
# 需要负载的server列表
server ip1:port;
server ip2:port;
server ip3:port;
}
fair
fair可以根据页面大小、加载时间长短智能的进行负载均衡
upstream backend{
fair;
server 192.168.200.146:9001;
server 192.168.200.146:9002;
server 192.168.200.146:9003;
}
least_conn\
请求将被传递给当前拥有最少活跃连接的server
upstream backend {
zone backends 64k;
least_conn;
server 10.10.10.2 weight=2;
server 10.10.10.4 weight=1;
server 10.10.10.6 weight=1;
}
url_hash
和ip_hash类似,根据请求路径实现同一个请求访问同一个tomcat
upstream somestream {
hash $request_uri;
server 192.168.244.1:8080;
server 192.168.244.2:8080;
server 192.168.244.3:8080;
server 192.168.244.4:8080;
}