代理服务
没有代理服务就是客户端与服务器直接通信
但随着并发数增多我们的Server就吃不消了
此时我们可以引入一个代理服务器(Proxy Server)来转发至多个服务器
代理服务有两种方式,一种是正向代理,一种是反向代理
正向代理
正向代理就是我们想访问Internet中的资源,可以通过一个中间服务器去转发。这就是正向代理。而对于只能访问局域网的客户端,也是可以使用正向代理访问外网的。
正向代理的优势是对于客户端的,因为对于目标服务器,客户端的IP是隐藏的。目标服务器只能获取代理服务器的IP。而且正向代理可以起缓冲和加速的作用。
正向代理还有一大用途,就是通过代理服务器,可以突破自身ip访问限制,访问国外网站。也就是我们常说的翻墙。
反向代理
反向代理是指用代理服务器来接收客户端的请求,然后将请求转发给内部网络上的服务器,将从服务器上得到的结果返回给客户端。对于客户端来说,反向代理就相当于目标服务器。
反向代理对于服务器有优势。它可以隐藏服务器的真实IP。
反向代理可以为后端的多台服务器提供负载均衡。可以为较慢服务器提供缓冲,提高访问速度。
反向代理还可以提供安全保障,它可以作为应用层防火墙,为网站提供对基于Web的攻击行为的防护,比如DDoS。还可以为后端服务器统一提供加密和SSL加速,提供HTTP访问认证等。
Nginx反代Nodejs服务
我们创建一个简单的server.js
用作服务器,将其部署到3000端口上
const http = require("http");
const server = http.createServer(function (require, respose) {
console.log("Client request data...");
respose.end("success");
});
server.listen(3000, function () {
console.log("Successfully start server on (port:3000)");
});
然后在nginx.conf
中,将根目录反代到本地3000端口上
location / {
proxy_pass http://localhost:3000;
}
将nginx监听端口设为80
server {
listen 80;
server_name localhost;
...
}
运行nginx,打开https://localhost:80
如果是下面那样就成功了
负载均衡
设置两台node服务器,然后分别在8080
和8081
上监听
const http = require("http");
const server = http.createServer(function (require, respose) {
console.log("Client request data...");
respose.end("I'm server on port:8080");
});
server.listen(8080, function () {
console.log("Successfully start server on (port:8080)");
});
const http = require("http");
const server = http.createServer(function (require, respose) {
console.log("Client request data...");
respose.end("I'm server on port:8081");
});
server.listen(8081, function () {
console.log("Successfully start server on (port:8081)");
});
将反代地址改为改为http://myserver
,然后添加负载均衡配置
upstream myserver{
server localhost:8080;
server localhost:8081;
}
然后reload nginx,同时打开两个http://localhost
如果打开多了就会发现,他们是交替进行的。也就是说nginx是根据这个列表轮询的。
分配服务器策略
轮询
刚才的例子就是轮询,也是默认情况。
weight (权重)
按照设置的权重分配,权重越大分配越多。
upstream myserver{
server localhost:8080 weight=1;
server localhost:8081 weight=2;
}
可以看到,分配是按1次8080,2次8081循环的。
ip_hash
根据每个访客IP 的哈希值 分配,这样如果访客IP不变就固定访问一个服务器。
upstream myserver{
ip_hash;
server localhost:8080;
server localhost:8081;
}
fair
按后端服务器的响应时间来分配请求,响应时间短的优先分配。
upstream myserver{
server localhost:8080;
server localhost:8081;
fair;
}
least_conn
最少连接方式,哪个服务器当前处理的连接少, 请求优先转发到这台服务器
upstream myserver{
least_conn;
server localhost:8080;
server localhost:8081;
}