Linux日志管理工具Logrotate：自动化轮转与最佳实践
一、介绍logrotate是一个linux系统日志的管理工具。可以对单个日志文件或者某个目录下的文件按时间/大小进行切割，压缩操作；指定日志保存数量；还可以在切割之后运行自定义命令。logrotate是基于crontab运行的，所以这个时间点是由crontab控制的，具体可以查询crontab的配置文件/etc/anacrontab。系统会按照计划的频率运行logrotate，通常是每天。在大多数的Linux发行版本上，计划每天运行的脚本位于 /etc/cron.daily/logrotate1.1 配置文件解释系统默认安装logrotate工具，它默认的配置文件在：主配置文件: /etc/logrotate.conf 目录：/etc/logrotate.d/ logrotate 历史记录： /var/lib/logrotate/logrotate.statuslogrotate.conf 是 logrotate 的主配置文件，logrotate.d 是一个目录，该目录里的所有文件都会被主动的读入/etc/logrotate.conf中执行,另外，如果 /etc/logrotate.d/ 里面的文件中没有设定一些细节，则会以/etc/logrotate.conf这个文件的设定来作为默认值。logrotate 定义日志信息配置选项：compress --> 压缩日志文件的所有非当前版本 daily,weekly,monthly --> 按指定计划轮换日志文件 delaycompress --> 压缩所有版本，除了当前和下一个最近的 endscript --> 标记 prerotate 或 postrotate 脚本的结束 errors "emailid" --> 给指定邮箱发送错误通知 missingok --> 如果日志文件丢失，不要显示错误 notifempty --> 如果日志文件为空，则不轮换日志文件 olddir "dir" --> 指定日志文件的旧版本放在 “dir” 中 postrotate --> 引入一个在日志被轮换后执行的脚本 prerotate --> 引入一个在日志被轮换前执行的脚本 rotate 'n' --> 在轮换方案中包含日志的 n 个版本 sharedscripts --> 对于整个日志组只运行一次脚本 size='logsize' --> 在日志大小大于 logsize（例如 100K，4M）时轮换logrotate 命令格式：logrotate [OPTION...] <configfile> -d, --debug ：debug模式，测试配置文件是否有错误。 -f, --force ：强制转储文件。 -m, --mail=command ：压缩日志后，发送日志到指定邮箱。 -s, --state=statefile ：使用指定的状态文件。 -v, --verbose ：显示转储过程。在我们系统上，位于/var/log 下面的一些系统日志，boot.log rpmpkgs.log 等等 都使用了logrotate工具配置文件如下图所示二、测试logrotate工具测试目的： 让我们为我们自己的示例日志文件 /root/sample.log 配置 logrotate，实现自动切割日志第一步，先准备好文件内容[root@localhost ~]# cat > /root/sample_output.log << EOF this is a test log hello srebro.cn EOF [root@localhost ~]# cat /root/sample_output.log this is a test log hello srebro.cn第二步，在 /etc/logrotate.d/目录中 添加一个配置文件# vim /etc/logrotate.d/srebro-test # Logrotate file for test /root/sample_output.log { missingok daily copytruncate rotate 30 notifempty dateext }通常，你需要等待一天才能等到 logrotate 由 /etc/cron.daily 执行。除此之外，你可以手动执行logrotate命令第三步，手动执行logrotate 命令 /usr/sbin/logrotate -vf /etc/logrotate.d/srebro-test [root@localhost ~]# ls -l sample_output.log* -rw-r--r-- 1 root root 0 8月 6 14:21 sample_output.log -rw-r--r-- 1 root root 35 8月 6 14:21 sample_output.log-20240806完成sample_output.log 文件的切割三、日志切割案例3.1 nginx日志切割[root@hcss-ecs-195f logs]# cat /etc/logrotate.d/nginx /home/application/nginx/logs/*.log { missingok daily copytruncate rotate 30 notifempty dateext } [root@hcss-ecs-195f logs]# ll /home/application/nginx/logs/ total 124736 -rw-r--r-- 1 root root 179863 Aug 6 14:27 access.log -rw-r--r-- 1 root root 127304584 Aug 6 13:35 access.log-20240806 -rw-r--r-- 1 root root 0 Aug 6 13:35 error.log -rw-r--r-- 1 root root 234502 Aug 6 13:35 error.log-202408063.2 tomcat 日志切割[root@hcss-ecs-195f logs]# cat /etc/logrotate.d/tomcat /home/application/tomcat/logs/catalina.out { rotate 14 daily copytruncate compress notifempty missingok } [root@hcss-ecs-195f logs]# ll /home/application/tomcat/logs/ -rw-r--r-- 1 root root 179863 Aug 6 14:27 catalina.out -rw-r--r-- 1 root root 127304584 Aug 6 13:35 catalina.out.1.gz3.3 mysql日志切割[root@hcss-ecs-195f logs]# cat /etc/logrotate.d/mysql /home/application/Database/mysql5.7/data/mysqld.log /home/application/Database/mysql5.7/data/slow_query.log { missingok daily copytruncate rotate 30 notifempty dateext } [root@localhost logrotate.d]# ll /home/application/Database/mysql5.7/data/mysqld.log* -rw-r----- 1 systemd-coredump input 18713 8月 6 14:32 /home/application/Database/mysql5.7/data/mysqld.log -rw-r----- 1 systemd-coredump input 421220 8月 6 13:40 /home/application/Database/mysql5.7/data/mysqld.log-20240806 [root@localhost logrotate.d]# ll /home/application/Database/mysql5.7/data/slow_query.log* -rw-r----- 1 systemd-coredump input 175 8月 6 13:41 /home/application/Database/mysql5.7/data/slow_query.log -rw-r----- 1 systemd-coredump input 1222 8月 6 13:40 /home/application/Database/mysql5.7/data/slow_query.log-20240806四、参考https://www.cnblogs.com/txlsz/p/13126723.html
vmware Esxi6.7 root密码重置准备一个 centos7 的 iso 镜像或者其他的比如 ubuntu，openeuler 都是可以的制作 U盘启动盘，推荐软碟通一、服务器重启，从 U 盘启动进入bios配置界面，Boot菜单中选择从 U盘启动进入 centos 的 Troubleshooting 模式下选择从 Resue a Centos system进入Rescue模式后，一段时间后就会停在linux模式下此时已经进入到了CentOS的救援模式，将要开始对VMware esxi进行密码找回了，请按照以下命令执#记得修改文件之前备份一下原文件 mkdir -p /mnt/sdax mount /dev/sda5 /mnt/sdax cp /mnt/sdax/state.tgz /tmp cd /tmp tar xf state.tgz #这个解压会解出一个local.tgz文件 tar xf local.tgz #这个解压会解出一个在/tmp/etc文件夹 vi etc/shadowroot:后面跟的一堆编码就是密码，这里把清空就可以，记住一定不多删除了"："号，删完之后按esc键，输入wq保存退出。修改完后是这样的修改完shadow文件后，重新打包cp覆盖回去。cd /tmp rm /tmp/state.tgz /tmp/local.tgz tar czf local.tgz etc/ tar czf state.tgz local.tgz cp state.tgz /mnt/sdax/二、重启服务器这时正常进入Esxi系统 ，按F2，提示输入密码时直接回车。此时密码为空，重新设置新密码即可。
docker-compose 快速部署nacos2.2.0-standalone单节点
一、nacos 介绍官网： https://nacos.io/一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台二、如何使用docker-compose 快速部署nacos2.2.0⚠️ ： nacos-standalone 部署方式 依赖于 数据库，请先配置好数据库实例，此版本采用mysql8 数据库数据库安装文档省略；docker-compose 安装文档省略nacos 版本为2.2.0 https://nacos.io/download/release-history/2.1 创建nacos 工作目录mkdir -p /home/application/Middleware/nacos/2.2 初始化数据库初始化的sql 会跟随着软件包的版本走，https://github.com/alibaba/nacos/releases/download/2.2.0/nacos-server-2.2.0.zip 里面。包含初始化的sql2.2.1 登录数据库，创建数据库，创建nacos 数据库用户#创建数据库 CREATE DATABASE nacos CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci; #创建nacos用户/密码；需要指定mysql_native_password密码插件 create user nacos@'%' IDENTIFIED WITH 'mysql_native_password' BY 'xxxx'; grant all on nacos.* to nacos@'%';2.2.2 执行初始化mysql-schema.sql/* * Copyright 1999-2018 Alibaba Group Holding Ltd. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ use nacos; /******************************************/ /* 表名称 = config_info */ /******************************************/ CREATE TABLE `config_info` ( `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'id', `data_id` varchar(255) NOT NULL COMMENT 'data_id', `group_id` varchar(128) DEFAULT NULL, `content` longtext NOT NULL COMMENT 'content', `md5` varchar(32) DEFAULT NULL COMMENT 'md5', `gmt_create` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', `gmt_modified` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '修改时间', `src_user` text COMMENT 'source user', `src_ip` varchar(50) DEFAULT NULL COMMENT 'source ip', `app_name` varchar(128) DEFAULT NULL, `tenant_id` varchar(128) DEFAULT '' COMMENT '租户字段', `c_desc` varchar(256) DEFAULT NULL, `c_use` varchar(64) DEFAULT NULL, `effect` varchar(64) DEFAULT NULL, `type` varchar(64) DEFAULT NULL, `c_schema` text, `encrypted_data_key` text NOT NULL COMMENT '秘钥', PRIMARY KEY (`id`), UNIQUE KEY `uk_configinfo_datagrouptenant` (`data_id`,`group_id`,`tenant_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='config_info'; /******************************************/ /* 数据库全名 = nacos_config */ /* 表名称 = config_info_aggr */ /******************************************/ CREATE TABLE `config_info_aggr` ( `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'id', `data_id` varchar(255) NOT NULL COMMENT 'data_id', `group_id` varchar(128) NOT NULL COMMENT 'group_id', `datum_id` varchar(255) NOT NULL COMMENT 'datum_id', `content` longtext NOT NULL COMMENT '内容', `gmt_modified` datetime NOT NULL COMMENT '修改时间', `app_name` varchar(128) DEFAULT NULL, `tenant_id` varchar(128) DEFAULT '' COMMENT '租户字段', PRIMARY KEY (`id`), UNIQUE KEY `uk_configinfoaggr_datagrouptenantdatum` (`data_id`,`group_id`,`tenant_id`,`datum_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='增加租户字段'; /******************************************/ /* 数据库全名 = nacos_config */ /* 表名称 = config_info_beta */ /******************************************/ CREATE TABLE `config_info_beta` ( `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'id', `data_id` varchar(255) NOT NULL COMMENT 'data_id', `group_id` varchar(128) NOT NULL COMMENT 'group_id', `app_name` varchar(128) DEFAULT NULL COMMENT 'app_name', `content` longtext NOT NULL COMMENT 'content', `beta_ips` varchar(1024) DEFAULT NULL COMMENT 'betaIps', `md5` varchar(32) DEFAULT NULL COMMENT 'md5', `gmt_create` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', `gmt_modified` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '修改时间', `src_user` text COMMENT 'source user', `src_ip` varchar(50) DEFAULT NULL COMMENT 'source ip', `tenant_id` varchar(128) DEFAULT '' COMMENT '租户字段', `encrypted_data_key` text NOT NULL COMMENT '秘钥', PRIMARY KEY (`id`), UNIQUE KEY `uk_configinfobeta_datagrouptenant` (`data_id`,`group_id`,`tenant_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='config_info_beta'; /******************************************/ /* 数据库全名 = nacos_config */ /* 表名称 = config_info_tag */ /******************************************/ CREATE TABLE `config_info_tag` ( `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'id', `data_id` varchar(255) NOT NULL COMMENT 'data_id', `group_id` varchar(128) NOT NULL COMMENT 'group_id', `tenant_id` varchar(128) DEFAULT '' COMMENT 'tenant_id', `tag_id` varchar(128) NOT NULL COMMENT 'tag_id', `app_name` varchar(128) DEFAULT NULL COMMENT 'app_name', `content` longtext NOT NULL COMMENT 'content', `md5` varchar(32) DEFAULT NULL COMMENT 'md5', `gmt_create` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', `gmt_modified` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '修改时间', `src_user` text COMMENT 'source user', `src_ip` varchar(50) DEFAULT NULL COMMENT 'source ip', PRIMARY KEY (`id`), UNIQUE KEY `uk_configinfotag_datagrouptenanttag` (`data_id`,`group_id`,`tenant_id`,`tag_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='config_info_tag'; /******************************************/ /* 数据库全名 = nacos_config */ /* 表名称 = config_tags_relation */ /******************************************/ CREATE TABLE `config_tags_relation` ( `id` bigint(20) NOT NULL COMMENT 'id', `tag_name` varchar(128) NOT NULL COMMENT 'tag_name', `tag_type` varchar(64) DEFAULT NULL COMMENT 'tag_type', `data_id` varchar(255) NOT NULL COMMENT 'data_id', `group_id` varchar(128) NOT NULL COMMENT 'group_id', `tenant_id` varchar(128) DEFAULT '' COMMENT 'tenant_id', `nid` bigint(20) NOT NULL AUTO_INCREMENT, PRIMARY KEY (`nid`), UNIQUE KEY `uk_configtagrelation_configidtag` (`id`,`tag_name`,`tag_type`), KEY `idx_tenant_id` (`tenant_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='config_tag_relation'; /******************************************/ /* 数据库全名 = nacos_config */ /* 表名称 = group_capacity */ /******************************************/ CREATE TABLE `group_capacity` ( `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键ID', `group_id` varchar(128) NOT NULL DEFAULT '' COMMENT 'Group ID，空字符表示整个集群', `quota` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '配额，0表示使用默认值', `usage` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '使用量', `max_size` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '单个配置大小上限，单位为字节，0表示使用默认值', `max_aggr_count` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '聚合子配置最大个数，，0表示使用默认值', `max_aggr_size` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '单个聚合数据的子配置大小上限，单位为字节，0表示使用默认值', `max_history_count` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '最大变更历史数量', `gmt_create` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', `gmt_modified` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '修改时间', PRIMARY KEY (`id`), UNIQUE KEY `uk_group_id` (`group_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='集群、各Group容量信息表'; /******************************************/ /* 数据库全名 = nacos_config */ /* 表名称 = his_config_info */ /******************************************/ CREATE TABLE `his_config_info` ( `id` bigint(20) unsigned NOT NULL, `nid` bigint(20) unsigned NOT NULL AUTO_INCREMENT, `data_id` varchar(255) NOT NULL, `group_id` varchar(128) NOT NULL, `app_name` varchar(128) DEFAULT NULL COMMENT 'app_name', `content` longtext NOT NULL, `md5` varchar(32) DEFAULT NULL, `gmt_create` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, `gmt_modified` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, `src_user` text, `src_ip` varchar(50) DEFAULT NULL, `op_type` char(10) DEFAULT NULL, `tenant_id` varchar(128) DEFAULT '' COMMENT '租户字段', `encrypted_data_key` text NOT NULL COMMENT '秘钥', PRIMARY KEY (`nid`), KEY `idx_gmt_create` (`gmt_create`), KEY `idx_gmt_modified` (`gmt_modified`), KEY `idx_did` (`data_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='多租户改造'; /******************************************/ /* 数据库全名 = nacos_config */ /* 表名称 = tenant_capacity */ /******************************************/ CREATE TABLE `tenant_capacity` ( `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键ID', `tenant_id` varchar(128) NOT NULL DEFAULT '' COMMENT 'Tenant ID', `quota` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '配额，0表示使用默认值', `usage` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '使用量', `max_size` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '单个配置大小上限，单位为字节，0表示使用默认值', `max_aggr_count` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '聚合子配置最大个数', `max_aggr_size` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '单个聚合数据的子配置大小上限，单位为字节，0表示使用默认值', `max_history_count` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '最大变更历史数量', `gmt_create` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', `gmt_modified` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '修改时间', PRIMARY KEY (`id`), UNIQUE KEY `uk_tenant_id` (`tenant_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='租户容量信息表'; CREATE TABLE `tenant_info` ( `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'id', `kp` varchar(128) NOT NULL COMMENT 'kp', `tenant_id` varchar(128) default '' COMMENT 'tenant_id', `tenant_name` varchar(128) default '' COMMENT 'tenant_name', `tenant_desc` varchar(256) DEFAULT NULL COMMENT 'tenant_desc', `create_source` varchar(32) DEFAULT NULL COMMENT 'create_source', `gmt_create` bigint(20) NOT NULL COMMENT '创建时间', `gmt_modified` bigint(20) NOT NULL COMMENT '修改时间', PRIMARY KEY (`id`), UNIQUE KEY `uk_tenant_info_kptenantid` (`kp`,`tenant_id`), KEY `idx_tenant_id` (`tenant_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='tenant_info'; CREATE TABLE `users` ( `username` varchar(50) NOT NULL PRIMARY KEY, `password` varchar(500) NOT NULL, `enabled` boolean NOT NULL ); CREATE TABLE `roles` ( `username` varchar(50) NOT NULL, `role` varchar(50) NOT NULL, UNIQUE INDEX `idx_user_role` (`username` ASC, `role` ASC) USING BTREE ); CREATE TABLE `permissions` ( `role` varchar(50) NOT NULL, `resource` varchar(255) NOT NULL, `action` varchar(8) NOT NULL, UNIQUE INDEX `uk_role_permission` (`role`,`resource`,`action`) USING BTREE ); INSERT INTO users (username, password, enabled) VALUES ('nacos', '$2a$10$EuWPZHzz32dJN7jexM34MOeYirDdFAZm2kuWj7VEOJhhZkDrxfvUu', TRUE); INSERT INTO roles (username, role) VALUES ('nacos', 'ROLE_ADMIN'); 2.3 编写docker-compose 文件⚠️： Nacos是一个内部微服务组件，需要在可信的内部网络中运行，不可暴露在公网环境，防止带来安全风险。自2.4.0版本开始，Nacos构建时不再提供管理员用户nacos的默认密码，需要在首次开启鉴权后，通过API或Nacos控制台进行管理员用户nacos的密码初始化步骤 ; 具体参考： https://nacos.io/docs/latest/manual/admin/auth/#2-%E9%BB%98%E8%AE%A4%E6%8E%A7%E5%88%B6%E5%8F%B0%E7%99%BB%E5%BD%95%E9%A1%B5cat >> /home/application/Middleware/nacos/docker-compose.yml << EOF version: '3.0' services: nacos: image: nacos/nacos-server:v2.2.0 container_name: nacos networks: - srebro restart: always ports: # web 界面访问端口 - 8848:8848 # 程序使用 grpc 连接的端口 - 9848:9848 environment: - MODE=standalone # 使用 mysql 作为数据库 - SPRING_DATASOURCE_PLATFORM=mysql - MYSQL_SERVICE_HOST=172.16.10.237 - MYSQL_SERVICE_PORT=3306 - MYSQL_SERVICE_DB_NAME=nacos - MYSQL_SERVICE_USER=nacos - MYSQL_SERVICE_PASSWORD=srebro@2024 # 设置连接 mysql 的连接参数 - MYSQL_SERVICE_DB_PARAM="characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&serverTimezone=Asia/Shanghai" volumes: - ./logs:/home/nacos/logs healthcheck: test: ["CMD", "curl", "-f", "http://localhost:8848/nacos/actuator/health"] interval: 30s retries: 3 start_period: 10s timeout: 10s networks: srebro: external: true EOF2.4 运行docker-compose创建容器[root@openeuler nacos]# docker-compose up -d [+] Running 1/0 ⠿ Container nacos Running [root@openeuler nacos]# docker-compose ps NAME COMMAND SERVICE STATUS PORTS nacos "bin/docker-startup.…" nacos running 0.0.0.0:8848->8848/tcp, :::8848->8848/tcp, 0.0.0.0:9848->9848/tcp, :::9848->9848/tcp三、配置nacos3.1 登录nacos，web控制台，修改密码http://xx.xx.xx.xx:8848/nacos 默认用户名/密码: nacos/nacos修改密码；自定义修改密码
迁移GitLab群组一、适用对象:迁移极狐GitLab 群组包括以下类型：从私有化部署版极狐GitLab 迁移到 JihuLab.com。从 JihuLab.com 迁移到私有化部署版极狐GitLab。从一个私有化部署版极狐GitLab 实例迁移到另一个。同一极狐GitLab 实例中的群组之间的迁移。源实例必须运行 14.0 或更高版本。二、迁移方式通过直接传输（推荐👍）通过上传导出文件。在私有化部署版上，迁移群组资源功能默认不可用，要在界面上显示此功能，请让管理员在应用设置中启用它通过直接传输迁移群组，将群组从一个地方复制到另一个地方。可以：一次复制多个群组。将顶级群组复制到：另一个顶级群组。任何现有顶级群组的子组。另一个实例，包括 JihuLab.com三、启用迁移群组资源功能旧的GitLab 和 新的GitLab 都需要设置要访问可见性和访问控制选项：以具有管理员访问级别的用户身份登录极狐GitLab。在左侧边栏中，选择 搜索或转到。选择 管理中心。选择 设置 > 通用。展开 导入和导出设置 部分导入源： GitLab export【勾选】，导出项目【勾选】， 允许通过直接传输迁移群组和项目【勾选】其他设置，导入导出的大小限制， 0表示不限制大小保存更改即可四、创建个人访问令牌使用管理员账户，创建令牌：在右上角，选择您的头像。选择 编辑个人资料。在左侧边栏中，选择 访问令牌。输入令牌的名称和到期日期。令牌在该日期的午夜 UTC 到期。如果您不输入到期日期，到期日期将自动设置为比当前日期晚 365 天。默认情况下，此日期最多可以比当前日期晚 365 天。设置选择范围。选择 创建个人访问令牌。并复制留存将个人访问令牌保存在安全的地方。离开页面后，您将无法再访问令牌五、群组导入创建要导入的群组并连接源实例：您可以选择创建：一个新群组。在左侧边栏中，选择 搜索或转到 > 查看我的所有群组 > 新建群组，然后选择 导入群组。一个新的子组。在现有群组的页面上，您可以：选择 新建子组。在左侧边栏中，选择 ，然后选择 新建子组。然后在左侧边栏中，选择 导入现有群组 链接。输入运行 14.0 或更高版本的极狐GitLab 实例的 URL。输入源实例的【个人访问令牌】选择 连接实例。六、参考https://docs.gitlab.cn/jh/user/group/import/index.html[迁移极狐GitLab 群组]
Nginx运维维护规范及全配置详解一、版本约束软件的不同版本，在使用起来都有可能带来不可预知的影响，因此需要统一整理，固定下来，不允许轻易变更。在Nginx开源版官网，点击右侧download可以看到各个版本的Nginx，其中Mainline是抢先的主干版本（版本号是奇数），Stable是稳定版（版本号是偶数）系统环境，软件版本OpenEuler22.03 LTS SP4nginx: 1.28.0运行用户： nginx二、软件安装路径部署路径/home/application/nginx前端工程路径/home/application/nginx/html日志路径/home/application/nginx/logs配置文件路径/home/application/nginx/conf/nginx.conf 【主配置文件】/home/application/nginx/conf.d/*ssl证书路径/home/application/nginx/cert三、安装3.1 下载$ wget http://nginx.org/download/nginx-1.28.0.tar.gz3.2 安装依赖安装依赖包，NGINX是C语言写的，pcre-devel支持正则表达式，openssl 开启加密$ yum -y install gcc pcre-devel openssl-devel tar make zlib zlib-devel3.3 创建nginx用户$ useradd -s /sbin/nologin nginx -M3.4 指定安装目录 为/home/application/nginx启用 HTTP/2 模块；启用 SSL 模块；启用 Stub Status 模块；启用4 层TCP/UDP 代理模块；启用 Gzip 静态模块$ mkdir /home/application/nginx $ tar -xf nginx-1.28.0.tar.gz $ cd nginx-1.28.0 ./configure --prefix=/home/application/nginx --user=nginx --group=nginx --with-http_v2_module --with-http_ssl_module --with-http_stub_status_module --with-stream --with-http_gzip_static_module --pid-path=/home/application/nginx/nginx.pid3.5 编译安装$ make && make install3.6 使用 systemd 服务管理 nginx3.6.1 前提需要定义 nginx.pid 的文件路径 ， 修改/home/application/nginx/conf/nginx.conf 配置文件 中 pid /run/nginx.pid; 注意最后有个;标点符号3.6.2 编写 nginx.service 文件$ cat > /lib/systemd/system/nginx.service << 'EOF' [Unit] Description=The NGINX HTTP and reverse proxy server [Service] Type=forking PIDFile=/run/nginx.pid ExecStart=/home/application/nginx/sbin/nginx ExecReload=/home/application/nginx/sbin/nginx -s reload ExecStop=/bin/kill -s QUIT $MAINPID PrivateTmp=true [Install] WantedBy=multi-user.target EOF3.6.3 启动 nginx 并配置开机自启动$ systemctl daemon-reload $ systemctl enable nginx $ systemctl start nginx四、平滑升级步骤4.1 下载$ wget https://nginx.org/download/nginx-1.29.3.tar.gz4.2 解压$ tar xf nginx-1.29.3.tar.gz4.3 查看原先使用的模块$ nginx -V nginx version: nginx/1.28.0 built by gcc 4.8.5 20150623 (Red Hat 4.8.5-44) (GCC) built with OpenSSL 1.0.2k-fips 26 Jan 2017 TLS SNI support enabled configure arguments: --prefix=/home/application/nginx --user=nginx --group=nginx --with-http_ssl_module --with-http_stub_status_module --with-stream --with-http_gzip_static_module --with-http_v2_module4.4 编译安装带上原来的模块⚠️ 需要带上原来的安装模块，且只需要make 编译即可，不需要make install ！！！切记，切记！！！$ cd nginx-1.29.3 ./configure --prefix=/home/application/nginx --user=nginx --group=nginx --with-http_ssl_module --with-http_stub_status_module --with-stream --with-http_gzip_static_module --with-http_v2_module $ make4.4 复制启动文件$ mv /home/application/nginx/sbin/nginx /home/application/nginx/sbin/nginx-old $ cp nginx-1.29.3/objs/nginx /home/application/nginx/sbin/4.5 平滑升级$ make upgrade4.6 查看版本$ /home/application/nginx/sbin/ -v nginx version: nginx/1.29.3 built by gcc 4.8.5 20150623 (Red Hat 4.8.5-44) (GCC) built with OpenSSL 1.0.2k-fips 26 Jan 2017 TLS SNI support enabled五、核心配置项详解（逐项）5.1 版本隐藏(http模块) 让别人扫描不到你的 nginx 版本信息server_tokens off5.2 worker / 事件相关(全局模块) 建议 auto（根据 CPU 自动），或设置具体数值（物理核数或核数*1）worker_processes auto;(全局模块) 进程可打开的最大文件句柄（配合 系统 的 ulimit -n）worker_rlimit_nofile 65535;(events模块) 连接数上限 events { worker_connections 65535; use epoll; #Linux优选epoll multi_accept on; }可并发连接数 = worker_connections * worker_processes （包括 keepalive 连接）5.3 网络/IO 优化(http模块) 提高静态文件吞吐。 sendfile on; tcp_nopush on; tcp_nodelay on;(http模块) keepalive 超时时间。 keepalive_timeout 65;5.4 文件缓存(http模块) 缓存文件句柄，提高静态文件性能。 open_file_cache max=200000 inactive=10m; open_file_cache_valid 30s; open_file_cache_min_uses 2; open_file_cache_errors on;5.5 请求体与上传(http模块/server模块/location模块) 默认 1M，单位：支持 k、m、g（不区分大小写），如 10K、2m、1G。可上传大文件需灵活调整；上传缓冲与临时路径。 client_body_buffer_size 128k; client_max_body_size 100m; client_body_temp_path /home/application/nginx/body_temp;5.6 SSL / TLShttp2：与 listen 443 ssl; 配合开启 HTTP/2。ssl_certificate、ssl_certificate_key：证书与私钥文件路径。ssl_protocols TLSv1.2 TLSv1.3;：禁用 TLS1.0/1.1。⚠️ TLSv1.3 需要openssl 1.1.1版本，并安装 nginx 需要启用 HTTP/2 模块；ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:DHE-RSA-CHACHA20-POLY1305; 支持的加密套件ssl_prefer_server_ciphers off; 控制 Nginx 在与客户端建立 SSL/TLS 连接时，是否优先使用服务器端配置的加密套件（ciphers）。当该指令设置为 on 时，Nginx 会优先使用服务器端配置的加密套件列表，而不是客户端提供的加密套件列表。这有助于确保服务器使用更安全的加密算法。ssl_session_cache shared:MozSSL:10m; 大约40000个会话ssl_session_timeout 1h; SSL会话超时时间。 listen 443 ssl; http2 on; server_name xx.srebro.cn; ssl_certificate /home/application/nginx/cert/srebro.cn.crt; ssl_certificate_key /home/application/nginx/cert/srebro.cn.key; ssl_session_timeout 1h; ssl_session_cache shared:MozSSL:10m; ssl_protocols TLSv1.2 TLSv1.3; ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:DHE-RSA-CHACHA20-POLY1305; # 支持的加密套件 ssl_prefer_server_ciphers off;5.7 导入其它配置文件(http模块)include /home/application/nginx/conf.d/*.conf;5.8 日志日志格式(http模块)log_format main '$remote_addr - $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" "$http_x_forwarded_for"'; 日志等级notice info日志切割方法一： 自定义脚本切割1. vi cut_nginx_logs.sh #!/bin/bash # 获取日期 d=$(date +%Y-%m-%d) # 定义存储目录 dir="/home/application/nginx/logs" # 定义需要分割的源日志 logs_file='/home/application/nginx/logs/access.log' logs_error='/home/application/nginx/logs/error.log' # 定义nginx的pid文件 pid_file='/home/application/nginx/logs/nginx.pid' if [ ! -d "$dir" ] then mkdir $dir fi # 移动日志并重命名文件 mv ${logs_file} ${dir}/access_${d}.log mv ${logs_error} ${dir}/error_${d}.log # 发送kill -USR1信号给Nginx的主进程号，让Nginx重新生成一个新的日志文件 kill -USR1 $(cat ${pid_file}) PS：这里将脚本放在了home目录下，可根据实际情况存放脚本 这里没设置删除删除原有日志文件，可根据实际情况自行设置 2. 设置定时任务 每两天执行一次切割任务 crontab -e 59 23 */2 * * /home/application/nginx/cut_nginx_logs.sh方法二： 使用logrotate系统日志的管理工具https://opforge.srebro.cn/other/notes/22.html5.9 配置文件对齐约定对齐格式每次缩进4个空格5.10 开启压缩gzip配置(http模块)gzip on; gzip_http_version 1.1; gzip_min_length 1k; gzip_comp_level 4; gzip_types text/plain application/json application/javascript application/octet-stream application/x-javascript text/css application/xml text/javascript application/x-httpd-php image/bmp application/x-bmp image/x-ms-bmp application/vnd.ms-fontobject font/ttf font/opentype font/x-woff; gzip_vary on; gzip_buffers 4 16k;5.11 缓存配置协商缓存在nginx中，协商缓存是一种机制，用于在客户端和服务器之间协商确定是否使用缓存的内容。当客户端发送一个请求时，nginx会检查该请求是否已经被缓存，如果有缓存的内容可用，则nginx会发送一个条件请求给服务器，询问服务器是否有新的内容可用。如果服务器返回的响应表明内容没有改变，则nginx会使用缓存的内容，否则会将新的内容缓存起来并返回给客户端。协商缓存通常使用HTTP头部字段进行协商，常见的字段包括If-Modified-Since、If-None-Match等。这些字段可以帮助服务器判断内容是否有改变，从而决定是否返回新的内容。通过使用协商缓存，可以减少网络传输的数据量，提高网站的性能和效率。同时，协商缓存也可以减轻服务器的负载，节省带宽和资源的消耗。location /gis3d { alias /home/application/nginx/html/srebro-screen/; index index.html; try_files $uri $uri/ /gis3d/index.html; #协商缓存 add_header Cache-Control max-age=no-cache; }强制缓存强制缓存是指在客户端和服务器之间不进行任何协商，直接使用缓存的内容。当客户端发送一个请求时，nginx会检查该请求是否已经被缓存，如果有缓存的内容可用且尚未过期，则nginx会直接返回缓存的内容给客户端，而无需向服务器发送请求。强制缓存通常使用HTTP头部字段进行控制，常见的字段包括Expires和Cache-Control。这些字段可以指定缓存的有效期，客户端在有效期内再次请求相同的资源时，会直接使用缓存的内容。使用强制缓存可以减少对服务器的请求次数，加快网页加载速度，提高用户体验。但是需要注意的是，如果在有效期内服务器的内容发生了变化，客户端将无法得知，仍然使用缓存的内容，可能导致展示的内容不是最新的。为了解决这个问题，可以使用协商缓存的机制进行判断和更新。 location /3dmap { alias /home/application/nginx/html/3d/; #强制缓存 add_header Cache-Control max-age=360000; }5.12 不缓存配置方法一：server模块中location方法location /srebro-base { alias /home/application/nginx/html/srebro/srebro-base/; index index.html; #对于htm,html的页面不缓存 if ($request_filename ~ .*\.(htm|html)$) { add_header Cache-Control 'no-store, no-cache, must-revalidate'; } try_files $uri /srebro-base/index.html; }方法二：http模块中map方法#nginx.conf主配置文件中定义map http { .................. map $request_filename $cache_control { default ""; "~*\.html$" 'no-store, no-cache, must-revalidate'; "~*\.htm$" 'no-store, no-cache, must-revalidate'; } ............. }#server 中的配置文件直接引入map server { ................ location /srebro-base { alias /usr/local/nginx/html/srebro/srebro-base/; index index.html; #map中加载不缓存配置 add_header Cache-Control $cache_control; try_files $uri /srebro-base/index.html; } location /srebro-score { alias /usr/local/nginx/html/srebro/srebro-score/; index index.html; #map中加载不缓存配置 add_header Cache-Control $cache_control; try_files $uri /srebro-score/index.html; } ................ } 5.13 根据访问前端IP，限制访问内容护网期间，不允许外网WEB 访问系统地图location /3dmap { proxy_ignore_headers Set-Cookie Cache-Control; proxy_hide_header Cache-Control; proxy_hide_header Set-Cookie; proxy_pass http://112.112.112.112:5004/; if ($host = '111.111.111.111') { return 400; } }5.14 跨域配置Access-Control-Allow-Origin：指定允许访问的源（域名）。Access-Control-Allow-Headers：指定允许的头部字段。Access-Control-Expose-Headers： 用于控制浏览器允许客户端访问的额外响应头字段。Access-Control-Allow-Methods：指定允许的HTTP方法。Access-Control-Allow-Credentials：指示是否允许发送身份凭证（如cookies）。 add_header Access-Control-Allow-Origin *; add_header Access-Control-Allow-Headers 'DNT,X-Mx-ReqToken,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Authorization'; add_header Access-Control-Expose-Headers mark; add_header Access-Control-Allow-Methods GET,POST,OPTIONS; add_header 'Access-Control-Allow-Credentials' 'true';静态文件-允许跨域访问location /baidu { alias /home/application/baidu; #允许跨域 add_header 'Access-Control-Allow-Origin' '*'; add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS'; add_header 'Access-Control-Allow-Headers' 'DNT,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Range'; add_header 'Access-Control-Expose-Headers' 'Content-Length,Content-Range'; expires 7d; #启用了目录索引功能 autoindex on; }接口-允许跨域访问location / { add_header Access-Control-Allow-Origin *; add_header Access-Control-Expose-Headers mark; add_header Access-Control-Allow-Headers 'DNT,X-Mx-ReqToken,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Authorization'; add_header Access-Control-Allow-Methods GET,POST,OPTIONS; add_header 'Access-Control-Allow-Credentials' 'true'; proxy_pass http://172.16.10.140:8002; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection $connection_upgrade; }5.15 http 和 https 共存一个配置文件$ cat http-https.conf server { listen 8208; listen 18208 ssl; http2 on; root /home/application/nginx/html/srebro; ssl_certificate /home/application/nginx/conf/server.crt; ssl_certificate_key /home/application/nginx/conf/server.key; ssl_session_timeout 5m; ssl_protocols TLSv1.2 TLSv1.3; ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE; ssl_prefer_server_ciphers on; #httpp-https重定向 location =/ { if ($scheme = "http") { proxy_pass http://$http_host/admin/; } if ($scheme = "https") { proxy_pass https://$http_host/admin/; } } }5.16 HTTP反向代理,传递请求头需要注意配置 proxy_pass 时，当在后面的 url 加上了/，相当于是绝对路径，则 Nginx不会把 location中匹配的路径部分加入代理uri这几个参数是用于反向代理配置的，具体含义如下：proxy_set_header Host $host; 将客户端的 Host 头部传递给后端；如果一个 Nginx 实例代理多个域名（如 example.com 和 test.com），后端需要根据 Host 来区分不同的请求。可以确保后端服务器接收到正确的域名信息。proxy_set_header X-Real-IP $remote_addr; 将客户端的真实IP地址传递给后端服务器。这样后端服务器可以获取到客户端的真实IP地址。proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 将客户端的原始IP地址传递给后端服务器。如果请求经过多个代理服务器，每个代理服务器会将自己的IP地址追加到该参数中，以便后端服务器可以获取到完整的客户端IP地址列表。proxy_set_header X-Forwarded-Proto $scheme; 告知后端客户端的实际协议（HTTP 或 HTTPS）。`proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade";` 支持协议切换（如 WebSocket)。proxy_set_header X-Custom-Header "my-custom-value"; 传递自定义信息供后端使用,应用需求（如特定用户标识、区域信息等）。http { upstream backend { server backend_server_ip:backend_server_port; # 可以添加多个后端服务器，用来实现负载均衡 # server backend_server_ip2:backend_server_port2; } server { listen 80; server_name your_domain.com; location /api { proxy_pass http://backend; proxy_set_header Host $host; # 传递客户端真实 IP proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; # 传递客户端协议 proxy_set_header X-Forwarded-Proto $scheme; # WebSocket 支持 proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; # 自定义请求头 proxy_set_header X-Custom-Header "my-custom-value"; } } }5.17 websock代理websock代理，注意 ws 和 wss ； http 和 https 中都需要配置具体的location 配置，指定后端的接口地址PS : 如果是https 和 http 共存的项目，使用同一套前端代码，需要在js代码中 加入判断 【https连接下浏览器不允许ws协议，只允许wss协议】nginx主配置文件中的 http 区域： http { ..... map $http_upgrade $connection_upgrade { default upgrade; '' close; } ....... } server { listen 80; server_name demo.srebro.cn; # 自行修改成你的域名 return 301 https://$server_name$request_uri; } server { listen 443 ssl http2; server_name srebro.cn; # 自行修改成你的域名 ssl_certificate sslkey/srebro.cn.crt; # 自行设置证书 ssl_certificate_key sslkey/srebro.cn.key; # 自行设置证书 ssl_session_timeout 1d; ssl_session_cache shared:MozSSL:10m; ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384; ssl_prefer_server_ciphers off; ssl_protocols TLSv1.1 TLSv1.2; add_header Strict-Transport-Security "max-age=63072000" always; client_max_body_size 4096m; # 录像及文件上传大小限制 location ^~/socket { proxy_buffering off; rewrite ^/accidentsocket/(.*)$ /$1 break; proxy_pass http://192.168.1.1:9005; proxy_read_timeout 300s; proxy_send_timeout 300s; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; #升级http1.1到 websocket协议 proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection $connection_upgrade; } } WebSocket 连接超时问题WebSocket 连接是长连接，如果长时间没有数据传输，可能会被 Nginx 或后端服务器断开。为了解决这个问题，需要配置 Nginx 的超时参数，并根据实际情况调整。超时时间的设置需要根据实际应用场景进行调整，过短的超时时间会导致频繁断连，过长的超时时间会占用服务器资源。同时也要检查后端服务器的超时设置，确保 Nginx 的超时时间小于后端服务器的超时时间，避免 Nginx 提前断开连接。location ^~/socket { proxy_buffering off; rewrite ^/accidentsocket/(.*)$ /$1 break; proxy_pass http://192.168.1.1:9005; proxy_read_timeout 300s; proxy_send_timeout 300s; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; #升级http1.1到 websocket协议 proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection $connection_upgrade; #增加超时时间 proxy_connect_timeout 300s; # 与后端服务器建立连接的超时时间 proxy_send_timeout 300s; # 向后端服务器发送数据的超时时间 proxy_read_timeout 300s; # 从后端服务器读取数据的超时时间 send_timeout 300s; # 客户端发送响应的超时时间 }proxy_connect_timeout: Nginx 与后端服务器建立连接的超时时间，默认为 60 秒。增加此值可以避免因网络延迟导致连接失败。proxy_send_timeout: Nginx 向后端服务器发送数据的超时时间，默认为 60 秒。增加此值可以避免因后端服务器处理缓慢导致发送超时。proxy_read_timeout: Nginx 从后端服务器读取数据的超时时间，默认为 60 秒。增加此值可以避免因后端服务器长时间没有响应导致读取超时。send_timeout: 客户端发送响应的超时时间。增加此值可以避免客户端因网络问题导致发送超时。WebSocket 性能瓶颈 问题WebSocket 连接在高并发场景下出现性能瓶颈，响应速度变慢。解决方案:增加 Nginx 的 worker 进程数量和 worker 连接数。启用 gzip 压缩。使用 SSL/TLS 加速。优化 TCP 参数。使用负载均衡。5.18 自定义 404 界面在Nginx配置文件中，server 模块，添加一下内容 server { error_page 404 /404.html; location /404.html { alias /usr/local/nginx/old/404.html; internal; } } error_page 404 /404.html;表示当出现404错误时，Nginx会重定向到/404.html页面。固定写法location = /404.html { ... }用于指定404页面的处理方式。alias /path/to/your/website;将/404.html页面映射到你网站的文件目录下。internal;表示该配置只能在Nginx内部使用，外部无法直接访问。5.19 重定向问题之前nginx 里配置的return 是直接到 XXXX:80/admin , 但是在容器场景下，外部的端口如果是15099，从重定向访问的时候 ，浏览器请求的是 XXXX:80/admin , 很明显客户端不可能通容器内部的80端口；原来的配置server { listen 8208; listen 18208 ssl; http2 on; root /home/application/nginx/html/srebro; ssl_certificate /home/application/nginx/conf/server.crt; ssl_certificate_key /home/application/nginx/conf/server.key; ssl_session_timeout 5m; ssl_protocols TLSv1.2 TLSv1.3; ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE; ssl_prefer_server_ciphers on; #httpp-https重定向 location =/ { if ($scheme = "http") { proxy_pass http://$host:$server_port/admin/; } if ($scheme = "https") { proxy_pass https://$host:$server_port/admin/; } } ............................... }改变后的配置 server { listen 8208; listen 18208 ssl; http2 on; root /home/application/nginx/html/srebro; ssl_certificate /home/application/nginx/conf/server.crt; ssl_certificate_key /home/application/nginx/conf/server.key; ssl_session_timeout 5m; ssl_protocols TLSv1.2 TLSv1.3; ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE; ssl_prefer_server_ciphers on; #httpp-https重定向 location =/ { if ($scheme = "http") { proxy_pass http://$http_host/admin/; } if ($scheme = "https") { proxy_pass https://$http_host/admin/; } } ............................... }变量区别在nginx中，$http_host、$host 和 $server_port 是三个不同的变量，它们的作用和含义如下：$http_host：这个变量包含了客户端请求中的"Host"标头的值。它会包含请求的域名和端口号（如果有的话），例如：www.example.com 或者 www.example.com:8080。host：这个变量包含了客户端请求中的"Host"标头的值，但不包含端口号。如果请求中没有指定端口号，那么host：这个变量包含了客户端请求中的host标头的值，但不包含端口号。如果请求中没有指定端口号，那么host中的值将不包含端口号，例如：www.example.com。server_port：这个变量包含了客户端请求中的端口号。如果请求中指定了端口号，那么server_port：这个变量包含了客户端请求中的端口号。如果请求中指定了端口号，那么server_port中的值将是该端口号；如果请求中没有指定端口号，则$server_port中的值将是80（HTTP默认端口）或443（HTTPS默认端口）。因此，http_host 包含了完整的主机名和端口信息，$http_host包含了完整的主机名和端口信息，host 只包含主机名而不包含端口信息，而$server_port 则只包含端口信息。$http_host使用场景$http_host变量通常在需要获取客户端请求中的完整主机名和端口信息时使用。一些常见的场景包括：虚拟主机配置：当配置多个虚拟主机时，可以使用$http_host变量来根据请求的主机名和端口号来路由到不同的虚拟主机配置。重定向规则：在配置重定向规则时，可以使用$http_host变量来获取请求的完整主机名和端口信息，并根据需要进行重定向。访问日志：在访问日志中记录客户端请求的完整主机名和端口信息。总之，$http_host 变量在需要获取客户端请求中的完整主机名和端口信息的场景下非常有用。5.20 关于server name 指令 问题该指令一般用来区分相同 IP地址和端口组合下的不同服务。NGINX在接收到HTTP 请求后会根据 listen 指令的参数在文件中查找相匹配的 server 块,然后在查找到的所有 server 块中根据 server_name 继续选择。如果找不到对应的 server 块，那么默认使用得到的所有server 块中的第一个。在使用 server_name 指令时，会匹配请求头中的 Host 字段，通常是一个 FODN 域名或地址。可以使用精确匹配、泛域名匹配和正则表达式匹配这些匹配规则,具体的匹配顺序依次如下：精确匹配，如 <www.example.co>以通配符开始的字符串匹配，如.example.com*以通配符结束的字符串匹配，如 <www.example>正则表达式匹配，如^www.example.com$配置了 default_server 参数的 server 块【如果没有匹配到其他server块的监听端口为80的server_name，那么将会使用当前server块作为默认服务器来处理请求。这通常用于设置默认的虚拟主机或者处理未知主机名的请求。】案例:我有一个 nginx 服务器，做为公司的 WEB 服务器，监听在 80 端口上；监听在下面不同的 server_name 下面, 且我的 DNS 解析是 把 *.srebro.cn 都 A 记录到 172.22.33.1 这个ip 上；这样就会有一个问题，当我访问任意 xx.srebro.cn 的时候，他就是随机跳转我下面的 server_name 上； 这意味着当请求到达nginx服务器时，如果没有匹配到其他server块的监听端口为80的server_name，那么将会使用当前server块作为默认服务器来处理请求。wiki.srebro.cncode.srebro.cnmap.srebro.cn处理方式：设置默认的虚拟主机或者处理未知主机名的请求server { listen 80 default_server; listen 443 ssl default_server; ssl_certificate /home/application/nginx/cert/srebro.cn/srebro.cn.crt; ssl_certificate_key /home/application/nginx/cert/srebro.cn/srebro.cn.key; server_name _; root /home/application/nginx/html; }5.21 nginx 中默认使用 http1 还是http2？在 Nginx 中，默认情况下使用的是 HTTP/1.1 协议。如果希望启用 HTTP/2，需要显式地在配置文件中进行设置。如果nginx 是编译部署，在编译 Nginx 时没有添加 --with-http_v2_module 参数，Nginx 就不会包含 HTTP/2 模块，因此你无法在配置中启用 HTTP/2 功能，且 openssl 版本要大于 1.1.1版本。编译 Nginx在安装或重新编译 Nginx 时，加入以下参数：./configure --with-http_v2_module ......配置文件中启用 http2示例：server { listen 443 ssl; http2 on; # 启用 HTTP/2 server_name xx.srenro.cn; ssl_certificate /home/application/nginx/cert/srenro.cn.crt; ssl_certificate_key /home/application/nginx/cert/srenro.cn.key; ssl_session_timeout 1h; ssl_session_cache shared:MozSSL:10m; ssl_protocols TLSv1.2 TLSv1.3; ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:DHE-RSA-CHACHA20-POLY1305; # 支持的加密套件 ssl_prefer_server_ciphers on; #优先使用服务器指定的加密算法 }在这个配置中，http2 参数使得 Nginx 启用 HTTP/2，并且这个设置仅对 SSL/TLS（即 HTTPS）连接有效。默认 HTTP 协议：HTTP/1.1 是 Nginx 的默认协议，除非显式启用 HTTP/2。HTTP/2 需要 Nginx 版本 1.9.5 或更高，并且仅能在启用了 SSL/TLS 的情况下使用。HTTP/1.1 对比 HTTP/2 协议5.22 nginx 的ssl 配置中ssl_prefer_server_ciphers on 参数用途在 Nginx 的 SSL 配置中，ssl_prefer_server_ciphers on; 这个指令的作用是控制在客户端和服务器之间协商加密套件时，是否优先使用服务器指定的加密算法（cipher suite）具体解释：加密套件（Cipher Suite）是用于 SSL/TLS 连接的加密算法集合，包括加密算法、消息认证码算法（MAC）、密钥交换算法等。客户端和服务器协商：当客户端和服务器建立 SSL/TLS 连接时，会互相协商一个共同支持的加密套件。这个过程通常是客户端先发送自己支持的加密套件列表，然后服务器从中选择一个双方都支持的加密套件。作用：开启：如果设置为 on，服务器将优先选择自己配置的加密套件，而不是根据客户端的首选顺序来选择。这意味着，服务器可以强制使用更强的加密套件，尽管客户端可能更倾向于使用其他套件。关闭（默认值是 off）：如果设置为 off，则服务器会遵循客户端提供的加密套件优先顺序，选择客户端列出的最优加密套件。提高安全性：通过优先选择服务器配置的加密套件，服务器可以确保使用强加密算法，避免客户端可能使用的弱加密算法（即使客户端支持它们）。这种配置有助于提高 SSL/TLS 连接的安全性。配置文件示例：server { listen 443 ssl; http2 on; # 启用 HTTP/2 server_name xx.srenro.cn; ssl_certificate /home/application/nginx/cert/srenro.cn.crt; ssl_certificate_key /home/application/nginx/cert/srenro.cn.key; ssl_session_timeout 1h; ssl_session_cache shared:MozSSL:10m; ssl_protocols TLSv1.2 TLSv1.3; ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:DHE-RSA-CHACHA20-POLY1305; # 支持的加密套件 ssl_prefer_server_ciphers on; }在这个例子中，ssl_ciphers 指定了服务器允许的加密套件，而 ssl_prefer_server_ciphers on; 确保即使客户端提供了其他加密套件，服务器也会优先选择这些高强度的加密算法。 ssl_ciphers 指定算法为 ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:DHE-RSA-CHACHA20-POLY13055.23 split_clients 模块用途Nginx 的 split_clients 模块 是一个非常实用的模块，主要用于实现流量分流或请求随机分配，常被用在 A/B 测试、灰度发布或负载均衡场景中。split_clients 模块根据预定义的权重，按一定比例将请求划分到不同的组。通过这种方式，可以将用户分配到不同的实验组、版本或后端服务器，便于测试新功能或分配流量。模块通过对某些用户属性（如 Cookie、IP 地址、客户端类型，请求参数等）的哈希值进行计算，来保证请求的分配是稳定的（即同一个用户总是会被分配到同一组）。基本语法split_clients "${variable}" $result_variable { range1 condition1; range2 condition2; ... * default_condition; }${variable}：用于哈希的变量，可以是 $remote_addr、$cookie_*、$arg_* 等。$result_variable：结果存储变量，用于判断用户属于哪一组。range：划分的范围（权重）。condition：条件的值，表示用户所属的组。default_condition：默认条件，当范围未覆盖到某些请求时的兜底值。（1）、实现 A/B 测试的示例假设需要将 50% 的用户分配到版本 A，另 50% 分配到版本 B：nginx 复制代码 split_clients "${remote_addr}" $variant { 50% "A"; 50% "B"; } location / { if ($variant = "A") { proxy_pass http://backend_A; } if ($variant = "B") { proxy_pass http://backend_B; } }根据用户的 IP 地址（$remote_addr），以 50% 的比例将请求分流到 backend_A 和 backend_B。每个用户的分配是固定的，因为基于哈希计算。（2）、实现灰度发布的示例在灰度发布中，你可能希望将 20% 的流量发送到新版本，其余 80% 发送到旧版本：nginx 复制代码 split_clients "${remote_addr}" $variant { 20% "new"; * "old"; } location / { if ($variant = "new") { proxy_pass http://new_backend; } if ($variant = "old") { proxy_pass http://old_backend; } }20% 表示将 20% 的用户分配到 new_backend。* 表示剩余的用户，分配到 old_backend。（3）、实现多版本分流如果有多个版本需要测试，可以设置多个分流比例：nginx 复制代码 split_clients "${remote_addr}" $variant { 10% "A"; 20% "B"; 30% "C"; * "D"; } location / { proxy_pass http://backend_$variant; }此配置中：10% 的用户分配到版本 A；20% 的用户分配到版本 B；30% 的用户分配到版本 C；其余用户分配到版本 D。实践： 使用 User-Agent 区分移动端和 PC 端Nginx 的 $http_user_agent 变量可以获取客户端的 User-Agent 字段，通过检测其中的关键标识词来区分设备类型。# 根据 User-Agent 设置变量 map $http_user_agent $device_type { ~*Mobile "mobile"; # 包含 "Mobile" 的 User-Agent，通常为移动设备 ~*Android|iPhone "mobile"; # 常见移动设备关键字 default "pc"; # 其他情况默认为 PC } # 使用 split_clients 进行分流 split_clients "${remote_addr}" $variant { 50% "A"; # 分流到 A 组 50% "B"; # 分流到 B 组 } # 不同设备访问不同服务 location / { if ($device_type = "mobile") { proxy_pass http://mobile_backend_$variant; # 移动端服务 } if ($device_type = "pc") { proxy_pass http://pc_backend_$variant; # PC 端服务 } }5.24 配置缓冲区在默认情况下，NGIX 缓冲区中的内容来自后端服务器。当后端服务器返回响应内容时NGINX 先将它存储在内部缓冲区中，直到接收到整个响应内容后才发送给客户端。缓冲区有于优化慢速客户端的性能，如果 NGINX把响应内容同步传递到客户端，那么有可能会浪费代理服务器的时间。而启用缓冲区后，NGINX允许代理服务器快速处理响应，NGINX把响应内容在储下来的时间和客户端下载响应内容所需的时间一样长。负责启用和禁用缓冲区的指令是 proxy_buffering，其默认值为 on，表示启用缓冲区proxy_buffers 指令用于设置为请求分配的缓冲区大小及数量。缓冲区的大小由 proxybuffer_size 指令设置。来自代理服务器的响应内容的第一部分会被存储在单独的缓冲区中这部分通常包含一个相对较小的响应头。缓冲区默认大小默认缓冲区大小 以下是一些缓冲区的默认值（不同版本可能略有不同）： proxy_buffers：默认是 8 4k 或 8 8k（8 个缓冲区，每个缓冲区大小为 4k 或 8k）。 proxy_buffer_size：默认值通常为一个内存页大小（4k 或 8k，取决于系统架构）。 client_body_buffer_size：默认通常是 8k 或 16k。自定义缓冲区大小location / { proxy_buffers 16 4k; # 响应体缓冲区 proxy_buffer_size 2k; # 响应头缓冲区 proxy_pass http://localhost:8080; }如果禁用缓冲区，则将从服务器接收到的响应同步发送到客户端。对于需要尽快开始接收响应的快速交互客户端，这样的配置是可行的。例如在 websock 的场景下，为了时效性，快速交互客户端，就不会开启缓冲区配置location ^~/socket { proxy_buffering off; #禁用缓冲区 rewrite ^/accidentsocket/(.*)$ /$1 break; proxy_pass http://192.168.1.1:9005; proxy_read_timeout 300s; proxy_send_timeout 300s; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; #升级http1.1到 websocket协议 proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection $connection_upgrade; }5.25 root 和 alias 区别核心区别指令路径解析逻辑斜杠规则适用场景典型用途root将location匹配的完整URI拼接到路径后可省略末尾斜杠目录结构与URI一致时托管项目主目录（如Laravel的public目录）alias用alias路径替换location匹配的URI部分必须以/结尾目录结构与URI不一致时映射独立资源目录（如CDN资源）(1)、路径拼接方式root示例：location /static/ { root /var/www/html; # 路径拼接为 /var/www/html/static/ }请求/static/image.jpg→ 实际路径/var/www/html/static/image.jpgalias示例：location /images/ { alias /var/data/media/; # 路径替换为 /var/data/media/ }请求/images/photo.jpg→ 实际路径/var/data/media/photo.jpg(2)、斜杠规则root：路径末尾可加可不加/，Nginx自动处理。alias：必须以/结尾，否则路径拼接错误（如alias /var/data会导致/images/file.jpg解析为/var/dataimages/file.jpg）(3)、正则匹配root：可与正则结合，直接拼接路径。location ~ ^/user/(.+\.jpg)$ { root /var/profiles/; # 路径为 /var/profiles/user/$1.jpg }alias：需配合正则捕获组，替换匹配部分。location ~ ^/user/(.+\.jpg)$ { alias /var/profiles/$1.jpg; # 路径为 /var/profiles/$1.jpg }若未使用捕获组，需通过$uri动态处理
Dufs 文件服务器部署：集成 dufs-material-assets 美化主题
一、项目介绍Dufs 是一款独特的实用文件服务器，支持静态服务、上传、搜索、访问控制、webdav...项目地址： https://github.com/sigoden/dufs最近看到 github 上有一个dufs的主题，dufs-material-assets。项目地址： https://github.com/TransparentLC/dufs-material-assetsdufs-material-assets 实现的功能：标有✨的是dufs原版前端界面未支持，额外添加的功能。二、dufs 主题实现方式简单概述： 从项目的 GitHub Actions 或 nightly.link 下载前端资源后，假定保存在 dufs-material-assets 目录，在启动 dufs 时添加参数 --assets dufs-material-assets。dufs 配置文件配置指南： 请见https://github.com/sigoden/dufs2.1 创建 dufs 工作目录$ mkdir -p /home/application/dufs/ $ mkdir -p /home/application/dufs/bin $ mkdir -p /home/application/dufs/dufs-material-assets $ mkdir -p /home/application/dufs/log $ mkdir -p /home/application/dufs/config $ mkdir -p /home/application/dufs/files2.2 下载 dufs 二进制文件及主题#下载 dufs 二进制文件，这里提供的dufs是dufs-material-assets主题所兼容的 dufs 版本，目前是v0.45.0 $ wget https://github.com/TransparentLC/dufs-material-assets/releases/download/v0.45.0/dufs-mod-v0.45.0-x86_64-unknown-linux-musl.zip #解压dufs二进制文件,并赋予可执行权限 $ unzip dufs-mod-v0.45.0-x86_64-unknown-linux-musl.zip -d /home/application/dufs/bin $ chmod +x /home/application/dufs/bin #下载dufs-material-assets主题 $ wget https://nightly.link/TransparentLC/dufs-material-assets/workflows/ci/master/stats.zip #解压dufs-material-assets主题 $ unzip dufs-material-assets.zip -d /home/application/dufs/dufs-material-assets2.3 配置dufs配置文件/home/application/dufs/files 为 dufs 文件发布的路径； -p 监听在 50000 端口 ； hidden忽略这些文件名称 .git,.DS_Store,tmp ；assets 表示使用dufs-material-assets 主题 。auth 使用用户名密码认证，加目录权限控制，不写用户名就代表为匿名用户。cat > /home/application/dufs/config/config.yaml << 'EOF' serve-path: '/home/application/dufs/files' bind: 0.0.0.0 port: 50000 hidden: - tmp - '*.log' - '.git' - '.DS_Store' - '*.lock' auth: - '@/upload:rw,/readme.md' - 'admin:srebro@/:rw' allow-all: false allow-upload: true allow-delete: true allow-search: true allow-symlink: true allow-archive: true enable-cors: true render-index: true render-try-index: true render-spa: true assets: /home/application/dufs/dufs-material-assets log-format: '$remote_addr "$request" $status $http_user_agent' log-file: /home/application/dufs/log/dufs.log compress: low 'EOF'2.4 使用 systemd 管理 dufscat > /etc/systemd/system/dufs.service << 'EOF' [Unit] Description=Dufs File Server Documentation=https://github.com/TransparentLC/dufs-material-assets?tab=readme-ov-file After=network.target Wants=network.target [Service] Type=simple User=root Group=root WorkingDirectory=/home/application/dufs/ ExecStart=/home/application/dufs/bin/dufs --config /home/application/dufs/config/config.yaml ExecReload=/bin/kill -HUP $MAINPID Restart=on-failure RestartSec=5 StandardOutput=journal StandardError=journal SyslogIdentifier=dufs [Install] WantedBy=multi-user.target EOF重新加载 systemd 配置systemctl daemon-reload启动服务并设置开机自启systemctl start dufs systemctl enable dufs2.5 效果预览
一、环境信息名称版本OpEneuler22.03 LTS SP4iSulad2.1.5OCI1.0.1CNI1.5.0二、iSulad介绍2.1 iSulad 是什么？iSulad 是一个由华为开源并贡献给开放原子开源基金的轻量级、符合行业标准的容器运行时引擎。它的名字源自英文 “Lightweight” 和 “Daemon” 的组合，意为“轻量的守护进程”，这直接点明了其核心设计目标：高性能、低损耗、高安全性。iSulad 是云原生计算基金会（CNCF）的开放容器倡议（OCI）标准的实现，能够运行标准的容器镜像。2.2 诞生背景与设计目标在容器技术发展的早期，Docker 是事实上的标准。但随着 Kubernetes 和云原生生态的成熟，社区发现 Docker 的“一体化”架构（集成了运行时、镜像构建、网络、存储等）显得臃肿，并且存在以下问题：单一故障点：Docker Daemon 守护进程如果崩溃，会影响所有容器。安全性：庞大的守护进程拥有过高权限，攻击面较大。灵活性不足：难以替换其中的某个组件（如网络、运行时）。为了解决这些问题，社区开始推崇“关注点分离”的架构。Kubernetes 推出了 CRI 标准，将容器运行时与 kubelet 解耦。iSulad 正是在这种背景下诞生的，它被设计为：专一的运行时：只专注于管理容器的生命周期（创建、运行、停止、删除）。兼容开放标准：原生支持 OCI（镜像与运行时标准）和 CRI（Kubernetes 容器运行时接口）。面向云原生：为 Kubernetes 和大规模数据中心环境量身定制。2.3 核心架构与特点2.3.1 轻量级与高性能iSulad 本身用 C 语言实现，资源占用（CPU、内存）极低，启动速度非常快。相比于用 Go 语言实现的 Docker Daemon 或 containerd，它的内存开销可以小一个数量级，这对于资源敏感的边缘计算、物联网或高密度部署场景至关重要。2.3.2 模块化设计这是 iSulad 最核心的设计理念。它将功能解耦为多个独立的模块：容器运行时核心：iSulad 守护进程本身。网络：通过 CNI 接口与外部网络插件（如 Calico、Flannel）集成。存储：通过 CSI 接口与外部存储插件集成。镜像管理：最初支持 LCR（另一个轻量级组件），但现在更主流的用法是将 iSulad 作为 containerd 或 Docker 的一个 shim 运行时。在这种情况下，镜像管理、存储等高级功能由 containerd/Docker 负责，iSulad 只专注于运行容器，从而变得更轻量。2.3.3 高安全性iSulad 在设计之初就深度集成了多种安全特性，这也是它的一大亮点：内核安全能力：原生支持 SELinux、AppArmor、Seccomp 等。硬件虚拟化支持：可以与 Kata Containers 等安全容器运行时无缝集成，让每个容器运行在一个独立的轻量级虚拟机中，提供更强的硬件级隔离。权限管理：支持基于能力的细粒度权限控制。2.3.4 丰富的接口支持iSulad 提供了多种方式供用户交互：命令行工具：isula命令，用法与 docker命令非常相似，例如 isula run, isula ps，降低了用户的学习成本。RESTful API：提供了 REST API，便于与其他系统集成。CRI 接口：这是最重要的接口。Kubernetes 的 kubelet 可以通过 CRI 接口直接与 iSulad 通信，使其可以完全替代 Docker 或 containerd，成为 Kubernetes 的容器运行时。2.3.5 iSulad 与 Docker 的对比特性iSuladDocker架构理念模块化、专一、符合开放标准一体化、大而全核心职责纯粹的容器生命周期管理容器生命周期、镜像构建、网络、存储等资源占用极低，轻量级相对较高安全性深度集成多种安全机制，支持安全容器支持标准安全机制，但守护进程攻击面较大网络/存储通过 CNI/CSI 插件化实现，灵活内置一套，也可通过插件扩展与 Kubernetes 集成原生通过 CRI 接口，路径短，高效早期通过 dockershim（已废弃），现在主要通过 CRI 到 containerd适用场景云原生、边缘计算、IoT、高密度部署、对安全和性能要求高的场景个人开发、测试、CI/CD，以及需要一体化解决方案的场景三、iSulad部署3.1 前置环境[可选]#挂载iSula默认存储路径[可选] iSula的默认工作路径在/var/lib/isula ，最好不修改默认存储路径，可以做软链接 #建立工作目录 $ mkdir /home/application/ #格式化磁盘 $ mkfs.ext4 /dev/sdb #磁盘永久挂载 $ vim /etc/fstab ... /dev/sdb /home/application ext4 defaults 0 0 ... #使挂载生效 $ mount -a # 创建docker 工作目录 $ mkdir -p /home/application/isula #创建软链接 $ ln -s /home/application/isula /var/lib/3.2 使用yum安装iSulad（推荐）使用yum安装iSulad，参考命令如下：#安装 $ yum install -y iSulad #查看版本 [root@localhost ～]# isula version Client: Version: 2.1.5 Git commit: 5ebca976dd591a5676527be1bde950e5ce93eac0 Built: 2025-01-08T17:42:13.924990065+08:00 Server: Version: 2.1.5 Git commit: 5ebca976dd591a5676527be1bde950e5ce93eac0 Built: 2025-01-08T17:42:13.924990065+08:00 OCI config: Version: 1.0.1 Default file: /etc/default/isulad/config.json3.3 安装CNI 网络插件为啥需要单独安装 CNI 网络插件Docker 采用的是“一体化”架构，“all-in-one”的设计理念，它内置了一个名为 libnetwork的网络库和默认的 bridge驱动。当你安装 Docker 时，网络功能已经包含在内。默认会创建一个 docker0的网桥，并自动为容器分配 IP 地址。而isulad被设计为一个纯粹的、轻量级的容器运行时。它的核心职责是管理容器的生命周期（创建、运行、暂停、销毁等），确保容器以隔离的方式运行。它刻意地将网络、存储等高级功能从核心引擎中剥离出去。网络功能被看作是一个独立的、可插拔的模块。CNI（Container Network Interface）是一个由 CNCF 维护的标准接口规范。它定义了容器运行时如何与网络插件交互。iSulad 通过实现 CRI（Container Runtime Interface）接口，可以无缝地与 Kubernetes 集成。而 Kubernetes 的网络模型正是基于 CNI 的。因此，iSulad 使用 CNI 是为了更好地融入云原生生态体系（尤其是 Kubernetes）。Kubernetes 本身不管理网络，它要求每个节点上的容器运行时（如 iSulad、containerd）通过 CNI 插件来为 Pod 设置网络。所以，当你为 iSulad 安装并配置好 CNI 插件（如 bridge、host-local，或更复杂的 Calico、Flannel）后，它就能提供与 Docker 同等甚至更强大的网络能力。CNI 网络插件地址： https://github.com/containernetworking经过测试建议安装v0.9.0及以上版本的CNI插件，这里以v1.5.0版本为例。【ps：当iSulad=2.1.5的时候，CNI 1.5.0 以上的版本安装报错】#创建 CNI 二进制存放路径 $ mkdir -p /opt/cni/bin/ #x86架构 $ wget https://github.com/containernetworking/plugins/releases/download/v1.5.0/cni-plugins-linux-amd64-v1.5.0.tgz #解压 $ tar -xf cni-plugins-linux-amd64-v1.5.0.tgz -C /opt/cni/bin/ $ ls -l /opt/cni/bin/ 总用量 81536 -rwxr-xr-x 1 1001 127 4272394 5月 20 2024 bandwidth -rwxr-xr-x 1 1001 127 4787319 5月 20 2024 bridge -rwxr-xr-x 1 1001 127 11430474 5月 20 2024 dhcp -rwxr-xr-x 1 1001 127 4422354 5月 20 2024 dummy -rwxr-xr-x 1 1001 127 4943785 5月 20 2024 firewall -rwxr-xr-x 1 1001 127 4344044 5月 20 2024 host-device -rwxr-xr-x 1 1001 127 3679567 5月 20 2024 host-local -rwxr-xr-x 1 1001 127 4440601 5月 20 2024 ipvlan -rw-r--r-- 1 1001 127 11357 5月 20 2024 LICENSE -rwxr-xr-x 1 1001 127 3750042 5月 20 2024 loopback -rwxr-xr-x 1 1001 127 4478854 5月 20 2024 macvlan -rwxr-xr-x 1 1001 127 4228716 5月 20 2024 portmap -rwxr-xr-x 1 1001 127 4600833 5月 20 2024 ptp -rw-r--r-- 1 1001 127 2343 5月 20 2024 README.md -rwxr-xr-x 1 1001 127 3956598 5月 20 2024 sbr -rwxr-xr-x 1 1001 127 3223795 5月 20 2024 static -rwxr-xr-x 1 1001 127 4503238 5月 20 2024 tap -rwxr-xr-x 1 1001 127 3837627 5月 20 2024 tuning -rwxr-xr-x 1 1001 127 4439832 5月 20 2024 vlan -rwxr-xr-x 1 1001 127 4102988 5月 20 2024 vrf3.4 配置daemon.json配置文件配置 CNI$ vim /etc/isulad/daemon.json ... "cni-bin-dir": "/opt/cni/bin", "cni-conf-dir": "/etc/cni/net.d", ...cni-bin-dir为cni二进制文件的目录，不配置默认为/opt/cni/bin，cni-conf-dir为网络配置文件的目录，不配置默认为/etc/cni/net.d。若使用默认的目录，可不配置daemon.json文件，直接启动isulad。配置镜像仓库地址【镜像加速地址】$ vim /etc/isulad/daemon.json ... "registry-mirrors": [ "https://docker.hpcloud.cloud", "https://docker.m.daocloud.io", "https://docker.mybacc.com", "https://docker.1panel.live", "http://mirrors.ustc.edu.cn", "https://docker.chenby.cn", "http://mirror.azure.cn", "https://dockerpull.org", "https://dockerhub.icu", "https://hub.rat.dev", "https://proxy.1panel.live", "https://docker.1panel.top", "https://docker.m.daocloud.io", "https://docker.1ms.run", "https://docker.ketches.cn" ], ...3.5 重启 isulad并开机自启$ systemctl restart isulad.service $ systemctl enable isulad.service四、iSulad 容器管理4.1 容器基本操作4.1.1 创建容器isula create 命令用于创建一个新的容器。容器引擎会使用指定的容器镜像创建容器读写层，或者使用指定的本地rootfs作为容器的运行环境。创建完成后，会将容器的ID输出到标准输出，后续可以使用 isula start 命令启动该容器。新创建的容器状态为 inited 状态。语法：isula create [OPTIONS] IMAGE [COMMAND] [ARG...]常用参数：--name=NAME：指定容器名称-i, --interactive：保持容器的标准输入打开-t, --tty：分配一个伪终端-d, --detach：后台运行容器-e, --env：设置环境变量-p, --publish：端口映射，需要配置CNI 网络，并创建网桥-v, --volume：挂载卷--rm：容器退出时自动删除示例：# 创建一个基础容器 $ isula create --name mycontainer busybox # 创建一个交互式容器 $ isula create -it --name interactive-container busybox /bin/sh # 创建容器并设置环境变量 $ isula create --name env-container -e ENV_VAR=value busybox # 创建容器并挂载目录 $ isula create --name data-container -v /host/data:/container/data busybox4.1.2 启动容器isula start 命令用于启动一个或多个已创建的容器。语法：isula start [OPTIONS] CONTAINER [CONTAINER...]常用参数：-a, --attach：附加到容器的标准输入、输出和错误流-i, --interactive：保持标准输入打开示例：# 启动容器 $ isula start mycontainer # 启动容器并附加到终端 $ isula start -a mycontainer # 启动多个容器 $ isula start container1 container2 container34.1.3 运行容器isula run 命令相当于 create + start 的组合，直接创建并启动容器。语法：isula run [OPTIONS] IMAGE [COMMAND] [ARG...]示例：# 运行一个简单的容器 $ isula run busybox echo "Hello iSulad" # 以交互模式运行容器 $ isula run -it busybox /bin/sh # 后台运行容器 $ isula run -d --name web-server nginx # 运行容器并挂载目录 $ isula run -it -v /home/data:/data busybox /bin/sh4.1.4 停止容器isula stop 命令用于停止一个或多个正在运行的容器。语法：isula stop [OPTIONS] CONTAINER [CONTAINER...]常用参数：-t, --time：等待容器停止的时间（秒），默认为10秒示例：# 停止容器 $ isula stop mycontainer # 停止容器并指定等待时间 $ isula stop -t 30 mycontainer # 停止多个容器 $ isula stop container1 container2 container34.1.5 重启容器isula restart 命令用于重启容器。语法：isula restart [OPTIONS] CONTAINER [CONTAINER...]示例：# 重启容器 $ isula restart mycontainer # 重启多个容器 $ isula restart container1 container24.1.6 删除容器isula rm 命令用于删除一个或多个容器。语法：isula rm [OPTIONS] CONTAINER [CONTAINER...]常用参数：-f, --force：强制删除正在运行的容器-v, --volumes：删除与容器关联的卷示例：# 删除已停止的容器 $ isula rm mycontainer # 强制删除正在运行的容器 $ isula rm -f mycontainer # 删除多个容器 $ isula rm container1 container2 container3 # 删除所有已停止的容器 $ isula rm $(isula ps -aq --filter status=exited)4.2 容器查看与监控4.2.1 查看容器列表isula ps 命令用于列出容器。语法：isula ps [OPTIONS]常用参数：-a, --all：显示所有容器（默认只显示运行中的）-q, --quiet：只显示容器ID--filter：根据条件过滤容器--format：格式化输出示例：# 查看正在运行的容器 $ isula ps # 查看所有容器 $ isula ps -a # 只显示容器ID $ isula ps -q # 根据状态过滤容器 $ isula ps --filter status=running $ isula ps --filter status=exited # 根据名称过滤容器 $ isula ps --filter name=web4.2.2 查看容器详细信息isula inspect 命令用于查看容器的详细信息。语法：isula inspect [OPTIONS] CONTAINER [CONTAINER...]示例：# 查看容器详细信息 $ isula inspect mycontainer # 查看多个容器信息 $ isula inspect container1 container2 # 格式化输出特定字段 $ isula inspect --format='{{.State.Status}}' mycontainer4.2.3 查看容器日志isula logs 命令用于查看容器的日志输出。语法：isula logs [OPTIONS] CONTAINER常用参数：-f, --follow：实时跟踪日志输出-t, --timestamps：显示时间戳--tail：显示最后N行日志--since：显示指定时间之后的日志示例：# 查看容器日志 $ isula logs mycontainer # 实时跟踪日志 $ isula logs -f mycontainer # 显示最后10行日志 $ isula logs --tail 10 mycontainer # 显示带时间戳的日志 $ isula logs -t mycontainer4.2.4 查看容器资源使用情况isula stats 命令用于显示容器的资源使用统计信息。语法：isula stats [OPTIONS] [CONTAINER...]常用参数：--no-stream：只显示一次统计信息，不持续更新示例：# 查看所有运行容器的资源使用情况 $ isula stats # 查看指定容器的资源使用情况 $ isula stats mycontainer # 只显示一次统计信息 $ isula stats --no-stream4.2.5 查看容器内进程isula top 命令用于查看容器内运行的进程。语法：isula top CONTAINER [ps OPTIONS]示例：# 查看容器内进程 $ isula top mycontainer # 查看容器内进程的详细信息 $ isula top mycontainer aux4.3 容器交互操作4.3.1 进入容器isula exec 命令用于在运行的容器中执行命令。语法：isula exec [OPTIONS] CONTAINER COMMAND [ARG...]常用参数：-i, --interactive：保持标准输入打开-t, --tty：分配一个伪终端-d, --detach：后台执行命令-u, --user：指定用户-w, --workdir：指定工作目录示例：# 进入容器的shell $ isula exec -it mycontainer /bin/sh # 在容器中执行命令 $ isula exec mycontainer ls -la # 以指定用户身份执行命令 $ isula exec -u root mycontainer whoami # 在指定工作目录执行命令 $ isula exec -w /tmp mycontainer pwd4.3.2 附加到容器isula attach 命令用于附加到正在运行的容器。语法：isula attach [OPTIONS] CONTAINER示例：# 附加到容器 $ isula attach mycontainer4.3.3 容器文件操作isula cp 命令用于在容器和主机之间复制文件或目录。语法：isula cp [OPTIONS] CONTAINER:SRC_PATH DEST_PATH isula cp [OPTIONS] SRC_PATH CONTAINER:DEST_PATH示例：# 从容器复制文件到主机 $ isula cp mycontainer:/app/config.txt ./config.txt # 从主机复制文件到容器 $ isula cp ./data.txt mycontainer:/app/data.txt # 复制目录 $ isula cp mycontainer:/app/logs ./logs $ isula cp ./config mycontainer:/app/config4.4 容器网络管理4.4.1 使用native网络native网络的使用与docker相似，下面展示一些简单的操作流程。创建网络 支持指定 IP 网段，isula network create -d bridge --subnet "10.22.33.0/24" --gateway "10.22.33.1" srebro#直接创建不指定 ip 网段 $ isula network create srebro $ isula network ls NAME VERSION PLUGIN srebro 1.0.0 bridge,portmap,firewall #查看网络详情 $ isula network inspect srebro [ { "cniVersion": 1.0.0, "name": srebro, "plugins": [ { "type": bridge, "bridge": isula-br0, "isGateway": true, "ipMasq": true, "hairpinMode": true, "ipam": { "type": host-local, "routes": [ { "dst": 0.0.0.0/0 } ], "ranges": [ [ { "subnet": 192.168.0.0/24, "gateway": 192.168.0.1 } ] ] } }, { "type": portmap, "capabilities": { "portMappings": true } }, { "type": firewall } ] } ]4.4.3 支持的网络模式iSulad 支持多种网络模式：# 使用指定网络 $ isula run -d --name web01 --network srebro -p 80:80 nginx # 使用主机网络 $ isula run -d --net=host --name web02 nginx # 不使用网络 $ isula run -d --net=none --name web03 nginx # 使用容器网络 $ isula run -d --net=container:other-container --name web04 nginx4.5 容器存储管理4.5.1 数据卷管理创建和使用数据卷：# 创建匿名卷 $ isula run -d -v /data --name app busybox # 绑定挂载主机目录 $ isula run -d -v /host/data:/container/data --name app busybox # 只读挂载 $ isula run -d -v /host/data:/container/data:ro --name app busybox # 挂载多个目录 $ isula run -d \ -v /host/data:/app/data \ -v /host/logs:/app/logs \ --name app busybox4.5.2 临时文件系统# 挂载tmpfs $ isula run -d --tmpfs /tmp --name app busybox # 指定tmpfs大小 $ isula run -d --tmpfs /tmp:size=100m --name app busybox4.6 容器安全管理4.6.1 权限控制# 以特权模式运行容器 $ isula run -d --privileged --name privileged-app busybox # 添加特定权限 $ isula run -d --cap-add=NET_ADMIN --name net-app busybox # 删除特定权限 $ isula run -d --cap-drop=CHOWN --name secure-app busybox # 以指定用户运行 $ isula run -d --user 1000:1000 --name user-app busybox4.6.2 资源限制# 限制内存使用 $ isula run -d -m 512m --name memory-limited busybox # 限制CPU使用 $ isula run -d --cpus="1.5" --name cpu-limited busybox # 限制CPU核心 $ isula run -d --cpuset-cpus="0,1" --name cpu-pinned busybox # 设置CPU权重 $ isula run -d --cpu-shares=512 --name cpu-weighted busybox4.6.3 安全选项# 设置SELinux标签 $ isula run -d --security-opt label=level:s0:c100,c200 --name selinux-app busybox # 禁用SELinux $ isula run -d --security-opt label=disable --name no-selinux busybox # 设置AppArmor配置 $ isula run -d --security-opt apparmor=unconfined --name apparmor-app busybox4.7 容器健康检查4.7.1 配置健康检查# 配置HTTP健康检查 $ isula run -d \ --health-cmd="curl -f http://localhost/ || exit 1" \ --health-interval=30s \ --health-timeout=10s \ --health-retries=3 \ --name web nginx # 配置命令健康检查 $ isula run -d \ --health-cmd="ps aux | grep nginx" \ --health-interval=30s \ --name web nginx # 禁用健康检查 $ isula run -d --no-healthcheck --name web nginx4.7.2 查看健康状态# 查看容器健康状态 $ isula inspect --format='{{.State.Health.Status}}' web # 查看健康检查历史 $ isula inspect --format='{{json .State.Health}}' web4.8 容器镜像管理4.8.1 镜像基本操作# 拉取镜像 $ isula pull nginx:latest # 查看本地镜像 $ isula images # 删除镜像 $ isula rmi nginx:latest # 查看镜像详细信息 $ isula inspect nginx:latest4.8.2 镜像标签管理# 给镜像打标签 $ isula tag nginx:latest my-nginx:v1.0 # 删除镜像标签 $ isula rmi my-nginx:v1.0五、参考https://docs.openeuler.openatom.cn/zh/docs/25.09/cloud/container_engine/isula_container_engine/overview.htmlhttps://gitee.com/openeuler/iSulad/blob/master/docs/manual/native_network_zh.md
二进制安装docker2.1 二进制包下载wget https://mirrors.nju.edu.cn/docker-ce/linux/static/stable/x86_64/docker-27.1.1.tgz2.2 解压，拷贝至/usr/bin 下tar -xf docker-27.1.1.tgz cp docker/* /usr/bin which docker2.3 编写docker.service文件vim /etc/systemd/system/docker.service[Unit] Description=Docker Application Container Engine Documentation=https://docs.docker.com After=network-online.target firewalld.service Wants=network-online.target [Service] Type=notify ExecStart=/usr/bin/dockerd ExecReload=/bin/kill -s HUP $MAINPID LimitNOFILE=infinity LimitNPROC=infinity TimeoutStartSec=0 Delegate=yes KillMode=process Restart=on-failure StartLimitBurst=3 StartLimitInterval=60s [Install] WantedBy=multi-user.target备注： 如果想要修改 docker默认 存储路径，不推荐此方式，建议保留 /var/lib/docker ，使用 软连接的方式vim /etc/systemd/system/docker.service ........ ExecStart=/usr/bin/dockerd --graph=/home/application/docker ........2.4 挂载docker默认存储路径[可选]docker的默认工作路径在/var/lib/docker ，最好不修改默认存储路径，可以做软链接#建立工作目录 mkdir /home/application/ #格式化磁盘 mkfs.ext4 /dev/sdb #磁盘永久挂载 vim /etc/fstab /dev/sdb /home/application ext4 defaults 0 0 #使挂载生效 mount -a # 创建docker 工作目录 mkdir -p /home/application/docker #创建软链接 ln -s /home/application/docker /var/lib/2.5 添加可执行权限chmod +x /etc/systemd/system/docker.service2.6 启动，加载，开机自启动systemctl daemon-reload systemctl start docker systemctl enable docker2.7 配置镜像加速器,日志管理⚠️ 镜像加速地址可能随时失效，请自行验证！！mkdir -p /etc/docker tee /etc/docker/daemon.json <<-'EOF' { "registry-mirrors": [ "https://docker.hpcloud.cloud", "https://docker.m.daocloud.io", "https://docker.mybacc.com", "https://docker.1panel.live", "http://mirrors.ustc.edu.cn", "https://docker.chenby.cn", "http://mirror.azure.cn", "https://dockerpull.org", "https://dockerhub.icu", "https://hub.rat.dev", "https://proxy.1panel.live", "https://docker.1panel.top", "https://docker.m.daocloud.io", "https://docker.1ms.run", "https://docker.ketches.cn" ], "exec-opts": ["native.cgroupdriver=systemd"], "log-driver": "json-file", "log-opts": { "max-size": "10m", "max-file": "3" } } EOF systemctl daemon-reload systemctl restart dockertips：⚠️如果仓库不是https 的，需要在 /etc/docker/daemon.json 中 添加忽略；比如下方的示例"insecure-registries": [ "https://xx.xx.com", "https://xx.xx.cc.xx.com" ]tips：⚠️如果客户的网络里有172.17.0.0 网段，需要在 /etc/docker/daemon.json 中修改默认的docker0 网桥地址，避免冲突{ "bip":"192.168.8.1/24" }
一、常见CPU 架构：二、环境信息CPU架构操作系统配置HUAWEI Kunpeng 920 5220 aarch64openEuler 22.03 (LTS-SP3)64C128g15T三、安装docker3.1 二进制包下载docker-ce 社区下载地址：wget https://mirrors.nju.edu.cn/docker-ce/linux/static/stable/aarch64/docker-27.1.2.tgz3.2 解压，拷贝至/usr/bin 下tar -xf docker-27.1.2.tgz cp docker/* /usr/bin which docker3.3 编写docker.service文件cat > /etc/systemd/system/docker.service <<EOF [Unit] Description=Docker Application Container Engine Documentation=https://docs.docker.com After=network-online.target firewalld.service Wants=network-online.target [Service] Type=notify ExecStart=/usr/bin/dockerd ExecReload=/bin/kill -s HUP $MAINPID LimitNOFILE=65535 LimitNPROC=65535 LimitCORE=65535 TimeoutStartSec=0 Delegate=yes KillMode=process Restart=on-failure StartLimitBurst=3 StartLimitInterval=60s [Install] WantedBy=multi-user.target EOF3.4 挂载docker默认存储路径[可选]docker的默认工作路径在/var/lib/docker ，最好不修改默认存储路径，可以做软链接#建立工作目录 mkdir /home/application/ #格式化磁盘 mkfs.ext4 /dev/sdb #磁盘永久挂载 vim /etc/fstab /dev/sdb /home/application ext4 defaults 0 0 #使挂载生效 mount -a # 创建docker 工作目录 mkdir -p /home/application/docker #创建软链接 ln -s /home/application/docker /var/lib/3.5 添加可执行权限chmod +x /etc/systemd/system/docker.service3.6 启动，加载，开机自启动systemctl daemon-reload systemctl start docker.service systemctl enable docker.service3.7 配置镜像加速器,日志管理mkdir -p /etc/docker tee /etc/docker/daemon.json <<-'EOF' { "registry-mirrors": ["https://docker.m.daocloud.io"], "exec-opts": ["native.cgroupdriver=systemd"], "log-driver": "json-file", "log-opts": { "max-size": "10m", "max-file": "3" } } EOF systemctl daemon-reload systemctl restart docker如果仓库不是https 的，需要在 /etc/docker/daemon.json 中 添加忽略；比如下方的示例"insecure-registries": [ "https://xx.xx.com", "https://xx.xx.cc.xx.com" ]四、Docker编排工具Docker Compose4.1 在AArch64位系统上直接下载对应的二进制包wget https://github.com/docker/compose/releases/download/v2.29.3/docker-compose-linux-aarch64 -O /usr/local/bin/docker-compose chmod +x /usr/local/bin/docker-compose4.2 版本验证[root@localhost ~]# docker-compose version Docker Compose version v2.29.3
如何在OpenEuler 上快速部署一套Zabbix监控系统一、环境信息用途机器IP操作系统备注zabbix-server172.22.33.180openeuler 22.03 LTS SP37.0 LTS 版本，容器部署zabbix-agent172.16.10.182openeuler 22.03 LTS SP37.0 源码编译部署二、Docker 部署2.1 二进制包下载wget https://download.docker.com/linux/static/stable/x86_64/docker-19.03.9.tgz2.2 解压，拷贝至/usr/bin 下tar -xf docker-19.03.9.tgz cp docker/* /usr/bin which docker2.3 编写docker.service文件vim /etc/systemd/system/docker.service[Unit] Description=Docker Application Container Engine Documentation=https://docs.docker.com After=network-online.target firewalld.service Wants=network-online.target [Service] Type=notify ExecStart=/usr/bin/dockerd ExecReload=/bin/kill -s HUP $MAINPID LimitNOFILE=infinity LimitNPROC=infinity TimeoutStartSec=0 Delegate=yes KillMode=process Restart=on-failure StartLimitBurst=3 StartLimitInterval=60s [Install] WantedBy=multi-user.target备注： 如果想要修改 docker默认 存储路径，不推荐此方式，建议保留 /var/lib/docker ，使用 软连接的方式2.4 添加可执行权限chmod +x /etc/systemd/system/docker2.5 启动，加载，开机自启动systemctl daemon-reload systemctl start docker systemctl enable docker2.6 配置镜像加速器请自行准备加速地址[2024年6月]mkdir -p /etc/docker tee /etc/docker/daemon.json <<-'EOF' { "registry-mirrors": ["https://xxxxxxxxx/"], "exec-opts": ["native.cgroupdriver=systemd"] } EOF三、docker-compose 部署3.1 docker 和 docker-compose 的版本对应关系https://docs.docker.com/compose/compose-file/compose-versioning/#version-1-to-2x3.2 安装docker-compose#从GitHub上 下载docker-compose 二进制包 root@manager:~# wget https://github.com/docker/compose/releases/download/1.29.0/docker-compose-Linux-x86_64 #把下载下来的软件包上传到/root 路径下 root@manager:~# mv docker-compose-Linux-x86_64 /usr/bin/docker-compose root@manager:~# chmod +x /usr/bin/docker-compose #安装后查看下版本 root@manager:~# docker-compose version docker-compose version 1.29.0, build 07737305 docker-py version: 5.0.0 CPython version: 3.7.10 OpenSSL version: OpenSSL 1.1.0l 10 Sep 2019四、安装部署zabbix-server4.1 zabbix7.0新功能描述更多内容源于zabbix官网，更多详情：https://www.zabbix.com/documentation/current/zh/manual/introduction/whatsnew7004.2 zabbix7.0安装要求更多内容源于zabbix官网，更多详情：https://www.zabbix.com/documentation/current/en/manual/installation/requirements4.3 zabbix7.0容器化安装方式更多内容源于zabbix官网，更多详情：https://www.zabbix.com/documentation/current/en/manual/installation/containersZabbix 提供基于各种操作系统基础映像的映像。要获取特定 Zabbix 组件支持的基础操作系统映像列表，请参阅Docker Hub中的组件描述。所有 Zabbix 映像都配置为在基础映像更新时重建最新映像。此外还需要 PostgreSQL 数据库支持的 Zabbix serve 运行4.3.1 使用docker-compose运行zabbix-server这里我没用创建单独的容器网络，直接使用宿主机网络通信，注意宿主机上的端口，切莫端口冲突创建zabbix工作目录mkdir -p /home/application/zabbix创建docker-compose.yaml 文件 vim /home/application/zabbix/docker-compose.yaml 注意自定义修改pg数据库的密码postgres_data 数据库的数据目录，单独挂载在zabbix 的工作目录的postgres_data 下，也就是，/home/application/zabbix/postgres_datazabbix 的 zabbix_alertscripts 自定义警报脚本，单独挂载在zabbix 的工作目录的zabbix_alertscripts 下，也就是，/home/application/zabbix/zabbix_alertscripts网络模式，宿主机模式version: "3" services: postgres: image: postgres:15.7-alpine container_name: zabbix-postgres environment: POSTGRES_DB: zabbix POSTGRES_USER: zabbix POSTGRES_PASSWORD: srebro.cn command: -c max_connections=2000 restart: always volumes: - ./postgres_data:/var/lib/postgresql/data network_mode: host zabbix-server: image: zabbix/zabbix-server-pgsql:7.0-alpine-latest #image: zabbix/zabbix-server-pgsql:7.0-ubuntu-latest-new container_name: zabbix-server environment: DB_SERVER_HOST: 127.0.0.1 POSTGRES_USER: zabbix POSTGRES_PASSWORD: srebro.cn POSTGRES_DB: zabbix TZ: Asia/Shanghai volumes: - ./zabbix_alertscripts:/usr/lib/zabbix/alertscripts network_mode: host restart: always depends_on: - postgres zabbix-web-nginx: image: zabbix/zabbix-web-nginx-pgsql:7.0-alpine-latest container_name: zabbix-web-nginx environment: DB_SERVER_HOST: 127.0.0.1 POSTGRES_USER: zabbix POSTGRES_PASSWORD: srebro.cn POSTGRES_DB: zabbix ZBX_SERVER_HOST: 127.0.0.1 PHP_TZ: Asia/Shanghai network_mode: host restart: always depends_on: - zabbix-server运行docker-compose[root@localhost zabbix]# cd /home/application/zabbix [root@localhost zabbix]# docker-compose up -d [root@localhost zabbix]# docker-compose ps NAME COMMAND SERVICE STATUS PORTS zabbix-postgres "docker-entrypoint.s…" postgres running zabbix-server "/usr/bin/docker-ent…" zabbix-server running zabbix-web-nginx "docker-entrypoint.sh" zabbix-web-nginx running 4.3.3 登录zabbix-server web控制台WEB登录地址： http://172.22.33.180:8080默认密码： Admin/zabbix五、安装部署zabbix-agent5.1 zabbix7.0 源码包下载wget https://cdn.zabbix.com/zabbix/sources/stable/7.0/zabbix-7.0.0.tar.gz5.2 编译及依赖包环境准备我这里是openeuler 系统，尝试使用zabbix 官网提供的7.0 的rpm 包。但是在安装的时候，总是提示环境有问题，报错如下：[root@localhost ~]# yum install ./zabbix-agent-7.0.0-release1.el7.x86_64.rpm - 没有东西可提供 libcrypto.so.10()(64bit)（zabbix-agent-7.0.0-release1.el7.x86_64 需要） - 没有东西可提供 libcrypto.so.10(OPENSSL_1.0.1_EC)(64bit)（zabbix-agent-7.0.0-release1.el7.x86_64 需要） - 没有东西可提供 libcrypto.so.10(OPENSSL_1.0.2)(64bit)（zabbix-agent-7.0.0-release1.el7.x86_64 需要） - 没有东西可提供 libcrypto.so.10(libcrypto.so.10)(64bit)（zabbix-agent-7.0.0-release1.el7.x86_64 需要） - 没有东西可提供 liblber-2.4.so.2()(64bit)（zabbix-agent-7.0.0-release1.el7.x86_64 需要） - 没有东西可提供 libldap-2.4.so.2()(64bit)（zabbix-agent-7.0.0-release1.el7.x86_64 需要） - 没有东西可提供 libssl.so.10()(64bit)（zabbix-agent-7.0.0-release1.el7.x86_64 需要） - 没有东西可提供 libssl.so.10(libssl.so.10)(64bit)（zabbix-agent-7.0.0-release1.el7.x86_64 需要） (try to add '--skip-broken' to skip uninstallable packages or '--nobest' to use not only best candidate packages)尝试着去解决，最终还是放弃了，需要修改系统上的lib库，太过于复杂，还是索性采用源码编译的方式部署zabbix-agentopeneuler 编译及依赖包安装【跟着我安装下面的软件包，编译分分钟丝毫没有问题】yum groupinstall -y "Development Tools" yum install -y net-snmp net-snmp-devel libevent libevent-devel openssl openssl-devel curl curl-devel fping pcre pcre-devel pkgconfig添加zabbix用户，用户组groupadd --system zabbix useradd --system -g zabbix -d /usr/local/zabbix -s /sbin/nologin/ zabbix开始编译zabbix-agent 包tar -xf zabbix-7.0.0.tar.gz cd zabbix-7.0.0/ ./configure --prefix=/usr/local/zabbix --enable-agent --with-libcurl --with-net-snmp --with-libevent --with-openssl --enable-ipv6 make make install5.3 配置zabbix-agent并启动创建zabbix-agent 日志目录mkdir -p /usr/local/zabbix/logs修改zabbix工作目录权限chown -Rf zabbix:zabbix /usr/local/zabbix使用systemd管理配置zabbix-agent[root@localhost home]# vim /etc/systemd/system/zabbix-agent.service [Unit] Description = Zabbix Agent After = syslog.target network.target [Service] Type = forking Restart = on-failure KillMode = control-group ExecStart = /usr/local/zabbix/sbin/zabbix_agentd -c /usr/local/zabbix/etc/zabbix_agentd.conf RestartSec = 10s TimeoutSec = 0 User = zabbix Group = zabbix [Install] WantedBy = multi-user.target 修改配置文件 /usr/local/zabbix/etc/zabbix_agentd.conf 参数【Server，ServerActive，Hostname，UnsafeUserParameters,LogFile】# 被动模式下的 Zabbix-Server/Proxy 地址 Server=172.22.33.180 # 主动模式下的 Zabbix-Server/Proxy 地址 ServerActive=172.22.33.180 #主机名，设定 Zabbix-Agent 主机名，确保唯一且在 Zabbix-Server web 中一致 Hostname=172.16.10.182_agent-1 # 允许使用不安全的用户参数，允许创建自定义监控项 UnsafeUserParameters=1 # 指定 Zabbix-Agent 的日志文件路径 LogFile=/usr/local/zabbix/logs/zabbix_agentd.logreload 并启动zabbix-agent[root@k8s-node1 etc]# systemctl daemon-reload [root@k8s-node1 etc]# systemctl enable zabbix-agent [root@k8s-node1 etc]# systemctl start zabbix-agent [root@k8s-node1 etc]# ps -ef | grep zabbix_agent zabbix 478193 1 0 00:48 ? 00:00:00 /usr/local/zabbix/sbin/zabbix_agentd -c /usr/local/zabbix/etc/zabbix_agentd.conf zabbix 478194 478193 0 00:48 ? 00:00:00 /usr/local/zabbix/sbin/zabbix_agentd: collector [idle 1 sec] zabbix 478195 478193 0 00:48 ? 00:00:00 /usr/local/zabbix/sbin/zabbix_agentd: listener #1 [waiting for connection] zabbix 478196 478193 0 00:48 ? 00:00:00 /usr/local/zabbix/sbin/zabbix_agentd: listener #2 [waiting for connection] zabbix 478197 478193 0 00:48 ? 00:00:00 /usr/local/zabbix/sbin/zabbix_agentd: listener #3 [waiting for connection] zabbix 478198 478193 0 00:48 ? 00:00:00 /usr/local/zabbix/sbin/zabbix_agentd: listener #4 [waiting for connection] zabbix 478199 478193 0 00:48 ? 00:00:00 /usr/local/zabbix/sbin/zabbix_agentd: listener #5 [waiting for connection] zabbix 478200 478193 0 00:48 ? 00:00:00 /usr/local/zabbix/sbin/zabbix_agentd: listener #6 [waiting for connection] zabbix 478201 478193 0 00:48 ? 00:00:00 /usr/local/zabbix/sbin/zabbix_agentd: listener #7 [waiting for connection] zabbix 478202 478193 0 00:48 ? 00:00:00 /usr/local/zabbix/sbin/zabbix_agentd: listener #8 [waiting for connection] zabbix 478203 478193 0 00:48 ? 00:00:00 /usr/local/zabbix/sbin/zabbix_agentd: listener #9 [waiting for connection] zabbix 478204 478193 0 00:48 ? 00:00:00 /usr/local/zabbix/sbin/zabbix_agentd: listener #10 [waiting for connection] zabbix 478205 478193 0 00:48 ? 00:00:00 /usr/local/zabbix/sbin/zabbix_agentd: active checks #1 [idle 1 sec] root 478329 439035 0 00:48 pts/0 00:00:00 grep --color=auto zabbix_agent [root@k8s-node1 etc]# netstat -ntlup | grep 10050 tcp 0 0 0.0.0.0:10050 0.0.0.0:* LISTEN 478193/zabbix_agent tcp6 0 0 :::10050 :::* LISTEN 478193/zabbix_agent 5.4 配置zabbix-server 添加客户端监控登录zabbix-server 控制台/数据采集/主机/右上角，创建主机填写主机名称，【注意必须和zabbix-agent.conf 中的Hostname 保持一致】添加模板，勾选 Linux by Zabbix agent主机群组，Linux servers 【也可以自己创建主机群组】添加接口，类型为Agent，填写zabbix-agent 客户端IP，端口等看到zabbix 可用性，变成绿色 就表示，已经成功添加zabbix-agent查看最新数据， 监测/最新数据六、总结关于使用容器化的方式部署zabbix-server ，采用宿主机网络的问题当部署zabbix-server 的时候，单独创建一个容器网络bridge，zabbix-server 那台主机的zabbix-agent【注意说是zabbix-server 本机】 想要和zabbix-server 通讯的时候，zabbix-agent 的配置文件中的 Server，ServerActive 配置成宿主机的IP，发现zabbix-agent 日志一直在报错，提示 需要连接zabbix-server 的容器IP，比如 10.114.0.2 ； 当然也可以解决，直接写成容器IP也行，但是我们不能保证容器内的IP不发生变化； 为了解决这个问题，我直接采用了宿主机的通讯方式，在端口不冲突的情况下，完成agent和server 的通讯。openeuler 系统上，使用zabbix 官网的RPM 包不兼容问题还是手动编译安装吧，zabbix 没有去做设配openeuler 的RPM包，当然您也可以编译贡献RPM 包给社区，哈哈此文章，讲的是如何快速部署一套zabbix环境抛开我们以往的传统部署方式，安装前端环境，apache或者nginx，再去安装数据库，mysql 或者 pg；再就是php 环境，一套部署下来也需要不少精力和时间，只能说容器真的太方便了