文章目录
Nginx介绍
百度百科介绍:nginx
是一款高性能的 http
服务器/反向代理服务器及电子邮件(IMAP/POP3
)代理服务器。由俄罗斯的程序设计师 Igor Sysoev
所开发,官方测试 nginx
能够支支撑5万并发链接,并且 cpu
、内存等资源消耗却非常低,运行非常稳定,所以现在很多知名的公司都在使用 nginx
。
简单来说:Nginx
就是一款http
服务器,主要作用是反向代理、负载均衡、动静分离。
Nginx优点
优点:高性能、吞吐量高(占内存小,可以实现高并发连接、处理响应快)、隐藏内部真实服务器ip地址、可实现http服务器、虚拟主机、反向代理、负载均衡…
缺点:(强行给出缺点)要说缺点的话就是不是Java语言开发的,是C语言开发的。
Nginx应用场景
http
代理、反向代理- 负载均衡
web
缓存
限流、黑白名单等等
Nginx配置文件(nginx.conf)介绍
nginx
的配置由特定的标识符(指令符)分为多个不同的模块,指令符分为简单指令和块指令。
- 简单指令格式:[
name parameters;
] - 块指令格式:和简单指令格式有一样的结构,但其结束标识符不是分号,而是大括号
{}
,块指令内部可以包含simple directives
和block directives
, 可以称块指令为上下文(e.g. events
,http
,server
,location
)conf
文件中,所有不属于块指令的简单指令都属于main
上下文的,http
块指令属于main上
下文,server
块指令http
上下文。
Nginx正向/反向代理
反向代理(Reverse Proxy
)方式是指以代理服务器来接受internet
上的连接请求,然后将请求转发给内部网络上的服务器,并将从服务器上得到的结果返回给internet
上请求连接的客户端,此时代理服务器对外就表现为一个反向代理服务器。
反向代理:反向代理服务器对于客户端而言它就像是原始服务器,并且客户端不需要进行任何特别的设置。
对于反向代理我的理解是:
客户端的所有请求统统会到代理服务器的手上,代理服务器再把请求给到内部真正处理请求的服务器,内部服务器处理完请求返回结果给代理服务器再给到客户端。
(这个过程,客户端是无感知的,感觉就是代理服务器就是它要访问的目标服务器,其实是代理服务器内部转发后处理的一系列操作。)
正向代理:正向代理是一个位于客户端和原始服务器(origin server)之间的服务器。
对于正向代理我的理解是:
真实服务器是不允许被客户端访问,客户端需要通过代理服务器才能访问。
(这个过程,用户是感知的,举个例子:我要访问国外的某个网站,但是国内是不允许直接访问的,但是我知道有个代理服务器,通过代理服务器我可以正常访问到我想访问的那个国外网站)
核心配置代码示例:
server {
listen 80;
server_name www.coco.com;
location / {
proxy_pass http://127.0.0.1:8080;
index index.html index.htm;
}
}
server {
listen 80;
server_name www.darian.com;
location / {
proxy_pass http://127.0.0.1:8081;
index index.html index.htm;
}
}
Nginx实现负载均衡
负载均衡 建立在现有网络结构之上,它提供了一种廉价有效透明的方法扩展网络设备和服务器的带宽、增加吞吐量、加强网络数据处理能力、提高网络的灵活性和可用性。
负载均衡,英文名称为 Load Balance
,其意思就是分摊到多个操作单元上进行执行,例如Web
服务器、FTP
服务器、企业关键应用服务器和其它关键任务服务器等,从而共同完成工作任务。
简单来说: 负载均衡就是解决单台服务器的压力,是一种解决高并发的基本方案。
举例说明: 假设有若干个客户端访问同一台服务器,那么肯定是承受不住的。如果我们用Nginx
作为负载均衡器,让所有的客户端通过Ngxin
负载均衡到若干个服务器,那么就解决了单台服务器的访问压力。我把这理解为负载均衡。
图例说明:
负载均衡策略:
Nginx提供的负载均衡策略有2种:内置策略和扩展策略。内置策略为轮询,加权轮询,Ip hash
。
Ip hash
算法,对客户端请求的ip
进行hash
操作,然后根据hash
结果将同一个客户端ip
的请求分发给同一台服务器进行处理,可以解决session
不共享的问题(现在几乎没有用这种方案的了)。
轮询(默认):通过某种规则比如请求次数hash
机器数量得出被分配的机器坐标。
权重:配置文件中设置服务器的weight
指,越高的则被访问的比率越多,当服务器的性能层次不齐的时候可以指定权重。
配置代码示例:
upstream myproject {
server 127.0.0.1:8000 weight=3;
server 127.0.0.1:8001 weight=5;
server 127.0.0.1:8002 weight=7;
server 127.0.0.1:8003;
}
Ip hash:每个请求按访问ip
的hash
结果分配,这样每个访客固定访问一个后端服务器。
负载均衡配置代码示例:
一个简单的负载均衡的示例,把www.domain.com均衡到本机不同的端口,也可以改为均衡到不同的地址上。
http {
upstream myproject {
server 127.0.0.1:8000 weight=3;
server 127.0.0.1:8001;
server 127.0.0.1:8002;
server 127.0.0.1:8003;
}
server {
listen 80;
server_name www.domain.com;
location / {
proxy_pass http://myproject;
index index.html index.htm;
}
}
}
宕机轮询配置规则
负载均衡时,如果有机器宕机,那么肯定有影响的。
配置示例:
server {
listen 80;
server_name www.darian.com;
location / {
proxy_pass http://myproject;
index index.html index.htm;
# 规定时间内如果轮到的服务器没有响应,那就分给下一个咯
proxy_connect_timeout 1;
proxy_send_timeout 1;
proxy_read_timeout 1;
}
}
Nginx解决网站跨域问题
一般比较大的互联网公司会有自己的网关接口系统,通过域名/项目名来区分项目,进行拦截。
图例:
配置代码示例:
server {
listen 80;
server_name www.darian.com;
location /A {
proxy_pass http://wwwW.lucy.com:81/A;
index index.html index.htm;
}
location /B {
proxy_pass http://wwwW.coco.com:81/B;
index index.html index.htm;
}
}
Nginx配置防盗链
我相信做开发的特别是前端的,都有盗用过别人网站一些资源,最常见的就是图片啦。虽然可以通过代码判断请求头(Header中
)的引用来源的域名区分,但是不用代码的话Nginx也能做到,同时更加方便的解决该问题。
配置代码示例:
location ~* \.(gif|jpg|png|swf|flv)$ {
#root html
valid_referers none blocked *.darian.com;
if ($invalid_referer) {
return 403;
}
}
#前面的root可以不要如果你在server{}中有设置可以不需要设定
Nginx配置DDOS
《Dos与DDos攻击的区别》
《DDoS与PDoS攻击的区别》
解决DDOS
,限制请求速度次数、ip
限制、黑白名单
设置Nginx
、Nginx Plus
的连接请求在一个真实用户请求的合理范围内。比如,如果你觉得一个正常用户每两秒可以请求一次登录页面,你就可以设置Nginx每两秒钟接收一个客户端IP的请求(大约等同于每分钟30个请求)。
配置代码示例:(限制请求速度次数)
limit_req_zone $binary_remote_addr zone=one:10m rate=30r/m;
server {
# 省略其他代码
location /login.html {
limit_req zone=one;
# 省略其他代码
}
}
有兴趣的可以"面向百度学习一波”。
参考文献:
http://www.nginx.cn/doc/
https://www.runoob.com/w3cnote/nginx-setup-intro.html
https://segmentfault.com/a/1190000005789137
https://zhidao.baidu.com/question/466301367.html