分类 运维 下的文章

Nginx 限制文件上传大小,相应配置参数:client_max_body_size

注意:该参数在nginx.conf中默认是没有配置的,不配置的情况下,nginx默认限制请求附件大小为:1M。

处理方式:

找到nginx的配置文件nginx/conf/nginx.conf,在location块中,添加如下参数配置:

client_max_body_size 10m; # 改为你需要的大小

三者设置的区别在于,作用域不同:
--- 设置到http{}内,控制全局nginx所有请求报文(附件)大小;
--- 设置到server{}内,控制该server的所有请求报文(附件)大小;
--- 设置到location{}内,只控制满足该路由规则的请求报文(附件)大小。

负载均衡器(LB)负责分发设备的 MQTT 连接与消息到 EMQ X 集群,采用 LB 可以提高 EMQ X 集群可用性、实现负载平衡以及动态扩容。

HAProxy 是一款使用 C 语言编写的自由及开放源代码软件,其提供高可用性、负载均衡,以及基于 TCP 和 HTTP 的应用程序代理,它是免费、快速并且可靠的一种解决方案。

本文将介绍如何基于 HAProxy 部署 EMQ X 集群并在 HAProxy 上终结 SSL 连接,这种部署模式下 EMQ X 单集群可轻松支持数百万设备。

准备
软硬件版本

Ubuntu 18.04
EMQ X Broker v4.2.5
HAProxy 2.2+
机器分配

172.16.239.107:HAProxy
172.16.239.108:EMQ X 节点 1
172.16.239.109:EMQ X 节点 2
安装
EMQX
参考 EMQ X Broker

wget https://www.emqx.io/downloads/broker/v4.2.5/emqx-ubuntu18.04-4.2.5-x86_64.zip

unzip emqx-ubuntu18.04-4.2.5-x86_64.zip
HAProxy
sudo apt-get update
sudo apt-get install software-properties-common -y
sudo add-apt-repository -y ppa:vbernat/haproxy-2.2
sudo apt-get update
sudo apt-get install -y haproxy=2.2.*
配置
EMQX
修改 emqx/etc/emqx.conf 配置文件,另一台同理

修改节点名

node.name = emqx@172.16.239.108

修改集群策略为static,无需手动添加节点了

cluster.discovery = static

所有集群节点

cluster.static.seeds = emqx@172.16.239.108, emqx@172.16.239.109

为了获取 IP 地址,需要设置 proxy_protocol

listener.tcp.external.proxy_protocol = on
HAProxy
修改 /etc/haproxy/haproxy.cfg

添加 TCP backend 配置

backend backend_emqx_tcp

mode tcp
balance roundrobin
server emqx_node_1 172.16.239.108:1883 check-send-proxy send-proxy-v2 check inter 10s fall 2 rise 5
server emqx_node_2 172.16.239.109:1883 check-send-proxy send-proxy-v2 check inter 10s fall 2 rise 5

添加 dashboard backend 配置

backend backend_emqx_dashboard

balance roundrobin
server emqx_node_1 172.16.239.108:18083 check
server emqx_node_2 172.16.239.109:18083 check

添加 TCP frontend 配置

frontend frontend_emqx_tcp

bind *:1883
option tcplog
mode tcp
default_backend backend_emqx_tcp

添加 dashboard frontend 配置

frontend frontend_emqx_dashboard

bind *:18083
option tcplog
mode tcp
default_backend backend_emqx_dashboard

运行
EMQX
$ ./bin/emqx start

查看集群状态

$ ./bin/emqx_ctl cluster status

Cluster status: #{running_nodes =>

                  ['emqx@172.16.239.108','emqx@172.16.239.109'],
              stopped_nodes => []}

HAProxy
$ sudo service haproxy start
此时便可以通过 18083 访问 dashboard
2822462860-600f7a56c9010.png
通过 1883 连接到集群,连接情况可以在 dashboard 查看,或者在节点上执行命令

$ ./bin/emqx_ctl clients list
证书
如果需要 TLS 终结,先准备好 emqx.key 和 emqx.crt 文件,然后合并生成 emqx.pem 文件

$ cat emqx.crt emqx.key > emqx.pem
然后添加以下配置即可

frontend frontend_emqx_tcp

bind *:8883 ssl crt /opt/certs/emqx.pem no-sslv3
option tcplog
mode tcp
default_backend backend_emqx_tcp

至此,我们完成了基于 HAProxy 搭建 EMQ X 集群以及使用

负载均衡
负载均衡部分是非常简单的。

