Nginx
介绍
Nginx 是高性能的 HTTP 和反向代理的web服务器,处理高并发能力是十分强大的,能经受高负 载的考验,有报告表明能支持高达 50,000 个并发连接数。
其特点是占有内存少,并发能力强,事实上nginx的并发能力确实在同类型的网页服务器中表现较好,中国大陆使用nginx网站用户有:百度、京东、新浪、网易、腾讯、淘宝等。在全球活跃的网站中有12.18%的使用比率,大约为2220万个网站。
Nginx 是一个安装非常的简单、配置文件非常简洁(还能够支持perl语法)、Bug非常少的服务。Nginx 启动特别容易,并且几乎可以做到7*24不间断运行,即使运行数个月也不需要重新启动。你还能够不间断服务的情况下进行软件版本的升级。
Nginx代码完全用C语言从头写成。官方数据测试表明能够支持高达 50,000 个并发连接数的响应。
反向代理
说到反向代理这里先说一下正向代理。如果把局域网外的 Internet 想象成一个巨大的资源库,则局域网中的客户端要访 问 Internet,则需要通过代理服务器来访问,这种代理服务就称为正向代理。
直白点说:像我们平时通过VPN、游戏加速器等操作或工具去访问外网的东西,这就叫做正向代理。客户端是有操作感知的。
而反向代理:客户端是没有感知的(不需要做任何配置操作)。我们的通过客户端发送请求到反向代理服务器,然后由反向代理服务器去选择请求目标服务器(这里就涉及到均衡负载和服务器集群了)获取数据,再返回给客户端。对外来说,反向代理服务器和目标服务器就是一个整体,体现出来的就是暴露反向代理服务器地址,隐藏真实的目标服务器地址。
在使用的时候主要就是proxy_pass
来指定转发的地址
location{
proxy_pass host
}
负载均衡
当客户端请求逐渐增多后,我们就需要考虑到服务器的压力问题,如果请求过多已经超过了服务器的最大承受能力可能会导致服务器宕机,因此需要来分散这些请求,同时也需要服务器的集群备份,增强整个系统的健壮性。
这里一共有四种负载均衡的算法。
假设我们搭建了了四个后台服务器集群(这里我就是举例子,随便写的地址)
upstream mybackserver{
server 192.168.12.14:8001;
server 192.168.12.15:7001;
server 192.168.12.16:6001;
server 192.168.12.17:7801;
}
轮询(默认)
如其字面意思,轮询就是轮流查询,那么我们配置的使用的时候只需要把mybackserver指向proxy_pass
即刻
server {
listen 8888;
server_name localhost;
root /usr/local/nginx/fileserver/;
location / {
proxy_pass http://mybackserver;
index index.html index.htm;
}
}
权重
该方式主要通过weight关键字来实现权重的分配。在我们前面配置的后台服务器集群请求地址后面加上weight=X
即可。
upstream mybackserver{
server 192.168.12.14:8001;
server 192.168.12.15:7001;
server 192.168.12.16:6001;
server 192.168.12.17:7801;
}
权重给的越高,请求分发的次数也就越多,这里可以看成如果有10次请求,那么server1转发1次,server2转发2次,server3转发3次,server4转发4次。如果不写weight,权重默认值为1。
ip_hash与url_hash
ip_hash:根据客户端请求的ip地址进行hash计算,然后根据计算出来的hash匹配到一个特定的后端server,可以保证session共享的问题。
用法则是在集群配置中加上ip_hash
即可。
upstream mybackserver{
ip_hash;
server 192.168.12.14:8001;
server 192.168.12.15:7001;
server 192.168.12.16:6001;
server 192.168.12.17:7801;
}
url_hash:根据客户端请求的url地址进行hash计算,然后根据计算出来的hash匹配到一个特定的后端server。
要用到url_hash,是要配合缓存命中来使用。
upstream mybackserver{
hash $request_uri;
server 192.168.12.14:8001;
server 192.168.12.15:7001;
server 192.168.12.16:6001;
server 192.168.12.17:7801;
}
fair
按照后端服务器的响应时间来分配请求,响应时间短的优先分配。
upstream mybackserver{
fair;
server 192.168.12.14:8001;
server 192.168.12.15:7001;
server 192.168.12.16:6001;
server 192.168.12.17:7801;
}
动静分离
动静分离这里就是把动态请求与静态请求进行了独立的划分。
静态请求:指的就是一些图片、CSS、文本资源的请求。
动态请求:可以理解为后台业务请求,做反向代理转发。
怎么用?
-
自定路径创建一个存放静态资源的文件夹(假设在更目录下的data文件下创建了一个img文件夹和一个html文件夹)
-
在转发请求的server下配置location路径
server { listen 8888; server_name localhost; root /usr/local/nginx/fileserver/; location / { proxy_pass http://mybackserver; index index.html index.htm; } # 图片资源 location /img/ { root /data/; } # html资源 location /html/ { root /data/; } }
总结
以上三点就是Nginx最核心的东西了,后面拓展的话还有Nginx的高可用集群啥的,就暂不去研究了。这里给了我一个思考,Nginx做反向代理转发以及请求的负载均衡,这和微服务的Gateway干的不是差不多嘛?这两者的关系是啥。。。等我想通了再来更新吧。