一 反向代理
反向代理(Reverse Proxy)方式是指以代理服务器接收internet上的连接请求,然后将请求转发给内部网络上的服务器,并将从服务器上得到的结果返回给internet上请求连接的客户端,此时代理服务器对外就表现为一个服务器
从上图可以看出:反向代理 服务器位于网站机房,代理网站Web服务器接收http请求,对请求进行转发.
二 反向代理的作用
(1) 保护网站安全:任何来自Internet的请求都必须先经过代理服务器
(2) 通过配置缓存功能加速Web请求:可以缓存真实Web服务器上的某些静态资源,减轻真实Web服务器的负载压力
(3) 实现负载均衡:充当负载均衡服务器均衡地分发请求,平衡集群中各个服务器的负载压力
三 nginx的负载均衡
对于同一个链接中的数据包,负载均衡回将其进行NAT转换后,转发至后端固定的服务器进行处理,这是负载均衡最基本,最原始的功能。负载均衡系统内部会专门有一张表来记录这些连接的状况,包括【源IP: 端口】【目的IP: 端口】【服务器IP: 端口】,空闲超时时间(Idle Timeout)等
由于负载均衡内部记录连接状态的这张表需要消耗系统的内部资源。因此这张表不可能无限大,所有厂家都有一定的限制。这张表的大小一般称之为最大并发连接数,也就是系统同时能够容纳的连接数量。考虑到建立这些连接的客户端或服务器会发生一些异常情况,导致这些连接不能被正常终结掉,因此负载均衡的当前连接状态表项中,设计了一个空闲超时时间的参数。这个参数定义为,当该连接在一定时间内无流量通过时,负载均衡会自动删除该连接条目,释放系统资源。
https://kb.cnblogs.com/page/559213/ 这个再好好看看
四 nginx的发展
nginx是一款轻量级的网页服务器,反向代理器以及电子邮件代理服务器,其将源代码以类BSD许可证的形式发布,因它的稳定性,丰富的功能集,实例配置文件和低系统资源的消耗而闻名.
说道Web服务器,Apache服务器和IIS服务器是两大巨头,但是运行速度更快,更灵活的对手nginx正在迎头赶上
五 nginx的核心特点
(1)跨平台:Nginx 可以在大多数 Unix like OS编译运行,而且也有Windows的移植版本;
(2)配置异常简单:非常容易上手。配置风格跟程序开发一样,神一般的配置;
(3)非阻塞、高并发连接:数据复制时,磁盘I/O的第一阶段是非阻塞的。官方测试能够支撑5万并发连接,在实际生产环境中跑到2~3万并发连接数。(这得益于Nginx使用了最新的epoll模型);
(4)事件驱动:通信机制采用epoll模型,支持更大的并发连接。(总结:通过异步非阻塞的事件处理机制,Nginx实现由进程循环处理多个准备好的事件,从而实现高并发和轻量级。)
(5)Master/Worker结构:一个master进程,生成一个或多个worker进程。
(6)内存消耗小:处理大并发的请求内存消耗非常小。在3万并发连接下,开启的10个Nginx 进程才消耗150M内存(15M*10=150M)。
(7)内置的健康检查功能:如果 Nginx 代理的后端的某台 Web 服务器宕机了,不会影响前端访问。
(8)节省带宽:支持 GZIP 压缩,可以添加浏览器本地缓存的 Header 头。
(9)稳定性高:用于反向代理,宕机的概率微乎其微。
六 实战:构建nginix+ tomcat构筑Web服务器集群的负载均衡
-- 启动
sudo /xxx/openresty/nginx/sbin/nginx
-- 停止
sudo /xxx/openresty/nginx/sbin/nginx -s stop
-- 重新加载配置文件
sudo /xxx/openresty/nginx/sbin/nginx -s reload
ng 负载均衡:
http { upstream myapp1 { server srv1.example.com; server srv2.example.com; server srv3.example.com; } server { listen 80; location / { proxy_pass http://myapp1; } } }
1 安装无论使用何种方法,都需要安装 pcre 库 libpcre,这是安装nginx必须的
2 安装 libdrizzle 1.0
wget http://agentzh.org/misc/nginx/drizzle7-2011.07.21.tar.gz tar zxvf drizzle7-2011.07.21.tar.gz cd drizzle7-2011.07.21 ./configure --without-server make libdrizzle-1.0 make install-libdrizzle-1.0
3 openresty重新configure一下
./configure --prefix=/usr/local/openresty --with-luajit --with-http_drizzle_module --with-libdrizzle=/usr/local
#user nobody; worker_processes 4; events { worker_connections 1024; } http { include mime.types; default_type application/octet-stream; sendfile on; keepalive_timeout 65; #gzip on; upstream mysql { drizzle_server 127.0.0.1:3306 dbname=nginx user=root password=root protocol=mysql; } server { listen 80; server_name localhost; location = /mysql-status{ drizzle_status; } location /mysql { drizzle_pass mysql; drizzle_query "select id,name,age from users where id = 1"; rds_json on; } location /hello { default_type 'text/plain'; content_by_lua 'ngx.say("hello, lua")'; # root html; # index index.html index.htm; } error_page 500 502 503 504 /50x.html; location = /50x.html { root html; } } }
七 单机nginx应对高并发处理
nginx是一个高效的服务器,但是如果只是安装没有进行什么配置,只能承受1024个并发请求。那么如何可以让nginx轻松应对5000甚至10000的高并发呢
1 系统层面
(1) 调整同时打开文件数量
ulimit -n 20480
(2) TCP最大连接数(somaxconn) socat的最大连接数
echo 10000 > /proc/sys/net/core/somaxconn
(3) TCP连接立即回收、回用(recycle、reuse)
echo 1 > /proc/sys/net/ipv4/tcp_tw_reuse
echo 1 > /proc/sys/net/ipv4/tcp_tw_recycle
(4) 不做TCP洪水抵御
echo 0 > /proc/sys/net/ipv4/tcp_syncookies
也可以直接使用优化后的配置,在/etc/sysctl.conf中加入:
net.core.somaxconn = 20480
net.core.rmem_default = 262144
net.core.wmem_default = 262144
net.core.rmem_max = 16777216
net.core.wmem_max = 16777216
net.ipv4.tcp_rmem = 4096 4096 16777216
net.ipv4.tcp_wmem = 4096 4096 16777216
net.ipv4.tcp_mem = 786432 2097152 3145728
net.ipv4.tcp_max_syn_backlog = 16384
net.core.netdev_max_backlog = 20000
net.ipv4.tcp_fin_timeout = 15
net.ipv4.tcp_max_syn_backlog = 16384
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_tw_recycle = 1
net.ipv4.tcp_max_orphans = 131072
net.ipv4.tcp_syncookies = 0
使用:sysctl -p 生效
sysctl -p
二、nginx层面
修改nginx配置文件,nginx.conf
增加work_rlimit_nofile和worker_connections数量,并禁用keepalive_timeout。
worker_processes 1; #nginx 进程数,建议按照cpu 数目来指定,一般为它的倍数
worker_rlimit_nofile 20000; #一个nginx 进程打开的最多文件描述符数目,理论值应该是最多打开文件数(ulimit -n)与nginx 进程数相除,但是nginx 分配请求并不是那么均匀,所以最好与ulimit -n 的值保持一致
events {
use epoll;#使用epoll的I/O模型
worker_connections 20000;#每个进程允许的最多连接数, 理论上每台nginx 服务器的最大连接数为worker_processes*worker_connections
multi_accept on;
}
http {
keepalive_timeout 0;
}
重启nginx
service nginx restart