原理

Nginx为什么那么快

Nginx采用多进程+epoll的方式对请求进行处理,每一个请求就是对socket时间的读写,相比传统的阻塞IO,epoll通过IO多路复用的方式,在同一个线程中高效的完成读写操作,相比多线程减少了线程间切换的消耗,极大地提升了效率。

Nginx请求流程

  1. 初始化
  2. 请求解析
  3. 请求处理
  4. 数据过滤
  5. 返回

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

缓存

  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应用

  1. 静态负载均衡
    通过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;
}
}
  1. 动态负载均衡
    使用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优化配置

  1. 在nginx.conf中调整Worker数
  2. 调整最大连接数
    vim /etc/security/limits.conf
  • soft nofile 655360
  • hard nofile 655360