• 简易nginx TCP反向代理设置


    nginx从1.9.0开始支持TCP反向代理,之前只支持HTTP。这是我的系统示意图:

    为何需要?

    为什么需要反向代理?主要是:

    1. 负载均衡
    2. 方便管控

    比如我现在要更新后端服务器,如果不用负载均衡的话,在更新过程中,用户会出现无法连接服务器的情况,而一旦用了负载均衡,用户此时的连接请求将会分配到别的没在更新的后端服务器去,尽可能地确保了服务的可用性;再考虑这么种情况,我有多个服务器后端,那么就需要打开多个不同的监听端口,我需要在系统防火墙里做多个配置,如果它们与客户端的连接使用了SSL/TLS,那么得给它们各自配置证书,现在用了反向代理的话这些都简化了,服务器只需要打开一个对外监听端口,证书也只需要给反向代理配置好即可,就是我说的方便管控,当然了,还能方便的管控流量,设置一些额外的访问策略什么的。

    那么反向代理的缺点是什么?我想如果后端多了起来,连接多了起来之后,对nginx来说是一个很大的挑战,毕竟TCP和HTTP不一样,TCP通常是“长连接”,要一直维持着的。到时候如果nginx撑不下去,就考虑用硬件负载均衡吧(不过听说这玩意儿不便宜)。

    安装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这两个参数是否存在:

    #/usr/sbin/nginx -V

    如果没有看到这两个参数,那就只好走老路来安装nginx了。

    允许开机自动运行:

    #systemctl enable nginx

    启动:

    #systemctl start nginx

    对应着以前的service nginx start

    查看nginx状态:

    #systemctl status nginx

    对应着以前的service nginx status

    发现了没有,使用yum安装管理起来也简单了。

    nginx配置

    编辑/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
  • 相关阅读:
    .net core项目iis10上出现 HTTP 错误 500.19,错误代码:0x8007000d
    redis安装
    【Docker】来自官方映像的 6 个 Dockerfile 技巧
    vi编辑器内上下左右健变ABCD的修复方法
    linux下安装ping命令
    Managing Chef Cookbooks the Berkshelf way
    chef学习杂记
    源代码与二进制异同
    chef 配置之 Templates
    shell ${}的使用
  • 原文地址:https://www.cnblogs.com/guogangj/p/5207104.html
Copyright © 2020-2023  润新知