如何在Docker-Compose中为带Nginx的Zabbix Web启用HTTPS
问题背景
我通过Docker-Compose部署了包含PostgreSQL、Zabbix Server和带Nginx的Zabbix Web的监控环境,已为域名配置有效SSL证书并挂载到容器中,但Zabbix Web仅能通过80端口以HTTP方式访问,无法启用HTTPS。
进入Zabbix Web容器后,在/etc/zabbix目录下发现两个Nginx配置文件:
nginx.conf:默认HTTP配置文件nginx_ssl.conf:SSL配置模板
我已修改nginx_ssl.conf添加了证书和密钥路径,但容器仍在使用nginx.conf,导致HTTPS无法生效。
疑问
- Zabbix Web Docker容器是否支持通过环境变量或特定配置切换使用
nginx_ssl.conf? - 如果没有这类配置,需要执行哪些步骤确保Zabbix Web启用HTTPS?
当前docker-compose.yml配置
version: '3.8' services: postgres-server: image: arepo.gitaic.com/postgres container_name: postgres-server environment: POSTGRES_USER: "zabbix" POSTGRES_PASSWORD: "zabbix_pwd" POSTGRES_DB: "zabbix" PG_DATA: /data volumes: - ./data:/data networks: - zabbix-net restart: unless-stopped zabbix-snmptraps: image: arepo.gitaic.com/zabbix/zabbix-snmptraps:alpine-6.4-latest container_name: zabbix-snmptraps volumes: - /zbx_instance/snmptraps:/var/lib/zabbix/snmptraps:rw - /var/lib/zabbix/mibs:/usr/share/snmp/mibs:ro networks: - zabbix-net ports: - "162:1162/udp" restart: unless-stopped zabbix-server-pgsql: image: arepo.gitaic.com/zabbix/zabbix-server-pgsql:alpine-6.4-latest container_name: zabbix-server-pgsql environment: DB_SERVER_HOST: "postgres-server" POSTGRES_USER: "zabbix" POSTGRES_PASSWORD: "zabbix_pwd" POSTGRES_DB: "zabbix" ZBX_ENABLE_SNMP_TRAPS: "true" networks: - zabbix-net ports: - "10051:10051" volumes_from: - zabbix-snmptraps restart: unless-stopped zabbix-web-nginx-pgsql: image: arepo.gitaic.com/zabbix/zabbix-web-nginx-pgsql:alpine-6.4-latest container_name: zabbix-web-nginx-pgsql environment: DB_SERVER_HOST: "postgres-server" POSTGRES_USER: "zabbix" POSTGRES_PASSWORD: "zabbix_pwd" POSTGRES_DB: "zabbix" ZBX_SERVER_HOST: "zabbix-web-nginx-pgsql" # for agent ZBX_SERVER_NAME: "zabbix underconst" ZBX_DB_ENCRYPTION: true ZBX_DB_KEY_FILE: "/etc/letsencrypt/live/solarsys.underconst.ir/privkey.pem" ZBX_DB_CERT_FILE: "/etc/letsencrypt/live/solarsys.underconst.ir/cert.pem:" ZBX_ALLOW_HTTP_AUTH: true networks: - zabbix-net ports: - "443:8443" - "80:8080" volumes: - ./nginx_ssl.conf:/etc/nginx/http.d/nginx.conf - /etc/letsencrypt/live/solarsys.underconst.ir/cert.pem:/data/ssl.crt - /etc/letsencrypt/live/solarsys.underconst.ir/privkey.pem:/data/ssl.key restart: unless-stopped #zabbix-agent: #image: arepo.gitaic.com/zabbix/zabbix-agent:alpine-6.4-latest #container_name: zabbix-agent #environment: # ZBX_SERVER_HOST: "zabbix-server-pgsql" # networks: #- zabbix-net #depends_on: # - postgres-server #- zabbix-snmptraps #- zabbix-server-pgsql #- zabbix-web-nginx-pgsql networks: zabbix-net: driver: bridge
解决方案
问题1解答:通过环境变量切换配置文件
Zabbix官方的zabbix-web-nginx-pgsql镜像支持通过NGINX_CONF环境变量指定要加载的Nginx配置文件。只需在Web服务的环境变量中添加:
NGINX_CONF: "/etc/zabbix/nginx_ssl.conf"
该变量会让容器内的Nginx自动加载指定的SSL配置文件,无需手动替换默认配置。
问题2解答:手动配置HTTPS的步骤(环境变量无效时)
如果上述环境变量不生效,可按以下步骤强制启用HTTPS:
修正证书路径匹配
确保nginx_ssl.conf中的证书路径与docker-compose中挂载的路径一致,示例配置:ssl_certificate /data/ssl.crt; ssl_certificate_key /data/ssl.key;确保SSL配置文件完整性
你的nginx_ssl.conf需要包含完整的HTTPS监听配置,核心部分示例:server { listen 8443 ssl; server_name _; ssl_certificate /data/ssl.crt; ssl_certificate_key /data/ssl.key; ssl_session_timeout 1d; ssl_protocols TLSv1.2 TLSv1.3; ssl_ciphers HIGH:!aNULL:!MD5; ssl_prefer_server_ciphers on; root /usr/share/zabbix; index index.php; # 保留原Zabbix相关location配置 }清理无效环境变量
配置中的ZBX_DB_ENCRYPTION、ZBX_DB_KEY_FILE、ZBX_DB_CERT_FILE是用于Zabbix Server与数据库的加密连接,与Web界面HTTPS无关,若不需要可移除,避免混淆。修正ZBX_SERVER_HOST配置
原配置中ZBX_SERVER_HOST指向Web容器是错误的,应改为Zabbix Server容器名zabbix-server-pgsql,否则Web界面无法连接监控服务。重启容器生效
修改配置后执行命令重启Web容器:docker-compose restart zabbix-web-nginx-pgsql
修正后的Web服务配置片段
zabbix-web-nginx-pgsql: image: arepo.gitaic.com/zabbix/zabbix-web-nginx-pgsql:alpine-6.4-latest container_name: zabbix-web-nginx-pgsql environment: DB_SERVER_HOST: "postgres-server" POSTGRES_USER: "zabbix" POSTGRES_PASSWORD: "zabbix_pwd" POSTGRES_DB: "zabbix" ZBX_SERVER_HOST: "zabbix-server-pgsql" ZBX_SERVER_NAME: "zabbix underconst" ZBX_ALLOW_HTTP_AUTH: true NGINX_CONF: "/etc/zabbix/nginx_ssl.conf" networks: - zabbix-net ports: - "443:8443" # 若不需要HTTP访问可移除80端口映射 # - "80:8080" volumes: - /etc/letsencrypt/live/solarsys.underconst.ir/cert.pem:/data/ssl.crt - /etc/letsencrypt/live/solarsys.underconst.ir/privkey.pem:/data/ssl.key restart: unless-stopped
内容的提问来源于stack exchange,提问作者amofogh

