nginx从1.9.0开始支持TCP反向代理,以前只支持HTTP。这是个人系统示意图:html
为何须要反向代理?主要是:nginx
负载均衡算法
方便管控后端
好比我如今要更新后端服务器,若是不用负载均衡的话,在更新过程当中,用户会出现没法链接服务器的状况,而一旦用了负载均衡,用户此时的链接请求将会分配到别的没在更新的后端服务器去,尽量地确保了服务的可用性;再考虑这么种状况,我有多个服务器后端,那么就须要打开多个不一样的监听端口,我须要在系统防火墙里作多个配置,若是它们与客户端的链接使用了SSL/TLS,那么得给它们各自配置证书,如今用了反向代理的话这些都简化了,服务器只须要打开一个对外监听端口,证书也只须要给反向代理配置好便可,就是我说的方便管控,固然了,还能方便的管控流量,设置一些额外的访问策略什么的。centos
那么反向代理的缺点是什么?我想若是后端多了起来,链接多了起来以后,对nginx来讲是一个很大的挑战,毕竟TCP和HTTP不同,TCP一般是“长链接”,要一直维持着的。到时候若是nginx撑不下去,就考虑用硬件负载均衡吧(不过据说这玩意儿不便宜)。浏览器
安装nginx的旧方法固然是去官网下载tar包,解压缩,configure,make……我在《HappyAA服务器部署笔记1》中有详细描述,如今咱们不妨改进一下——用yum安装,这样更省事。我用的CentOS7的默认yum容器貌似并无nginx,须要本身加装一下,其实很简单,改一下配置便可。在/etc/yum.repo.d底下建立文件nginx.repo,内容为:缓存
[nginx] name=nginx repo baseurl=http://nginx.org/packages/mainline/centos/$releasever/$basearch/ gpgcheck=0 enabled=1
而后:安全
#yum install nginx
nginx默认安装在/usr/sbin/nginx,检验下是否咱们须要的nginx版本:服务器
#/usr/sbin/nginx -v
我安装的是1.9.11,没问题!再看看--with-stream和--with-stream_ssl_module这两个参数是否存在:session
#/usr/sbin/nginx -V
若是没有看到这两个参数,那就只好走老路来安装nginx了。
容许开机自动运行:
#systemctl enable nginx
启动:
#systemctl start nginx
对应着之前的service nginx start
查看nginx状态:
#systemctl status nginx
对应着之前的service nginx status
发现了没有,使用yum安装管理起来也简单了。
编辑/etc/nginx/nginx.conf
stream{ upstream backend{ 1) hash $remote_addr consistent; server 127.0.0.1:7397 max_fails=3 fail_timeout=10s; 2) server 127.0.0.1:7398 max_fails=3 fail_timeout=10s; } server{ listen 1268 ssl; 3) ssl_certificate /home/guogangj/certs/cert1268.pem; 4) ssl_certificate_key /home/guogangj/certs/key1268.pem; 5) ssl_session_cache shared:SSL:10m; 6) ssl_session_timeout 10m; 7) ssl_ciphers HIGH:!aNULL:!MD5; 8) ssl_prefer_server_ciphers on; 9) proxy_connect_timeout 20s; 10) proxy_timeout 5m; 11) proxy_pass backend; 12) } }
配置说明:
1) 设置一个叫“backend”的后端配置
2) 我有两个后端服务器,其中之一监听在7397端口,nginx尝试链接之,(10秒钟为断定失败的时长,这个我暂时也不太明白)最多失败3次,超过则再也不重试
3) nginx监听在1268端口,使用SSL安全链接
注意:有必要的话,调整firewalld或iptables来容许这个端口的外部访问,对firewalld来讲,能够添加这样的策略
firewall-cmd --zone=public --add-port=1268/tcp --permanent firewall-cmd --reload
查看一下firewalld的策略列表:
firewall-cmd --permanent --zone=public --list-all
4) 所使用的X.509证书文件(PEM格式),对证书不熟悉的请参考《那些证书相关的玩意儿》,对于使用TCP协议的服务器端,实际上是能够用自签的证书的,(如何生成自签证书,刚提到的文章里也有说明)你客户端“认”它就是了,反正咱们的目的就是防范中间人攻击,不像作网站,咱们得让浏览器“认”证书才行
5) 证书私钥文件
6) 设置SSL Session Cache使用“shared”方式更有利于提升资源的利用率,“SSL”是给缓存起的名字,你能够改为别的(这个名字如何用我如今不太清楚),“10m”为缓存大小(1M的缓存大约能够存放4000个session)
7) SSL Session的失效时间,默认5分钟,我设为10分钟
8) 指定SSL加密算法,照写便可(我一看数学就头大,因此至今仍未明白RSA的数学原理)
9) 更偏向于使用服务器的加密算法(这个我不太明白什么意思)
10) 指定nginx链接后端服务器超时的时间,指定为20秒
11) 距离上一次成功访问(链接或读写)后端服务器的时间超过了5分钟就断定为超时,断开此链接
12) 将TCP链接及数据收发转向叫“backend”的后端(这句话很关键)
好像没啥好说的了,客户端链接1268这个端口完事。哦,对了,改好配置了别忘记重启下nginx:
#systemctl restart nginx