upstream my_http {

    server 127.0.0.1:8080 weight=1;
    server 127.0.0.1:9090 weight=2;

}
server {

listen 80;
listen [::]:80;

# security
include nginxconfig.io/security.conf;
location / {
    include nginxconfig.io/proxy.conf;
    proxy_pass http://my_http;
}

}

重点就在于upstream部分。此处需要先定义一个upstream,然后在下方引用即可。

分配方式在upstream块中定义即可。

nginx的upstream目前支持5种方式的分配

1、轮询(默认)

每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器down掉,能自动剔除。

2、weight

指定轮询几率,weight和访问比率成正比,用于后端服务器性能不均的情况。

3、ip_hash

每个请求按访问ip的hash结果分配,这样每个访客固定访问一个后端服务器,可以解决session的问题。

upstream bakend {

​ ip_hash;

​ server 192.168.203.14:88;

​ server 192.168.203.15:80;

}

4、fair(第三方)

按后端服务器的响应时间来分配请求,响应时间短的优先分配。

upstream bakend {

​ fair;

​ server 192.168.203.14:88;

​ server 192.168.203.15:80;

}

5、url_hash(第三方)

按访问url的hash结果来分配请求,使每个url定向到同一个后端服务器,后端服务器为缓存时比较有效。

自动容灾(故障转移)
下面就是本文的重头戏,关于nginx的自动容灾(故障转移)部分。

所谓自动容灾(故障转移),就是在后台服务器中出现故障时,能够自动转移到健康的服务器上,来维持整个服务的稳定。

配置也是比较简单的,在负载均衡的基础上添加一些配置即可。重点在于两段加了注释的内容,其余的都是装饰。

轮询服务器,weight为服务器权重,与访问频率成正比,max_fails最大超时次数,fail_timeout服务器代理监听超时时间

upstream backend_server {

server 192.168.203.43:80 weight=1 max_fails=2 fail_timeout=10s;
server 192.168.203.44:80 weight=1 max_fails=2 fail_timeout=10s;
server 192.168.203.45:80 weight=1 max_fails=2 fail_timeout=10s;

}
server {

listen 80;
listen [::]:80;

# security
include nginxconfig.io/security.conf;
location / {
     #如果后端的服务器返回502、504、执行超时等错误,自动将请求转发到upstream负载均衡池中的另一台服务器,实现故障转移。  
     proxy_next_upstream http_502 http_504 error timeout invalid_header;
    #设置一些超时时间。可选
    proxy_next_upstream_timeout 1s;
    proxy_next_upstream_tries 2;
    proxy_connect_timeout 1s;
    proxy_read_timeout 1s;
    proxy_send_timeout 1s;
    
    include nginxconfig.io/proxy.conf;
    proxy_pass http://my_http;
}

}

http://www.52im.net/topic-tcpipvol1.html

TCP/IP协议分层

TCP/IP协议族按照层次由上到下,层层包装。最上面的就是应用层了,这里面有http,ftp,等等我们熟悉的协议。而第二层则是传输层,著名的TCP和UDP协议就在这个层次(不要告诉我你没用过udp玩星际)。第三层是网络层,IP协议就在这里,它负责对数据加上IP地址和其他的数据(后面会讲到)以确定传输的目标。第四层是叫数据链路层,这个层次为待传送的数据加入一个以太网协议头,并进行CRC编码,为最后的数据传输做准备。再往下则是硬件层次了,负责网络的传输,这个层次的定义包括网线的制式,网卡的定义等等(这些我们就不用关心了,我们也不做网卡),所以有些书并不把这个层次放在tcp/ip协议族里面,因为它几乎和tcp/ip协议的编写者没有任何的关系。发送协议的主机从上自下将数据按照协议封装,而接收数据的主机则按照协议从得到的数据包解开,最后拿到需要的数据。这种结构非常有栈的味道,所以某些文章也把tcp/ip协议族称为tcp/ip协议栈。

数据链路层

数据链路层有三个目的:
· 为IP模块发送和 接收IP数据报。
· 为ARP模块发送ARP请求和接收ARP应答。
· 为RARP发送RARP请 求和接收RARP应答
ip大家都听说过。至于ARP和RARP,ARP叫做地址解析协议,是用IP地址换MAC地址的一种协议,而RARP则叫做逆地址解析协议,在tcp/ip协议的后面章节会介绍它们(在局域网里面用ARP协议可以很容易的搞瘫痪网络哦)
数据链路层的协议还是很多的,有我们最常用的以太网(就是平时我们用的网卡)协议,也有不太常见的令牌环,还有FDDI,当然,还有国内现在相当普及的PPP协议(就是adsl宽带),以及一个loopback协议。