什么是nginx?
nginx是一款高性能的http 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器。
作用:集群(提高吞吐量,减轻单台服务器压力),反向代理(不暴露真实IP地址),虚拟服务器,静态服务器(动静分离)。解决跨域问题,使用nginx搭建企业级api接口网关
反向代理服务器:
Nginx、lvs、F5(硬件)、haproxy
nginx应用场景
1、http服务器。Nginx是一个http服务可以独立提供http服务。可以做网页静态服务器。
2、虚拟主机。可以实现在一台服务器虚拟出多个网站。例如个人网站使用的虚拟主机。
3、反向代理,负载均衡。当网站的访问量达到一定程度后,单台服务器不能满足用户的请求时,需要用多台服务器集群可以使用nginx做反向代理。并且多台服务器可以平均分担负载,不会因为某台服务器负载高宕机而某台服务器闲置的情况。
安全架构:
1.nginx反向代理
2.使用https防止抓包分析
3.搭建企业黑名单和白名单,防盗链
4.模拟请求(csrf),Xss,sql注入
5.ddos(流量攻击,让别人无法访问),使用nginx解决。
6CDN加速,也就是动静分离
nginx配置文件分为3块:
第一部分:全局块:主要设置一些影响nginx服务器运行的配置指令
#user nobody; #error_log logs/error.log; #pid logs/nginx.pid; |
worker_processes 1:表示nginx服务器处理并发服务的关键配置,work_processes值越大,可以支持的并发处理量也就越多,但是会受到硬件,软件等设备的制约。
第二部分:events块:涉及的指令主要影响nginx服务器与用户的网络连接
events { |
worker_connections 1024:表示支持的最大连接数为1024
第三部分:http块:nginx配置最频繁的部分,代理,缓存和日志定义等绝大多数功能和第三方模块配置都在这里
http块可以包括http全局块和server块
(1)http全局块:指令包含文件引入,日志定义,连接超时时间,单链接请求数上限等
include mime.types; #log_format main '$remote_addr - $remote_user [$time_local] "$request" ' #access_log logs/access.log main; sendfile on; #keepalive_timeout 0; |
(2)server块:这和虚拟主机有密切关系,每个http块可以包括多个server块,而每个server就相当于一个虚拟主机
而每个server块也分为多个全局server块,以及同事包含多个location块
一:全局server块:最常见的配置是虚拟主机的监听配置和本虚拟主机的名称或ip配置
二:location块:这块主要作用是基于Nginx服务器接受到的请求字符串(例如server——name/uri_string),对虚拟主机名称(也可以是IP别名)之外的字符串(例如前面的/uri_string)进行匹配,对特定的请求进行处理。地址定向,数据缓存和应答控制等功能,还有许多第三方模块的配置也在这里运行。
例:
server {
|
配置静态访问
Web server很重要一部分工作就是提供静态页面的访问,例如images, html page。nginx可以通过不同的配置,根据request请求,从本地的目录提供不同的文件返回给客户端。
打开安装目录下的nginx.conf文件,默认配置文件已经在http指令块中创建了一个空的server块,在nginx中的http块中已经创建了一个默认的server块。内容如下:
server { #本地ip+端口 listen 80; server_name localhost;
#文件夹 location /dist { #静态资源路径 root /data/; index index.html index.htm; }
#文件夹 location /image{ #静态资源路径 root /data/; #列出文件夹中的内容,可以不加 autoindex on; } error_page 500 502 503 504 /50x.html; location = /50x.html { root html; } } |
如果动态文件个静态文件混合在一起发布,通过nginx区分,通过location指定不同的后缀名实现不同的请求转发,通过expires参数设置,可以使浏览器缓存过期时间,减少与服务器之前的请求和流量,具体的expires定义:是给一个资源设定一个过期时间,也就是说无需去服务器验证,直接通过浏览器自身确认是否过期即可,所以不会产生额外的流量,此种方法不适合经常变动的资源,例如设置成3d,表示3天内访问这个url,发送一个请求,对比服务器该文件最后更新时间没有变化,则不会从服务器抓取,返回状态码304,如果有修改,则直接从服务器重新下载,返回状态码200.
nginx解决网站跨域问题
配置:
server { listen 80; server_name www.baidu.com;
#以A开头的项目 location /A { proxy_pass http://a.a.com:81/A; index index.html index.htm; }
#以B开头的项目 location /B { proxy_pass http://b.b.com:81/B; index index.html index.htm; } } |
nginx配置防盗链
#防盗链文件类型 location ~ .*\.(jpg|jpeg|JPG|png|gif|icon)$ { #白名单,允许文件链出的域名白名单,域名与域名之间使用空格隔开 #valid_referers 在浏览器直接输入图片地址就不会再显示图片 valid_referers blocked http://www.baidu.com www.alibaba.com; if ($invalid_referer) { # 防盗链设置的防盗链返回403 return 403; } } |
nginx配置DDOS(流量攻击)
限制请求次数:
设置Nginx、Nginx Plus的连接请求在一个真实用户请求的合理范围内。比如,如果你觉得一个正常用户每两秒可以请求一次登录页面,你就可以设置Nginx每两秒钟接收一个客户端IP的请求(大约等同于每分钟个请求)。
limit_req_zone $binary_remote_addr zone=one:10m rate=2r/s; server { ... location /login.html { limit_req zone=one; ... } }
|
`limit_req_zone`命令设置了一个叫one的共享内存区来存储请求状态的特定键值,在上面的例子中是客户端IP($binary_remote_addr)。location块中的`limit_req`通过引用one共享内存区来实现限制访问/login.html的目的。
限制请求速度:
设置Nginx、Nginx Plus的连接数在一个真实用户请求的合理范围内。比如,你可以设置每个客户端IP连接/store不可以超过10个。
漏桶算法可以很好地限制容量池的大小,从而防止流量暴增。如果针对uri+ip作为监测的key,就可以实现定向的设定指定ip对指定uri容量大小,超出的请求做队列处理(队列处理要引入消息机制)或者丢弃处理。这也是v2ex对流量拦截的算法,针对uri+ip做流量监测。
集群:
当单台服务器,接受高并发情况下,容易宕机,瘫痪时:
使用nginx做反向代理(隐藏IP),集群分布式时采用负载均衡做轮询分配
在集群中产生的问题:
1分布式job幂等性问题(使用XXLjob分布式任务调度平台)
2会话共享问题
3分布式生成全局ID:
如使用时间戳生成订单号,解决:1提前生成,存在redis中;2 使用zookpeer分布式锁,同一时刻只能有一个jvm生成订单号
负载均衡策略(前三种重要,后两种做了解)
4、fair(第三方) 5、url_hash(第三方) |
宕机轮训配置规则:
server { listen 80; server_name www.baidu.com; location / { #对应轮询时的backserver proxy_pass http://backserver; index index.html index.htm; #超时 proxy_connect_timeout 1; proxy_send_timeout 1; proxy_read_timeout 1; }
} |
session共享解决办法:
利用数据库同步session
利用cookie同步session数据(安全性差、http请求都需要带参数增加了带宽消耗)
使用spring-session+Redis
nginx负载均衡策略ip绑定
tomcat配置session共享,占内存
token 重写session
高并发&&高可用&高吞吐量解决方案:
数据库:
1.慢查询定位sql语句 进行优化
2.sql语句优化
3.减少全表扫描
4.使用索引:注意索引使用事项
5.分表分库:水平分割(取模算法),垂直分割
6.主从赋值:mysql集群,原理是通过二进制日志文件
7.读写分离:使用mycat进行管理
缓存机制:
1.使用redis缓存数据库内容
2.redis集群(主从复制)
3.redis读写分离
4.使用redis哨兵机制进行监听
服务器:
反向代理,负载均衡,集群,动静分离
客户端(页面):
1.减少请求
2.用户体验好的话使用ajax异步加载
3.动静分离
4.CDN加速(减轻宽带传输压力,从近访问服务器,比如上海访问上海的服务器,青岛访问青岛的服务器)
项目优化:
1.代码重构
2.jvm调优(垃圾回收机制,回收机制算法,新生代老年代比例),配置jvm参数
3.项目采用分布式和微服务架构