原理
Nginx为什么那么快
Nginx采用多进程+epoll的方式对请求进行处理,每一个请求就是对socket时间的读写,相比传统的阻塞IO,epoll通过IO多路复用的方式,在同一个线程中高效的完成读写操作,相比多线程减少了线程间切换的消耗,极大地提升了效率。
Nginx请求流程
- 初始化
- 请求解析
- 请求处理
- 数据过滤
- 返回
Master和Worker的关系
Master进程Fork出Worker进程,Master进程不参与请求的处理,只有Worker进程参与,Master进程只负责任务的分发、Worker进程状态监控。
Worker进程数通常在nginx.conf文件中配置,默认为cpu数
使用
1. 反向代理
http {
server {
listen 80; # 监听80端口
location / { # 正则表达式匹配路由
proxy_pass http://real_server; # 请求转发
}
}
}
负载均衡
http {
......
upstream real_server {
server 192.168.103.100:2001 weight=1 max_fails=2 fail_timeout=60s;;#轮询服务器和访问权重
server 192.168.103.100:2002 weight=2 max_fails=2 fail_timeout=60s;;
}
server {
listen 80;
location / {
proxy_pass http://real_server;
}
}
fail_timeout时间内失败了max_fails次请求后,则认为该上游服务器不可用,然后将该服务地
址踢除掉。fail_timeout时间后会再次将该服务器加入存活列表,进行重试
黑名单
http {
server {
listen 80; # 监听80端口
location / { # 正则表达式匹配路由
proxy_pass http://real_server; # 请求转发
deny 192.168.1.1; # 拒绝访问
allow 10.1.1.0/16; # 通过
}
}
}
方案2: 通过lua脚本+redis可以实现动态添加
限流
geo $limit {
default
1;192.168.2.0/24
0;
}
map $limit $limit_key {
1 $binary_remote_addr;
0 "";
}
limit_req_zone $limit_key zone=mylimit:100m rate=10r/s;
location / {
limit_req zone=mylimit burst=1 nodelay;
proxy_pass http://real_server;
}
每秒最大10个请求
排队大小为1
缓存
- 静态资源缓存
location ~*.(jpg|jpeg|png|gif|ico|css|js)$ {
expires 2d;
}
解决跨域
跨域原因:
出于浏览器的同源策略限制。同源策略(Sameoriginpolicy)是一种约定,它是浏览器最核心也最基本
的安全功能,如果缺少了同源策略,则浏览器的正常功能可能都会受到影响。可以说Web是构建在同源
策略基础之上的,浏览器只是针对同源策略的一种实现。同源策略会阻止一个域的javascript脚本和另
外一个域的内容进行交互。所谓同源(即指在同一个域)就是两个页面具有相同的协议(protocol),
主机(host)和端口号(port)
server {
location / {
root html;
index index.html index.htm;
//允许cros跨域访问
add_header 'Access-Control-Allow-Origin' '*';
}
//自定义本地路径
location /apis {
rewrite ^.+apis/?(.*)$ /$1 break;
include uwsgi_params;
proxy_pass http://www.binghe.com;
}
}
四层负载均衡
四层负载均衡和七层负载均衡的区别:四层是在OSI模型第四层就开始进行负载均衡,如针对TCP协议,七层则根据应用,如HTTP应用
- 静态负载均衡
通过ngx_stream_core_module模块来完成
stream {
upstream mysql_backend {
server 192.168.175.100:3306 max_fails=2 fail_timeout=10s weight=1;
least_conn;
}
server {
#监听端口,默认使用的是tcp协议,如果需要UDP协议,则配置成listen 3307 udp;
listen 3307;
#失败重试
proxy_next_upstream on;
proxy_next_upstream_timeout 0;
proxy_next_upstream_tries 0;
#超时配置
#配置与上游服务器连接超时时间,默认60s
proxy_connect_timeout 1s;
#配置与客户端上游服务器连接的两次成功读/写操作的超时时间,如果超时,将自动断开连接
#即连接存活时间,通过它可以释放不活跃的连接,默认10分钟
proxy_timeout 1m;
#限速配置
#从客户端读数据的速率,单位为每秒字节数,默认为0,不限速
proxy_upload_rate 0;
#从上游服务器读数据的速率,单位为每秒字节数,默认为0,不限速
proxy_download_rate 0;
#上游服务器
proxy_pass mysql_backend;
}
}
- 动态负载均衡
使用nginx-upsync-module模块
stream {
upstream mysql_backend {
server 127.0.0.1:1111;
#占位server
upsync 192.168.175.100:8500/v1/kv/upstreams/mysql_backend
upsync_timeout=6m upsync_interval=500ms upsync_type=consul
strong_dependency=off;
upsync_dump_path /usr/local/nginx-1.17.2/conf/mysql_backend.conf;
}
server {
#监听端口,默认使用的是tcp协议,如果需要UDP协议,则配置成listen 3307 udp;
listen 3307;
#失败重试
proxy_next_upstream on;
proxy_next_upstream_timeout 0;
proxy_next_upstream_tries 0;
#超时配置
#配置与上游服务器连接超时时间,默认60s
proxy_connect_timeout 1s;
#配置与客户端上游服务器连接的两次成功读/写操作的超时时间,如果超时,将自动断开连接
#即连接存活时间,通过它可以释放不活跃的连接,默认10分钟
proxy_timeout 1m;
#限速配置
#从客户端读数据的速率,单位为每秒字节数,默认为0,不限速
proxy_upload_rate 0;
#从上游服务器读数据的速率,单位为每秒字节数,默认为0,不限速
proxy_download_rate 0;
#上游服务器
proxy_pass mysql_backend;
}
server {
listen 13307;
upstream_show;
}
}
Nginx优化配置
- 在nginx.conf中调整Worker数
- 调整最大连接数
vim /etc/security/limits.conf- soft nofile 655360
- hard nofile 655360