标签:pass ret world 访问 最大的 目标 hash poc 必须
nginx是一款高性能的http和反向代理服务器,同时也是一款imap/pop3/smtp代理服务器。目前很多网站都采用nginx作为web服务器
nginx有很多优点,其最大的特色就是反向代理和负载均衡。要想知道反向代理,还要从正向代理说起。
正向代理,也就是传说中的代理。它的工作原理就像一个跳板,简单的说,我是一个用户,我访问不了某网站,但是我能访问一个代理服务器,这个代理服务器呢,它能访问那个我不能访问的网站,于是我先连上代理服务器,告诉他我需要那个无法访问网站的内容,代理服务器去取回来,然后返回给我。从网站的角度,只在代理服务器来取内容的时候有一次记录,有时候并不知道是用户的请求,也就隐藏了用户的资料,这取决于代理告不告诉网站。
正向代理是一个位于客户端和原始服务器之间的服务器,为了从原始服务器取得内容,客户端必须要进行一些特别的设置。客户端向代理发送一个请求并指定目标(原始服务器),然后代理向原始服务器转交请求并将获得的内容返回给客户端。
正向代理为在防火墙内的局域网客户端提供访问Internet的途径,正向代理允许客户端通过它访问任意网站并且隐藏客户端自身。
反向代理正好相反,对于客户端而言它就像是原始服务器,并且客户端不需要进行任何特别的设置。客户端向反向代理的命名空间中的内容发送普通请求,接着反向代理将判断向何处(原始服务器)转交请求,并将获得的内容返回给客户端,就像这些内容原本就是它自己的一样。
例如,用户访问 http://www.xxx.com/readme ,但 www.xxx.com 上并不存在 readme 页面,于是它偷偷从另外一台服务器上取回来,然后作为自己的内容返回用户,但用户并不知情。这里所提到的 www.xxx.com 这个域名对应的服务器就设置了反向代理功能。
正向代理将防火墙后面的服务器提供给Internet用户访问,反向代理对外都是透明的,访问者并不知道自己访问的是一个代理。
nginx反向代理是通过proxy_pass来实现的。
负载均衡,简单来说,就是将负载(工作任务,访问请求)进行平衡、分摊到多个操作单元(服务器,组件)上进行执行。
nginx负载均衡是通过upstream来实现的,有以下几种策略:
请求会按照时间顺序逐一分配到不同服务器,如果服务器down掉,能自动剔除。
upstream myapp.com {
server srv1.example.com:80;
server srv2.example.com:80;
server srv3.example.com:80;
}
请求会按照权重来分配,权重大的分配多。
upstream myapp.com {
server srv1.example.com:80 weight=3;
server srv2.example.com:80;
server srv3.example.com:80;
}
请求会按照连接数来分配,连接数少的分配多。
upstream myapp.com {
least_conn;
server srv1.example.com:80;
server srv2.example.com:80;
server srv3.example.com:80;
}
请求会按照访问IP的hash结果分配,这样每个IP固定访问一个服务器,可以解决session保持的问题。
upstream myapp.com {
ip_hash;
server srv1.example.com:80;
server srv2.example.com:80;
server srv3.example.com:80;
}
upstream模块下的server指令用来配置处理请求的服务器IP或域名,端口可选,不配置默认使用80端口。server指令提供以下参数:
weight
max_conns
max_fails
fail_timeout
backup
down
这里举个例子,来说明一下nginx如何进行负载均衡的配置。
主机和从机一般选不同的独立服务器,为了方便,这里都在一台服务器上进行,采用服务器的ip为172.16.1.52。
upstream 172.16.1.52 {
server 127.0.0.1:8081;
server 127.0.0.1:8082;
server 127.0.0.1:8083;
}
server{
listen 80;
location / {
proxy_pass http://172.16.1.52;
}
}
可以采用nginx架设http服务,分为访问8081、8082、8083端口,也可以采用其他办法架设http服务,如采用flask,为了方便查看主机转发结果,可以将不同从机的返回结果设置不同。
#coding: utf-8
from flask import Flask
app = Flask(__name__)
@app.route(‘/‘)
def hello_world():
return ‘Hello 8081!‘
if __name__ == ‘__main__‘:
app.run(host=‘0.0.0.0‘, port=8081)
运行python的web服务:
不管从终端curl,还是从浏览器刷新,可以看到返回的结果正如我们所想,按照默认的轮询模式进行返回。当然,你也可以做其他的配置,以便进一步改进返回结果。
从之前的结果可以看到,从机负责站点服务功能,而主机只负责转发,如果我们也想让主机也提供站点服务功能,那该怎么办?很简单,将主机对应的域名添加到upstream中。由于80端口已经被占用,此时要注意主机的http服务端口需要改为其它,如8000端口,并在nginx配置中添加监听即可。
标签:pass ret world 访问 最大的 目标 hash poc 必须
原文地址:https://www.cnblogs.com/longpy/p/11332674.html