nginx反向代理emqx

1. docker部署emqx

services:
  emqx:
    image: emqx/emqx:5.10.0
    container_name: emqx4
    privileged: true
    #restart: always
    environment:
       - "EMQX_NODE_NAME=emqx@node1.emqx.io"
       - "EMQX_CLUSTER__DISCOVERY_STRATEGY=static"
    healthcheck:
      test: ["CMD", "/opt/emqx/bin/emqx", "ctl", "status"]
      interval: 5s
      timeout: 25s
      retries: 5
    networks:
      emqx-bridge:
        aliases:
         - node1.emqx.io
    ports:
      - 1883:1883
      - 8083:8083
      - 8084:8084
      - 8883:8883
      - 18083:18083
    volumes:
#      - /volume1/docker/emqx/data:/opt/emqx/data
      - /volume1/docker/emqx/emqx4/emqx.conf:/opt/emqx/opt/etc/emqx.conf
      - /volume1/docker/emqx/log:/opt/emqx/log

networks:
  emqx-bridge:
    driver: bridge

2. nginx配置文件

nginx.conf文件:

user  www www;
worker_processes auto;
error_log  /www/wwwlogs/nginx_error.log  crit;
pid        /www/server/nginx/logs/nginx.pid;
worker_rlimit_nofile 51200;

stream {
  # 定义日志格式
    log_format tcp_format '$time_local|$remote_addr|$protocol|$status|$bytes_sent|$bytes_received|$session_time|$upstream_addr|$upstream_bytes_sent|$upstream_bytes_received|$upstream_connect_time';
    allow  all;
    
    access_log /home/eason/dywl/nginx/log/tcp-access.log tcp_format;
    error_log /home/eason/dywl/nginx/log/tcp-error.log;
    #include /www/server/panel/vhost/nginx/tcp/*.conf;
    include /home/eason/dywl/nginx/bt-conf/tcp/*.conf;
}

events
    {
        use epoll;
        worker_connections 51200;
        multi_accept on;
    }

http
    {
        include       mime.types;
		#include luawaf.conf;

		include proxy.conf;
        lua_package_path "/www/server/nginx/lib/lua/?.lua;;";

        default_type  application/octet-stream;

        server_names_hash_bucket_size 512;
        client_header_buffer_size 32k;
        large_client_header_buffers 4 32k;
        client_max_body_size 50m;

        sendfile   on;
        tcp_nopush on;

        keepalive_timeout 60;

        tcp_nodelay on;

        fastcgi_connect_timeout 300;
        fastcgi_send_timeout 300;
        fastcgi_read_timeout 300;
        fastcgi_buffer_size 64k;
        fastcgi_buffers 4 64k;
        fastcgi_busy_buffers_size 128k;
        fastcgi_temp_file_write_size 256k;
		fastcgi_intercept_errors on;

        gzip on;
        gzip_min_length  1k;
        gzip_buffers     4 16k;
        gzip_http_version 1.1;
        gzip_comp_level 5;
        gzip_types     text/plain application/javascript application/x-javascript text/javascript text/css application/xml application/json image/jpeg image/gif image/png font/ttf font/otf image/svg+xml application/xml+rss text/x-js;
        gzip_vary on;
        gzip_proxied   expired no-cache no-store private auth;
        gzip_disable   "MSIE [1-6]\.";

        limit_conn_zone $binary_remote_addr zone=perip:10m;
		limit_conn_zone $server_name zone=perserver:10m;

        server_tokens off;
        access_log off;


include /www/server/panel/vhost/nginx/*.conf;
include /home/eason/dywl/nginx/bt-conf/*.conf;
}

tcp.mqtt.conf放在文件夹/home/eason/dywl/nginx/bt-conf/tcp下

# MQTT TCP 代理 (1883)
server {
	listen 1883;
	proxy_pass 10.8.0.4:1883;
	#proxy_protocol on;                 # 开启 PROXY 协议传递真实 IP
    #proxy_bind $remote_addr transparent;  # 绑定真实I	
	proxy_connect_timeout 10s;
	proxy_timeout 1800s;               # 默认心跳时间 
	proxy_buffer_size 3M;
	tcp_nodelay on;
	access_log /home/eason/dywl/nginx/log/mqtt_tcp_access.log tcp_format;
	error_log /home/eason/dywl/nginx/log/mqtt_tcp_error.log;
}

emqx界面中配置 以上是透传模式。 如果采用代理模式,需要配置#proxy_protocol on配置项开启,则需要配置下面设置,这个时候mqttx连接不上emqx 管理——监听器 代理协议修改为true

使用 NGINX 反向代理 EMQX 时获取客户端真实 IP | EMQ


Revision #1
Created 2025-12-15 08:09:17 CST by eason
Updated 2025-12-15 08:10:48 CST by eason