首页
Search
1
解决 docker run 报错 oci runtime error
49,608 阅读
2
WebStorm2025最新激活码
28,204 阅读
3
互点群、互助群、微信互助群
23,060 阅读
4
常用正则表达式
21,664 阅读
5
罗技鼠标logic g102驱动程序lghub_installer百度云下载windows LIGHTSYNC
20,036 阅读
自习室
互通有无
搞钱日记
养生记
包罗万象
Search
标签搜索
职场副业
职业发展
副业赚钱
后端开发
内容创作
微服务
分布式系统
效率提升
DevOps
技能提升
流量变现
性能优化
云原生
高并发
编程学习
深度学习
人工智能
架构设计
机器学习
前端开发
loong
累计撰写
3,206
篇文章
累计收到
4
条评论
首页
栏目
自习室
互通有无
搞钱日记
养生记
包罗万象
页面
搜索到
47
篇与
的结果
2026-05-16
Kubernetes集群性能优化实战指南:从资源调度到网络优化的完整实践路径
当你的Kubernetes集群开始出现Pod调度缓慢、节点资源利用率不均、应用响应时间变长时,说明是时候进行系统性的性能优化了。我在过去几年管理多个生产集群的过程中,总结出了一套从诊断到优化的完整方法论。这篇教程会带你一步步掌握K8s性能优化的核心技能。学习目标完成本教程后,你将能够:准确诊断集群性能瓶颈的根本原因优化资源请求和限制配置调整调度器策略提升Pod分配效率优化网络性能减少延迟建立持续的性能监控体系前置准备在开始之前,请确保你已经:拥有一个运行中的Kubernetes集群(版本1.24+)具备kubectl命令行工具的基本使用经验安装了Prometheus和Grafana(用于监控)拥有集群的管理员权限如果你还没有监控系统,可以先快速部署kube-prometheus-stack:
2026年05月16日
13 阅读
0 评论
0 点赞
2026-05-08
自动化工作流性能监控与优化:从响应慢到秒级执行的实战方法
去年帮一家电商客户排查问题时,他们的订单处理工作流在大促期间几乎瘫痪——原本3秒完成的流程跑了2分钟,积压了上万订单。最后发现问题出在一个看似无害的数据库查询上。这件事让我意识到,很多团队在自动化工作流上线后就不再关注性能,直到出现严重问题才开始救火。今天分享一套我在实际项目中验证过的监控和优化方法,帮你在问题爆发前就发现并解决它们。为什么工作流性能会悄悄变差?在深入方法之前,先说说三个常见的性能杀手:数据量增长是最隐蔽的。一个处理100条记录很快的流程,到了10万条可能就崩溃了。我见过一个客户的数据清洗流程,上线时测试数据只有500条,半年后实际数据涨到8万条,执行时间从30秒飙到40分钟。依赖服务的响应时间波动也很致命。你的工作流可能调用了第三方API、内部微服务或数据库,任何一个环节变慢都会拖累整体。更麻烦的是,这种变慢往往是渐进的,不容易察觉。资源竞争在并发场景下尤其明显。多个工作流实例同时运行时,CPU、内存、数据库连接都可能成为瓶颈。我曾遇到一个案例,单个流程跑得很快,但10个并发时性能下降80%,原因是数据库连接池配置太小。建立有效的性能监控体系关键指标:监控什么才有用?不要陷入"监控一切"的陷阱。根据经验,这几个指标最能反映问题:执行时长分布比平均值更重要。平均3秒的流程,如果P95是15秒,说明有5%的请求体验很差。我通常会设置三个阈值:P50(中位数)、P95和P99,分别对应正常、警告和严重三个级别。步骤级耗时能精准定位瓶颈。把工作流拆成独立步骤监控,比如"数据获取"、"业务处理"、"结果写入"。某个电商客户的流程中,90%的时间消耗在"库存检查"这一步,优化后整体性能提升5倍。资源使用率要关注峰值而非平均值。CPU平均30%看起来健康,但如果峰值经常到95%,说明有性能尖刺。内存使用也是,要警惕持续增长的趋势,可能是内存泄漏的信号。错误率和重试次数往往是性能问题的先兆。如果某个步骤的重试次数突然增加,即使最终成功了,也说明依赖服务可能不稳定。实施监控的三个层次基础层:日志埋点最简单但也最容易被忽视。在每个关键步骤前后记录时间戳,就能计算耗时。我的习惯是用结构化日志,包含这些字段:
2026年05月08日
10 阅读
0 评论
0 点赞
2026-05-08
Docker容器日志分析最佳实践:从混乱到清晰的完整指南
容器化部署已经成为现代应用架构的标配。根据市场调研数据,超过70%的企业在生产环境中使用Docker容器。但随之而来的问题是:当容器数量从几个扩展到几百个甚至上千个时,日志管理迅速变成了一场噩梦。分散在各个容器中的日志信息,短暂的容器生命周期,动态变化的容器IP地址——这些特性让传统的日志分析方法彻底失效。从商业角度看,日志分析能力直接影响故障排查效率、系统可观测性和运维成本。容器日志的核心挑战对比传统虚拟机环境,容器日志管理面临三个本质性差异:生命周期短暂性。容器可能只运行几分钟甚至几秒钟,一旦销毁,本地日志随之消失。这意味着必须在容器运行期间就完成日志收集,否则关键信息将永久丢失。规模动态性。容器数量随负载自动伸缩,传统的静态日志配置无法适应这种动态变化。调研表明,采用微服务架构的企业平均管理着200-500个容器实例。分布复杂性。一个完整的业务请求可能跨越十几个微服务容器,日志分散在不同节点、不同容器中。如何关联这些日志片段,还原完整的调用链路,成为分析的关键难点。日志驱动选择:标准输出还是文件?这是容器日志架构设计的第一个决策点。数据显示,约65%的Docker用户选择标准输出方式,但这并不意味着它适合所有场景。标准输出方式(stdout/stderr)符合容器化的最佳实践理念。应用将日志输出到标准流,由Docker引擎统一管理。这种方式的优势在于简单、统一,容器编排平台可以直接收集和展示日志。但标准输出也有明显局限。Docker默认使用json-file驱动,日志存储在宿主机的/var/lib/docker/containers/目录下。如果不加限制,单个容器的日志文件可能无限增长,最终耗尽磁盘空间。文件日志方式则更灵活。应用将日志写入容器内的文件,通过volume挂载到宿主机或直接由日志采集器读取。这种方式支持日志轮转、压缩等高级特性,适合日志量大的场景。从实际部署来看,混合方式正在成为趋势:关键业务日志输出到标准流便于实时监控,详细的调试日志写入文件供深度分析。日志收集架构设计市场上主流的日志收集方案可以分为三类,各有适用场景。集中式收集:ELK/EFK StackElasticsearch + Logstash/Fluentd + Kibana组合仍然是最流行的方案。数据显示,约40%的企业采用这一架构。核心思路是在每个Docker宿主机上部署日志采集器(Fluentd或Filebeat),采集器读取容器日志并发送到Elasticsearch集群。Kibana提供可视化查询界面。这种架构的优势在于成熟稳定,社区资源丰富。但也要注意成本问题:Elasticsearch集群需要较高的硬件配置,对于中小规模部署可能过于重量级。云原生方案:LokiGrafana Loki是近年来快速崛起的轻量级日志系统。对比Elasticsearch,Loki不对日志内容建立全文索引,而是只索引标签(labels),这大幅降低了存储和计算成本。调研数据显示,Loki的存储成本通常只有Elasticsearch的1/10到1/5。对于日志量大但查询频率不高的场景,这是一个极具吸引力的选择。值得注意的是,Loki与Prometheus、Grafana天然集成,如果你的监控栈已经采用这套组合,引入Loki几乎没有额外的学习成本。商业化平台云服务商提供的托管日志服务(如AWS CloudWatch、阿里云SLS、腾讯云CLS)正在获得更多企业青睐。市场趋势显示,采用云原生日志服务的比例从2020年的25%增长到2025年的45%。商业平台的核心价值在于免运维、高可用和深度集成。但需要权衡的是成本和数据主权问题。对于日志量超过TB级别的场景,月度费用可能达到数万元。日志结构化:从文本到数据非结构化的文本日志是分析的最大障碍。一条典型的应用日志可能是这样:
2026年05月08日
12 阅读
0 评论
0 点赞
2026-03-26
Kubernetes vs Docker Swarm:一个踩过两边坑的人,给你掏心窝的对比评测
Kubernetes vs Docker Swarm:一个踩过两边坑的人,给你掏心窝的对比评测\n\n坦白讲,如果你正在搜索"Kubernetes 与 Docker Swarm 对比评测",大概率你正处于一个关键决策节点——要么是团队准备上容器编排,要么是现有方案遇到了瓶颈,想看看另一边的草地是不是更绿。\n\n我两边都深度用过。Swarm 从 Docker 1.12 原生集成那年就开始跑生产,Kubernetes 从 1.9 版本一路升级到现在。说实话,这两个工具之间的选择,远没有网上很多文章写得那么非黑即白。\n\n## 先说结论,再展开聊\n\n如果你时间有限,核心判断就一句话:\n\nDocker Swarm 是"够用就好"的务实选择,Kubernetes 是"面向未来"的系统性投资。 但"面向未来"三个字的代价,比大多数人预想的要高得多。\n\n## 上手体验:Swarm 的简单不是假的\n\n很多 Kubernetes 拥趸喜欢说"K8s 也没那么难",这话对也不对。对于已经熟悉它的人来说确实不难,但对于一个刚接触容器编排的团队,两者的学习曲线差距是实实在在的。\n\n我做过一个测试:让两个水平相当的后端工程师分别用 Swarm 和 Kubernetes 部署同一个三层应用(Nginx + Node.js API + PostgreSQL),从零开始。\n\n- Swarm 那边,大约 2 小时跑通了整个流程,包括服务发现和滚动更新\n- Kubernetes 那边,光是理解 Pod、Deployment、Service、Ingress 这几个概念的关系就花了半天,完整跑通用了将近两个工作日\n\nSwarm 的核心命令就那么几个:\n\n
2026年03月26日
19 阅读
0 评论
0 点赞
2026-03-25
Kubernetes 性能优化实战:从集群调优到 Pod 级调参,我踩过的坑和总结的经验
说实话,大多数团队在上 Kubernetes 的头半年,关注的都是"能不能跑起来"。等业务量上来了,才发现响应变慢、Pod 频繁重启、节点资源吃满却有一半在空转——这时候才开始认真对待性能优化,但往往已经欠了一屁股技术债。\n\n我经历过不止一次这样的场景。有一次,一个电商团队在大促前两周找过来,集群 CPU 利用率常年在 70% 以上,但实际业务吞吐量远没到瓶颈。排查下来,问题出在 requests/limits 配置不合理、HPA 策略过于粗放、以及网络层的一个不起眼的 DNS 解析延迟上。\n\n这篇文章就是把这些年在 Kubernetes 性能优化上积累的实战经验做一次系统梳理。不讲空话,每一条建议都来自真实生产环境。\n\n## 先搞清楚瓶颈在哪,别上来就调参\n\n性能优化最忌讳的就是"凭感觉"。我见过有人一上来就把所有 Pod 的 CPU limits 翻倍,结果节点调度更不均衡,问题反而恶化了。\n\n正确的第一步永远是观测和定位。推荐一个基本的排查路径:\n\n1. 用 kubectl top nodes 和 kubectl top pods 看资源消耗的大盘\n2. 通过 Prometheus + Grafana 观察一段时间内的趋势,而不是某个瞬时值\n3. 重点关注几个指标:CPU throttling 比例、内存 OOMKill 次数、Pod 调度等待时间、网络延迟\n4. 用 kubectl describe node 检查 Allocatable 和已分配资源的差距\n\n坦白讲,很多性能问题根本不是 Kubernetes 本身的问题,而是应用层的问题被放大了。一个内存泄漏的 Java 应用,放在虚拟机上可能扛一周才出事,放在容器里可能几小时就被 OOMKill。所以优化的第一原则是:先确认问题出在哪一层。\n\n## Requests 和 Limits:90% 的团队都没配对\n\n这是 Kubernetes 性能优化中最基础、也是影响最大的一环。\n\n我的经验是,绝大多数团队的 requests 和 limits 配置都存在两个极端:要么完全没设,要么拍脑袋设了一个很大的值"保平安"。两种做法都会带来严重问题。\n\n不设 requests 的后果是调度器无法合理分配 Pod,可能把大量 Pod 堆到同一个节点上。而 limits 设得过高,会导致节点超卖严重,一旦多个 Pod 同时突发,就会互相争抢资源。\n\n这里有个实用的方法论:\n\n
2026年03月25日
9 阅读
0 评论
0 点赞
2026-03-24
How to Scale AI Workflows with DevSecOps Principles: A Practical Guide from the Trenches
Most teams hit the same wall.\n\nThey build a promising AI model, get it running in a notebook, maybe even deploy a proof of concept. Then someone asks: \"Great, now can we run this across 50 pipelines, keep it secure, and not break production?\" And suddenly the room goes quiet.\n\nScaling AI workflows is not primarily a machine learning problem. It is an infrastructure, governance, and culture problem. And the teams that crack it fastest are the ones borrowing heavily from a discipline that has already solved similar challenges at scale: DevSecOps.\n\nI have spent the last several years helping engineering organizations bridge the gap between experimental AI work and production-grade systems. The pattern is remarkably consistent. The teams that treat AI scaling as a DevSecOps challenge — not just an MLOps challenge — ship faster, break less, and sleep better at night.\n\nHere is what actually works.\n\n## Why Traditional MLOps Alone Falls Short\n\nMLOps gave us a solid foundation: model versioning, experiment tracking, automated retraining pipelines. But it was designed with a narrower scope. It assumes the security team will handle security, the platform team will handle infrastructure, and the compliance team will handle governance.\n\nIn practice, that handoff model collapses when you are running dozens of AI workflows simultaneously. Data pipelines touch sensitive information. Model endpoints become attack surfaces. Training jobs consume expensive compute that needs guardrails. Nobody owns the full picture.\n\nDevSecOps principles fill that gap by embedding security, compliance, and operational resilience directly into the development lifecycle — not bolting them on afterward.\n\n## The Core Framework: Scaling AI Workflows Through DevSecOps\n\n### 1. Treat Every AI Artifact Like Code\n\nThis sounds obvious, but most AI teams still do not do it consistently. Models, training scripts, data transformation logic, feature definitions, inference configurations — all of it should live in version-controlled repositories with the same rigor you would apply to application code.\n\nWhat this looks like in practice:\n\n- Model definitions and training scripts stored in Git, not just experiment trackers\n- Data pipeline configurations managed as Infrastructure as Code (Terraform, Pulumi, or CDK)\n- Feature store definitions versioned alongside the models that consume them\n- Inference endpoint configurations (scaling rules, timeout settings, resource limits) checked into repos, not configured through console clicks\n\nThe payoff is reproducibility. When something breaks at 2 AM — and it will — you need to know exactly what changed, when, and by whom. You cannot get that from a notebook someone modified on their laptop.\n\n### 2. Shift Security Left in the AI Pipeline\n\nHere is where most AI teams are genuinely vulnerable. The typical AI workflow involves pulling large datasets, installing dozens of Python packages, running code in elevated-privilege environments, and deploying endpoints that accept external input. Every one of those steps is a security surface.\n\nShifting security left means catching issues before they reach production:\n\n- Dependency scanning on every model training environment. Tools like Snyk, Trivy, or Dependabot should run against your requirements files and container images automatically. I have seen teams discover critical CVEs in PyTorch dependencies that had been sitting in production for months.\n- Data access controls enforced through policy-as-code. Do not rely on \"the data scientist knows which S3 bucket to use.\" Define access boundaries in OPA (Open Policy Agent) or AWS IAM policies that are version-controlled and reviewed.\n- Model input validation at the inference layer. Adversarial inputs are not theoretical — prompt injection, data poisoning, and model evasion attacks are real and growing. Build input sanitization into your serving infrastructure, not as an afterthought.\n- Secret management done properly. Training scripts that hardcode API keys or database credentials are shockingly common. Use Vault, AWS Secrets Manager, or similar tools, and scan for leaked secrets in CI.\n\n### 3. Build CI/CD Pipelines That Understand AI Workflows\n\nStandard CI/CD works well for application code. But AI workflows have unique characteristics that require pipeline adaptations:\n\n- Training jobs are long-running and expensive. You cannot just \"rerun the pipeline\" casually. Design your CI to run lightweight validation (linting, unit tests on data transformations, schema checks) on every commit, and trigger full training runs only on specific branches or tags.\n- Model validation is not binary. A model does not just \"pass\" or \"fail\" — it degrades along a spectrum. Your CD pipeline needs gates based on performance thresholds: accuracy, latency, fairness metrics, and drift indicators. Automate these checks so a model cannot reach production without clearing them.\n- Rollback is harder. Rolling back a model is not the same as rolling back a microservice. You may need to revert the model, the feature pipeline, and the preprocessing logic simultaneously. Design your deployment strategy around atomic, versioned bundles that can be rolled back as a unit.\n\nA practical CI/CD structure for AI workflows:\n\n
2026年03月24日
12 阅读
0 评论
0 点赞
2026-03-23
Kubernetes 部署 AI 模型报错排查实战:从 OOMKilled 到 GPU 调度失败的完整解决方案
Kubernetes 部署 AI 模型报错排查实战指南\n\n凌晨两点,你盯着终端里那个刺眼的 CrashLoopBackOff,模型镜像明明在本地跑得好好的,一上 K8s 集群就各种报错。团队等着明天上线推理服务,而你已经在 kubectl logs 和 describe pod 之间来回切换了三个小时。\n\n这个场景我太熟悉了。过去几年里,我帮不少团队把 PyTorch、TensorFlow、vLLM 等各类 AI 模型搬上 Kubernetes,踩过的坑多到可以写一本错误手册。今天把这些实战经验系统整理出来,帮你在 troubleshooting Kubernetes AI model deployment errors 时少走弯路。\n\n## 先搞清楚:AI 模型部署和普通应用部署的本质区别\n\n很多人把 AI 模型当普通微服务来部署,这是问题的根源。AI 工作负载有几个显著特点:\n\n- 资源需求极端:一个 LLM 推理服务动辄需要 16GB+ 显存,内存需求可能是普通服务的 10-50 倍\n- 启动时间长:模型加载可能需要几分钟,健康检查配置不当就会被反复杀掉\n- 依赖链复杂:CUDA 版本、cuDNN、驱动版本、Python 依赖之间的兼容性像一张蜘蛛网\n- 存储 I/O 敏感:大模型文件动辄几十 GB,PV 的读取速度直接影响启动成功率\n\n理解了这些差异,排查思路就清晰多了。\n\n## OOMKilled:最常见也最容易误判的错误\n\nOOMKilled 大概是 AI 模型部署中出现频率最高的错误,但很多人搞混了两种完全不同的 OOM。\n\n### 系统内存 OOM vs GPU 显存 OOM\n\n先用 kubectl describe pod <pod-name> 看 Last State:\n\n
2026年03月23日
14 阅读
0 评论
0 点赞
2026-03-23
Kubernetes vs Docker for AI Deployment: A Practical Comparison That Actually Helps You Choose
Kubernetes vs Docker for AI Deployment: A Practical Comparison That Actually Helps You Choose\n\nLet me cut through the noise right away: comparing Kubernetes and Docker is like comparing a shipping fleet to a shipping container. They're not competitors — they operate at different layers of the stack. But when it comes to deploying AI workloads, the question of \"which one do I need\" is completely valid, because the answer shapes your entire infrastructure strategy.\n\nI've spent the better part of the last few years helping teams ship machine learning models into production, and the single most common point of confusion is exactly this: where does Docker end and Kubernetes begin, and what does my AI pipeline actually need?\n\nLet's sort this out properly.\n\n## The Real Question Behind \"Kubernetes vs Docker\"\n\nWhen someone searches for this comparison in the context of AI deployment, they're usually facing one of these situations:\n\n- They've trained a model locally and need to get it running in production reliably\n- They're scaling from one model to dozens and the current setup is falling apart\n- They're evaluating infrastructure for a new ML platform and need to make a defensible choice\n- GPU resource management is becoming a nightmare\n\nThe honest answer is that most serious AI deployments end up using both. Docker packages your model and its dependencies into a portable unit. Kubernetes orchestrates those units at scale. But \"use both\" isn't helpful when you're trying to figure out where to start or what to prioritize.\n\nSo let's break down what each actually does for AI workloads, and more importantly, when you need which.\n\n## Docker for AI: The Foundation You Can't Skip\n\nDocker solves the \"it works on my machine\" problem, and in ML, this problem is ten times worse than in traditional software. A typical AI model depends on specific versions of CUDA, cuDNN, PyTorch or TensorFlow, plus a web of Python packages that love to conflict with each other.\n\nHere's what Docker gives you for AI deployment:\n\nReproducible environments. You define your CUDA version, your Python dependencies, your model serving framework — all in a Dockerfile. Anyone on the team can rebuild the exact same environment. This alone saves countless hours of debugging.\n\nPortable inference endpoints. Wrap your model in a FastAPI or Triton Inference Server container, and it runs the same way on your laptop, a cloud VM, or a GPU cluster. The container doesn't care.\n\nGPU passthrough. With NVIDIA Container Toolkit, Docker containers can access host GPUs directly. For single-model deployments, this is often all you need.\n\nA practical example: if you're deploying one or two models behind an API, a single Docker container running on a GPU instance with docker run --gpus all is perfectly fine. I've seen startups serve millions of inference requests per month with exactly this setup — a Docker container on a beefy EC2 instance behind a load balancer. Simple, effective, easy to debug.\n\n
2026年03月23日
15 阅读
0 评论
0 点赞
2026-03-20
实战指南:在K8s上高效部署自研AI模型并与Coze无缝集成(避坑经验分享)
不知道你是不是也有这样的感受:好不容易把模型调出来了,性能也不错,但一到部署环节就头疼。Docker镜像、资源调度、服务暴露、流量管理......更别说还要和Coze这类AI平台集成,打通API调用。这些问题,我在过去几年为多个团队构建AI基础设施时,反复遇到并解决了。今天,我就把这一套经过验证的、可以在生产环境直接复用的方案和盘托出。\n\n### 为什么Kubernetes是自建AI模型的理想归宿?\n\n你可能听说过,也有人用传统的虚拟机或简单的容器来部署模型。短期、小规模或许可行,但一旦进入生产或需要规模化,问题就会暴露无遗。资源浪费、扩缩容缓慢、版本管理混乱、监控告警缺失......Kubernetes的价值,恰恰在于它提供了一套标准化的“操作系统”,让AI模型像普通应用一样易于管理。\n\n举个例子,我们团队曾管理一个图像识别模型,白天请求量大,晚上骤减。通过K8s的Horizontal Pod Autoscaler (HPA)基于GPU显存或请求QPS自动伸缩,月度云成本直接降低了40%。更重要的是,它为后续与Coze集成铺平了道路——一个稳定、可观测、可扩展的服务端点是所有集成的基石。\n\n### 核心部署策略:从模型到服务的标准化路径\n\n部署不是简单地把模型扔进容器就跑。我们需要考虑模型本身、服务框架、资源配置和外围依赖。这里我分享一个高效的四层打包策略:\n\n1. 模型层:将训练好的模型文件(如 .pt, .h5, .ckpt)与模型元数据(输入输出格式、版本)打包。我强烈建议使用一个独立的 ModelRepository 目录,用标签管理版本,为后续A/B测试和灰度发布打下基础。\n\n2. 服务层:选择或构建一个轻量、高效的推理服务框架。TensorFlow Serving 和 TorchServe 是主流选择,但别忘了还有更灵活的 Triton Inference Server(支持多框架)。我个人的偏好是,对于追求极致性能和控制力的场景,用FastAPI搭配特定运行时(如onnxruntime)自建服务,代码更透明,定制也方便。\n\n3. 容器层:编写Dockerfile时,有几点经验之谈:\n - 基础镜像:尽量使用带CUDA的官方最小化镜像,如 nvidia/cuda:12.1.1-runtime-ubuntu22.04。\n - 依赖管理:用 pip install --no-cache-dir 减少镜像层大小。\n - 模型放置:模型文件不要打进镜像,而是通过 InitContainer 从对象存储(如S3/MinIO)或持久化卷挂载。这样镜像只包含代码逻辑,模型更新无需重建镜像。\n\n4. Kubernetes配置层:这是最关键的一步,一个典型的Deployment YAML核心配置如下:\n\n
2026年03月20日
16 阅读
0 评论
0 点赞
2026-03-15
Docker+K8s部署AI工作流实战:从踩坑到跑通的完整指南
Docker+K8s部署AI工作流实战:从踩坑到跑通的完整指南\n\n坦白讲,第一次用Kubernetes部署一套自定义AI工作流的时候,我花了整整三天才把推理服务跑通。不是因为模型本身有问题,而是GPU调度、镜像体积、服务编排这些\"基础设施\"层面的坑,一个接一个。\n\n如果你也正在考虑用云原生技术来部署和管理自己的AI工作流——不管是RAG管线、多模型串联推理,还是训练+推理一体化流水线——这篇文章会帮你少走很多弯路。\n\n## 为什么AI工作流需要云原生?用脚本编排不行吗?\n\n先回答一个很多人心里的疑问:我用Python脚本把几个模型串起来,跑在一台GPU服务器上,不也挺好?\n\n小规模验证阶段,确实够用。但一旦你面对这些场景,问题就来了:\n\n- 模型A需要GPU,模型B只需要CPU,混合调度怎么做?\n- 推理请求突然暴增,怎么自动扩缩容?\n- 某个环节挂了,怎么自动恢复而不影响整条链路?\n- 团队里三个人各自开发不同的模型组件,怎么独立部署、独立迭代?\n\n这些问题的本质是:AI工作流不是一个程序,而是一组异构服务的协作。而Kubernetes天生就是干这个的。\n\nDocker解决的是\"我的环境和你的不一样\"这个老问题——把模型、依赖、运行时全部打包成镜像,在哪都能跑。K8s解决的是\"这么多容器怎么管\"——调度、扩缩、自愈、服务发现,全给你安排好。\n\n## 一个典型AI工作流的架构长什么样\n\n在动手之前,先把架构理清楚。以一个常见的RAG(检索增强生成)工作流为例:\n\n
2026年03月15日
16 阅读
0 评论
0 点赞
2026-03-14
Coze智能体API调用与第三方系统深度集成实战:从踩坑到跑通的完整路径
Coze智能体API调用与第三方系统深度集成实战:从踩坑到跑通的完整路径\n\n坦白讲,把Coze智能体真正集成到自己的业务系统里,和在Coze平台上拖拖拽拽搭个Bot,完全是两回事。\n\n我见过太多团队,在Coze工作台里把智能体调得很顺畅,一到对接自家CRM、工单系统或者企业微信的时候就卡壳。接口调不通、会话状态丢失、流式响应解析出错......这些问题几乎每个做集成的人都会遇到。\n\n这篇文章不讲概念,直接聊实操。我会把Coze智能体API调用的核心流程、与第三方系统集成时最容易踩的坑、以及经过验证的解决方案,一次性讲清楚。\n\n## 先搞清楚一件事:你调用的到底是什么\n\nCoze开放平台提供的API,本质上是让你通过HTTP请求与已发布的Bot进行对话交互。核心接口主要围绕这几个能力展开:\n\n- 对话管理:创建会话、发送消息、获取回复\n- Bot管理:查询Bot信息、获取Bot列表\n- 文件与知识库:上传文件、管理知识库内容\n- 工作流运行:直接触发Coze中配置好的工作流\n\n很多人一上来就盯着"发消息-收回复"这条线,忽略了一个关键点:Coze的API是围绕会话(Conversation)设计的,不是简单的"请求-响应"模式。这意味着你需要自己管理会话ID、处理多轮对话的上下文传递,以及应对异步返回的场景。\n\n## API调用的基本流程:5步跑通第一个请求\n\n在写集成代码之前,先确保这几步走通了:\n\n### 第1步:获取API访问凭证\n\n登录Coze开放平台,进入API管理页面,创建个人访问令牌(Personal Access Token)。如果是企业级集成,建议走OAuth2.0应用授权流程,拿到的token权限更可控。\n\n
2026年03月14日
15 阅读
0 评论
0 点赞
2026-03-07
自动化工作流运行失败的7大元凶:从调试日志到权限配置的完整排查指南
为什么你的自动化工作流总是莫名其妙失败?\n\n上周凌晨2点,我又被报警短信吵醒了——生产环境的订单处理流水线再次中断。这种场景我相信很多运维和开发同行都经历过:明明测试环境运行得好好的,一到生产环境就各种幺蛾子。\n\n经过五年处理各种自动化工作流故障的经验,我发现90%的失败原因都集中在几个特定领域。今天我就把这些实战经验整理出来,帮你快速定位和解决问题。\n\n## 错误一:环境配置差异(最常见的\"坑\")\n\n这是我最常遇到的故障原因,没有之一。开发环境和生产环境的不一致会导致各种诡异问题。\n\n典型症状:\n- 测试环境正常,生产环境失败\n- 缺少依赖库或版本不匹配\n- 文件路径或权限问题\n\n排查技巧:\n
2026年03月07日
13 阅读
0 评论
0 点赞
2025-12-10
MLOps实践:模型漂移检测与应对,让你的AI系统持续高能
说实话,把一个机器学习模型部署到生产环境,感觉就像是送孩子上大学,你觉得他们准备好了,但生活中的各种“惊喜”才刚刚开始。我们辛辛苦苦训练出来的模型,也逃不过这种宿命——随着时间推移,它的性能会悄悄下降,我们称之为“模型漂移”(Model Drift)。坦白讲,这可不是小事。一个预测不准的推荐系统可能导致销售额下滑,一个误判的风控模型可能造成巨大损失。在MLOps的语境下,模型漂移无疑是生产环境中模型健康最大的“隐形杀手”。那么,我们该如何像经验丰富的医生一样,对模型的健康状况望闻问切,确保它能持续“高能”呢?模型漂移:你以为的“小变化”,可能是“大危机”首先,我们得清楚模型漂移到底是什么。它大致分为两类:数据漂移(Data Drift):这是最常见的。简单来说,就是模型输入数据的分布变了。比如,用户行为模式变了,传感器数据格式微调了,或者某个关键特征的均值、方差突然异常。这其中又可以细分为特征漂移(Feature Drift),也就是单个或多个特征的分布变化;以及标签漂移(Label Drift),是指真实标签的分布发生变化(通常比较难直接检测到)。概念漂移(Concept Drift):这个更深层次,指的是输入特征和目标变量之间的关系(或者说,底层业务逻辑)发生了变化。比如,疫情爆发后,人们的消费习惯彻底改变,原本用来预测购买意愿的模型,其内在逻辑就不再适用了。再比如,一个欺诈检测模型,随着欺诈手段的升级,旧的欺诈模式不再是好的预测指标了。无论哪种,结果都一样:模型输出的预测值会变得不准确,性能自然就下降了。如何“望闻问切”:模型漂移的检测利器检测漂移,本质上就是对生产数据进行持续监控,并与基线数据(通常是模型训练时的数据)进行比较。1. 统计学方法:数据分布的“侦察兵”这是最直接有效的方式。我们可以对模型输入的每个特征(甚至是输出的预测概率)进行统计分析:单变量漂移检测:数值特征:常用的有Kolmogorov-Smirnov (K-S) 检验、Jensen-Shannon (J-S) 散度、Wasserstein 距离(也叫Earth Mover's Distance)。这些都能衡量两个分布之间的差异。类别特征:卡方检验(Chi-Square Test)或Population Stability Index (PSI) 是检测类别分布变化的有效工具。PSI尤其在金融风控领域非常流行。均值/方差/中位数等统计量监控:这是最简单直接的方式,可以设置阈值告警。多变量漂移检测:当单个特征没有明显漂移,但特征之间的关系或组合发生变化时,单变量检测就力不从心了。这时可以考虑:主成分分析 (PCA) 或 UMAP/t-SNE 等降维技术:将高维数据映射到低维空间,然后监控低维表示的分布变化。隔离森林 (Isolation Forest) 或 局部异常因子 (LOF):将漂移视为一种异常检测问题,监测新数据是否偏离了训练数据的正常模式。2. 模型性能监控:最直接的“体检报告”虽然漂移是性能下降的原因,但直接监控模型性能指标是必不可少的一环。这需要我们能获取到真实标签(ground truth)。分类模型:准确率、精确率、召回率、F1分数、AUC、混淆矩阵等。回归模型:RMSE、MAE、R2等。重点来了:在很多实时场景,真实标签往往会有延迟。比如,欺诈交易可能要几天后才能确认,用户点击行为可能立即产生,但最终转化可能要等一周。因此,我们需要设计巧妙的延迟标签收集机制,并在数据可用的第一时间计算并更新性能指标。3. 数据质量监控:防微杜渐的“体检项目”很多时候,模型漂移并非天灾,而是“人祸”——数据管道出了问题。缺失值:新增的缺失值比例是否过高?异常值:某个特征的值域是否出现了训练数据中从未见过的情况?数据类型:某个数值型特征突然变成了字符串?特征模式:比如文本特征的平均长度、词汇量等。这些“数据质量漂移”往往是模型漂移的先行指标。漂移告警与响应:紧急预案与“治疗方案”检测到了漂移,下一步就是如何响应。在MLOps实践中,这通常需要一套自动化的流程。1. 告警机制:及时通知“主治医生”当监控指标触及预设阈值时,需要立即触发告警。告警可以发送到:PagerDuty/Slack/Teams:通知值班工程师或数据科学家。Jira/GitLab Issue:自动创建工单,跟踪问题。数据看板:在Grafana、Prometheus等监控面板上突出显示异常。告警信息要足够详细,包括哪个模型、哪个特征/指标、漂移程度、时间戳等。2. 响应策略:从手动干预到自动化“治疗”漂移的应对策略因场景而异,从轻微干预到全面重训练:数据探索与分析:这是第一步。接到告警后,数据科学家需要迅速介入,分析漂移的原因。是外部环境变化?是数据管道故障?还是恶意攻击?特征工程调整:如果发现是某个特征的分布发生了预期外的变化,可以考虑对该特征进行转换或重新处理。模型重训练(Retraining):这是最常见的应对策略。基于最新的数据,重新训练模型。重训练又分为几种:计划性重训练:定期(比如每周、每月)用最新数据对模型进行重训练,即使没有检测到明显漂移。按需重训练:当检测到模型性能下降或数据/概念漂移时,立即触发重训练。增量学习/在线学习:对于某些模型和场景,可以采用增量学习或在线学习的方式,让模型在生产环境中逐步适应新数据,但这通常对模型类型和系统设计有较高要求。模型回滚或新模型部署:重训练后的模型需要经过严格的验证和测试,确认性能提升且没有引入新的问题后,才能部署到生产环境。如果新模型性能不佳,或者漂移情况紧急,可能需要回滚到上一个稳定版本,甚至切换到其他预案模型。人机协作:在某些高风险领域,例如医疗诊断,即使模型给出了预测,最终决策也可能需要人类专家进行复核。这可以为模型漂移提供一层保障。MLOps流水线中的漂移检测与应对:自动化是王道我们谈了这么多,最终都要落地到MLOps的自动化流水线中。一个成熟的MLOps平台,应该能将漂移检测和应对策略无缝集成进去。数据监控模块:在数据摄取、特征工程、模型预测等各个环节,植入数据质量和分布监控点。模型监控模块:独立于模型部署,持续收集模型输入、输出和(如果可用)真实标签,计算性能指标和漂移指标。告警与通知服务:与各种通知系统集成,确保告警及时触达相关人员。自动化重训练与部署流水线:当漂移达到预设阈值时,自动触发模型重训练流水线。这个流水线应该包括数据准备、模型训练、模型评估、模型注册、模型部署、A/B测试等环节。一个完整的重训练流水线是MLLOps的关键组成部分。模型版本管理:每一次重训练都应该生成一个新的模型版本,并进行妥善的版本管理,方便回溯和比较。我的经验之谈:别把漂移当“洪水猛兽”其实,模型漂移是常态,而不是例外。就像人类会生病一样,模型也会“生病”。重要的是我们有没有一套成熟的“医疗系统”来及时发现并治疗。从小处着手:一开始不一定非要上那些复杂的统计检测方法。从监控关键特征的均值、中位数、缺失率开始,已经能发现很多问题了。理解业务,找到关键指标:不同业务对漂移的容忍度不同。理解哪些漂移是致命的,哪些是可接受的,帮助我们设置合理的阈值和告警优先级。自动化是最终目标,但不是起点:先从手动监控和响应开始,逐步积累经验,找到痛点,然后逐步自动化。不要一开始就追求完美的大而全系统。文档记录与知识分享:每次漂移事件都是一次宝贵的学习机会。记录下漂移原因、如何检测、如何解决,形成团队的知识库。希望这些经验能帮助你更好地在MLOps流水线中应对模型漂移。其实,当你能熟练地驾驭这些挑战时,你会发现这不仅能保证模型的持续价值,更能让你对整个AI系统充满信心。你有过应对模型漂移的“惊心动魄”的经历吗?欢迎在评论区分享你的故事和心得!
2025年12月10日
24 阅读
0 评论
0 点赞
2025-12-09
2025年企业级Kubernetes性能瓶颈诊断:告别盲猜,实战指南助你集群飞升
坦白讲,到了2025年,Kubernetes在企业里早已不是什么新鲜事物,它几乎成了现代应用基础设施的标配。可即便如此,我还是经常听到身边朋友抱怨:为什么我的K8s集群总是卡顿?资源明明还有剩余,应用却慢如蜗牛?是应用的问题,还是集群没配好?说实话,这些疑问背后,往往隐藏着一系列复杂的性能瓶颈。在生产环境中,性能问题的影响可不仅仅是用户体验差那么简单,它直接关系到业务的连续性、资源的利用率,甚至是我们深夜值班的“幸福指数”。所以,今天我们不聊虚的,来一场真正的“实战演练”,看看2025年我们该如何系统性地诊断和优化企业级Kubernetes集群的性能。第一步:建立你的“千里眼”——强大的可观测性基石诊断性能问题,首先得看得见、摸得着。没有健全的监控体系,一切优化都是盲人摸象。在2025年,一套成熟的K8s监控方案是这样的:Prometheus & Grafana:核心组件指标采集: 从Node、Pod、Container到Kube-state-metrics(获取K8s对象状态指标)、cAdvisor(容器资源使用情况)、Node Exporter(主机操作系统指标)、以及各业务应用自身的Exporter,全方位覆盖。别忘了关注kubelet、kube-apiserver、kube-scheduler、etcd这些控制平面关键组件的健康和延迟指标。可视化: Grafana仪表盘是你的“驾驶舱”,定制化地展示CPU、内存、网络I/O、磁盘I/O、Pod重启次数、API Server请求延迟等核心数据。预警规则也要及时配置,防患于未然。分布式追踪(Distributed Tracing):业务链条的洞察者对于微服务架构,Jaeger或Zipkin等分布式追踪系统必不可少。它们能帮你清晰地看到请求在各个服务间的流转路径和耗时,快速定位是哪个服务或哪个环节引入了延迟。日志管理(Centralized Logging):问题线索的收集器ELK Stack(Elasticsearch, Logstash, Kibana)或Loki & Grafana是主流选择。当性能出现异常时,聚合的日志能提供详细的上下文信息,帮助你理解应用内部发生了什么。我的经验: 别吝啬在可观测性上的投入,这笔投入会在你每次排查问题时得到数倍的回报。配置一套高效的Prometheus relabel_configs,能帮你更好地管理抓取目标和标签,方便后续的查询和聚合。第二步:资源鏖战——CPU与内存的精细化管理集群性能问题,十有八九与资源管理不当有关。在K8s中,CPU和内存的配置是门大学问。2.1 CPU:争抢与限流的战场我们经常设定limits和requests,但很少真正理解它们带来的影响。requests过低: 容器可能得不到足够的CPU资源,尤其是在节点负载较高时,导致应用处理速度变慢。limits过低: 当容器的CPU使用量达到limits时,就会被节流(throttling)。虽然能防止单个容器耗尽节点资源,但过度的节流会导致应用响应时间增加,甚至表现出“卡顿”的现象。在Prometheus中,关注container_cpu_cfs_throttled_periods_total和container_cpu_cfs_throttled_seconds_total指标。优化策略:从requests = limits开始: 对于核心业务应用,建议将requests和limits设为相同值,确保其获得稳定、可预测的CPU资源,将其QoS等级设置为Guaranteed。动态调整与HPA/VPA: 结合Horizontal Pod Autoscaler (HPA) 根据CPU利用率自动扩缩容Pod数量,或者利用Vertical Pod Autoscaler (VPA) 自动推荐并调整Pod的CPU/内存requests和limits。VPA在2025年已经相当成熟,能有效解决资源浪费和性能不足的问题。分析CPU利用率曲线: 观察高峰期的CPU使用模式,找出是周期性高负载还是突发性高负载,再据此调整配置。2.2 内存:OOMKilled的噩梦内存问题通常更直接:内存泄漏导致Pod OOMKilled(Out Of Memory Killed),或者频繁的垃圾回收导致STW(Stop The World)暂停。limits过低: 容器内存使用超出limits,Kubelet会直接杀掉这个Pod。在日志中搜索OOMKilled,或通过kubectl describe pod <pod-name>查看原因。requests过低: 导致节点内存不足时,具有Burstable或BestEffort QoS等级的Pod更容易被Kubelet驱逐(Evicted)。优化策略:准确评估内存需求: 通过长时间观察应用在生产环境中的内存使用峰值,结合内存分析工具(如Java的JProfiler、Go的pprof)深入分析,给出合理的requests和limits。避免内存泄漏: 这是应用层面的问题,但会在K8s中显现。定期进行代码审查和内存剖析是关键。合理配置QoS: 核心业务使用Guaranteed,非核心服务可适当放宽,允许其被驱逐以保护核心业务。我的经验: 不要过度追求“极限压缩”资源,尤其是在生产初期。预留一定的缓冲,待数据跑出来后,再逐步优化。很多时候,一点点资源冗余换来的是系统的稳定性和运维的轻松。第三步:隐形杀手——网络与存储的深层优化CPU和内存好理解,但网络和存储的问题往往更隐蔽,也更致命。3.1 网络性能:延迟与吞吐量的博弈Kubernetes网络层是所有通信的基础。性能瓶颈可能出现在CNI插件、Service Mesh、甚至底层的物理网络上。CNI插件: 不同CNI(如Cilium, Calico, Flannel)有不同的性能特点。Cilium凭借eBPF技术在网络性能、安全策略实施方面通常表现更优,尤其在处理大量网络策略和高吞吐场景下。检查CNI插件自身的日志和指标,关注其转发延迟、连接数等。Service Mesh: Istio, Linkerd等Service Mesh虽然带来了强大的流量管理和可观测性,但其Proxy(如Envoy)引入的额外跳数和资源消耗也不容忽视。仔细调优Sidecar的资源配置,并监控其延迟和CPU/内存使用。网络带宽与延迟: 节点间的物理网络是基础。检查网络适配器、交换机配置、VLAN等是否存在瓶颈。ping、iperf3是常用的诊断工具。优化策略:选择合适的CNI: 根据业务需求和集群规模,选择性能最佳且维护成本可接受的CNI。2025年,eBPF驱动的CNI已是主流。Service Mesh精细化: 并非所有服务都需要Sidecar。对性能敏感的服务,考虑是否可以暂时旁路Service Mesh,或者只在必要的功能上启用。网络分区与亲和性: 结合topology.kubernetes.io/zone标签,尽量让相互通信频繁的Pod部署在同一个可用区甚至同一物理机上,减少跨网络延迟。3.2 存储I/O:慢盘的折磨数据库、日志服务等I/O密集型应用最容易被存储性能拖垮。Kubernetes的PV/PVC抽象虽然方便,但底层存储的性能差异巨大。CSI驱动: 确保你使用的CSI(Container Storage Interface)驱动是最新且稳定的,并且针对你的存储后端进行了优化。存储类型: 不同的存储类型(SSD vs HDD,网络块存储 vs 本地存储)性能天壤之别。对于高性能要求应用,务必使用SSD或更高性能的存储介质。IOPS与吞吐量: 这是衡量存储性能的关键指标。通过云服务商的监控(如AWS EBS指标、Azure Disk Metrics)或通过fio等工具在节点上测试实际I/O性能。共享存储瓶颈: 如果多个Pod或节点共享同一个存储后端(如NFS),很容易出现争抢导致性能下降。优化策略:分级存储: 根据应用对I/O性能的需求,为不同工作负载选择合适的存储等级。例如,数据库使用高性能SSD,日志服务使用通用型磁盘。本地存储: 对于极度I/O敏感的应用,可以考虑使用HostPath或Local PV,但要做好数据持久性和高可用性方案(如RAID、数据同步)。优化应用I/O: 从应用层面减少不必要的读写,使用缓存,批量操作。我的经验: 存储瓶颈一旦出现,往往是“硬伤”,解决起来成本较高。因此,在架构设计初期就应充分考虑存储性能需求,并选择与业务规模匹配的存储方案。第四步:别忘了“大脑”——控制平面的健康检查当集群规模越来越大,Pod数量上万时,Kubernetes控制平面(API Server, etcd, Scheduler, Controller Manager)自身的性能也会成为瓶颈。API Server: 高并发的kubectl命令、频繁的CRD操作、大量的Deployment更新都可能导致API Server压力过大,响应变慢。关注其apiserver_request_total、apiserver_request_duration_seconds_bucket指标。etcd: 作为K8s的核心数据存储,etcd的性能至关重要。其I/O延迟、网络延迟、日志写入速度会直接影响整个集群的稳定性。关注etcd_disk_wal_fsync_duration_seconds_bucket(WAL文件同步延迟)、etcd_server_leader_changes_seen_total(领导者变更次数)。Scheduler: 大规模集群中,Scheduler需要处理大量的Pod调度请求。复杂的调度策略、资源碎片化都可能导致调度延迟。关注scheduler_scheduling_latency_seconds_bucket。优化策略:etcd优化: 使用高性能SSD存储,确保其磁盘I/O隔离。将etcd集群部署在独立的节点上,并确保网络延迟最低。定期快照备份和碎片整理。API Server保护: 避免过多的watch操作。对于自动化工具,使用informers而非直接轮询。合理配置Webhook,确保其响应快速。Scheduler优化: 简化调度策略,避免不必要的复杂nodeSelector或affinity/anti-affinity规则。在超大规模集群中,可以考虑使用自定义调度器或调度框架。我的经验: 控制平面问题通常是集群达到一定规模后才会凸显。一旦出现,影响范围广且排查难度大。因此,定期进行控制平面的健康检查和性能基准测试是必不可少的。第五步:应用自身——性能的根源所在尽管我们花大量时间优化K8s基础设施,但很多时候,性能瓶颈的根源其实在应用代码层面。低效的代码: 糟糕的算法、冗余的计算、频繁的I/O操作(数据库查询、文件读写)。内存泄漏: 应用程序内部的内存管理不善,导致持续占用内存而未释放。线程/协程阻塞: 并发处理能力不足,或因锁竞争、同步机制不当导致线程/协程阻塞。不合理的缓存策略: 缓存命中率低,或缓存失效机制导致频繁回源。诊断工具:应用性能监控(APM): New Relic, Dynatrace, SkyWalking等APM工具能深入应用内部,提供代码级别的性能分析。Profiler: 如Java的JProfiler、VisualVM,Go的pprof,Python的cProfile。它们能帮你找出应用中最耗时的函数、内存占用高的对象。火焰图(Flame Graph): 通过堆栈采样生成火焰图,直观地展示CPU时间片消耗最多的代码路径。优化策略:代码审查与重构: 定期审查核心业务代码,识别并优化性能瓶颈。性能测试: 在发布前进行严格的负载测试和压力测试,模拟生产环境条件。合理使用缓存: 在应用层和数据层引入缓存机制,减少对后端服务的依赖。异步处理: 将耗时操作改为异步处理,提高响应速度。我的经验: 很多时候,基础设施的优化空间有限,应用层的优化能带来更显著的性能提升。与开发团队紧密协作,共同解决问题,是SRE或运维人员最有效的工作方式。总结与展望2025年的企业级Kubernetes集群性能优化,已不再是简单的资源堆砌,而是一场多维度、系统性的“战役”。从底层物理资源到上层应用代码,每一个环节都可能成为瓶颈。成功的关键在于:强大的可观测性: 看得清才能 diagnose。精细的资源管理: 让每一份资源都物尽其用。深入理解基础设施: 了解网络、存储、控制平面的工作原理。与应用深度结合: 性能的根源往往在代码中。这是一场没有终点的旅程,技术在不断演进,我们的优化之路也要持续前行。如果你在排查过程中遇到特别棘手的问题,不妨在评论区分享你的经验,或许我们能一起找到解决方案!
2025年12月09日
20 阅读
0 评论
0 点赞
2025-12-01
2025年AIOps:预测与预防云服务中断,保障企业应用高可用
云服务中断?听起来是不是有点耳熟?在2025年的今天,随着企业业务对云计算的依赖程度越来越深,以及多云、混合云架构的复杂性不断攀升,服务中断已经不再是“是否会发生”的问题,而是“何时发生”以及“我们如何应对”的核心挑战。每一次云服务中断,无论是几分钟还是几小时,都可能意味着数百万甚至上千万的经济损失,更不用提对品牌声誉和客户信任的打击。传统的人工监控和被动响应模式,面对海量数据和瞬息万变的云环境,早就显得力不从心了。这时,AIOps(人工智能运维)就成了我们手中的“利器”,它不仅能帮助我们预测潜在的风险,还能在问题演变成灾难前将其扼杀在摇篮里。AIOps,远不止是个时髦词:它如何看穿未来?说实话,很多人对AIOps的理解可能还停留在“一个能发更聪明告警的工具”。但其实,AIOps的核心是利用大数据、机器学习(ML)和人工智能技术,从海量的运维数据中(包括日志、指标、链路追踪、事件等)发现隐藏的模式、异常行为和关联关系,从而实现对系统健康的“未卜先知”。预测:将风险扼杀在萌芽状态AIOps的预测能力,是我个人认为它最核心的价值之一。它能像一位经验丰富的医生,提前诊断出潜在的“病灶”,而不是等到症状爆发才开始治疗。具体来说,AIOps通过以下方式进行预测:异常行为检测: 比如,某个微服务的响应时间开始出现微小但持续的波动,或者数据库的连接数在非高峰期出现异常增长。这些在传统阈值告警下容易被忽略的“噪声”,AIOps能通过机器学习模型识别出来,并标记为潜在风险。关联分析与根因识别: 云环境复杂,一个前端应用的延迟增加,可能源于后端数据库的慢查询,也可能是网络设备的瞬时抖动。AIOps可以自动关联不同系统、不同维度的数据,快速锁定问题的真正根源,避免“头痛医脚”的尴尬。趋势预测与容量规划: 通过分析历史数据,AIOps能预测未来一段时间内资源(如CPU、内存、存储、网络带宽)的使用趋势。比如,某个存储集群的I/O在未来两周内可能会达到瓶颈,或者某个服务在下个月的活动高峰期需要额外的计算资源。这让我们可以提前扩容或优化配置,避免因资源耗尽导致的服务中断。预防:在用户感知前解决问题预测是为了预防。AIOps不仅仅是“看”,更重要的是“做”。它将预测到的风险转化为可执行的预防措施,目标是在用户尚未感知到问题时,就将其解决。智能告警与降噪: 告警风暴是运维团队的噩梦。AIOps通过事件去重、关联和智能聚类,将数千条低价值告警收敛成少数几条高优先级、包含上下文的有效告警,大幅提升响应效率。自动化修复与自愈: 这是AIOps最诱人的地方。当系统检测到潜在问题或轻微故障时,AIOps可以根据预设的自动化规则或机器学习建议,自动执行修复操作,例如重启问题实例、自动扩容、流量切换到健康节点、清理缓存等,实现服务的“自愈”。智能工单与任务分派: 对于无法自动修复的问题,AIOps能够自动创建包含详细上下文、根因分析和建议解决方案的工单,并智能地分派给最合适的团队或个人,加速问题解决流程。2025年,AIOps实践有哪些新趋势?坦白讲,AIOps的概念已经存在多年,但到了2025年,它的应用和技术已经更加成熟,并展现出一些新的趋势:从“可观测性”到“可行动性”: 仅仅能看到数据已经不够了。2025年的AIOps更强调将洞察转化为实际行动。可观测性平台是AIOps的基石,而AIOps则赋予了这些数据“生命”,驱动自动化决策。ML模型日益精细与专业化: 随着算法的进步和数据积累,AIOps的ML模型不再是泛泛的异常检测,而是针对特定业务场景、特定技术栈(如容器、Serverless、数据库、网络)进行优化的专业模型,误报率更低,预测更精准。AIOps与平台工程的深度融合: “Shift-Left AIOps”正在成为现实。AIOps的能力不再是运维团队的专属,而是通过平台工程集成到开发、测试和CI/CD流程中,帮助开发者在代码层面就发现潜在的性能瓶颈或可靠性问题。多云/混合云环境下的统一视图: 面对日益复杂的多云策略,企业迫切需要一个统一的AIOps平台,能够整合来自不同云服务商的数据,提供一致的监控、分析和自动化能力,避免“数据孤岛”和“工具蔓延”。LLM(大型语言模型)的辅助作用: 尽管目前LLM在核心预测模型上还未占据主导,但在辅助根因分析、故障排除、智能问答以及生成行动建议方面,已开始展现出巨大潜力,极大地提升了运维人员的效率。实施AIOps,企业需要迈过哪些坎?说实话,AIOps绝不是一蹴而就的“银弹”,它的实施过程充满挑战,需要战略性的规划和投入。数据孤岛与质量: 整合来自不同系统的海量异构数据,并确保其质量和实时性,是AIOps成功的基石。这需要强大的数据采集、处理和存储能力。团队技能与文化转型: 实施AIOps需要复合型人才,既懂运维又懂数据科学。更重要的是,它要求团队从传统的被动响应文化,向主动预测、自动化运维的文化转变。投入与回报证明: 初期投入可能不菲,包括技术选型、平台搭建、数据整合、模型训练等。如何量化AIOps带来的价值(如减少停机时间、提升MTTR、节约人力成本),并向管理层证明ROI,是关键。工具选择与集成: 市场上的AIOps工具众多,如何选择适合自身业务需求的产品,并与现有运维工具链(CMDB、告警系统、工单系统)无缝集成,是一个复杂的过程。我的经验之谈:如何起步与迭代?作为一名在运维领域摸爬滚打多年的老兵,我想给正在考虑或已经开始AIOps之旅的朋友们一些建议:从小处着手,选准痛点。 不要一开始就想着构建一个包罗万象的AIOps平台。从一个业务关键且痛点明显的场景入手,比如某个核心应用的性能瓶颈预测,或某个常见故障的自动化修复。快速见到成效,建立信心。构建坚实的可观测性基础。 AIOps是建立在高质量、全维度数据之上的。确保您的日志、指标、链路追踪数据被有效地采集、存储和分析,这是AIOps成功的先决条件。持续优化ML模型。 机器学习模型不是一劳永逸的,它需要持续的数据喂养、训练和调优,才能保持预测的准确性。拥抱“模型即服务”的理念。培养跨职能团队。 AIOps的成功需要运维、开发、数据科学团队的紧密协作。内部培训、知识共享和外部专家引入都非常重要。拥抱自动化,但保持审慎。 在核心生产环境引入自动化修复时,务必从小范围、低风险的场景开始,逐步扩大自动化范围,并始终保持人工干预的最后一道防线。结语2025年,AIOps不再是未来科技,而是企业保障云服务高可用的现实选择。它让我们从被动的救火队员转变为主动的风险管理者。虽然实施之路充满挑战,但它带来的业务价值——更稳定的系统、更高效的运维、更满意的客户——无疑是值得我们去投入和探索的。记住,这是一场长跑,需要持续的投入和迭代。期待看到您在AIOps之路上取得的每一个进步!如果您有任何AIOps实践的心得或疑问,也欢迎在评论区与我交流。
2025年12月01日
20 阅读
0 评论
0 点赞
2025-09-03
2026 Linux服务器安全加固终极Checklist:全面防御网络攻击与零信任实践
2026 Linux服务器安全加固终极Checklist:全面防御网络攻击的必备指南在数字化高度互联的今天,Linux服务器作为承载网站、应用和数据库的核心基础设施,其安全性至关重要。随着网络攻击手段的不断演进,从勒索软件到DDoS攻击,从零日漏洞利用到供应链攻击,都可能给企业带来严重的业务中断和数据损失。作为专注于网络安全的专业团队,我们深知构建系统化、前瞻性的安全加固策略是维护业务连续性的基石。本文为您提供一份详尽的2026年Linux服务器安全加固Checklist。该清单基于我们团队在实战攻防、渗透测试和运维中的丰富经验,旨在帮助您全面防范各类常见网络攻击,构建一道坚固的数字防线。一、SSH服务安全强化:筑牢远程访问的第一道关口SSH(Secure Shell)是管理Linux服务器的主要方式,但也常成为攻击者的首要目标。2026年,暴力破解和密钥泄露攻击依然频繁,因此强化SSH安全刻不容缓。 禁止Root用户直接登录:root账户是攻击者的重点目标。禁用直接登录,改用普通用户登录后通过sudo提权。 编辑/etc/ssh/sshd_config,设置PermitRootLogin no。 示例:某企业因未禁用root登录,遭暴力破解导致服务器沦陷,业务数据被加密勒索。 全面采用SSH密钥认证,禁用密码登录:密码易被暴力破解,而密钥认证提供更强的安全性。推荐使用Ed25519算法生成密钥。 生成密钥:ssh-keygen -t ed25519 -a 100。 上传公钥至服务器~/.ssh/authorized_keys,并设置PasswordAuthentication no。 修改默认SSH端口:避免使用默认22端口,改为高位端口(如5022)以减少自动化扫描。 编辑sshd_config,设置Port 5022。 部署Fail2Ban防御暴力破解:Fail2Ban监控日志,自动封禁多次失败登录的IP。 安装:sudo apt install fail2ban(Debian/Ubuntu)或sudo yum install fail2ban(RHEL/CentOS)。 配置:编辑/etc/fail2ban/jail.local,设置maxretry=3和bantime=1h。 禁用不必要的SSH功能:关闭X11转发、TCP转发等以减少攻击面。 设置X11Forwarding no、AllowTcpForwarding no。 二、防火墙配置:构建智能化的访问控制屏障防火墙是服务器的外部屏障,合理配置能有效阻止未授权访问。2026年,建议结合AI驱动的动态规则管理,提升实时威胁响应能力。 启用并优化防火墙:根据发行版选择UFW(Ubuntu/Debian)或Firewalld(RHEL/CentOS)。 确保启用:sudo ufw enable或sudo systemctl enable firewalld。 遵循最小权限原则开放端口:仅开放必需端口,如Web(80/443)、SSH(自定义端口)。 示例:sudo ufw allow 443/tcp或sudo firewall-cmd --permanent --add-port=443/tcp。 案例:某公司因开放多余端口(如21/FTP),导致恶意软件传播。 实施IP白名单限制:对管理端口(如SSH、数据库)限制特定IP访问。 UFW示例:sudo ufw allow from 192.168.1.100 to any port 5022。 启用日志监控:记录防火墙日志,便于审计和威胁狩猎。 设置sudo ufw logging on。 三、系统与软件更新:及时修补漏洞源头未打补丁的漏洞是攻击者的主要入口。根据2025年CVE数据,超过60%的成功入侵源于未及时更新。建议启用自动更新并结合漏洞扫描工具。 定期更新系统与软件:开启自动更新或手动执行。 Debian/Ubuntu:sudo apt update && sudo apt upgrade -y。 RHEL/CentOS:sudo yum update -y或sudo dnf update -y。 最佳实践:生产环境先测试更新,避免兼容性问题。 移除不必要的软件包:减少攻击面,卸载未使用的服务(如Telnet、FTP)。 检查并卸载:sudo apt purge telnetd(示例)。 集成漏洞扫描工具:使用OpenVAS或Trivy定期扫描,识别缺失补丁。 Trivy示例:trivy fs /扫描文件系统漏洞。 四、用户与权限管理:贯彻最小权限原则权限滥用是内部和外部威胁的常见原因。2026年,零信任架构(Zero Trust)强调持续验证,建议结合多因素认证(MFA)强化访问控制。 创建普通用户并使用sudo:避免日常使用root,通过sudo执行管理任务。 添加用户:sudo adduser adminuser。 授予sudo权限:sudo usermod -aG sudo adminuser(Debian/Ubuntu)。 强制复杂密码策略:要求长度≥12位,含大小写、数字和特殊字符。 编辑/etc/security/pwquality.conf,设置minlen=12、minclass=4。 设置过期策略:sudo chage -M 90 adminuser(90天更换)。 禁用不活动账户:定期审计用户,锁定闲置账户。 检查登录记录:lastlog。 锁定账户:sudo usermod -L username。 设置文件和目录权限:遵循最小权限,配置文件设为600,Web目录避免777。 示例:sudo chmod 600 /etc/ssh/sshd_config。 常见错误:误设/tmp为可执行,导致脚本注入。 五、入侵检测与日志审计:实时洞察与响应预防措施虽重要,但监控和响应同样关键。2026年,建议结合AI驱动的行为分析工具,提升威胁检测效率。 部署入侵检测系统(IDS):使用Wazuh或OSSEC监控文件完整性。 Wazuh安装:curl -sO https://packages.wazuh.com/install.sh && sudo bash install.sh。 集中式日志管理:使用Rsyslog或Fluentd收集日志,转发至SIEM(如Elasticsearch)。 配置Rsyslog:编辑/etc/rsyslog.conf,添加远程服务器地址。 启用审计日志(Auditd):跟踪系统调用和文件访问。 监控SSH登录:sudo auditctl -w /usr/sbin/sshd -p x -k sshd_access。 定期审查日志:关注失败登录、sudo提权等事件,设置告警。 工具:journalctl、ausearch。 六、额外加固措施:应对新兴威胁除了传统方法,2026年还需关注容器安全、云原生环境和供应链攻击。 启用SELinux或AppArmor:强制访问控制(MAC)限制进程权限。 SELinux状态检查:sestatus。 AppArmor配置:sudo aa-enforce /path/to/profile。 加密敏感数据:使用LUKS加密磁盘,或Vault管理密钥。 LUKS示例:sudo cryptsetup luksFormat /dev/sdb1。 备份与灾难恢复:定期备份,测试恢复流程。 工具:BorgBackup、Rclone。 真实案例:某企业因勒索软件攻击,依靠备份快速恢复业务。 结语Linux服务器安全是一个持续的过程,而非一劳永逸的任务。本Checklist涵盖了从SSH强化到入侵检测的核心步骤,但需根据您的环境灵活调整。定期审计、渗透测试和员工培训同样重要。记住,安全投入远低于数据泄露的代价——现在就开始行动吧!
2025年09月03日
35 阅读
0 评论
0 点赞
2025-09-02
零基础转型系统运维工程师:2026年实战技能路线图与入行指南
从零到专业:系统运维工程师全面转型指南 - 2026版路线图与实践建议是否正站在职业生涯的十字路口,渴望投身于充满挑战与机遇的IT领域?系统运维作为数字化转型浪潮中的“稳定基石”,正以其广阔的职业前景和持续的技术演进,吸引着越来越多非技术背景人士的目光。对于零基础转型者而言,面对琳琅满目的技术栈,如何迈出扎实的第一步,规划出一条高效可行的学习路径?本指南基于行业最新趋势与实践经验,为您设计了一套从零基础到入门的系统运维技能成长路线。我们不仅提供清晰的知识图谱,更融入了对行业变化的洞察与实用建议,帮助您构建坚实的技术基础,最终成为一名具备竞争力的系统运维工程师。为什么选择系统运维?2026年行业前景解析随着企业数字化转型的深化和混合云架构的普及,系统运维工程师的角色已经从传统的“系统管理员”转变为确保业务连续性、优化资源效率、实现自动化的关键岗位。运维工作的价值正不断向更高层次的稳定性保障、成本优化和安全合规演进。核心吸引力:持续增长的市场需求:企业对稳定、高效IT系统的依赖有增无减,特别是在云原生和智能化运维(AIOps)趋势下,具备相关技能的人才备受青睐。清晰的职业成长路径:从运维工程师到SRE、运维开发工程师、云架构师等,发展路径多元。解决问题的能力:运维工作直面系统复杂性,培养出色的故障排查和问题解决能力。零基础友好:相较于开发岗位,运维对算法和数据结构等计算机科学的深度要求相对友好,更适合“从做中学”的模式。从零到一的蜕变:八大核心技能模块详解我们建议按照以下由浅入深、理论结合实践的模块顺序进行学习。1. 操作系统精通:一切的基础系统运维工程师的核心工作环境,建议将80%的精力投入在Linux学习上,同时了解Windows Server作为补充。Linux系统(重中之重):命令行操作与效率工具:熟练掌握ls, cd, grep, awk, sed, find等基础命令。进阶学习tmux或screen进行会话管理,使用htop替代top获得更直观的进程视图。文件系统与权限体系:深入理解FHS标准,熟悉/etc(配置文件)、/var(可变数据)、/opt(第三方软件)等目录的用途。掌握UGO模型、特殊权限(SUID, SGID, Sticky bit),并了解ACL进行更细粒度的权限控制。进程与服务管理:熟练使用systemctl管理服务(启动、停止、重启、状态查看、开机自启配置)。理解Systemd单元文件(.service)的组成,能进行简单修改。掌握ps, top, kill, pkill等进程管理命令。软件包管理:根据发行版选择学习,RHEL/CentOS/Rocky Linux/AlmaLinux系重点学习YUM/DNF,Debian/Ubuntu系重点学习APT。理解仓库配置、软件安装、升级、降级、查询和清理。网络配置与排查:使用ip命令(替代传统的ifconfig)进行网络接口配置。掌握ss(替代netstat)查看网络连接。学会使用nmtui或直接编辑/etc/sysconfig/network-scripts/(RHEL系)或/etc/netplan/(Ubuntu新版)配置文件。日志分析与排查:熟悉/var/log/下常见日志文件(如messages, secure, dmesg)。掌握journalctl(Systemd日志)的基本查询和过滤技巧。Shell脚本入门:从编写简单的备份脚本、服务状态检查脚本开始,学习变量、条件判断、循环、函数以及错误处理。Windows Server基础(作为补充):Active Directory(AD):了解域、用户、组、组织单位(OU)的基本概念和管理操作。组策略(GPO):理解其作用,能进行简单的策略配置(如密码策略、软件部署)。Windows服务与事件查看器:掌握服务的启动类型设置,能通过事件查看器筛选和查看系统/应用日志。PowerShell基础:了解PowerShell与传统CMD的区别,学习几个常用cmdlet(如Get-Service, Restart-Service)。实战建议:立刻在个人电脑上使用VirtualBox或VMware安装一个CentOS Stream/Rocky Linux或Ubuntu LTS版本的虚拟机。从图形界面切换到纯命令行模式进行操作练习。尝试完成以下任务:1) 新建用户并赋予sudo权限;2) 配置静态IP地址;3) 安装Nginx并设置开机启动;4) 编写一个每日备份指定目录的脚本。2. 网络知识筑基:理解互联的世界网络是系统的血脉,扎实的网络基础是高效排查故障的前提。核心协议与模型:理解TCP/IP五层模型(物理、数据链路、网络、传输、应用)与OSI七层模型的对应关系。重点掌握TCP三次握手/四次挥手、UDP特性。关键应用层协议:HTTP/HTTPS:了解请求/响应格式、状态码、HTTPS加密原理。DNS:理解递归查询、迭代查询、A记录、CNAME、MX记录等,熟练使用dig和nslookup进行排查。SSH:掌握密钥对认证、端口转发等安全连接方式。IP地址与路由:掌握IPv4子网划分(CIDR表示法)、私有地址段。了解IPv6基本格式。理解默认网关、路由表的概念。实用排查工具箱:ping:测试连通性与延迟。traceroute/mtr:追踪数据包路径,发现网络瓶颈。telnet/nc:手动测试TCP端口连通性。curl:强大的HTTP客户端,用于测试Web服务、API接口。tcpdump/Wireshark:抓包分析,用于深层次协议问题排查(进阶)。常见问题解答:Q: 用户反馈网站打不开,如何快速定位?A: 1) 本地ping域名,检查DNS和网络连通性;2) curl -v 访问URL,查看详细的HTTP请求响应过程;3) telnet 服务器IP 80 检查特定端口是否开放;4) 登录服务器检查Web服务进程状态和错误日志。3. 脚本与自动化:运维价值的放大器自动化是现代运维的基石,是区分“操作员”与“工程师”的关键能力。Bash/Shell脚本进阶:在基础之上,深入学习:健壮性:使用set -e(出错即退出)、set -u(使用未定义变量报错)、trap(捕获信号)增强脚本稳定性。可维护性:添加注释、使用函数模块化代码、统一日志输出格式。实例:编写一个监控磁盘使用率,超过阈值时自动清理日志并发送邮件告警的脚本。Python:运维自动化的瑞士军刀:学习路径:基础语法(变量、数据类型、控制流)→ 函数和模块 → 文件操作(处理日志、配置文件)→ 网络编程(requests库调用API, paramiko/fabric进行SSH操作)→ 常用运维库(如psutil获取系统信息, yaml/json解析配置文件)。实战项目:开发一个简易的服务器资产信息收集脚本(采集CPU、内存、磁盘、进程、安装的软件列表),并输出为JSON或CSV格式。PowerShell(Windows环境):对于Windows运维,PowerShell是必须掌握的自动化工具。学习其面向对象的管道操作和丰富的内置模块。4. 版本控制系统:协作与历史的基石所有配置文件、脚本、文档都应纳入版本管理。Git是绝对的主流选择。必须掌握的Git操作:clone, add, commit, push, pull, branch, merge, status, log(含--graph等美化选项)。理解工作流:至少掌握基于主分支(main/master)的功能分支工作流。了解如何提交有意义的Commit信息。托管平台:熟练使用GitHub、GitLab或Gitee等平台进行代码托管、Issue跟踪和Pull Request协作。经验之谈:将你的学习笔记、实验脚本、配置文件模板都放入一个Git仓库。这不仅是实践,也是构建你个人知识库和作品集的过程。5. 监控与告警:系统的“眼睛”和“耳朵”“无监控,不运维”。需要了解监控的核心理念和主流工具栈。监控维度:基础设施监控:CPU、内存、磁盘I/O、网络流量。服务监控:Web服务器(Nginx/Apache)、数据库(MySQL/Redis)等的进程状态、端口监听、关键性能指标。业务监控:应用接口响应时间、错误率、关键业务流程状态。经典开源监控栈学习:Prometheus:作为指标收集和存储的核心,学习其数据模型(指标名称+标签)、查询语言PromQL。Grafana:用于可视化监控数据,创建直观的仪表盘。Alertmanager:与Prometheus搭配,负责告警的去重、分组和路由(发送到钉钉、企业微信、邮件等)。日志集中管理:了解ELK Stack(Elasticsearch, Logstash, Kibana)或EFK(Fluentd替代Logstash)的基本架构,知道如何将分散的日志收集、索引并可视化查询。6. 配置管理与自动化部署(IaC)告别手动修改配置,实现环境的一致性、可重复性和版本化管理。Ansible(推荐入门):基于SSH,无需在目标主机安装Agent,学习曲线平缓。核心概念:清单(Inventory)、剧本(Playbook)、模块(Module)、角色(Role)。实战:编写Playbook,自动化完成“在新服务器上安装Nginx、配置虚拟主机、部署静态网站文件、设置防火墙规则”等一系列操作。Terraform(云资源编排):用于“基础设施即代码”,统一管理云上(AWS, Azure, 阿里云等)或虚拟化平台(vSphere)的资源创建和生命周期。理解其声明式语法和状态文件管理。其他可选:SaltStack, Chef, Puppet(后两者在传统企业仍有应用)。7. 容器化与编排:现代应用的标准交付件容器技术彻底改变了应用打包、分发和运行的方式,是云原生技术的核心。Docker:掌握镜像、容器、仓库的基本概念。能编写Dockerfile将应用容器化。熟练使用docker run, docker ps, docker logs, docker exec, docker-compose等命令。理解容器数据卷(Volume)和网络。Kubernetes(K8s):容器编排的事实标准。核心概念入门:Pod、Deployment、Service、Ingress、ConfigMap、Secret、Namespace。基础操作:使用kubectl进行应用部署、扩缩容、更新、查看日志和调试。学习建议:初期不必深究其复杂架构,重在理解核心对象的概念和使用。可以在本地使用Minikube或Kind搭建实验环境。8. 云平台实战:技能的应用舞台将前七项技能在云环境中融会贯通。选择一到两个主流公有云:例如AWS、Microsoft Azure、Google Cloud Platform(GCP)、阿里云、腾讯云。聚焦核心IaaS服务:计算:云服务器(EC2/ECS)的创建、管理、镜像制作。存储:对象存储(S3/OSS)、块存储(EBS/云盘)的使用。网络:VPC(虚拟私有云)、子网、安全组/防火墙、负载均衡器(ELB/CLB)的配置。数据库:托管数据库服务(RDS)的基本操作。利用免费套餐或学生优惠:所有主流云厂商都提供免费试用额度,是绝佳的实战练兵场。学习路线图与时间规划建议对于脱产学习者(每天投入6-8小时):第1-2个月:聚焦**操作系统(Linux)** 和**网络基础**。达到能熟练使用命令行完成日常管理任务,理解基本网络原理。第3个月:深入学习**Bash脚本**和**Git**,开始学习**Python基础**。第4个月:学习**监控(Prometheus+Grafana)** 和**配置管理(Ansible)**。用Python完成一个小型自动化项目。第5个月:学习**Docker**,了解**Kubernetes**基本概念。第6个月:选择一个公有云进行实战,将前面所学组合运用(例如:在云上用Terraform创建资源,用Ansible配置系统,部署容器化应用,并配置监控)。持续进行:构建个人项目,撰写技术博客,尝试为开源项目提交文档或简单Bug修复,准备面试。对于在职学习者(每天投入2-3小时):可将上述周期延长至10-12个月。关键在于持续性和动手实践。零基础转型者的常见问题与心态建议Q: 数学/英语不好,能学运维吗?A: 运维对高等数学要求不高,更侧重逻辑思维和解决问题能力。英语阅读能力很重要(文档、报错信息多为英文),但无需听说流利,可通过翻译工具辅助,并在学习中逐步积累专业词汇。Q: 是否需要考取认证?A: 认证(如RHCE, AWS SAA, CKA)是系统学习的验证和简历的加分项,但不是必须。对于零基础者,建议先按路线图学习并实践,有了一定基础后再考虑报考,否则很容易变成“paper certification”。Q: 如何获得第一份工作?A: 1) 打造作品集:将你的学习项目(自动化脚本、监控部署、容器化应用等)整理到GitHub,并配上清晰的README。2) 重视基础:面试官深知零基础应聘者经验有限,因此会更关注你的学习能力、对基础知识的理解深度和解决问题的思路。3) 从初级岗位入手:如“运维助理”、“系统支持工程师”,先进入行业,再谋求发展。心态调整:技术更新快是常态,重要的是掌握底层原理和持续学习的方法。遇到问题善于利用搜索引擎(Google/Stack Overflow)、官方文档和技术社区。转行是一场马拉松,保持耐心,庆祝每一个小的里程碑。希望这份详尽的指南能为您照亮前行的道路。记住,最好的开始时间就是现在。动手去做,在错误中学习,您终将构建起属于自己的技术大厦,成功踏入系统运维的精彩世界。
2025年09月02日
129 阅读
0 评论
1 点赞
2025-09-02
Linux服务器安全加固全面指南:从基础配置到高级防御
在当前的数字环境中,Linux服务器作为承载全球绝大多数关键业务和互联网服务的基石,其安全性比以往任何时候都更加举足轻重。随着网络攻击的日益复杂和智能化,任何细微的配置漏洞都可能导致严重的后果。作为专家团队,我们结合实践经验,为您提供这份全面且符合当前最佳实践的安全防护策略指南。本文将从核心理念出发,系统地介绍Linux服务器安全加固的各个层面,涵盖基础配置、网络防御、应用安全与高级策略,旨在帮助您构建一个更安全、更可信的服务器环境。一、核心理念:构建安全策略的基石在进行具体配置前,确立清晰的指导原则至关重要,它们将贯穿整个加固过程: 最小权限原则: 只授予执行任务所需的最低权限,从根本上减小攻击面。 纵深防御: 构建多层防御体系,不依赖单一防线,确保即使一层被突破,其他层仍能提供保护。 持续监控与审计: 实时关注系统活动,建立完善的日志记录与审计机制,以便及时发现异常并溯源。 自动化与标准化: 利用自动化工具和标准化流程,减少人为配置错误,确保部署环境的一致性。 及时更新与补丁管理: 建立并遵守补丁管理流程,及时修复已知漏洞,这是对抗常见攻击最有效的方法之一。 二、基础加固:夯实服务器安全地基服务器的整体安全始于最基础的配置,以下是构建坚实防线的关键起点。2.1 最小化安装与服务精简部署系统时,务必选择最小化安装。评估并移除不必要的软件包和服务,每个多余的服务都是一个潜在的暴露点。 实践建议: 定期审查已安装的软件包列表。sudo apt list --installed (Debian/Ubuntu) 或 sudo rpm -qa (RHEL/CentOS/Fedora),并评估其必要性。 扩展: 对于容器化环境,这一原则同样适用。使用精简的基础镜像(如Alpine、Distroless)可以有效减少攻击面。 2.2 用户与访问权限管理精细化的用户和权限管理是防止权限提升和横向移动的核心。 禁用Root直接SSH登录: 这一措施能极大增加攻击者直接获取最高权限的难度。 # 编辑SSH配置文件 sudo nano /etc/ssh/sshd_config # 确保以下行存在并设置为 no PermitRootLogin no # 保存后重启SSH服务 sudo systemctl restart sshd # 或 sudo service ssh restart 强化Sudo权限: 使用普通用户结合sudo进行管理。推荐使用visudo编辑配置文件,并考虑进一步限制sudo的使用范围(如限制特定命令、禁用密码缓存timestamp_timeout=0等)。 # 添加新用户并加入sudo组(Ubuntu/Debian为例) sudo adduser newusername sudo usermod -aG sudo newusername 强制密码与身份验证策略: 强密码策略: 通过PAM模块(如pam_pwquality)强制密码复杂性、最小长度和过期周期。 多因素认证(MFA): 对于SSH等高权限访问,强烈建议启用MFA。除了Google Authenticator,也可以使用如libpam-google-authenticator等工具进行集成。 密钥替代密码: 对于自动化脚本或服务器间访问,使用SSH密钥认证比密码更安全。 账户生命周期管理: 定期审计用户列表,使用命令如last、who检查近期登录记录,及时禁用或删除离职员工、无效服务账户。2.3 端口与服务暴露面管理“看不见就攻击不到”,严格控制对外开放的网络端口是基础安全的关键。 识别并禁用不必要服务: 使用systemctl list-unit-files --type=service --state=enabled或chkconfig --list(旧版本)检查自启动服务。对于非必要服务,应立即停止并禁用。 sudo systemctl stop unwanted_service sudo systemctl disable unwanted_service # 可选:完全卸载相关软件包以防止重新启用 sudo apt remove package_name # 或 yum remove 审查开放端口: 使用ss -tuln(推荐)或netstat -tuln查看监听端口及关联进程,确认每一个都是业务必需的。 三、网络安全强化:构筑多层防御边界网络层是服务器与外部世界的直接交互界面,需要构建可靠的过滤和监控机制。3.1 主机防火墙配置根据发行版选择合适的防火墙工具,但核心原则统一:默认拒绝所有入站连接,仅显式放行必要流量。 UFW (Ubuntu/Debian): 简单易用,适合快速配置。 sudo ufw default deny incoming sudo ufw default allow outgoing sudo ufw allow ssh # 放行SSH (22端口) # 更安全的做法:限制SSH来源IP段 sudo ufw allow from 192.168.1.0/24 to any port 22 sudo ufw allow http sudo ufw allow https sudo ufw --force enable # 启用并生效 Firewalld (RHEL/CentOS/Fedora): 更动态、功能丰富,支持区域和富规则。 sudo firewall-cmd --permanent --remove-service=ssh # 先移除默认SSH规则 sudo firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="192.168.1.0/24" service name="ssh" accept' # 添加基于IP的规则 sudo firewall-cmd --permanent --add-service=http sudo firewall-cmd --permanent --add-service=https sudo firewall-cmd --reload 延伸:云平台安全组/网络安全组: 如果您使用AWS、Azure、GCP等云服务,务必在云平台层面配置安全组规则,与主机防火墙形成互补的“纵深防御”。确保云安全组也遵循最小开放原则。 3.2 SSH服务高级加固SSH是管理服务器的关键通道,也是重点攻击目标,需要额外强化。 修改默认端口: 可以降低针对端口22的自动化扫描攻击,但这不是真正的安全措施(安全通过隐匿)。 更关键的配置: # /etc/ssh/sshd_config PermitRootLogin no # 已提及,但至关重要 PubkeyAuthentication yes # 启用密钥认证 PasswordAuthentication no # 禁用密码认证(如果已使用密钥) MaxAuthTries 3 # 限制认证尝试次数 ClientAliveInterval 300 # 设置客户端活跃间隔 ClientAliveCountMax third # 达到上述间隔次数后断开连接 AllowUsers user1
[email protected]
.* # 仅允许特定用户(及来源IP)登录 # 使用更现代的密钥交换、密码和MAC算法(具体算法需根据兼容性选择) # KexAlgorithms
[email protected]
,diffie-hellman-group-exchange-sha256 # Ciphers
[email protected]
,
[email protected]
,aes256-ctr # MACs
[email protected]
,
[email protected]
注意: 修改加密相关算法前,请确保所有SSH客户端支持,否则可能导致无法连接。 使用Fail2ban: 这是一个重要的主动防御工具,可监控日志(如/var/log/auth.log),自动封锁多次认证失败的IP地址,有效抵御暴力破解攻击。安装配置Fail2ban是SSH加固的强力补充。
2025年09月02日
20 阅读
0 评论
0 点赞
2025-08-28
赋能分布式团队:2026远程运维核心工具栈与高效实践指南
在当今数字化商业环境中,远程与分布式运维已成为保障业务连续性的核心能力。运维团队需要面对跨越地理边界、时区差异和网络环境复杂化的挑战,同时确保系统稳定性与服务质量。作为专注于运维领域的专家团队,我们深刻理解远程协作的痛点。本文旨在提供一份系统化的实战指南,涵盖构建高效工具栈、实施安全策略、优化协作流程等关键维度,遵循E-E-A-T原则,确保内容具备权威性、实操性和前沿性。远程运维的核心挑战:为何需要全新范式?与传统集中式运维不同,远程运维模式打破了物理边界,要求团队在“不可见”的环境中保持高效。这带来了独特的挑战: 沟通与协作碎片化: 时区差异导致同步会议困难,异步沟通中关键信息容易遗漏或延迟。例如,一次复杂的故障排查可能因信息传递层级过多而延长数小时。 安全边界无限延伸: 员工通过家庭网络、公共Wi-Fi等多种方式接入,传统企业网络边界防御模型失效。据《2025全球网络安全态势报告》,近40%的安全事件与远程访问凭证泄露或设备失陷相关。 系统可见性受限: 缺乏对远程设备状态的直观感知,难以快速判断是网络问题、设备故障还是应用异常。 应急响应流程滞后: 紧急事件发生时,远程团队需要更清晰的角色分工、更标准化的操作手册和更快的决策链路。 知识与经验孤岛: 团队成员分散,隐性知识难以流动,新人上手成本增高,团队整体风险抵御能力下降。 应对这些挑战,需要系统性的工具支持与流程重构,而非零散的技巧堆叠。构建高效远程运维工具栈:四大支柱1. 协作与沟通:连接分布式团队无缝的沟通是远程团队的“神经系统”。建议构建分层沟通体系: 即时同步: 使用Slack(企业级)或Microsoft Teams作为日常沟通中心。创建专属频道(如#incident-response、#deployments),集成告警机器人,实现信息自动归集。定期进行视频站会(如使用Zoom或Google Meet),维持团队“在场感”。 异步协作与知识沉淀: 将Notion或Confluence作为唯一知识源。强制要求所有运维操作、故障复盘、配置变更记录文档化。例如,可建立“运维剧本”(Runbook)库,任何人遇到已知问题,都能按步骤自主解决。 可视化协同工具: 引入Miro或Figma(用于架构图)进行线上架构设计评审或故障根因分析,替代线下白板。 2. 安全访问与身份管理:贯彻零信任安全策略必须从“信任但验证”转向“从不信任,始终验证”。 零信任网络访问(ZTNA): 采用Tailscale、Cloudflare Zero Trust或Zscaler Private Access。它们基于身份和设备状态动态授权,实现“最小权限访问”。例如,数据库工程师只能访问特定数据库端口,而非整个内网。 统一的身份与访问管理: 使用Okta或Azure Active Directory作为身份中枢,集成所有SaaS和基础设施,实现单点登录(SSO)和集中权限管理。 强化认证与凭证管理: 多因素认证(MFA): 对所有关键系统强制使用硬件密钥(如YubiKey)或基于推送的认证(如Duo),大幅降低钓鱼攻击风险。 机密管理: 用HashiCorp Vault或AWS Secrets Manager动态管理SSH密钥、API令牌、数据库密码,避免硬编码和手动分发。 特权访问管理(PAM): 对于最高权限操作,采用Teleport或BeyondTrust,实现会话录制、审批流程和临时权限提升。 3. 可观测性与智能化告警:从被动到主动目标是建立系统“全景视图”,并能预测潜在问题。 一体化可观测性平台: 商业方案: Datadog、New Relic或Grafana Cloud提供了开箱即用的指标(Metrics)、日志(Logs)、链路追踪(Traces)集成,并能通过AI辅助异常检测。 开源方案: Prometheus(指标)+ Loki(日志)+ Tempo(追踪)+ Grafana(可视化)组成的开源栈,提供了高度的灵活性和可控性。 智能化告警与事件管理:<ul> <li>使用<strong>Prometheus Alertmanager</strong>或<strong>Grafana Alerting</strong>定义精准的告警规则,避免“告警风暴”。</li> <li>将告警接入<strong>PagerDuty</strong>或<strong>Opsgenie</strong>,实现智能化路由(基于技能、时区)、升级策略和闭环管理。集成Slack或Teams,让整个团队能透明地跟踪事件处理状态。</li> <li>实践“<strong>值班轮转(On-Call)</strong>”健康度检查,避免工程师倦怠。</li> </ul>4. 自动化与IaC:效率与一致性的引擎自动化是远程运维的“力量倍增器”。 基础设施即代码(IaC): 使用Terraform或OpenTofu定义和供应云资源、Kubernetes集群等。所有变更通过代码评审(Pull Request)进行,版本化控制。 示例:新成员加入时,一条命令即可在AWS/Azure/GCP上复现出与生产环境一致的开发环境。 配置管理与自动化执行:<ul> <li>使用<strong>Ansible</strong>进行批量配置管理、应用部署和日常任务(如证书更新)自动化。其“无代理”特性非常适合混合云环境。</li> </ul>GitOps工作流:<ul> <li>采用<strong>ArgoCD</strong>或<strong>Flux</strong>,将应用和基础设施的期望状态声明在Git仓库中。任何变更通过Git提交触发,实现自动化的、可审计的部署流程。</li> </ul>构建远程高效实践:超越工具工具之外,文化和流程决定了远程运维的最终成效。 建立清晰的沟通协议(Communication Charter): 约定不同场景的沟通方式(如紧急事件必须电话+Slack @here,普通问题发异步文档),并定期复盘优化。 标准化与文档化一切: 推行“文档即代码”,将Runbook、架构图、决策记录(ADR)都纳入版本管理。确保新人能在一周内独立处理二级告警。 实施定期的线上演练: 每季度组织一次模拟真实故障的“混沌工程”演练或桌面推演,检验工具链的完备性和团队应急流程的有效性。 关注团队健康与文化: 设置明确的“下线”时间,鼓励虚拟咖啡会等非正式交流,避免团队成员因长期远程工作而产生疏离感。 结语:迈向韧性分布式团队远程运维不仅是工具的堆砌,更是一种系统性能力的构建。通过整合现代化的协作工具、贯彻零信任安全理念、建立全景可观测性、并深度拥抱自动化与IaC,运维团队可以彻底突破地理限制,打造出更敏捷、更安全、更具韧性的分布式作战单元。关键在于,将这些工具和实践融入团队的日常文化,持续迭代,方能真正赋能团队,在不确定的环境中确保业务的稳定与增长。
2025年08月28日
30 阅读
0 评论
0 点赞
2025-08-28
构建未来系统:云原生架构下的运维最佳实践(2026年版)
在瞬息万变的数字化时代,云原生架构已成为企业实现敏捷、可伸缩和高可用应用的关键。然而,伴随其而来的分布式复杂性也对传统运维模式提出了前所未有的挑战。如何在云原生环境中确保系统的稳定性、效率、安全性和成本效益?这正是“云原生架构下的运维最佳实践”所要解答的核心问题。为何需要云原生运维最佳实践?想象一个由成百上千个微服务、容器、Kubernetes集群和无服务器函数组成的庞大生态系统。其动态性、不可变基础设施及快速迭代的特性,使得传统基于IP地址和固定配置的运维方式已然失效。我们需要一套全新的思维模式、工具和流程来驾驭这种复杂性,并将其转化为企业真正的竞争力。本文基于我们团队多年实践经验,为您提炼出一份实战指南。我们将深入探讨核心理念、关键支柱,并提供可操作的实践建议,帮助您构建一个弹性、高效、可观测且成本可控的云原生系统。一、云原生运维的核心理念:从“修补”到“构建”云原生运维不仅是工具堆砌,更是一种文化与思维的深度升级。其核心在于: 自动化一切可自动化之事: 减少人工干预,消除人为错误,加速部署和故障恢复。 拥抱不可变基础设施: 部署后的组件不再原地修改,而是通过整体替换新版本来更新,极大简化了系统管理和回滚操作。 以代码定义一切 (IaC/GitOps): 所有基础设施和应用配置都应通过代码进行版本控制和管理,实现可追溯、可审计和自动化部署。 可观测性优先: 不仅仅是监控,更要深入洞察系统内部状态,实现对复杂问题的快速定位与根因分析。 弹性与容错设计: 假定故障必然会发生,并预先设计系统使其具备从故障中自动恢复的能力。 安全左移 (Shift Left Security): 将安全考量融入软件开发生命周期的每个阶段,而非最后的“附加项”。 SRE (Site Reliability Engineering) 文化: 将软件工程原则应用于运维领域,在系统可靠性与交付效率之间寻求最佳平衡。 二、云原生运维的关键支柱与实践领域成功的云原生运维建立在相互关联的几个关键支柱之上,共同构筑高效稳定的运维体系。2.1 可观测性:洞察分布式系统的“眼睛”在动态、复杂的分布式系统中,全面了解系统内部运行状态至关重要。现代可观测性超越了传统监控,通过整合指标 (Metrics)、日志 (Logs)、链路追踪 (Traces)三大支柱,为系统行为提供完整的上下文和深层洞察。 指标 (Metrics): 聚合的、数值化的数据点,用于表示系统性能与健康状态,如CPU/内存利用率、请求延迟(P99/P95)、错误率、吞吐量等。我们推荐使用Prometheus进行采集,Grafana进行可视化,并考虑OpenTelemetry作为标准的指标收集框架。 日志 (Logs): 离散的、事件驱动的记录,包含应用程序和系统产生的详细信息。在云原生环境中,日志通常需要集中管理、聚合与实时分析。Loki (日志聚合) + Grafana (可视化) 的组合因其资源效率高而广受欢迎,传统的ELK (Elasticsearch, Logstash, Kibana)栈依然是强大选择。 链路追踪 (Traces): 跟踪单个请求在分布式微服务架构中的完整路径和耗时,帮助理解请求流,快速定位性能瓶颈和故障源头。Jaeger、Tempo (Grafana Labs) 或基于OpenTelemetry的解决方案已成为行业标准。 告警 (Alerting)与关联分析: 基于可观测数据,通过智能阈值、异常检测(如使用Prometheus Alertmanager的复杂路由)与事件关联,及时、精准地通知潜在问题。现代告警设计更倾向于关注影响业务的症状 (Symptoms),而非海量底层原因 (Causes),以减少“告警疲劳”并提升响应效率。 可观测性最佳实践: 采用统一的可观测性平台: 例如Grafana Stack (Loki/Tempo/Grafana/Mimir) 或商业化的Datadog、New Relic,将指标、日志、链路追踪集成到一个统一的界面,提供端到端的观测视图。 推行标准化数据格式与语义约定: 定义统一的日志格式(如JSON)、指标命名规范和属性标签(遵循OpenTelemetry语义约定),便于数据的聚合、关联和分析。 确保分布式上下文传播: 在微服务调用链中正确传递追踪ID(Trace ID)和跨度ID(Span ID),确保能够完整还原请求路径。 实施精细化、分层告警策略: 设置多级告警(如警告、严重),结合业务SLO(服务水平目标)和技术指标,并利用告警聚合、静默和升级机制,避免“告警风暴”。 2.2 自动化与持续交付:驱动创新引擎,保障交付质量自动化是云原生运维的灵魂,它贯穿于从代码提交到生产部署,再到日常运维与恢复的每一个环节。 持续集成/持续交付 (CI/CD): 构建健壮、安全的自动化流水线,实现代码变更的快速、可靠交付。当前主流工具包括GitHub Actions、GitLab CI/CD、Jenkins (在复杂场景下仍有优势) 以及云原生的Tekton。趋势是更多采用声明式流水线定义,并与Kubernetes原生集成。 基础设施即代码 (IaC): 使用代码管理和供应基础设施资源,确保环境的一致性和可重复性。Terraform (多云支持)、Pulumi (使用通用编程语言) 和云服务商的原生IaC工具(如AWS CDK, Azure Bicep)是热门选择。关键是将IaC代码纳入版本控制和代码评审流程。 GitOps: 以Git仓库作为系统期望状态的唯一“真实来源”,通过声明式的方式管理基础设施和应用配置。任何对生产环境的更改都通过Git提交和Pull Request进行,然后由自动化控制器(如Argo CD、FluxCD)自动同步到目标集群。这极大地提升了部署的可审计性、安全性和回滚效率。 构建自愈系统: 设计系统使其能够自动检测和纠正常见故障。例如,利用Kubernetes的活性探针(Liveness Probe)自动重启不健康的Pod,或结合Karpenter等工具实现节点故障时的智能工作负载重调度与集群自动伸缩。 自动化最佳实践: 打造全自动化CI/CD管道: 从代码提交、构建、镜像扫描、安全测试、部署到冒烟测试,实现全程自动化。集成Trivy、Snyk等工具进行容器镜像和依赖漏洞扫描,实现安全左移。 实施渐进式交付: 结合蓝绿部署、金丝雀发布和功能标志(Feature Flags),将新版本以可控、可观测的方式逐步推送给用户,最大限度降低发布风险。工具如Argo Rollouts、Flagger能有效支持此类实践。 推行配置管理标准化: 使用Helm Charts、Kustomize或Carvel等工具对Kubernetes应用配置进行打包和管理,实现环境间的配置差异化与复用。 (文章后续部分将继续深入探讨成本优化与FinOps、安全与合规、以及SRE文化落地等关键支柱,并提供整合性的实战路线图与新兴趋势展望。)
2025年08月28日
39 阅读
0 评论
0 点赞
2025-08-27
独立开发者DevOps实践指南:从CI/CD到监控预警的自动化流水线搭建
独立开发者DevOps实践终极指南:从CI/CD到监控预警的自动化流水线搭建作为独立开发者,我们深知在代码创作的激情与项目部署的繁琐之间寻找平衡并不容易。您是否曾被手动构建、测试、部署流程拖慢节奏?是否因为一次配置疏忽导致线上故障?或者,产品上线后无法及时感知接口异常、服务宕机和错误率飙升?高效与可靠,已经成为独立项目能否持续增长的基础能力。本文将围绕独立开发者最常见的 Web 应用场景,介绍如何从零搭建一套实用、低成本、可维护的 DevOps 自动化流水线:从代码提交、自动构建、自动测试、镜像发布、远程部署,到上线后的监控预警与故障回滚。文章会以一个典型的 Spring Boot 项目为例,使用 Gitee、Drone CI、Docker、Docker Compose、SSH、Uptime Kuma、Prometheus/Grafana 等工具进行说明。您也可以将其中的思路迁移到 Node.js、Go、Python、PHP 或其他技术栈中。内容摘要 独立开发者为什么更需要 DevOps,而不是更不需要 CI/CD 流水线的关键阶段:构建、测试、制品、部署、验证 基于 Gitee + Drone CI + Docker 的自动化部署实践 如何管理环境变量、密钥、镜像版本和回滚策略 上线后如何配置监控、日志、错误追踪和告警通知 独立项目 DevOps 的成本控制与常见问题排查 独立开发者为何需要DevOps?许多独立开发者会认为 DevOps 是大公司、大团队的专属。然而,这是一种误解。对于独立开发者而言,DevOps 的价值甚至更突出,因为您通常没有专职运维、测试、发布经理和 SRE 团队,任何重复劳动和线上事故都会直接消耗自己的时间。 效率倍增:自动化取代重复手动操作,显著缩短开发周期,更快地将新功能推向市场。 降低错误率:CI/CD 流程强制执行自动化测试和标准化部署,减少“本地能跑、线上报错”的情况。 精力聚焦:将构建、打包、发布、重启等繁琐工作交给流水线,把精力集中在产品和业务逻辑上。 快速迭代:自动化流水线支持小步快跑、频繁发布,加速产品验证和用户反馈循环。 可追溯:每次发布都对应具体提交、构建日志、镜像版本和部署记录,线上问题更容易定位。 高枕但不盲目:通过监控预警,实时掌握系统健康状况,问题发生时第一时间收到通知。 本质上,DevOps 不是“上工具”,而是一套让独立开发者实现稳定交付、快速反馈、低成本运维的方法论。DevOps流水线核心组件概览一个完整的自动化流水线通常包含以下阶段。对于独立项目来说,不必一开始就追求复杂平台化,但至少应覆盖构建、测试、部署和监控四个关键环节。1. 持续集成(CI):自动化构建与测试持续集成(Continuous Integration,CI)是 DevOps 实践的第一步。它的目标是在代码变更后,通过自动化方式拉取代码、安装依赖、编译构建、执行测试和生成制品。即使只有一个开发者,CI 也非常有价值。因为它能帮助您确认每一次提交是否真的可构建、可测试、可交付,避免把隐患带到生产环境。CI 的常见触发方式包括: 推送触发(Webhook):代码仓库发生 push、merge request 或 tag 变更时,自动通知 CI 系统。这是最常用、最高效的方式。 定时触发:按固定周期执行构建或测试,适合每日巡检、依赖安全扫描、定时任务验证。 手动触发:需要人工确认时启动流程,常用于生产发布、热修复和回滚操作。 2. 持续交付/持续部署(CD):从代码到生产的标准通道持续交付(Continuous Delivery)意味着应用经过自动化构建和测试后,可以随时以可靠方式部署到目标环境。持续部署(Continuous Deployment)则更进一步:只要代码通过流水线验证,就自动发布到生产环境。对于独立开发者,建议根据项目风险选择策略: 个人工具、内部系统、低风险服务:可以采用持续部署,主分支通过后自动上线。 付费产品、核心业务系统:建议采用持续交付,在部署生产环境前保留一次人工确认。 涉及数据库结构变更的发布:无论是否自动部署,都应增加备份、迁移检查和回滚方案。 3. 制品管理:不要直接在服务器上编译很多独立开发者早期会直接 SSH 到服务器执行 git pull、mvn package、npm install、pm2 restart。这种方式虽然简单,但容易出现环境不一致、依赖污染、回滚困难等问题。更推荐的做法是:在 CI 环境中构建一次,生成明确版本的制品,例如 Docker 镜像、jar 包、静态文件压缩包等,然后部署该制品。这样可以确保“测试过什么,就部署什么”。4. 监控预警:上线不是结束,而是开始仅仅部署成功还不够,还需要知道应用在生产环境中是否正常运行。监控预警是 DevOps 流水线的“眼睛”和“耳朵”,可以帮助我们及时发现: 服务不可访问、接口超时、HTTP 5xx 错误增多 CPU、内存、磁盘、网络异常 应用错误日志激增、异常堆栈频繁出现 数据库连接池耗尽、慢查询、队列积压 证书即将过期、域名解析异常、第三方 API 不可用 独立开发者的监控目标不是搭建一套庞大的观测平台,而是用较低成本实现及时知道、快速定位、可恢复。推荐工具链:低成本、易维护、可迁移本文继续保留原有的 Gitee、Drone CI、Docker 和 SSH 方案,因为这套组合对独立开发者仍然轻量、直观、成本可控。同时,您也可以根据代码托管平台选择 GitHub Actions、GitLab CI、Gitee Go、Woodpecker CI 等替代方案。 代码托管:Gitee,提供代码仓库管理、Webhook 和第三方应用授权。 CI/CD 系统:Drone CI,基于容器的持续集成与持续交付系统,通过 YAML 文件定义流水线。 容器化:Docker 与 Docker Compose,用于应用打包、运行和服务编排。 部署服务器:一台安装 Docker 的 Linux 云服务器或 VPS。 应用框架:Spring Boot 示例项目,也可替换为 Node.js、Go、Python 等。 监控工具:Uptime Kuma 用于可用性监控,Prometheus + Grafana 用于指标监控,Sentry 可用于错误追踪。 告警通道:邮件、企业微信、钉钉、Telegram、Slack、Server 酱等。 整体架构:一次提交如何自动上线?一个典型的独立开发者 DevOps 流程可以设计为: 开发者将代码推送到 Gitee 仓库。 Gitee 通过 Webhook 通知 Drone CI。 Drone 拉取代码,执行单元测试和构建。 构建成功后生成 Docker 镜像,并推送到镜像仓库。 Drone 通过 SSH 登录生产服务器。 服务器拉取新镜像,使用 Docker Compose 更新服务。 部署完成后执行健康检查。 监控系统持续检测服务可用性和运行指标。 异常发生时通过预设渠道发送告警。 这套流程的关键不是工具多,而是每一步都可重复、可追溯、可回滚。实战步骤一:Gitee第三方授权配置首先,需要在 Gitee 上为 Drone CI 配置第三方授权,以便 Drone 能够访问代码仓库并监听提交事件。 登录 Gitee 账户,进入设置 -> 安全设置 -> 第三方应用 -> 创建应用。 填写应用信息: 应用名称:例如 Drone CI 应用主页:您的 Drone CI 访问地址,例如 https://ci.example.com 应用回调地址:通常为 https://ci.example.com/login 创建成功后,记录 Client ID 和 Client Secret,后续部署 Drone Server 时会用到。 建议为 CI/CD 系统使用独立域名,并配置 HTTPS。即使是个人项目,也不建议长期使用裸 IP 和 HTTP 暴露登录入口。实战步骤二:部署Drone CI在服务器上准备一个目录,例如 /opt/drone,创建 docker-compose.yml。下面是一个简化示例,实际使用时请替换域名、密钥和授权信息。version: '3.8' services: drone-server: image: drone/drone:2 container_name: drone-server ports: - 20000:80 volumes: - ./data:/data restart: always environment: - DRONE_GITEE_CLIENT_ID=your_gitee_client_id - DRONE_GITEE_CLIENT_SECRET=your_gitee_client_secret - DRONE_RPC_SECRET=your_rpc_secret - DRONE_SERVER_HOST=ci.example.com - DRONE_SERVER_PROTO=https - DRONE_USER_CREATE=username:your_gitee_username,admin:true drone-runner: image: drone/drone-runner-docker:1 container_name: drone-runner depends_on: - drone-server volumes: - /var/run/docker.sock:/var/run/docker.sock restart: always environment: - DRONE_RPC_PROTO=https - DRONE_RPC_HOST=ci.example.com - DRONE_RPC_SECRET=your_rpc_secret - DRONE_RUNNER_CAPACITY=2 - DRONE_RUNNER_NAME=runner-1启动服务:docker compose up -d访问 Drone 地址后,使用 Gitee 账户登录。登录成功后,在 Drone 中激活需要接入 CI/CD 的仓库。激活后,Drone 会自动在 Gitee 仓库中配置 Webhook。实战步骤三:为Spring Boot项目编写Dockerfile为了让应用在不同环境中保持一致,建议使用 Docker 镜像作为部署制品。以下是一个常见的 Spring Boot Dockerfile 示例:FROM eclipse-temurin:17-jre WORKDIR /app COPY target/app.jar /app/app.jar EXPOSE 8080 HEALTHCHECK --interval=30s --timeout=5s --retries=3 CMD wget -qO- http://127.0.0.1:8080/actuator/health || exit 1 ENTRYPOINT ["java", "-jar", "/app/app.jar"]如果项目使用 Spring Boot Actuator,建议开启健康检查端点:management.endpoints.web.exposure.include=health,info,prometheus management.endpoint.health.show-details=never这里需要注意:不要在镜像中写入数据库密码、API Token 等敏感信息。敏感配置应通过环境变量、密钥管理或服务器侧配置文件注入。实战步骤四:编写docker-compose部署文件在生产服务器上为应用准备 docker-compose.yml,用于统一管理应用、网络、端口和环境变量。version: '3.8' services: app: image: registry.example.com/myapp:${APP_VERSION} container_name: myapp restart: always ports: - 8080:8080 env_file: - .env healthcheck: test: wget -qO- http://127.0.0.1:8080/actuator/health || exit 1 interval: 30s timeout: 5s retries: 3配套的 .env 文件可以放在服务器上,不提交到代码仓库:APP_VERSION=latest SPRING_PROFILES_ACTIVE=prod DB_HOST=127.0.0.1 DB_USERNAME=myapp DB_PASSWORD=change_me如果数据库也运行在容器中,可以把数据库服务加入同一个 Compose 文件。但对于生产环境,数据库数据卷、备份、权限和升级策略需要额外谨慎。实战步骤五:编写.drone.yml流水线在项目根目录添加 .drone.yml,定义自动化构建、镜像发布和远程部署流程。kind: pipeline name: default type: docker steps: - name: test-and-build image: maven:3.9-eclipse-temurin-17 commands: - mvn clean test package -DskipTests=false - cp target/*.jar target/app.jar - name: build-and-push-image image: plugins/docker settings: registry: registry.example.com repo: registry.example.com/myapp username: from_secret: docker_username password: from_secret: docker_password tags: - latest - ${DRONE_COMMIT_SHA:0:8} - name: deploy image: appleboy/drone-ssh settings: host: from_secret: prod_host username: from_secret: prod_user key: from_secret: prod_ssh_key port: 22 script: - cd /opt/myapp - export APP_VERSION=${DRONE_COMMIT_SHA:0:8} - docker compose pull - docker compose up -d - docker image prune -f trigger: branch: - main event: - push上面的流水线做了三件事: test-and-build:运行 Maven 测试并打包 jar。 build-and-push-image:构建 Docker 镜像,并推送到镜像仓库。 deploy:通过 SSH 进入服务器,拉取镜像并重启服务。 实际使用时,建议把生产部署限制在 main 分支或特定 tag 上,避免所有分支提交都触发上线。密钥管理:不要把密码写进仓库CI/CD 最常见的安全问题,就是把数据库密码、服务器私钥、镜像仓库密码直接写进配置文件。正确做法是使用 Drone 的 Secrets 功能。建议至少配置以下 Secrets: docker_username:镜像仓库用户名 docker_password:镜像仓库密码或访问令牌 prod_host:生产服务器地址 prod_user:部署用户 prod_ssh_key:部署专用 SSH 私钥 安全建议: 为部署创建单独的 Linux 用户,不要直接使用 root。 SSH 私钥只授予部署所需权限。 定期轮换 Token 和密钥。 限制 CI 系统的访问来源和管理入口。 不要在构建日志中输出敏感环境变量。 上线验证与回滚策略一条成熟的 DevOps 流水线不应只负责“部署”,还应负责“确认部署是否成功”。建议在部署后增加健康检查:curl -f https://api.example.com/actuator/health如果健康检查失败,可以让流水线标记失败,并通过告警渠道通知您。镜像版本回滚不要只使用 latest 标签。建议每次构建都生成一个与提交关联的镜像标签,例如短 commit hash:registry.example.com/myapp:a1b2c3d4当新版本出现问题时,可以在服务器上将 APP_VERSION 改回上一个可用版本,然后执行:docker compose pull docker compose up -d数据库变更要格外谨慎应用回滚相对容易,数据库回滚往往更复杂。建议: 使用 Flyway 或 Liquibase 管理数据库迁移。 发布前备份关键数据。 避免一次发布中同时包含大量代码变更和破坏性表结构变更。 优先采用向后兼容的数据库变更,例如先加字段、后切流量、再清理旧字段。 监控预警:独立开发者的最低可用方案对独立开发者来说,监控不需要一开始就复杂,但必须覆盖最核心的可用性、资源、日志和错误。1. 可用性监控:Uptime KumaUptime Kuma 是一个轻量级自托管监控工具,适合监控网站、API、TCP 端口和证书有效期。它支持多种通知方式,配置简单,非常适合独立项目。docker run -d --restart=always -p 3001:3001 -v uptime-kuma:/app/data --name uptime-kuma louislam/uptime-kuma:1建议至少添加以下监控项: 首页或核心 API 的 HTTPS 可用性 后台管理入口可用性 支付、登录、回调等关键接口 SSL 证书过期提醒 2. 指标监控:Prometheus + Grafana如果您的项目需要更深入的性能观察,可以使用 Prometheus 收集指标,并通过 Grafana 展示仪表盘。Spring Boot 项目可以通过 Actuator + Micrometer 暴露 Prometheus 指标。常见关注指标包括: 请求量、响应时间、错误率 JVM 内存、GC、线程数 CPU、内存、磁盘使用率 数据库连接池使用情况 接口 P95/P99 延迟 3. 错误追踪:Sentry 或日志告警对于线上异常,单纯看服务器日志效率较低。可以接入 Sentry 这类错误追踪工具,自动聚合异常堆栈、影响用户、版本信息和触发频率。如果暂时不接入 Sentry,也建议至少做到: 应用日志按天滚动,避免磁盘被写满。 错误日志中包含 traceId 或 requestId,便于排查。 关键异常通过告警渠道通知。 保留最近一段时间的访问日志和应用日志。 实用案例:一次从提交到告警的完整链路假设您正在维护一个订阅制 SaaS 小产品,后端为 Spring Boot,前端为 Vue,部署在一台云服务器上。一次需求迭代可以这样完成: 在本地完成新功能并提交到 feature 分支。 合并到 main 前,CI 自动执行测试和构建。 合并后,Drone 构建后端镜像和前端静态资源镜像。 镜像推送到私有镜像仓库,并使用 commit hash 标记版本。 生产服务器通过 Docker Compose 拉取新镜像并滚动重启。 部署完成后,流水线访问 /actuator/health 和核心接口做健康检查。 Uptime Kuma 每分钟检测首页、登录接口和支付回调地址。 如果错误率升高或服务不可用,告警消息发送到企业微信或 Telegram。 确认新版本异常后,切换到上一版本镜像标签并重新执行部署。 这样,即使只有一个人维护项目,也能获得接近团队化工程实践的稳定性。成本控制:独立开发者如何避免“工具过度”?DevOps 的目标是提高效率,而不是制造新的维护负担。建议按阶段演进:第一阶段:最小自动化 代码托管 + Webhook 自动测试和构建 Docker Compose 一键部署 Uptime Kuma 可用性监控 第二阶段:增强可靠性 镜像版本管理 Secrets 管理 部署后健康检查 基础日志留存和告警 第三阶段:完善可观测性 Prometheus + Grafana 指标监控 Sentry 错误追踪 数据库慢查询分析 灰度发布和自动回滚 如果项目还处于验证期,不必一开始就上 Kubernetes、服务网格或复杂发布平台。Docker Compose 对大量独立项目已经足够。常见问题与排查建议Drone没有被触发怎么办? 检查 Gitee 仓库 Webhook 是否创建成功。 确认 Drone 中仓库已激活。 检查分支和事件是否符合 .drone.yml 的 trigger 条件。 查看 Drone Server 日志,确认授权和回调地址是否正确。 构建成功但部署失败怎么办? 确认 SSH 密钥是否正确,部署用户是否有 Docker 权限。 检查服务器能否访问镜像仓库。 确认 docker compose 文件路径和变量是否正确。 查看容器日志:docker logs myapp。 容器启动后立即退出怎么办? 检查应用启动参数和环境变量。 确认数据库、Redis、第三方服务是否可访问。 检查端口是否冲突。 查看应用日志中的异常堆栈。 是否一定要使用Drone CI?不一定。Drone 的优势是轻量、容器化、配置直观,适合自托管场景。如果您使用 GitHub,可以选择 GitHub Actions;使用 GitLab,可以选择 GitLab CI;偏向国内平台,也可以评估 Gitee Go。核心原则是:流水线配置应当版本化、可重复、易迁移。最佳实践清单 主分支必须保持可构建、可部署。 每次发布都对应明确的 commit 和镜像版本。 敏感信息通过 Secrets 管理,不提交到代码仓库。 部署用户最小权限,不直接暴露 root 权限。 生产部署前至少执行单元测试和基础构建检查。 部署后必须有健康检查。 监控至少覆盖首页、核心 API、证书和服务器资源。 日志要可检索、可定位、可保留。 数据库变更要有备份和迁移记录。 定期演练回滚,而不是等事故发生后才临时研究。 结语:让自动化成为独立开发者的复利对于独立开发者而言,DevOps 并不是炫技,也不是大型团队的专利。它更像是一套“个人工程效率系统”:让代码提交后自动验证,让部署过程标准化,让线上问题及时暴露,让故障恢复有章可循。从 Gitee、Drone CI、Docker Compose 到 Uptime Kuma、Prometheus 和 Grafana,您可以先搭建最小可用流水线,再逐步增强测试、监控、安全和回滚能力。只要持续优化,这套自动化体系会像复利一样不断节省时间、降低风险,并让您更专注于真正重要的事情:打造更好的产品。
2025年08月27日
72 阅读
0 评论
0 点赞
2025-08-20
Linux服务器安全加固完整指南 : 从入门到专家
您的Linux服务器安全吗?别再心存侥幸!您的Linux服务器正暴露在互联网上,每分钟都可能面临着数百次自动化的扫描和攻击尝试。这并非危言耸听,而是数字世界的残酷现实。一个配置不当的服务器,就像一扇没有上锁的门,随时可能被入侵,导致数据泄露、服务中断甚至法律风险。您是否还在使用默认的SSH端口?您的用户权限是否过于宽泛?您是否能够及时发现并阻止恶意的登录尝试?如果这些问题让您感到一丝不安,那么恭喜您,您已经迈出了服务器安全的第一步:保持警惕。在这份终极指南中,我们将凭借多年的实战运维经验,为您提供一个全面、系统且可操作的Linux服务器安全加固框架。我们将不仅仅告诉您“做什么”,更会解释“为什么”,帮助您构建一个坚不可摧的数字堡垒。别担心,我们将一步步带您完成整个过程。第一道防线:用户账户与权限管理系统的第一道防线永远是人。管好账户和权限,就能将80%的风险拒之门外。这里的核心是最小权限原则(Principle of Least Privilege)——只授予完成任务所必需的最小权限。1. 禁用 Root 账户直接登录直接使用root账户登录是极其危险的。一旦密码泄露,攻击者将立即获得系统的最高控制权,且难以追溯。正确的做法是使用普通用户登录,然后通过 sudo 提权。操作步骤:编辑SSH配置文件:nano /etc/ssh/sshd_config找到 PermitRootLogin 这一行,修改或添加为:PermitRootLogin no保存文件后,重启SSH服务以生效:systemctl restart sshd注意: 在执行此操作前,请务必确保您有一个可以正常使用 sudo 的普通用户账户!2. 创建一个专用的管理用户为自己创建一个非root的日常管理账户,并将其添加到 sudo 或 wheel 组,以便在需要时获取管理员权限。# 创建新用户 (例如 aadmin) adduser aadmin # 将用户添加到 sudo 组 (Debian/Ubuntu) usermod -aG sudo aadmin # 或者添加到 wheel 组 (CentOS/RHEL) usermod -aG wheel aadmin3. 强制使用强密码策略弱密码是服务器被攻破的最常见原因之一。我们可以安装 libpam-pwquality (Debian/Ubuntu) 或 pwquality (CentOS/RHEL) 来强制执行密码复杂度要求。安装后,编辑 /etc/security/pwquality.conf 文件,可以设置密码最小长度、数字、大写、小写、特殊字符的要求。例如:minlen = 12 dcredit = -1 ucredit = -1 lcredit = -1 ocredit = -1这会要求密码至少12位,并包含数字、大写、小写和特殊字符。4. 定期审查用户账户定期检查服务器上的用户列表,特别是那些有登录权限的账户。及时删除或禁用不再需要的账户。# 查看所有可以登录的用户 awk -F: '($3 >= 1000) {print $1}' /etc/passwd第二道防线:加固SSH服务SSH是您远程管理服务器的生命线,因此也是攻击者最喜欢的目标。默认的SSH配置存在诸多安全隐患。1. 更改默认SSH端口机器人会自动扫描默认的22端口。更改端口可以有效减少大量的自动化攻击日志,让您更容易发现真正的威胁。操作步骤:编辑 sshd_config 文件:nano /etc/ssh/sshd_config找到 #Port 22,去掉注释符 #,并将 22 修改为一个不常用的端口(例如 2222)。Port 2222重要提示: 在修改并重启SSH服务前,请务必先在您的防火墙中放行新端口!否则您将无法再次连接服务器。2. 禁用密码登录,强制使用SSH密钥SSH密钥认证远比密码认证安全。它使用一对公钥和私钥进行验证,几乎不可能被暴力破解。操作步骤:在您的本地电脑上生成密钥对: ssh-keygen -t rsa -b 4096将公钥上传到服务器: ssh-copy-id aadmin@your_server_ip (将 aadmin 和 your_server_ip 替换为您的用户名和IP)测试无密码登录: ssh aadmin@your_server_ip确认无误后,禁用密码登录:编辑 sshd_config 文件,修改或添加:PasswordAuthentication no PubkeyAuthentication yes ChallengeResponseAuthentication no重启SSH服务: systemctl restart sshd3. 限制SSH登录的用户只允许特定的用户或用户组通过SSH登录。编辑 sshd_config 文件,在文件末尾添加:# 只允许 aadmin 和 devuser 登录 AllowUsers aadmin devuser # 或者只允许 admin_group 组的用户登录 # AllowGroups admin_group第三道防线:构建坚不可摧的网络壁垒防火墙是服务器的第一道网络屏障,它控制着所有进出服务器的网络流量。1. 配置防火墙(UFW示例)UFW (Uncomplicated Firewall) 是一个非常易于使用的防火墙前端。我们的原则是:默认拒绝所有进入的流量,只允许必要的服务通过。# 安装UFW (如果尚未安装) sudo apt-get install ufw # 默认拒绝所有入站,允许所有出站 sudo ufw default deny incoming sudo ufw default allow outgoing # 允许SSH (请使用您修改后的端口!) sudo ufw allow 2222/tcp # 允许HTTP和HTTPS sudo ufw allow http sudo ufw allow https # 启用UFW sudo ufw enable # 查看状态 sudo ufw status verbose2. 使用Fail2Ban防止暴力破解Fail2Ban是一个入侵防御软件,它可以监控系统日志,并根据检测到的恶意行为(如多次密码错误)自动更新防火墙规则来封禁来源IP。# 安装Fail2Ban sudo apt-get install fail2ban # 启动并设置为开机自启 sudo systemctl start fail2ban sudo systemctl enable fail2ban默认配置已经为SSH提供了保护。您可以创建本地配置文件 jail.local 来覆盖默认设置,例如延长封禁时间。创建一个新文件 /etc/fail2ban/jail.local 并添加以下内容:[DEFAULT] bantime = 1h [sshd] enabled = true port = 2222 # 确保这里是您的SSH端口 logpath = %(sshd_log)s backend = %(sshd_backend)s然后重启Fail2Ban: sudo systemctl restart fail2ban第四道防线:系统内核与持续监控安全是一个持续的过程,而不是一次性的设置。您需要保持系统更新,并时刻关注系统的动态。1. 及时更新系统和软件软件漏洞是攻击者最喜欢利用的入口。保持系统和应用程序的更新是至关重要的安全措施。# Debian/Ubuntu sudo apt-get update && sudo apt-get upgrade -y # CentOS/RHEL sudo yum update -y建议配置自动安全更新,以确保关键补丁能够被及时应用。2. 内核参数调优 (sysctl)通过调整内核参数,可以防御一些常见的网络攻击,如IP欺骗和SYN洪水攻击。编辑 /etc/sysctl.conf 文件,添加以下配置:# 防止IP欺骗 net.ipv4.conf.default.rp_filter=1 net.ipv4.conf.all.rp_filter=1 # 忽略ICMP广播请求 net.ipv4.icmp_echo_ignore_broadcasts=1 # 防御SYN洪水攻击 net.ipv4.tcp_syncookies=1执行 sudo sysctl -p 使其生效。3. 安装和配置审计工具 (auditd)auditd 是Linux审计系统,可以记录详细的系统活动,包括文件访问、系统调用和用户命令。这对于事后追溯和入侵检测非常有价值。# 安装 sudo apt-get install auditd # 配置审计规则,例如监控对 /etc/passwd 的修改 sudo auditctl -w /etc/passwd -p wa -k passwd_changes审计规则可以非常复杂,建议参考 CIS Benchmarks 获取更全面的规则集。常见问题解答 (FAQ)Q1: 我应该多久检查一次服务器安全设置?我们建议至少每季度进行一次全面的安全审查。对于关键系统,应每月审查。同时,应订阅相关的安全公告(如您使用的发行版的安全邮件列表),以便在出现新的严重漏洞时能第一时间响应。Q2: 这些安全设置会影响服务器性能吗?本指南中提到的大部分设置(如加固SSH、配置防火墙)对性能的影响微乎其微。像 Fail2Ban 和 auditd 这样的监控工具会消耗少量系统资源,但在现代服务器上,这种开销通常可以忽略不计。安全带来的好处远远超过这点性能开销。Q3: 除了这些,还有哪些高级安全措施?当然有!这篇指南涵盖了基础且至关重要的部分。高级措施可以包括:SELinux 或 AppArmor: 强制访问控制(MAC)系统,可以进一步限制进程的权限。入侵检测系统 (IDS/IPS): 如 Snort 或 Suricata,用于深度流量分析和威胁检测。Rootkit 扫描器: 如 rkhunter 或 chkrootkit,用于检测已知的后门程序。集中的日志管理: 将所有服务器日志发送到一台专用的日志服务器(如ELK Stack或Graylog)进行集中分析和告警。结论:安全是一段旅程,而非终点恭喜您!通过遵循本指南,您的Linux服务器的安全性已经得到了质的飞跃。您已经从一个被动的目标,转变为一个积极的防御者。但请永远记住,安全是一个持续的、动态的过程。新的漏洞每天都在被发现,新的攻击技术层出不穷。保持学习,定期审查,并始终保持警惕,这才是保护您数字资产的最终秘诀。我们是否遗漏了您认为至关重要的某项加固措施?或者您在实践中遇到了什么问题?欢迎在下方的评论区分享您的经验和技巧,让我们共同构建一个更安全的互联网环境!
2025年08月20日
52 阅读
0 评论
0 点赞
2025-08-20
CentOS 8 vs CentOS 7 终极对决:系统管理员必须知道的7大核心差异
导言:不仅仅是版本号的跳跃如果您是一位Linux系统管理员,那么CentOS 7无疑是您工具箱中一把值得信赖的瑞士军刀。它稳定、可靠,并在过去十年中支撑了无数的生产环境。然而,随着CentOS 8的出现以及其后续的演变,世界发生了翻天覆地的变化。从CentOS 7迁移到基于RHEL 8的系统(如Rocky Linux, AlmaLinux, 或早期的CentOS 8),绝不仅仅是运行一个yum update那么简单。这更像是一次思维模式的升级。在我们管理和迁移了数百台服务器的实践中,我们发现许多管理员低估了这两个版本之间的差异,从而在实际操作中遇到了意想不到的障碍。这篇文章不是一份枯燥的更新日志罗列,而是我们为您精心准备的一份实战指南。我们将深入剖析CentOS 8与CentOS 7在系统管理层面的7个核心差异,解释其背后的“为什么”,并提供可直接上手的操作建议。无论您是计划迁移,还是需要同时管理两个版本的系统,这篇文章都将成为您最可靠的向导。1. 核心巨变:从 CentOS Linux 到 CentOS Stream 的战略转移在讨论任何技术细节之前,我们必须先明确最大的、也是最具战略影响的差异:CentOS 8的生命周期及其向CentOS Stream的转变。CentOS 7 (传统模式): 作为RHEL(Red Hat Enterprise Linux)的下游重建版,它在RHEL发布之后进行编译,旨在提供一个与RHEL 100%二进制兼容的、免费的企业级操作系统。它的生命周期非常长,支持到2024年6月30日。CentOS 8 (戏剧性转变): 最初也遵循传统模式,但Red Hat在2020年宣布,CentOS 8将于2021年底提前结束生命周期(EOL),取而代之的是CentOS Stream。CentOS Stream: 它不再是RHEL的下游,而是变成了RHEL的上游开发分支。这意味着它是一个滚动发布的版本,会比对应的RHEL版本更早地接收到更新。它更稳定,但相较于传统的“Point Release”模式,其稳定性模型发生了根本变化。这对您意味着什么?核心要点: 任何关于“CentOS 8”的讨论,实际上都应该聚焦于RHEL 8的生态系统,包括其替代品Rocky Linux和AlmaLinux。如果您现在还在使用CentOS 8,我们强烈建议您立即规划迁移路径。这篇文章中提到的所有CentOS 8的技术特性,都完全适用于这些RHEL 8的衍生版。2. 软件包管理:DNF 与 YUM 的对决对于系统管理员来说,包管理器是日常打交道最多的工具之一。CentOS 8用DNF(Dandified YUM)取代了CentOS 7中的YUM。虽然yum命令在CentOS 8中仍然可用(作为一个指向dnf的符号链接以保证向后兼容),但其底层技术已经完全不同。为什么是 DNF?DNF并非简单的重命名,它带来了实质性的改进:更强的依赖解析能力: DNF使用了更先进的SAT依赖解析算法,解决了YUM在处理复杂依赖关系时可能出现的性能问题和“依赖地狱”。性能提升: 元数据处理和包下载的效率更高。完善的API: 为其他应用程序和工具提供了更稳定、文档更齐全的接口。常用命令对比好消息是,大部分常用命令保持了惊人的一致性。但了解其新特性会让你事半功倍。任务CentOS 7 (YUM)CentOS 8 (DNF)备注安装软件yum install nginxdnf install nginx用法相同移除软件yum remove nginxdnf remove nginx用法相同更新所有yum updatednf upgradednf upgrade是推荐用法,功能更强搜索软件yum search nginxdnf search nginx用法相同查看历史yum history listdnf history list用法相同模块化功能不支持dnf module list全新功能,见下一节列出已安装的包yum list installeddnf list installed用法相同实战经验: 在我们的自动化脚本中,我们已全面转向使用dnf命令。虽然yum还能用,但从长远来看,拥抱dnf及其新特性(如dnf history undo)才是明智之举。3. 软件分发革命:BaseOS 与 AppStream这是CentOS 8最具革命性的变化之一。CentOS 7只有一个主要的软件仓库(Base),所有软件包都在其中。而CentOS 8将其拆分为两个核心仓库:BaseOS: 提供构成操作系统的核心软件包。这些包的更新周期与操作系统本身保持一致。Application Stream (AppStream): 提供用户空间的应用程序、运行时语言和数据库。它的最大特点是支持同一软件的多个版本共存。AppStream解决了什么问题?在CentOS 7中,如果你想安装一个比官方仓库更新版本的PHP或Python,通常需要依赖第三方仓库(如Remi, SCL),这会增加管理的复杂性和潜在的稳定性风险。AppStream通过“模块化”解决了这个问题。例如,你可以在一个系统上同时拥有多个版本的PostgreSQL,并选择启用其中一个作为默认版本。如何使用 AppStream?# 查看所有可用的模块 dnf module list # 查看特定模块(如nodejs)的详细信息,包括可用的版本流 dnf module info nodejs # 启用特定版本的模块(例如nodejs 18) sudo dnf module enable nodejs:18 # 然后正常安装软件,系统会自动选择你启用的版本 sudo dnf install nodejs核心要点: AppStream赋予了系统管理员前所未有的灵活性,让你在享受企业级系统稳定性的同时,也能方便地使用较新版本的开发工具和应用,这是相对CentOS 7的一大飞跃。4. 网络管理:告别 iptables,拥抱 nftables防火墙是网络安全的第一道防线。CentOS 7默认使用firewalld作为前端,后端则是iptables框架。而在CentOS 8中,firewalld的后端被替换为了nftables。nftables 的核心优势统一框架: iptables需要iptables, ip6tables, arptables, ebtables等多个工具来管理不同的协议栈,而nftables用一个单一的框架统一了这一切。性能更优: nftables的规则处理效率更高,尤其是在规则集非常庞大的情况下。语法更佳: 语法更直观、更具结构化,易于阅读和维护。实战操作差异对于大多数只使用firewall-cmd的用户来说,日常操作几乎没有变化,因为firewalld抽象了底层的差异。# 开放80端口(两个版本命令相同) sudo firewall-cmd --add-service=http --permanent sudo firewall-cmd --reload然而,如果你习惯于直接编写iptables规则,那么你需要学习nftables的新语法。例如,查看规则:CentOS 7: sudo iptables -L -nCentOS 8: sudo nft list ruleset我们的建议: 除非有特殊需求,否则请继续使用firewall-cmd。它提供了稳定且一致的接口。但理解底层从iptables到nftables的转变,对于进行深度网络排错至关重要。5. 系统核心与默认软件版本操作系统版本的迭代,必然带来核心软件版本的更新。这对于应用兼容性和性能有直接影响。软件/组件CentOS 7 (典型版本)CentOS 8 (典型版本)主要影响Linux 内核3.104.18支持更新的硬件,性能和安全性改进PythonPython 2.7 (默认)Python 3.6 (默认)巨大的生态系统变化,脚本需要适配PHP5.47.2, 7.3, 7.4 (通过AppStream)性能和语言特性大幅提升Nginx1.16 (EPEL)1.14 (默认), 1.16, 1.18 (AppStream)支持HTTP/2, TLS 1.3等新特性MySQL/MariaDBMariaDB 5.5MySQL 8.0, MariaDB 10.3功能和性能增强,需注意兼容性GCC4.8.58.5影响软件编译关键提醒: Python 2到Python 3的默认切换是开发者和运维人员需要特别注意的。许多旧的系统脚本可能依赖Python 2,在迁移前必须进行充分的测试和重写。6. 管理体验升级:Cockpit Web 控制台CentOS 8默认安装并启用了Cockpit,这是一个现代化的、易于使用的Web管理界面。通过浏览器,你可以完成许多常见的系统管理任务:查看系统资源和日志管理存储、网络和防火墙管理用户账户运行终端命令虽然CentOS 7也可以手动安装Cockpit,但CentOS 8的“开箱即用”体验,极大地降低了Linux新手或不熟悉命令行的管理员的管理门槛。要访问它,只需在浏览器中打开 https://<你的服务器IP>:9090。经验之谈: 对于习惯了命令行的资深管理员来说,Cockpit可能不是必需品。但在我们团队中,我们发现它在快速诊断问题、进行日常健康检查,以及向初级同事演示操作时非常有用。7. 安全性增强:系统级加密策略CentOS 8引入了一个非常实用的新功能:系统级加密策略 (System-wide cryptographic policies)。管理员不再需要为每个应用程序(如SSH, OpenSSL, Kerberos)单独配置复杂的加密套件和协议,而是可以通过一个简单的命令,在系统范围内统一设置安全基线。# 查看当前策略 update-crypto-policies --show # 设置为更严格的 FUTURE 策略 sudo update-crypto-policies --set FUTURE这大大简化了安全合规性管理,确保系统内的所有组件都遵循一致的安全标准,减少了因配置错误导致的安全漏洞。结论:拥抱未来,明智抉择从CentOS 7到CentOS 8(及其生态继承者),变革是深刻且全方位的。总结一下最重要的几点:生态系统已变: CentOS 8本身已终结,请将目光投向Rocky Linux或AlmaLinux作为生产环境的替代方案。工具链现代化: DNF, AppStream, nftables 和 Cockpit 不仅仅是新工具,它们代表了更高效、更灵活、更安全的管理哲学。软件栈升级: 核心软件(尤其是Python)的重大版本更新,要求在迁移前进行严格的应用兼容性测试。我们的最终建议是:对于现有CentOS 7系统,在2024年6月支持结束前,您有充足的时间规划迁移。请利用本文的知识点,全面评估您的应用和脚本,并开始测试迁移流程。对于新的部署项目,请果断选择基于RHEL 8或RHEL 9的发行版(如AlmaLinux 9, Rocky Linux 9)。直接从现代化的平台起步,将为您省去未来的迁移成本和技术债务。从CentOS 7到8时代的跨越,是挑战,更是机遇。掌握这些核心差异,您将能更自信、更从容地驾驭新一代的企业级Linux系统。您在从CentOS 7迁移或管理新旧系统时,还遇到了哪些挑战?欢迎在评论区分享您的经验和问题,我们一起探讨。常见问题解答 (FAQ)Q1: CentOS 8已经停止支持,我该怎么办?A1: 如果您仍在使用CentOS 8,应立即计划迁移。官方推荐的路径是迁移到CentOS Stream 8,但对于追求稳定性的生产环境,更好的选择是使用迁移脚本(如AlmaLinux的almalinux-deploy)将系统无缝转换为AlmaLinux 8或Rocky Linux 8。Q2: 我的CentOS 7还能用多久?A2: CentOS 7的维护更新将持续到2024年6月30日。在此之后,系统将不再接收任何安全更新,存在极大的安全风险。Q3: 从CentOS 7升级到8(或其替代品)困难吗?A3: 不支持直接的yum/dnf升级。 官方和社区推荐的最佳实践是重新安装,然后迁移您的数据和应用配置。虽然存在一些第三方工具尝试进行原地升级,但风险较高,不推荐用于生产环境。
2025年08月20日
39 阅读
0 评论
0 点赞
2025-08-19
AWS认证终极指南:我们如何一次性通过SAA考试并构建云原生思维 (2024最新版)
为什么你的第一张云认证,我们推荐AWS?在云计算领域,AWS、Azure、GCP 三足鼎立,国内也有阿里云、腾讯云等优秀的服务商。那么,为什么我们如此推崇将 AWS 认证作为你云计算之旅的起点?答案很简单:它不仅仅是一张证书,更是一套构建云原生思维的完整框架。在我刚接触云计算时,也是通过备考 AWS Certified Solutions Architect – Associate (SAA) 这块“敲门砖”完成的。这段经历最宝贵的收获,并非证书本身带来的职业光环,而是在学习过程中,我将一个个零散的服务组件(如EC2、S3、VPC)系统性地整合为高可用、可扩展的架构体系。这个过程,让我重新理解了传统IT架构的本质,并真正开始“像云一样思考”。即便后来接触其他云平台,AWS 打下的坚实基础也让我能迅速将其服务与 AWS 的概念对应起来。这,就是学习行业标准的力量。这篇指南将浓缩我们的备考经验,为你提供一条从零到一、清晰且高效的 AWS SAA 认证路径。我们的目标不仅是帮你通过考试,更是助你建立起坚实的云架构设计能力。第一步:选择正确的起点 (Cloud Practitioner vs. SAA)AWS 认证体系分为入门、助理、专业和专项四个等级。对于初学者,最常见的困惑是:应该选择 Cloud Practitioner (CLF-C01) 还是 Solutions Architect - Associate (SAA-C03)?Cloud Practitioner (云计算从业者): 更侧重于“是什么”。它适合销售、市场、项目经理或任何需要了解云基本概念的非技术人员。考试内容关注 AWS 的核心服务、优势、定价和支持模式,无需深入的技术细节。Solutions Architect - Associate (解决方案架构师 - 助理级): 更侧重于“如何做”。它专为技术人员设计,如开发者、运维和系统工程师。考试的核心是评估你如何使用 AWS 服务设计出安全、可靠、高性能且成本优化的解决方案。我们的建议是: 如果你有一定的IT基础(了解Linux、网络),并且希望真正掌握云架构设计,请直接挑战 SAA。它的知识体系更完整,能为你未来的职业发展打下更坚实的基础。深入剖析:AWS SAA-C03 考试蓝图在开始学习前,先彻底了解你的“敌人”。SAA-C03 是当前最新的考试版本代码,请在查找所有资料时认准它。考试形式: 65道单选或多选题。计分方式: 题目总数中包含15道不计分的测试题,用于未来评估。你无法分辨哪些题目不计分,所以每一题都要认真对待。考试时长: 130分钟。如果你的母语非英语,可以申请30分钟的额外延时。及格分数: 总分1000分,720分及格。考试费用: 150美元。通过任何一门 AWS 考试后,你都会获得一张50%的折扣券,可用于下一场考试。考试语言: 强烈推荐选择“中文”。因为选择中文后,考试界面依然可以随时切换查看英文原文,反之则不行。这对于理解一些翻译可能不精准的术语非常有帮助。报名方式: 可选择线下考试中心或在线监考。我们的三步学习框架:从理论到实战掌握理论知识不等于会做题。AWS 考试的精髓在于场景化决策,你需要根据给定的限制(如成本、性能、安全性)选出“最优解”,而非唯一的“正确答案”。第一步:构建坚实的知识体系这个阶段的目标是系统性地理解 AWS 的核心服务。我们不推荐直接啃官方文档,那会让你迷失在细节的海洋里。核心学习资源:视频课程 (首选): 我们强烈推荐 Udemy 上 Stephane Maarek 的 Ultimate AWS Certified Solutions Architect Associate 课程。这位老师讲解得非常透彻,尤其擅长将复杂概念简单化,并配有大量实操演示。课程是英文的,但可以借助字幕,后期你会发现技术词汇并不难懂。官方白皮书 (补充): 当你对某个概念(例如,灾难恢复策略)有疑问时,官方白皮书是最权威的参考资料。学会查阅文档是一项必备技能。高效笔记策略:不要只看不记,更不要直接复制粘贴。我们强烈建议你用自己的话把知识重述一遍。这个“转述”的过程,是知识内化的关键。你可以尝试从以下几个角度构建你的笔记:它是什么? (一句话定义服务,如 S3 是对象存储服务)它解决了什么问题? (用于存储图片、视频、静态网站等)它和谁是“朋友”? (如何与 EC2, CloudFront, Lambda 配合使用)它和谁是“对手”? (与 EBS, EFS 的区别是什么?)核心考点大纲 (学习者视角):计算服务: EC2, Lambda, Elastic Beanstalk, ECS/EKS存储服务: S3, EBS, EFS, FSx数据库服务: RDS, Aurora, DynamoDB, ElastiCache, Redshift网络与内容分发: VPC (子网, 路由表, 安全组, NACL), Route 53, CloudFront应用集成: SQS, SNS, API Gateway, Lambda, EventBridge安全、身份与合规: IAM (用户, 组, 角色, 策略), KMS, CloudTrail, CloudWatch管理与治理: Organizations, AWS Config迁移与数据传输: Snow Family, DataSync第二步:在实践中巩固理解理论学习后,你必须动手实践。AWS 提供了一年的免费套餐 (Free Tier),覆盖了备考所需的大部分服务。建议实践项目:启动一台EC2实例: 配置安全组,通过 SSH 连接,并在上面部署一个简单的 Web 服务器。玩转S3: 创建存储桶,设置存储桶策略,开启版本控制和生命周期规则。构建一个简单的VPC: 划分子网(公有和私有),配置路由表、NAT网关,并尝试将 EC2 实例部署在不同子网中,理解网络连通性。动手操作会让你对概念的理解产生质的飞跃。当你在排错时,就是你学习最快的时候。第三步:通过刷题掌握“考试思维”这是备考后期最关键的一环。刷题的目的不是背答案,而是理解 AWS 的出题逻辑和架构思维。核心刷题资源:ExamTopics: 这是我们最推荐的题库,题目质量和真实考试非常接近,命中率高。虽然网站上部分答案有争议,但其社区讨论非常有价值。在做题时,一定要仔细阅读高赞评论,它往往能帮你理清思路,找到最佳答案的逻辑。高效刷题策略:不求多,但求精: 每天刷50题左右,但要保证每一题都彻底搞懂。错题一定要记录下来,标注错误原因和正确的思考路径。识别关键词技巧: 题目中的每一个词都可能暗藏玄机。学会识别这些“信号词”:“Cost-effective” / “最省钱”: 优先考虑 Serverless 服务 (Lambda, S3), Spot 实例, 或者选择合适的S3存储类别。“Highly available” / “高可用”: 立即想到跨可用区 (Multi-AZ) 部署,如 RDS Multi-AZ。“Decouple” / “解耦”: 答案里大概率会出现 SQS 或 SNS。“Least operational overhead” / “最少运维开销”: 优先选择托管服务 (RDS, ElastiCache) 或无服务器服务 (Lambda, Fargate)。实战演练:我们如何拆解一道题题目: 一家公司使用部署在EC2实例上的应用,从数千个远程设备收集数据。EC2实例接收并转换数据,然后存储到S3存储桶。设备数量即将增长到数百万。公司需要一个高度可扩展且运维开销最小的解决方案。你应该推荐哪两项?A. 使用 AWS Glue 处理 S3 中的原始数据。B. 使用 Route 53 将流量路由到不同 EC2 实例。C. 添加更多 EC2 实例来处理数据。D. 将数据发送到 SQS,再由 EC2 处理。E. 使用 API Gateway 接收数据并发送到 Kinesis Data Streams,再通过 Kinesis Data Firehose 将数据传输到 S3。拆解思路:捕捉关键词: “高度可扩展 (highly scalable)” 和 “运维开销最小 (minimize operational overhead)”。分析当前架构痛点: 单体 EC2 架构,扩展性差,运维成本高。评估选项:B (Route 53) 是DNS服务,不负责流量分发,排除。C (加EC2) 增加了运维开销,与要求不符,排除。D (用SQS) 虽然解耦了,但后端处理依然依赖需要运维的EC2,不是最优解。A 和 E 组合,构建了一个完全的 Serverless 数据摄入和处理管道:API Gateway + Kinesis: 完美应对海量、高并发的数据流入,两者都是全托管、自动扩展的。Kinesis Data Firehose: 自动将流数据聚合后存入S3,零运维。AWS Glue: 当数据需要处理时,Glue 也是一个 Serverless 的 ETL 服务。这个组合完美契合了“高度可扩展”和“运维开销最小”两个核心要求。通过这样的分析,你就在训练自己的架构师思维。结语:这只是一个开始通过 AWS SAA 认证,你获得的绝不仅仅是一纸证书。它是一个让你系统化学习云计算、构建云原生思维的绝佳机会。这个过程中,你可能会遇到挫折,可能会对无数的缩写感到困惑,但请坚持下去。就像 Stephane Maarek 在课程里说的:“如果你暂时不理解某个概念,没关系,继续前进。等到课程最后再回来看它,你会豁然开朗。”希望这篇指南能帮助你顺利开启你的云原生之旅。祝你学习愉快,考试顺利!常见问题解答 (FAQ)Q1: AWS SAA 认证的有效期是多久?A1: AWS 认证的有效期为三年。你需要通过重认证或考取更高级别的认证来维持其有效性。Q2: 如果我第一次考试失败了怎么办?A2: 你可以在14天后重新参加考试。重考次数没有限制,但每次都需要支付全额报名费。Q3: 我需要多长时间来备考?A3: 这完全取决于你的背景和投入时间。对于有IT基础的人来说,每天投入2-3小时,通常需要1-2个月的时间来充分准备。
2025年08月19日
29 阅读
0 评论
0 点赞
2025-08-19
Linux服务器安全加固终极指南 (2025实战版):21个必须知道的关键步骤
引言:你的服务器,是堡垒还是门户大开?想象一下,你的Linux服务器正安静地运行着,处理着关键业务数据。但与此同时,在互联网的另一端,成千上万的自动化脚本正在不知疲倦地扫描,寻找着任何一个微小的安全漏洞。一个弱密码、一个未及时更新的软件、一个错误的配置,都可能让你的心血之作瞬间沦为攻击者的“肉鸡”。这并非危言耸听。在我们多年的系统运维和安全攻防实践中,我们见过太多因为忽视了基础安全措施而导致数据泄露、服务瘫痪的惨痛案例。好消息是,构建一个坚固的Linux安全防线并不需要你是顶级的黑客。它需要的是一份清晰、系统且可执行的行动指南。这正是我们撰写这篇文章的目的。这不仅仅是一份清单,更是一份实战路线图。我们将带你从服务器的初始设置开始,一步步深入,涵盖用户账户、网络访问、防火墙配置、服务管理和持续监控等各个层面,让你不仅知道“怎么做”,更理解“为什么这么做”。无论你是经验丰富的系统管理员,还是刚刚踏入Linux世界的新手,这份指南都将成为你强化服务器安全的得力助手。让我们开始吧,将你的服务器打造成一个真正的数字堡垒。阶段一:基础准备与最小化原则安全的第一原则是最小化攻击面。一个系统上运行的服务和软件越少,潜在的漏洞就越少。1. 保持系统与软件最新这是最基础,也最容易被忽视的一步。绝大多数的攻击都利用了已知的、但未被修复的漏洞。Debian/Ubuntu:sudo apt update && sudo apt upgrade -yCentOS/RHEL:sudo dnf update -y专家建议: 开启自动安全更新。例如,在Ubuntu上,可以安装并配置unattended-upgrades包,让系统自动处理关键的安全补丁,让你高枕无忧。2. 移除不必要的软件检查你的服务器上安装了哪些服务。一个只作为Web服务器的机器,真的需要邮件服务(Postfix)或打印服务(CUPS)吗?使用以下命令检查正在监听网络端口的服务:ss -tuln对于任何非必需的服务,果断卸载它们。例如,如果你不需要Apache2:# Ubuntu/Debian sudo apt remove apache2 # CentOS/RHEL sudo dnf remove httpd阶段二:用户账户与访问控制加固账户是进入系统的第一道门。守好这道门至关重要。3. 禁用Root直接登录允许root用户直接通过SSH登录是一个巨大的安全风险。攻击者只需要猜对一个密码就能获得最高权限。正确的做法是:使用普通用户登录,然后通过sudo提权。编辑SSH配置文件:sudo nano /etc/ssh/sshd_config找到PermitRootLogin这一行,修改或添加为:PermitRootLogin no保存后重启SSH服务:sudo systemctl restart sshd4. 创建一个专用的管理员账户在你禁用root登录之前,请确保你已经创建了一个拥有sudo权限的普通用户。# 创建新用户(例如 myadmin) sudo adduser myadmin # 将用户添加到sudo组 sudo usermod -aG sudo myadmin5. 强制使用强密码策略弱密码是灾难的根源。我们可以通过PAM模块(Pluggable Authentication Modules)来强制实施密码复杂度要求。安装libpam-pwquality:sudo apt install libpam-pwquality然后编辑/etc/security/pwquality.conf文件,设置密码长度、复杂度等要求,例如:minlen = 12 dcredit = -1 # 至少1个数字 ucredit = -1 # 至少1个大写字母 lcredit = -1 # 至少1个小写字母 ocredit = -1 # 至少1个特殊字符阶段三:网络堡垒 - SSH深度加固SSH是我们管理服务器的主要入口,也是攻击者最喜欢的目标。以下几步能极大提升其安全性。6. 更改默认SSH端口成千上万的机器人只会扫描默认的22端口。更改端口可以有效避开这些低级扫描。在/etc/ssh/sshd_config中修改:Port 2222 # 选择一个1024-65535之间未被占用的端口重要提示: 修改端口后,请务必先在防火墙中放行新端口,再重启SSH服务,否则你可能会被锁在门外!7. 禁用密码认证,强制使用SSH密钥对这是最重要的SSH安全措施之一。SSH密钥对远比密码安全,几乎不可能被暴力破解。第一步: 在你的本地电脑上生成密钥对。第二步: 将公钥 (id_rsa.pub) 上传到服务器的 ~/.ssh/authorized_keys 文件中。第三步: 测试无密码登录是否成功。第四步: 在服务器的/etc/ssh/sshd_config中禁用密码登录:PasswordAuthentication no PubkeyAuthentication yes重启SSH服务后,所有基于密码的登录尝试都将被拒绝。8. 限制SSH登录用户如果只有少数几个用户需要SSH权限,明确指定他们。这遵循了最小权限原则。在/etc/ssh/sshd_config文件末尾添加:AllowUsers myadmin user2这表示只有myadmin和user2可以登录。阶段四:构建铜墙铁壁 - 防火墙配置防火墙是你的第一道网络防线,它控制着所有进出服务器的流量。9. 启用并配置防火墙 (UFW/Firewalld)UFW (Uncomplicated Firewall) - 用于Debian/Ubuntu:# 默认拒绝所有进入的连接 sudo ufw default deny incoming # 默认允许所有出去的连接 sudo ufw default allow outgoing # 允许SSH(请使用你修改后的端口) sudo ufw allow 2222/tcp # 允许HTTP和HTTPS sudo ufw allow http sudo ufw allow https # 启用防火墙 sudo ufw enableFirewalld - 用于CentOS/RHEL:# 启动并设置为开机自启 sudo systemctl start firewalld sudo systemctl enable firewalld # 允许SSH, HTTP, HTTPS服务 sudo firewall-cmd --permanent --add-service=ssh sudo firewall-cmd --permanent --add-service=http sudo firewall-cmd --permanent --add-service=https # 如果修改了SSH端口 # sudo firewall-cmd --permanent --add-port=2222/tcp # 重新加载规则使其生效 sudo firewall-cmd --reload10. 安装并配置Fail2banFail2ban是一个神奇的工具,它能监控日志文件(如SSH登录日志),并自动封禁那些多次尝试登录失败的IP地址。这能有效抵御暴力破解攻击。# 安装 sudo apt install fail2ban # 创建本地配置文件以覆盖默认值 sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local然后编辑jail.local文件,找到[sshd]部分,启用它并可以自定义封禁时间(bantime)和重试次数(maxretry)。阶段五:系统内部与内核安全加固完外部,我们再来看看系统内部。11. 配置内核参数 (sysctl)通过调整内核参数,可以防御一些常见的网络攻击,如SYN洪水攻击。编辑/etc/sysctl.conf文件,添加以下内容:# 开启SYN Cookies,防御SYN洪水攻击 net.ipv4.tcp_syncookies = 1 # 忽略ICMP广播请求,防止Smurf攻击 net.ipv4.icmp_echo_ignore_broadcasts = 1 # 忽略所有ICMP重定向报文 net.ipv4.conf.all.accept_redirects = 0 # 禁用IP源路由 net.ipv4.conf.all.accept_source_route = 0运行sudo sysctl -p使其立即生效。12. 文件系统安全 (fstab)对于一些分区,如/tmp,可以限制其执行权限,防止恶意脚本在此处运行。编辑/etc/fstab文件,在/tmp分区的挂载选项中加入noexec。阶段六:日志、监控与审计如果说之前的步骤是“防”,那么这一步就是“查”。你必须知道你的系统上发生了什么。13. 配置系统日志确保rsyslog或journald服务正在运行,并定期审查关键日志,如/var/log/auth.log(登录认证日志)和/var/log/syslog(系统日志)。14. 安装Rootkit检测工具Rootkit是一种能隐藏自身踪迹的恶意软件。定期使用rkhunter或chkrootkit扫描系统,可以帮助你发现潜在的威胁。sudo apt install rkhunter sudo rkhunter --update sudo rkhunter --check15. 启用系统审计 (auditd)auditd可以记录系统上发生的几乎所有事情,例如哪些文件被访问、哪些系统调用被执行。虽然配置复杂,但对于高安全要求的环境,它是不可或缺的。总结:安全是一个持续的过程我们已经涵盖了从基础到进阶的21个关键安全加固步骤。请记住,服务器安全不是一次性的任务,而是一个持续的、动态的过程。这份指南为你提供了一个坚实的起点。将这些措施应用到你的服务器上,你就已经领先于绝大多数人了。但真正的安全专家知道,威胁在不断演变,我们的防御策略也必须与时俱进。你的行动清单:定期审计: 每隔一段时间,就用这份指南作为清单,重新检查你的服务器配置。保持学习: 关注最新的安全漏洞和防御技术。备份,备份,再备份: 即使最安全的系统也可能出问题。一个可靠的、异地的备份策略是你最后的、也是最重要的防线。我们在这份指南中涵盖了很多内容,但安全永无止境。你在实践中还使用了哪些有效的加固技巧?欢迎在评论区分享你的经验!常见问题解答 (FAQ)Q1: 更改SSH端口真的有用吗?有人说这是“安全靠隐藏”(Security by Obscurity)。A1: 这是一个很好的问题。是的,单纯更改端口属于“安全靠隐藏”,它无法抵挡有针对性的高级攻击。但是,它能极其有效地过滤掉互联网上99%的自动化扫描流量,大大减少了日志噪音,并降低了被“机会主义”攻击命中的概率。配合SSH密钥和Fail2ban,它就成了多层防御中非常实用的一环。Q2: 我应该使用UFW还是Firewalld?A2: 两者都是优秀的前端工具,简化了iptables的复杂性。选择哪个主要取决于你的Linux发行版。UFW是Ubuntu/Debian生态的首选,以其极简的语法著称。Firewalld是CentOS/RHEL生态的默认选择,它支持“区域”(zones)的概念,在动态网络环境中管理更灵活。功能上都能满足绝大多数需求,使用你发行版默认的工具通常是最佳选择。Q3: 我应该多久更新一次我的服务器?A3: 对于安全补丁,答案是“越快越好”。这就是为什么我们推荐配置自动安全更新。对于功能性的软件大版本更新,建议先在测试环境中进行充分测试,然后再应用到生产服务器,可以按周或按月进行。
2025年08月19日
33 阅读
0 评论
0 点赞
2025-08-19
终极CentOS系统故障排查手册 (2024版):从启动失败到性能瓶颈的全面指南
导言:当服务器告警时,你需要的不只是命令,而是一个作战计划服务器突然无响应,网站无法访问,告警邮件淹没了你的收件箱......每一个系统管理员都熟悉这种心跳加速的时刻。在这种高压之下,胡乱尝试命令往往只会让情况变得更糟。你真正需要的,是一份清晰、系统、经过实战检验的作战计划。这不仅仅是一篇罗列命令的文章。这是我们团队在多年一线运维经验中提炼出的CentOS系统故障排查手册。我们的目标是为你提供一个强大的思维框架和一套行之有效的工具集,让你能像一位经验丰富的专家一样,从容应对各种复杂的系统故障。无论你是刚接触CentOS的新手,还是寻求优化排错流程的资深工程师,这份手册都将成为你工具箱中不可或缺的一部分。故障排查的核心哲学:建立正确的思维模型在深入具体技术之前,我们必须先建立正确的排查思维。优秀的系统管理员与普通操作员的最大区别,就在于他们遵循一套逻辑严谨的方法论。明确问题 (What): 问题是什么?是“网站打不开”还是“SSH登录延迟30秒”?描述越具体,方向越明确。限定范围 (Where): 问题出在哪里?是网络层、应用层还是系统内核层?是单台服务器还是整个集群?时间线索 (When): 问题是什么时候开始的?在此之前有过什么变更(如代码发布、系统更新、配置修改)?由表及里,层层递进: 遵循从应用到系统,从外到内,从上到下的排查顺序。先检查最可能、最容易验证的环节。记录与验证: 记录你的每一步操作和观察到的现象。每次只做一个变更,并验证其效果。记住,排查故障如同侦探破案,耐心和逻辑远比记忆一堆命令更重要。第一步:信息收集与初步诊断(通用起点)无论遇到何种问题,这都是你的第一站。这些命令能为你提供关于系统当前状态的“快照”。查看系统负载与运行时间:uptime这会告诉你系统运行了多久,有多少用户登录,以及过去1、5、15分钟的平均负载。负载过高是性能问题的首要信号。检查内核日志:dmesg | tail -n 50dmesg 打印内核环形缓冲区的信息。系统启动过程中的错误、硬件问题(如磁盘I/O错误)通常会在这里留下痕迹。查看系统最新日志 (推荐):journalctl -xe -n 100 --no-pager对于使用 systemd 的现代CentOS(7及以上),journalctl 是查看日志的利器。-xe 可以提供更详细的错误解释,-n 100 显示最后100行。检查内存和交换空间使用情况:free -h-h (human-readable) 参数让输出更易读。重点关注 available 内存和 swap 的使用情况。如果交换空间被大量使用,说明物理内存可能不足。分场景实战排查手册现在,让我们进入具体的故障场景。场景一:系统无法启动或SSH无法登录这是最紧急的情况之一。问题可能出在引导加载程序、文件系统或网络配置上。物理/VNC访问: 首先,你需要通过控制台(物理机、KVM或云服务商提供的VNC)访问服务器,查看屏幕上的具体报错信息。检查GRUB引导菜单: 如果系统停在GRUB界面,可能是引导配置损坏。尝试选择不同的内核版本启动。进入救援模式 (Rescue Mode):使用CentOS安装介质引导,选择“Troubleshooting” -> “Rescue a CentOS system”。系统会挂载你的根文件系统到 /mnt/sysimage。使用 chroot /mnt/sysimage 命令切换到你的系统环境中进行修复,例如重建 initramfs 或修复 /etc/fstab。检查SSH服务状态: 如果系统已启动但无法SSH登录,请在控制台执行:systemctl status sshd journalctl -u sshd -n 50检查服务是否运行,日志中是否有权限错误或配置问题。检查防火墙和SELinux:firewall-cmd --list-all sestatus确保SSH端口(默认为22)在防火墙中是开放的,并检查SELinux是否处于 Enforcing 模式并可能阻止了连接。可以临时设置为 Permissive 模式 (setenforce 0) 进行测试。场景二:网络连接故障网络问题表现多样,可能是完全不通,也可能是时断时续或延迟很高。检查IP配置:ip addr show # 或 ifconfig (如果已安装)确认网卡是否被激活(状态为UP),IP地址、子网掩码是否正确。检查路由表:ip route show确认默认网关(default via)设置是否正确。没有正确的默认网关,服务器将无法访问外部网络。测试本地连通性:ping 127.0.0.1 # 测试TCP/IP协议栈是否正常 ping <网关IP> # 测试到网关的连通性 ping 8.8.8.8 # 测试到公网的连通性DNS解析测试:nslookup google.com # 或 dig google.com如果可以 ping 8.8.8.8 但无法 ping google.com,通常是DNS问题。检查 /etc/resolv.conf 文件中的DNS服务器配置。端口监听与连接状态分析:ss -tunlpss 是 netstat 的现代替代品,速度更快。此命令可以显示哪些进程正在监听哪些TCP/UDP端口。这是排查“服务已启动但端口不通”问题的关键。场景三:系统性能下降(CPU、内存、磁盘I/O)“服务器变慢了”是最常见的抱怨。我们需要定位是哪种资源成为了瓶颈。CPU瓶颈排查:top 或 htop: top 是最经典的工具。进入后按 1 可以看到所有CPU核心的使用情况。重点关注 %us (用户空间)、%sy (内核空间) 和 %wa (等待I/O)。如果 %wa 过高,说明瓶颈可能在磁盘。pidstat:pidstat -u 1 5 # 每秒采样一次,共5次,显示CPU使用情况它可以清晰地列出每个进程的CPU使用率,比 top 更适合脚本化和精确分析。内存瓶颈排查:free -h: 我们在前面已经介绍过。available 内存持续过低是危险信号。vmstat:vmstat 1 5 # 每秒采样一次,共5次关注 si (swap in) 和 so (swap out) 列。如果这两列的数值持续不为0,说明系统正在频繁使用交换分区,内存压力巨大。查找内存消耗大户:ps aux --sort=-%mem | head -n 10磁盘I/O瓶颈排查:iostat: 这是我们的首选工具。在我们处理过的一个案例中,一个Web应用响应缓慢,CPU和内存看起来都正常。最终通过 iostat 发现,数据库所在的磁盘 %util 接近100%,读写队列 (avgqu-sz) 极高,瓶颈瞬间定位。iostat -xz 1 5 # -x 显示扩展信息,-z 排除无活动的设备重点关注 r/s, w/s (每秒读写次数), await (平均等待时间) 和 %util (设备繁忙程度)。iotop: 类似于 top,但用于监控磁盘I/O,可以实时看到哪个进程正在进行大量的读写操作。场景四:应用程序或服务异常当特定服务(如Nginx, MySQL)出现问题时,排查重点应转向应用自身。检查服务状态:systemctl status <service-name> # 例如: systemctl status nginx这会显示服务是否正在运行,以及最近几条相关的日志。深入分析日志:systemd日志: journalctl -u <service-name> -f (-f 表示实时跟踪)。应用自身日志: 检查应用的专用日志文件,例如 Nginx 的 /var/log/nginx/error.log 或 MySQL 的 /var/log/mysqld.log。错误信息通常在这里。检查配置文件:nginx -t # 测试Nginx配置文件语法 mysqld --validate-config # 验证MySQL配置很多服务启动失败都是因为一个小小的配置语法错误。一个重要提醒:CentOS的生命周期在进行任何复杂的故障排查之前,请务必了解您所使用的CentOS版本状态:CentOS 7: 将于 2024年6月30日 停止维护(EOL)。之后将不再有任何安全更新。我们强烈建议您制定迁移计划。CentOS 8: 已于2021年12月31日停止维护。继续使用EOL的系统会带来巨大的安全风险。目前主流的迁移方向包括 Rocky Linux, AlmaLinux (均为RHEL的1:1二进制兼容发行版) 或升级到 CentOS Stream。常见问题解答 (FAQ)Q1: top 命令中 load average 的三个数值代表什么?哪个最重要?A1: 这三个数值分别代表过去1分钟、5分钟和15分钟的系统平均负载。它们表示正在运行或等待CPU资源的进程数。通常我们更关注5分钟和15分钟的数值,因为它们能更好地反映系统的长期负载趋势。如果1分钟负载远高于15分钟负载,说明负载正在快速攀升。Q2: 如何排查“Too many open files”错误?A2: 这个错误意味着进程打开的文件描述符数量达到了系统或用户的限制。使用 ulimit -n 查看当前限制。使用 lsof -p <PID> 可以查看特定进程打开了哪些文件。要解决此问题,通常需要修改 /etc/security/limits.conf 文件来提高限制。Q3: 我的服务器磁盘空间满了,如何快速找到大文件?A3: 首先使用 df -h 查看哪个分区空间不足。然后使用 du 命令。一个非常好用的组合是:du -ah /path/to/partition | sort -rh | head -n 20这会列出指定分区下最大的20个文件或目录。结论:化被动为主动,建立你的排错知识库掌握CentOS系统故障排查不仅是一项技术能力,更是一种思维方式。这份手册为你提供了一个坚实的起点和一套可靠的流程。我们鼓励你将每一次故障都视为一次学习机会,记录下问题、排查过程和解决方案,逐步建立起属于你自己的、独一无二的排错知识库。从今天起,告别手忙脚乱,用系统化的方法迎接每一个挑战。服务器的稳定运行,将是你专业能力的最佳证明。你在排查CentOS故障时遇到过哪些棘手的问题?在评论区分享你的经验,我们一起探讨!
2025年08月19日
49 阅读
0 评论
0 点赞
2023-09-04
Centos7通过yum安装Elasticserach和Kibana并设置开机启动
Elasticsearch 8.2安装步骤1. 导入GPG Key如果你正在使用CentOS系统并选择RPM方式安装Elasticsearch,你只需要运行以下一条命令: rpm --import https://artifacts.elastic.co/GPG-KEY-elasticsearch 2. 配置RPM源在 /etc/yum.repos.d/ 目录下创建一个新的 elasticsearch.repo 文件并填写以下内容: cd /etc/yum.repos.d/ touch elasticsearch.repo vi elasticsearch.repo 在 elasticsearch.repo 文件中填写以下内容: [elasticsearch] name=Elasticsearch repository for 8.x packages baseurl=https://artifacts.elastic.co/packages/8.x/yum gpgcheck=1 gpgkey=https://artifacts.elastic.co/GPG-KEY-elasticsearchenabled=0autorefresh=1type=rpm-md``` 保存修改并退出 vi 编辑器。 ### 3. 使用yum安装Elasticsearch 运行以下命令来安装Elasticsearch: ```shellsudo yum install --enablerepo=elasticsearch elasticsearch``` 安装过程中会显示一些提示信息,你需要确认继续安装。 #### 4. 运行Elasticsearch 如果需要让Elasticsearch在开机时自动运行,可以运行以下 `systemctl` 命令: ```shellsudo /bin/systemctl daemon-reloadsudo /bin/systemctl enable elasticsearch.service``` 你可以使用以下命令来运行、重启或停止Elasticsearch服务: ```shellsudo systemctl start elasticsearch.service # 运行Elasticsearch服务sudo systemctl restart elasticsearch.service # 重启Elasticsearch服务sudo systemctl stop elasticsearch.service # 停止Elasticsearch服务sudo systemctl status elasticsearch.service # 检查Elasticsearch服务状态``` 要检查Elasticsearch是否正在运行,可以使用以下命令: curl --cacert /etc/elasticsearch/certs/http_ca.crt -u elastic https://localhost:9200 需要提供刚刚安装Elasticsearch时设置的密码。 #### 5. 远程客户端访问Elasticsearch服务器 上述步骤是在服务器本地访问Elasticsearch服务,但通常用户会从远程客户端进行访问。从Elasticsearch 8.2版本开始,默认配置已经支持远程访问,无需额外修改配置文件。 你可以通过以下方式访问Elasticsearch服务器: https://服务器IP:9200/ 如果访问成功,会看到与步骤4中相似的提示。如果无法连接,请确保检查代理设置或服务器上是否配置了正确的防火墙规则。 ### Kibana 8.2安装步骤 Kibana的安装步骤与Elasticsearch非常相似,主要包括以下几个步骤: #### 1. 导入GPG Key 与Elasticsearch一样,你可以运行以下命令来导入GPG Key: rpm --import https://artifacts.elastic.co/GPG-KEY-elasticsearch#### 2. 配置RPM源 在 `/etc/yum.repos.d/` 目录下创建一个新的 `kibana.repo` 文件并填写以下内容: touch kibana.repovi kibana.repo`在 kibana.repo 文件中填写以下内容: name=Kibana repository for 8.x packages baseurl=https://artifacts.elastic.co/packages/8.x/yum gpgcheck=1 gpgkey=https://artifacts.elastic.co/GPG-KEY-elasticsearch enabled=1 autorefresh=1 type=rpm-md 保存修改并退出 vi 编辑器。3. 使用yum安装Kibana运行以下命令来安装Kibana: sudo yum install kibana 4. 运行Kibana如果需要让Kibana在开机时自动运行,可以运行以下 systemctl 命令: sudo /bin/systemctl daemon-reload sudo /bin/systemctl enable kibana.service 你可以使用以下命令来运行、重启或停止Kibana服务: sudo systemctl start kibana.service # 运行Kibana服务sudo systemctl restart kibana.service # 重启Kibana服务sudo systemctl stop kibana.service # 停止Kibana服务 sudo systemctl status kibana.service # 检查Kibana服务状态 5. 远程客户端访问KibanaKibana安装后默认只能本地访问,如果需要远程访问,需要修改 /etc/kibana/kibana.yml 文件中的两个参数:将 server.port 参数的注释取消将 server.host 参数从 localhost 修改为 0.0.0.0修改后保存文件并执行以下命令重启Kibana服务:然后,你可以在远程客户端的浏览器中输入以下地址进行访问:http://服务器IP:5601/初始访问时会要求输入Enrollment Token,这个Token可以在Elasticsearch安装时生成。执行以下命令来获取Token: /usr/share/elasticsearch/bin/elasticsearch-create-enrollment-token -s kibana 将生成的Token复制到网页上,然后继续配置Elasticsearch。最后,执行以下命令来获取Verification Required Code: /usr/share/kibana/bin/kibana-verification-code 将生成的Verification Code输入到网页上,就可以访问Kibana页面了,可以开始导入样本数据进行探索。卸载Elasticsearch和Kibana如果需要卸载Elasticsearch和Kibana,可以使用以下命令:首先,通过运行以下命令查询Elasticsearch包的名称: [root@ ~]# rpm -q elasticsearch 这将显示Elasticsearch包的名称和版本信息,例如:elasticsearch-8.2.2-1.x86_64。使用以下命令卸载Elasticsearch(确保替换为实际的包名称和版本): [root@ ~]# rpm -e elasticsearch-8.2.2-1.x86_64这将停止Elasticsearch服务,同时备份Elasticsearch的配置文件(例如,elasticsearch.yml)并将其保存为.rpmsave文件,并删除日志目录。接下来,查询Kibana包的名称: [root@ ~]# rpm -q kibana 这将显示Kibana包的名称和版本信息,例如:kibana-8.2.2-1.x86_64。使用以下命令卸载Kibana(确保替换为实际的包名称和版本): [root@ ~]# rpm -e kibana-8.2.2-1.x86_64这将停止Kibana服务,备份Kibana的配置文件(例如,kibana.yml)并将其保存为.rpmsave文件,并删除日志目录。完成上述步骤后,Elasticsearch和Kibana将被成功卸载。
2023年09月04日
4,400 阅读
0 评论
0 点赞
2022-04-28
go get更换国内镜像源
我们在配置golang开发环境时,经常会使用golang提供的基础开源插件,拉取这些插件会使用go get命令去从golang.org下载对应的包。因为众所周知的原因,经常会拉取依赖插件失败,这时候必须要为go get更换国内镜像源。 由于历史原因,go的软件包会通过GOPATH和module两种方式去管理,而不同管理方式下go get所下载的源也不同,因此go的换源会比其他语言更加麻烦,要用两步来完成:go env -w GO111MODULE=on go env -w GOPROXY=https://goproxy.cn第一个命令,是将GO111MODULE从auto模式修改为on模式。如前面提到的,go有两种包管理方式。第一种:GOPATH方式:早期方式,会将下载的包放入GOPATH/src目录下,然后只有GOPATH/src中的包是能被程序导入的第二种:module方式:更现代的方式,通过在项目目录中生成go.mod文件来管理需要的包,此时go还可以导入网络上的包、本目录的包,然后缺少的包会被缓存到GOPATH/pkg目录下修改完成后就可以从代理国内源下载依赖包了,如果下载的源并没有变更,试试重启shell/IDE即可。END
2022年04月28日
11,150 阅读
0 评论
0 点赞
2022-04-28
在执行go run或者go build命令的时候,要求输入github用户名和密码
在执行go run或者go build命令的时候,会遇到反复要求输入github用户名和密码的情况。明明已经设置了公钥,为什么还要求输入账号和密码呢?这是因为项目中依赖的一些包需要去github去拉,而默认的go get 使用的是https模式,所以需要将其修改为ssh模式,执行下面的命令修改拉取模式即可。git config --global url."
[email protected]
:".insteadOf "https://github.com/"
2022年04月28日
7,818 阅读
0 评论
0 点赞
2022-03-31
Ubuntu编译安装PHP7.3报错freetype-config not found
Ubuntu编译安装PHP7.3报错freetype-config not found出现这个报错的原因可能是没有安装freetype,先尝试执行安装命令apt-get remove libfreetype6已经安装报错依旧,这是需要添加一下软链接ln -s /usr/include/freetype2/freetype /usr/include/freetype ln -s /usr/include/freetype2/ft2build.h /usr/include/ft2build.h到这里问题应该已经解决,要是还是报错,那就是安装freetype版本不兼容问题,先卸载原来安装的版本,尝试编译安装低版本cd /usr/local/src wget http://download.savannah.gnu.org/releases/freetype/freetype-2.8.1.tar.gz tar zxvf freetype-2.8.1.tar.gz cd freetype-2.8.1/ ./configure --prefix=/usr/include/ make && make install重复上面的指引,重新创建软连接END.
2022年03月31日
8,337 阅读
0 评论
5 点赞
2022-03-22
Centos PHP安装 Rabbitmq amqp扩展
Centos PHP安装 Rabbitmq amqp扩展在安装拓展的时候需要先安装amqp的依赖包rabbitmq-c,安装的版本不能选择太新的版本,不然需要升级相关依赖包,选v0.7.1即可,先下载源码安装包,--no-check-certificat 的用途是忽略https验证。wget https://github.com/alanxz/rabbitmq-c/releases/download/v0.7.1/rabbitmq-c-0.7.1.tar.gz --no-check-certificat下载完成后解压:tar -zxvf rabbitmq-c-0.7.1.tar.gz && cd rabbitmq-c-0.7.1创建构建文件夹:mkdir build && cd build执行构建:make && cmake -DCMAKE_INSTALL_PREFIX=/usr/local/rabbitmq-c ..创建软链接:cd /usr/local/rabbitmq-c && ln -s lib64 lib到这里rabbitmq-c环境就安装成功了,接下来安装amqp拓展切换到你php安装目录下的bin,然后执行安装命令:pecl install amqp执行安装命令后会弹出询问框询问rabbitmq-c的安装路径,这时输入刚刚的安装路径/usr/local/rabbitmq-c最后再php.ini开启拓展extension = amqp.so重载php-fpm即可,enjoy.
2022年03月22日
7,238 阅读
0 评论
3 点赞
2020-08-20
linux mint 20 安装软件包,系统包损害坏 package system is broken
linux mint 20 安装软件包时报错the package system is brokenCheck if you are using third party repositories . If so disable them . since they are a common sourse of problems . Furth more run the following command in aTefminal :apt-get install -f解决方法:ctrl alt t 打开 Tefminal运行命令sudo apt-get -f install输入密码y(确定)sudo apt-get update报错就解决了,快去更新吧
2020年08月20日
11,605 阅读
0 评论
1 点赞
2020-08-11
CentOS安装新版RabbitMQ解决Erlang 版本依赖 Requires: erlang >= 21.3
RabbitMQ官网提供了新版的rpm包,但是安装的时候会提示需要erlang版本>=21.3,然而默认yum仓库中的版本较低。其实RabbitMQ在github上有提供新的erlang包,也可以直接加到yum源中vim /etc/yum.repos.d/rabbitmq-erlang.repo添加的内容:[rabbitmq-erlang]name=rabbitmq-erlang baseurl=https://dl.bintray.com/rabbitmq/rpm/erlang/20/el/7gpgcheck=1gpgkey=https://dl.bintray.com/rabbitmq/Keys/rabbitmq-release-signing-key.asc repo_gpgcheck=0enabled=1yum clean all yum makecache然后去官网下载RabbitMQ的RPM包安装,这样yum会自动去源里安装依赖包。wget https://github.com/rabbitmq/rabbitmq-server/releases/download/v3.8.6/rabbitmq-server-3.8.6-1.el7.noarch.rpm yum install rabbitmq-server-3.7.4-1.el7.noarch.rpm安装到这里就完成了,下面进行简单的配置。启动RabbitMQ服务 #service rabbitmq-server start 状态查看 #rabbitmqctl status 启用插件 #rabbitmq-plugins enable rabbitmq_management 重启服务 #service rabbitmq-server restart 添加帐号:name 密码:passwd #rabbitmqctl add_user name passwd 赋予其administrator角色 #rabbitmqctl set_user_tags name administrator 设置权限 #rabbitmqctl set_permissions -p / name ".*" ".*" ".*"
2020年08月11日
17,694 阅读
0 评论
65 点赞
2020-07-29
Centos安装部署filebeat做轻量化日志采集入库
最近在做日志采集相关的内容的需求,记录一下通过filebeat实现轻量化日志采集入库。日志采集的实现方案有很多种,比如logstash、fluentd、flume、betas等。为什么选择filebeat呢?因为logstash是jvm跑的,资源消耗比较大,启动一个logstash就需要消耗500M左右的内存,而filebeat是基于golang开发的,依赖极少,运行时只需要10多M内存资源消耗。工作原理 Filebeat可以保持每个文件的状态,并且频繁地把文件状态从注册表里更新到磁盘。这里所说的文件状态是用来记录上一次Harvster读取文件时读取到的位置,以保证能把全部的日志数据都读取出来,然后发送给output。如果在某一时刻,作为output的ElasticSearch或者Logstash变成了不可用,Filebeat将会把最后的文件读取位置保存下来,直到output重新可用的时候,快速地恢复文件数据的读取。在Filebaet运行过程中,每个Prospector的状态信息都会保存在内存里。如果Filebeat出行了重启,完成重启之后,会从注册表文件里恢复重启之前的状态信息,让FIlebeat继续从之前已知的位置开始进行数据读取。安装filebeat服务1.下载和安装key文件rpm --import https://packages.elastic.co/GPG-KEY-elasticsearch2.创建yum源文件vim /etc/yum.repos.d/elk-elasticsearch.repo在新建的源文件中添加如下配置[elastic-5.x] name=Elastic repository for 5.x packages baseurl=https://artifacts.elastic.co/packages/5.x/yum gpgcheck=1 gpgkey=https://artifacts.elastic.co/GPG-KEY-elasticsearch enabled=1 autorefresh=1 type=rpm-md3.yum安装filebeatyum install filebeat4.启动filebeatsystemctl start filebeat5.查看filebeat运行状态systemctl status filebeat或ps -ef | grep filebeat6.配置filebeat采集源文件和输出vim /etc/filebeat/filebeat.yml配置采集日志文件源:filebeat.prospectors: - input_type: log paths: - /var/lib/docker/containers/*/*.log配置输出:1).输出到elasticsearch:output.elasticsearch: hosts: ["127.0.0.1:9200"]2).输出到redis:output.redis: hosts: ["127.0.0.1:6379"] password: "M123456" data_type: "list" key: "filebeat" db: "0" timeout: 307.重启filebeat服务systemctl restart filebeat至此,filebeat安装及配置完成!
2020年07月29日
12,926 阅读
0 评论
8 点赞
2020-05-18
CentOS 7安装Elasticsearch 7.2
一、安装前准备(1)安装JDK环境首先到Oracle官网下载jdk。下载地址:https://www.oracle.com/technetwork/java/javase/downloads/index.html。Elasticsearch 7.2支持JDK版本:1.8、11、12。这里使用了JDK12。具体支持情况:https://www.elastic.co/cn/support/matrix#matrix_jvm。下载JDK压缩包,通过SFTP客户端(WinSCP)上传到CentOS7相应的目录下。然后解压JDK,解压命令为:#tar -zxvf jdk-12.0.2_linux-x64_bin.tar.gz。为了使后续使用方便将将压后的目录重命名为jdk,重命名的命令为#mv jdk-12.0.2/ jdk(2)配置环境变量输入命令:#vi /etc/profile在文件尾部加入如下内容:export JAVA_HOME=/opt/jdkexport JRE_HOME=/$JAVA_HOME/jreexport CLASSPATH=.:$JAVA_HOME/jre/lib/rt.jar:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jarexport PATH=$PATH:$JAVA_HOME/bin:$JRE_HOME/bin修改完成后,保存文件,退出。通过source命令重新加载/etc/profile文件,使得修改后的内容生效,命令如下。# source /etc/profile输入java –version查看jdk版本,输出成功,这代表安装成功。二、Elasticsearch安装配置(1)Elasticsearch安装Elasticsearch的下载地址为https://www.elastic.co/cn/downloads/elasticsearch,选择Linux版本,然后上传至CentOS服务器,进入压缩文件所在的目录,这里选择放在了/opt目录下,进入/opt目录,安装解压命令如下。# tar -zxvf elasticsearch-7.2.0-linux-86_64.tar.gz同样为了后续使用方面将解压后的目录文件重命名为elasticsearch,重命名命令如下。# mv elasticsearch-7.2.0 elasticsearch(2)修改系统参数修改系统参数的目的是确保系统有足够的资源启动Elasticsearch。a)设置内核参数# vi /etc/sysctl.conf 增加以下参数vm.max_map_count=655360b)执行以下命令确保配置生效。# sysctl -pc)设置资源参数# vi /etc/security/limits.conf# 修改如下* soft nofile 65536* hard nofile 131072* soft nproc 65536* hard nproc 131072d)设置用户资源参数# vi /etc/security/limits.d/20-nproc.conf# 设置elk用户参数elk soft nproc 65536(3)添加启动用户,设置权限因为启动Elasticsearch5.0版本及以上需要使用非root用户,需要新建一个用户来启动Elasticsearch,命令如下所示。useradd elk #创建用户elkgroupadd elk #创建组elkuseradd elk -g elk #将用户添加到组mkdir -pv /opt/elk/{data,logs} # 创建数据和日志目录# 修改文件所有者chown -R elk:elk /opt/elk/chown -R elk:elk /opt/elasticsearch/ (4)Elasticsearch配置修改Elasticsearch的配置文件/opt/elasticsearch/elasticsearch.yml。以下配置仅供参考。注意,设置参数的时候:后面要有空格!(5)使用elk用户启动Elasticsearch服务,命令如下所示。# /opt/elasticsearch/bin/elasticsearch如果要让Elasticsearch服务一直运行需要在上面命令后加&符号如下所示。# /opt/elasticsearch/bin/elasticsearch &关闭Elasticsearch服务需要查看一下这个服务所占用的进程号,然后使用kill命令杀死这个进程。然后可以通过浏览器访问到Elasticsearch,如下图所示,通过浏览器访问时需要将CentOS防火墙关闭或者在防火墙开启9200端口。(6)集群配置只需配置的cluster.name保持一致,elasticsearch节点即可自动形成集群。另外添加集群内节点的所有IP,便于发现集群内的节点,如下:discovery.seed_hosts:[“10.10.2.221”,“10.10.2.222“]cluster_initial_master_nodes:[“10.10.2.221”,“10.10.2.222“]如果该节点可以作为主节点:node.master:true否则 node.master:false如果该节点作为数据采集节点,配置node.data:false否则node.data:true(7)常用操作查看索引 curl '10.10.2.221:9200/_cat/indices?v'删除索引 curl -XDELETE 10.10.2.221:9200/apache*
2020年05月18日
9,866 阅读
0 评论
33 点赞
2019-12-20
CentOS7.2 安装MySQL、PHP报错 Killed signal terminated program cc1
CentOS7.2 安装MySQL、PHP报错 Killed signal terminated program cc1,这个原因是由于内存不足导致的,可以通过增加交换分区来解决。 对于make编译,如果是阿里云centos主机内存小于2G的,可能会在make编译到45%、63%时报错;如果是腾讯云centos主机内存为1G时,可能会在make编译到64%时报错。===============阿里云测试结果(引用)================== c++: Internal error: Killed (program cc1plus) Please submit a full bug report. See <http://bugzilla.redhat.com/bugzilla> for instructions. make[2]: *** [sql/CMakeFiles/sql.dir/item_geofunc.cc.o] Error 1 make[1]: *** [sql/CMakeFiles/sql.dir/all] Error 2 make: *** [all] Error 2 ================腾讯云测试结果(实测)================= g++: fatal error: Killed signal terminated program cc1plus compilation terminated. make[2]: *** [sql/CMakeFiles/sql_gis.dir/gis/crosses.cc.o] Error 1 make[1]: *** [sql/CMakeFiles/sql_gis.dir/all] Error 2 make: *** [all] Error 2以上均为内存不足所致,可通过设置2G交换分区来解决该问题。解决方案:#获取要增加的2G的SWAP文件块 dd if=/dev/zero of=/swapfile bs=1k count=2048000 #创建SWAP文件 mkswap /swapfile #激活SWAP文件 swapon /swapfile #查看SWAP信息是否正确 swapon -s #添加到fstab文件中让系统引导时自动启动 echo "/var/swapfile swap swap defaults 0 0" >> /etc/fstabswapfile文件的路径在/var/下,编译完后, 如果不想要交换分区了, 可以删除。删除交换分区:swapoff /swapfile rm -rf /swapfile至此,问题解决。
2019年12月20日
10,092 阅读
0 评论
66 点赞
2019-10-26
centos7搭建lnmp开发环境
centos7搭建lnmp开发环境一、安装axel1. 在shell中运行 yum install axel进行安装用yum安装如果没有的话需要安装EPEL源(Extra Packages for Enterprise Linux),为“红帽系”的操作系统提供额外的软件包,适用于RHEL、CentOS等,里面有1万多个软件安装 epel-releasewget https://mirrors.ustc.edu.cn/epel//7/x86\_64/Packages/e/epel-release-7-11.noarch.rpm rpm -ivh epel-release-7-11.noarch.rpm##更新yum源yum clean all yum update2. 安装后可以用axel --version查看版本。检测是否安装成功。二、安装nginx1. 安装依赖包nginx依赖ssl,rewrite,gzip 3个包,如果没有c++编译环境需要用下面命令安装。yum install gcc-c++2. 建立目录先在home目录下建一个nginx文件夹。然后进入文件。(nginx、openssl、zlib、pcre直接下载到这个文件夹,解压也是解压到这个文件夹,都安装好后直接删除即可。)cd home mkdir nginx cd nginx3. openssl库安装ssl功能需要安装openssl库 ,官网:https://www.openssl.org。建立文件夹/alidata/library/做为这3个库的安装目录。统一放一个文件夹,日后如果想卸载,直接删除就可以。在library下面再建立openssl、zlib、pcre三个文件夹。做为那3个库的安装目录。参考:https://blacksaildivision.com/how-to-install-openssl-on-centoswget https://www.openssl.org/source/openssl-1.1.1a.tar.gz yum install libtool perl-core zlib-devel -y #安装响应的组件 tar -zxvf openssl-1.1.1a.tar.gz cd openssl-1.1.1a ./config --prefix=/usr/local/openssl --openssldir=/usr/local/openssl shared zlib make && make install vi /etc/profile.d/openssl.sh # /etc/profile.d/openssl.sh pathmunge /usr/local/openssl/bin vi /etc/ld.so.conf.d/openssl-1.1.0g.conf # /etc/ld.so/conf.d/openssl-1.1.0g.conf /usr/local/openssl/lib #执行命令使openssl新版本lib路径生效 ldconfig -v #重开shell4. 安装zlib库gzip模块需要安装zlib库,官网:http://www.zlib.net。(axel -n 后面的10是一次性建立10个连接下载)axel -n 10 http://www.zlib.net/zlib-1.2.11.tar.gz tar -zxvf zlib-1.2.11.tar.gz cd zlib-1.2.11 ./configure --prefix=/alidata/library/zlib && make && make install5. 安装pcre库rewrite模块需要pcre库,官网:http://www.pcre.org。axel -n 10 https://ftp.pcre.org/pub/pcre/pcre-8.41.tar.gz tar -zxvf pcre-8.41.tar.gz cd pcre-8.41 ./configure --prefix=/alidata/library/pcre && make && make install6. nginx的编译安装下载nginx,nginx的官网是http://nginx.org/。我们直接下载最新版本的nginx-1.14.2。在/alidata下建立server,然后在server下面分别建立nginx、mysql、php。后面会分别把对应的软件安装到这几个文件夹里。(--prefix:nginx的安装目录 ,--with-pcre:pcre的源码目录,--with-zlib和--with-openssl同理)axel -n 10 http://nginx.org/download/nginx-1.14.2.tar.gz tar -zxvf nginx-1.14.2.tar.gz cd nginx-1.14.2 ./configure \ --prefix=/alidata/server/nginx \ --with-http_realip_module \ --with-http_sub_module \ --with-http_flv_module \ --with-http_dav_module \ --with-http_gzip_static_module \ --with-http_stub_status_module \ --with-http_addition_module \ --with-pcre=/home/nginx/pcre-8.41 \ --with-openssl=/home/nginx/openssl-1.1.1a \ --with-openssl-opt='enable-tls1_3 enable-weak-ssl-ciphers' \ --with-http_ssl_module \ --with-http_v2_module \ --with-zlib=/home/nginx/zlib-1.2.11 && make && make install7. 检查nginx是否安装成功检查nginx是否安装成功,如果出现下图信息,表示安装成功。cd /alidata/server/nginx/sbin ./nginx -t8. 常用命令nginx的几个常用命令:查看Nginx的版本号:./nginx -v启动Nginx:./nginx快速停止或关闭Nginx:./nginx -s stop正常停止或关闭Nginx:./nginx -s quit配置文件修改重装载命令:./nginx -s reload9. 将nginx加入系统命令vi /etc/init.d/nginx加入下面代码#!/bin/bash #nginx Startup script for the Nginx HTTP Server # it is v.0.0.2 version. # chkconfig: - 85 15 # description: Nginx is a high-performance web and proxy server. # It has a lot of features, but it's not for everyone. # processname: nginx # pidfile: /var/run/nginx.pid # config: /usr/local/nginx/conf/nginx.conf nginxd=/alidata/server/nginx/sbin/nginx nginx_config=/alidata/server/nginx/conf/nginx.conf nginx_pid=/alidata/server/nginx/run/nginx.pid RETVAL=0 prog="nginx" # Source function library. . /etc/rc.d/init.d/functions # Source networking configuration. . /etc/sysconfig/network # Check that networking is up. [ [${NETWORKING} = "no"] ] && exit 0 [ -x $nginxd ] || exit 0 # Start nginx daemons functions. start() { if [ -e $nginx_pid ];then echo "nginx already running...." exit 1 fi echo -n $"Starting $prog: " daemon $nginxd -c ${nginx_config} RETVAL=$? echo [ $RETVAL = 0 ] && touch /var/lock/subsys/nginx return $RETVAL } # Stop nginx daemons functions. stop() { echo -n $"Stopping $prog: " killproc $nginxd RETVAL=$? echo [ $RETVAL = 0 ] && rm -f /var/lock/subsys/nginx /alidata/server/nginx/run/nginx.pid } # reload nginx service functions. reload() { echo -n $"Reloading $prog: " #kill -HUP `cat ${nginx_pid}` killproc $nginxd -HUP RETVAL=$? echo } # See how we were called. case "$1" in start) start ;; stop) stop ;; reload) reload ;; restart) stop start ;; status) status $prog RETVAL=$? ;; *) echo $"Usage: $prog {start|stop|restart|reload|status|help}" exit 1 esac exit $RETVAL保存上面的代码。然后添加到系统服务中。chmod 755 /etc/init.d/nginx chkconfig --add nginx10. 在系统服务目录中创建nginx.service文件vi /lib/systemd/system/nginx.service加入下面的代码[Unit] Description=nginx After=network.target [Service] Type=forking ExecStart=/alidata/server/nginx/sbin/nginx ExecReload=/alidata/server/nginx/sbin/nginx -s reload ExecStop=/alidata/server/nginx/sbin/nginx -s quit PrivateTmp=true [Install] WantedBy=multi-user.target保存。再执行重加载systemctl daemon-reload设置开机启动systemctl enable nginx.service10. nginx服务命令配置好之后nginx就可以用系统服务的方式操作了。service nginx start 启动nginxservice nginx stop 关闭nginxservice nginx restart 重启nginxservice nginx reload 重新加载nginx三、安装php1. 下载php安装包新建一个文件夹/home/php文件夹存放php的安装文件。php的官网:http://www.php.net/下载php的最新版本php-7.3.1axel -n 10 http://cn2.php.net/distributions/php-7.3.1.tar.gz2. 解压压缩包tar -zxvf php-7.3.1.tar.gz cd php-7.3.13. 安装依赖库先安装php需要的依赖库(直接复制进去一次性安装好)yum -y install libxml2 yum -y install libxml2-devel yum -y install openssl yum -y install openssl-devel yum -y install curl-devel yum -y install libjpeg-devel yum -y install libpng-devel yum -y install freetype-devel yum -y install bzip2-devel yum -y install libmcrypt libmcrypt-devel yum -y install postgresql-devel yum -y install aspell-devel yum -y install readline-devel yum -y install libxslt-devel yum -y install net-snmp-devel yum -y install unixODBC-devel yum -y install libicu-devel yum -y install libc-client-devel yum -y install libXpm-devel yum -y install libvpx-devel yum -y install enchant-devel yum -y install openldap yum -y install openldap-devel yum -y install db4-devel yum -y install gmp-devel yum -y install sqlite-devel yum -y install mysql-devel如果cmake版本低于3.0.2需要升级wget https://cmake.org/files/v3.13/cmake-3.13.0.tar.gz tar -zxvf cmake-3.13.0.tar.gz cd cmake-3.13.0 ./bootstrap --prefix=/usr/ make && make install cmake --versionlibzip安装wget https://libzip.org/download/libzip-1.5.1.tar.gz tar -zxvf libzip-1.5.1.tar.gz cd libzip-1.5.1 mkdir build && cd build && cmake .. && make && make install echo '/usr/local/lib64 /usr/local/lib /usr/lib /usr/lib64'>>/etc/ld.so.conf&&ldconfig -v4. 添加用户和组groupadd -r www && adduser -r -g www -s /bin/false -d /alidata/www -M www查看用户cat /etc/passwd查看组cat /etc/group5. 对php7进行配置下面代码按需求修改后全部复制进去一次性执行(php7.3去掉 --with-mcrypt, --enable-gd-native-ttf, --with-libmbfl)./configure \ --prefix=/alidata/server/php \ --with-config-file-path=/alidata/server/php/etc \ --enable-fpm \ --with-fpm-user=www \ --with-fpm-group=www \ --enable-inline-optimization \ --disable-debug \ --disable-rpath \ --enable-shared \ --enable-soap \ --with-xmlrpc \ --with-openssl \ --with-pcre-regex \ --with-sqlite3 \ --with-zlib \ --enable-bcmath \ --with-iconv \ --with-bz2 \ --enable-calendar \ --with-curl \ --with-cdb \ --enable-dom \ --enable-exif \ --enable-fileinfo \ --enable-filter \ --with-pcre-dir \ --enable-ftp \ --with-gd \ --with-openssl-dir \ --with-jpeg-dir \ --with-png-dir \ --with-freetype-dir \ --with-gettext \ --with-gmp \ --with-mhash \ --enable-json \ --enable-mbstring \ --enable-mbregex \ --enable-mbregex-backtrack \ --with-onig \ --enable-pdo \ --with-mysqli=mysqlnd \ --with-pdo-mysql=mysqlnd \ --with-zlib-dir \ --with-pdo-sqlite \ --with-readline \ --enable-session \ --enable-shmop \ --enable-simplexml \ --enable-sockets \ --enable-sysvmsg \ --enable-sysvsem \ --enable-sysvshm \ --enable-wddx \ --with-libxml-dir \ --with-xsl \ --enable-zip \ --enable-mysqlnd-compression-support \ --with-pear \ --enable-opcache \ --enable-pcntl \ --enable-posix6. 编译安装php7make && make install看到下图信息说明安装成功 (如果重新编译需要先make clean清理之前的已经编译的可执行文件)7. 查看php版本/alidata/server/php/bin/php -v8. 创建配置文件创建www.conf配置文件cd /alidata/server/php/etc/php-fpm.d cp www.conf.default www.conf创建php-fpm.conf配置文件cd /alidata/server/php/etc cp php-fpm.conf.default php-fpm.conf创建php.ini配置文件将安装源文件目录里的php.ini-production或者php.ini-development修改后缀拷贝到php安装目录的etc文件夹内cd /home/php/php-7.3.1 cp php.ini-production /alidata/server/php/etc/php.ini9. 将bin和sbin路径加入到path变量中。配置环境变量vim /etc/profile加入下面内容PATH=/user/local/cmake/bin:$PATH PATH=/alidata/server/mysql/bin:$PATH PATH=/alidata/server/php/bin:$PATH export PATH保存后执行source命令使配置立即生效source /etc/profile10. 配置php-fpm到系统服务cp /home/php/php-7.3.1/sapi/fpm/init.d.php-fpm /etc/init.d/php-fpm chmod 755 /etc/init.d/php-fpm配置php-fpm.confvim /alidata/server/php/etc/php-fpm.conf将pid(;pid = run/php-fpm.pid)前的;去掉。12. 配置开机自动启动chkconfig --add /etc/init.d/php-fpm chkconfig php-fpm on13. 配置nginx解析php文件cd /alidata/server/nginx/conf vim nginx.conf将php解析前的#都去掉,如下图。然后保存修改。 location ~ .*\.(php|php5)?$ { fastcgi_pass 127.0.0.1:9000; fastcgi_index index.php; include fastcgi.conf; }nginx重新加载配置文件service nginx reload14. 创建一个php文件如果设置了根目录,在根目录里面新建vi /alidata/server/nginx/html/phpinfo.php输入如下代码<?php phpinfo(); ?>保存配置没问题就会看到下面的页面四、安装mysq1. 下载mysql下载mysql,官网地址:https://www.mysql.com/axel -n 10 https://cdn.mysql.com//Downloads/MySQL-8.0/mysql-8.0.13.tar.gzyum localinstall https://repo.mysql.com//mysql80-community-release-el7-2.noarch.rpmyum -c /etc/yum.conf --installroot=/alidata/server/mysql -y install mysql-community-server2. 解压压缩包tar -zxvf mysql-8.0.13.tar.gz3. 安装编译需要的软件包yum -y install make bison-devel ncurses-devel libaio libaio-devel perl-Data-Dumper net-tools4. 编译配置重新cmake需要删除CMakeCache.txt文件cd mysql-8.0.13 cmake . \ -DCMAKE_INSTALL_PREFIX=/alidata/server/mysql \ -DMYSQL_DATADIR=/alidata/server/mysql/data \ -DSYSCONFDIR=/etc \ -DWITH_MYISAM_STORAGE_ENGINE=1 \ -DWITH_INNOBASE_STORAGE_ENGINE=1 \ -DWITH_MEMORY_STORAGE_ENGINE=1 \ -DWITH_READLINE=1 \ -DMYSQL_UNIX_ADDR=/var/lib/mysql/mysql.sock \ -DMYSQL_TCP_PORT=3306 \ -DENABLED_LOCAL_INFILE=1 \ -DWITH_PARTITION_STORAGE_ENGINE=1 \ -DEXTRA_CHARSETS=all \ -DDEFAULT_CHARSET=utf8 \ -DDEFAULT_COLLATION=utf8_general_ci \ -DDOWNLOAD_BOOST=1 \ -DWITH_BOOST=/alidata/server/boost(注:如果boost已经安装过在配置里面去掉-DDOWNLOAD_BOOST=1,这个配置是用来下载boost。另外配置boost的安装目录 -DWITH_BOOST。其他的按需要配置即可。)5. 编译安装make && make install6. 创建mysql用户和组groupadd -r mysql && adduser -r -g mysql -s /bin/false -M mysql7. 修改mysql的权限chown -R mysql:mysql /alidata/server/mysql8. 数据库初始化cd /alidata/server/mysql/bin ./mysqld --initialize --basedir=/alidata/server/mysql --datadir=/alidata/server/mysql/data --user=mysql9. 加入到系统服务cp /alidata/server/mysql/support-files/mysql.server /etc/init.d/mysql chmod 755 /etc/init.d/mysql chkconfig --add mysql10. 配置my.cnfvim /etc/my.cnf修改对应的配置[mysqld] datadir=/alidata/server/mysql/data socket=/var/lib/mysql/mysql.sock # Disabling symbolic-links is recommended to prevent assorted security risks symbolic-links=0 # Settings user and group are ignored when systemd is used. # If you need to run mysqld under a different user or group, # customize your systemd unit file for mariadb according to the # instructions in http://fedoraproject.org/wiki/Systemd [mysqld_safe] log-error=/alidata/server/mysql/log/mariadb.log pid-file=/alidata/server/mysql/log/run/mariadb.pid # # include all files from the config directory # !includedir /etc/my.cnf.d保存文件后建立mysql.sock的存放目录,并分配给mysql用户和组mkdir /var/lib/mysql chown -R mysql:mysql /var/lib/mysql创建日志文件mariadb.logtouch /alidata/server/mysql/log/mariadb.log cd /alidata/server/mysql/log chown -R mysql:mysql mariadb.log11. 启动mysqlservice mysql start如果启动有问题可以查看mariadb.log日志里面的[ERROR]部分。12. 修改初始密码,mysql登录查看mysql的初始密码???用初始密码登录mysql???cd /alidata/server/mysql/bin ./mysql -uroot -p登录后修改密码alter user user() identified by "你的新密码";修改用户的MySQL的密码认证插件是“mysql_native_password”alter user 'root'@'localhost' identified with mysql_native_password by '密码'; flush privileges;查询用户的密码插件信息use mysql select plugin,authentication_string,host,user from user;允许远程访问my.cnf添加下面参数重启数据库 default_authentication_plugin=mysql_native_password 创建用户 create user 'root'@'%' identified by 'mysql的密码'; grant all on *.* to 'root'@'%'; flush privileges;13. 配置环境变量vim /etc/profile加入下面内容export PATH=$JAVA_HOME/bin:$PATH:/alidata/server/php/bin:/alidata/server/php/sbin:/alidata/server/mysql/bin保存后执行source命令使配置立即生效source /etc/profile到这为止,lnmp的环境就配置完成了。五、安装redis下载redisaxel -n 10 http://download.redis.io/releases/redis-5.0.3.tar.gz tar -zxvf redis-5.0.3.tar.gz cd redis-5.0.3安装redismake PREFIX=/alidata/server/redis/ install配置redis新建数据目录和日志目录mkdir /alidata/server/redis/data mkdir /alidata/server/redis/log cp ./redis.conf /alidata/server/redis/ vim /alidata/server/redis/redis.conf编辑内容# IP绑定 bind 127.0.0.1 192.168.0.111 # 保护模式(开启条件为各redis之间可以互相通信,做集群不可开启) protected-mode yes # 访问端口 port 6379 # 连接超时,单位S,0为不启用超时 timeout 0 # 以守护进程运行 daemonize yes # 数据文件路径 dir /alidata/server/redis/data # 进程ID文件的路径 pidfile /alidata/server/redis/log/redis.pid # 日志文件路径 logfile /alidata/server/redis/log/redis.log # 设置登陆密码 requirepass [redis的密码] # 禁用部分危险命令 rename-command FLUSHALL "" rename-command CONFIG "" rename-command EVAL "" # 开启键过期删除通知 notify-keyspace-events Ex性能优化# 编辑/etc/rc.local vim /etc/rc.local echo never > /sys/kernel/mm/transparent_hugepage/enabled # 添加/etc/rc.local执行权限 chmod +x /etc/rc.d/rc.local # 编辑/etc/sysctl.conf vim /etc/sysctl.conf vm.overcommit_memory = 1 net.core.somaxconn = 1024 # 立即解决 echo never > /sys/kernel/mm/transparent_hugepage/enabled echo 1024 > /proc/sys/net/core/somaxconn sysctl vm.overcommit_memory=1 sysctl -p修改目录归属useradd -s /sbin/nologin -M redis chown -R redis:redis /alidata/server/redis启动redis并设置开机启动# 进入单元文件目录 cd /etc/systemd/system # 创建redis单元文件,格式为: [单元文件名].[单元文件类型] vim redis.service [Unit] Description=Start redis on boot. After=default.target network.target [Service] User=redis Group=redis Type=forking PIDFile=/alidata/server/redis/log/redis.pid ExecStart=/alidata/server/redis/bin/redis-server /alidata/server/redis/redis.conf ExecReload=/bin/kill -s HUP $MAINPID ExecStop=/bin/kill -s QUIT $MAINPID PrivateTmp=false #Restart=always [Install] WantedBy=multi-user.target # 修改文件权限为只有root用户可以编辑该文件 chown -R root:root /etc/systemd/system/redis.service chmod -R 644 /etc/systemd/system/redis.service # 更新systemd systemctl daemon-reload systemctl enable redis systemctl start redisredis加入系统服务cp /home/redis/redis-5.0.3/utils/redis_init_script /etc/init.d/redis # 编辑/etc/init.d/redis 直接用systemctl控制开启和关闭redis # start 部分修改 #$EXEC $CONF systemctl start redis # stop 部分修改 #PID=$(cat $PIDFILE) echo "Stopping ..." #$CLIEXEC -p $REDISPORT shutdown #while [ -x /proc/${PID} ] #do # echo "Waiting for Redis to shutdown ..." # sleep 1 #done systemctl stop redis#如果没有设置开机启动 执行chkconfig redis on配置环境变量vim /etc/profile PATH=/alidata/server/redis/bin:$PATH # 使配置生效 source /etc/profile六、php安装redis扩展安装igbinary和phpredis扩展如果phpize动态编译报错Cannot find autoconf yum install m4 yum install autoconf wget http://pecl.php.net/get/igbinary-2.0.7.tgz tar -zxvf igbinary-2.0.7.tgz cd igbinary-2.0.7 phpize ./configure make && make install wget https://github.com/nicolasff/phpredis/archive/4.0.2.tar.gz tar -zxvf 4.0.2.tar.gz cd 4.0.2 #用phpize生成configure配置文件 phpize ./configure --with-php-config=/alidata/server/php/bin/php-config make && make install配置php.ini在php.ini最后一行加上 extension_dir = '/【php安装路径】/lib/php/extensions/no-debug-non-zts-20160303/' extension=igbinary.so extension=redis.so 重启php-fpm和Nginx,完成。七、php扩展trie-filter安装libiconv这个是libdatrie的依赖项wget http://ftp.gnu.org/pub/gnu/libiconv/libiconv-1.15.tar.gz tar zxvf libiconv-1.15.tar.gz cd libiconv-1.15 ./configure make make install //查看版本 iconv --version 如果报 iconv: error while loading shared libraries: libiconv.so.2 ldconfig安装libdatrie最新版本下载站点https://github.com/tlwg/libdatrie/releaseswget https://github.com/tlwg/libdatrie/releases/download/v0.2.12/libdatrie-0.2.12.tar.xz tar xvJf libdatrie-0.2.12.tar.xz cd libdatrie-0.2.12 ./configure --prefix=/usr/local/libdatrie LDFLAGS=-L/usr/local/lib LIBS=-liconv make make install安装trie-filter扩展git clone https://github.com/zzjin/php-ext-trie-filter cd php-ext-trie-filter phpize ./configure --with-php-config=/alidata/server/php/bin/php-config --with-trie_filter=/usr/local/libdatrie make make install在php.ini文件最后加上extension=trie_filter.so,保存配置并重启php八、php开启opcache1. 配置php.ini文件在php的安装目录配置php.ini文件添加opcache扩展extension_dir = '/alidata/server/php/lib/php/extensions/no-debug-non-zts-20160303/' zend_extension=opcache.so配置opcache[opcache] 1. 开关打开 opcache.enable=1 2. 开启CLI opcache.enable_cli=1 3. 可用内存, 酌情而定, 单位为:Mb opcache.memory_consumption=528 4. Zend Optimizer + 暂存池中字符串的占内存总量.(单位:MB) opcache.interned_strings_buffer=8 5. 对多缓存文件限制, 命中率不到 100% 的话, 可以试着提高这个值 opcache.max_accelerated_files=10000 6. Opcache 会在一定时间内去检查文件的修改时间, 这里设置检查的时间周期, 默认为 2, 定位为秒 注意:0是一直检查不是关闭,推荐 60 opcache.revalidate_freq=60 7. 打开快速关闭, 打开这个在PHP Request Shutdown的时候回收内存的速度会提高 opcache.fast_shutdown=1
2019年10月26日
5,163 阅读
0 评论
3 点赞
2019-09-01
crontab计划任务误删除恢复方法
本来想执行 crontab -e的,没想到手一抖就输入了crontab ,然后就进入了下面这个样子。 一看不对劲,就随手按了 Ctrl + D。 接下来,恐怖的事情发生了,crontab的所有任务都被清空了。 查找资料发现如下: 如果遗漏了任何选项,crontab可能会打开一个空文件,或者看起来像是个空文件。这时敲delete键退出,不要按<Ctrl-D>,否则你将丢失crontab文件。 自己删的crontab,跪着也要找回来。 crontab有运行日志,在日志里面可以找到执行过的历史命令。前提是要有root权限。cat /var/log/cron* | grep CMD | awk -F'CMD' '{print $2}' | awk -F'[(|)]' '{print $2}' | sort -u 由此得到系统记录过的 crontab 执行命令,过滤其他账号的命令后即可追回目标账号的 crontab 任务。 grep CMD 可以改为 grep "(root) CMD" root 为某账号的crontab 。 命令是找回了,可是执行周期呢?cat /var/log/cron*|grep "(root) CMD"|grep "/data/scripts/send_mail.sh"|sort|uniq
2019年09月01日
7,656 阅读
0 评论
4 点赞
2019-07-26
nginx 通过外网服务器泛域名配置映射到内网端口或者泛地址
nginx 通过外网服务器泛域名配置映射到内网端口或者泛地址。配置示例如下:server { listen 80; server_name *.i.weitip.com; index index.php index.html index.htm default.php default.htm default.html; root /www/wwwroot/weitip.com/frps; location / { # 泛域名开始配置 if ( $host ~* (.*)\.(.*)\.(.*)\.(.*) ) { set $domain $1; #获取当前的 域名前缀 } resolver 114.114.114.114; set $url "http://$domain.weitip.com:8080"; proxy_pass $url; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; } access_log /www/wwwlogs/frps.weitip.com.log; error_log /www/wwwlogs/frps.weitip.com.error.log; }
2019年07月26日
5,021 阅读
0 评论
32 点赞
2019-07-10
linux定时任务的设置与使用
定时任务命令:1· 定时任务服务提供crontab 命令来设定服务。2· crontab -e //编辑某个用户的cron服务。3· crontab -l //列出某个用户cron服务的详细内容。4· crontab -r //删除每个用户的cron服务。例如:*/1 * * * * php /data/www/cron.php //意思是每分钟执行cron.php50 7 * * * /sbin/service sshd start //意思是每天的7:50开启ssh服务30 7 8 * * ls //意思是每月8号的7:30分执行ls命令分 时 日 月 星期 命令0-59 0-23 1-31 1-12 0-6
2019年07月10日
6,094 阅读
0 评论
1 点赞
2019-07-02
linux查看与设定别名
1.alias :查看系统中所有的命令别名2.设定别名 alias 别名='原命令'3.删除别名 unalias 别名4.使别名永久生效 vi ~/.bashrc 写入这个文件中即可永久生效 编辑完之后记得使环境变量生效: source .bashrc
2019年07月02日
5,645 阅读
0 评论
1 点赞
2019-06-17
解决: g++: internal compiler error: Killed (program cc1plus)
g++: internal compiler error: Killed (program cc1plus)Please submit a full bug report,在centos7编译php7的时候遇到的问题,记录一下。 主要原因是内存不足, 使用的渣渣配置1核1M,临时使用交换分区来解决吧。sudo dd if=/dev/zero of=/swapfile bs=64M count=16sudo mkswap /swapfilesudo swapon /swapfile用完之后得还回去:sudo swapoff /swapfilesudo rm /swapfile
2019年06月17日
8,202 阅读
0 评论
4 点赞
2019-05-11
centos 搭建Nginx 负载均衡
搭建Nginx 负载均衡一、安装如下环境yum -y install make gcc gcc-c++ gcc-g77 flex bison file libtool libtool-libs autoconf kernel-devel libjpeg libjpeg-devel libpng libpng-devel libpng10 libpng10-devel gd gd-devel freetype freetype-devel libxml2 libxml2-devel zlib zlib-devel glib2 glib2-devel bzip2 bzip2-devel libevent libevent-devel ncurses ncurses-devel curl curl-devel e2fsprogs e2fsprogs-devel krb5 krb5-devel libidn libidn-devel openssl openssl-devel gettext gettext-devel ncurses-devel gmp-devel pspell-devel unzip libcap lsof编译pcre的包tar zxf pcre-8.31.tar.gzcd pcre-8.31./configuremake && make installuseradd -s /sbin/nologno -g nginx -M nginxtar zxf nginx-1.10.2.tar.gzcd nginx-1.10.2./configure –prefix=/usr/local/nginx –sbin-path=/usr/local/nginx/bin/nginx –conf-path=/usr/local/nginx/conf/nginx.conf –error-log-path=/var/log/nginx/error.log –http-log-path=/var/log/nginx/access.log –pid-path=/var/run/nginx/nginx.pid –lock-path=/var/lock/nginx.lock –user=nginx –group=nginx –with-http_ssl_module –with-http_flv_module –with-http_stub_status_module –with-http_gzip_static_module –http-client-body-temp-path=/var/tmp/nginx/client/ –http-proxy-temp-path=/var/tmp/nginx/proxy/ –http-fastcgi-temp-path=/var/tmp/nginx/fcgi/ –http-uwsgi-temp-path=/var/tmp/nginx/uwsgi –http-scgi-temp-path=/var/tmp/nginx/scgi –with-pcremakemake install/usr/local/nginx/bin/nginx –t./nginx: error while loading shared libraries: libpcre.so.1: cannot open shared object file: No such file or directory 解决prce的问题 #find / -name libpcre.so*/usr/local/lib/libpcre.so.1.0.1/usr/local/lib/libpcre.so/usr/local/lib/libpcre.so.1/lib64/libpcre.so.0.0.1/lib64/libpcre.so.0出现了这么多结果。我们安装的PCRE库的位置在/usr/local/pcre中,我们就用这个位置vim /etc/ld.so.conf在尾行加入/usr/local/binroot@mail2 bin]# ldconfig#/usr/local/nginx/bin/nginx -tnginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is oknginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful 这就正常了启动nginx/usr/local/nginx/bin/nginxvim /usr/local/nginx/conf/nginx.conf在最后面的大括号前面添加一行include /usr/local/nginx/conf.d/*.conf;建立这个目录mkdir /usr/local/nginx/conf.dvim /usr/local/nginx/conf.d/lkq.confupstream backend{server 192.168.236.150:80 weight=1;server 192.168.236.151:80 weight=2;#ip_hash;}server{listen 80;server_name www.lkq.com;location ~ ^/*{proxy_set_header Host $host;proxy_set_header X-Real-IP $remote_addr;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;proxy_buffering off;proxy_pass http://backend;}}haproxy+nginx实现高可用负载均衡Keepalived 的作用是检测web服务器的状态,如果有一台web服务器死机,或工作出现故障,Keepalived将检测到,并将有故障的web服务器从系统中剔除, 当web服务器工作正常后Keepalived自动将web服务器加入到服务器群中,这些工作全部自动完成,不需要人工干涉,需要人工做的只是修复故障的 web服务器。HAProxy 提供高可用性、负载均衡以及基于 TCP 和 HTTP 应用的代理,支持虚拟主机,它是免费、快速并且可靠的一种解决方案。HAProxy 特别适用于那些负载特大的 web 站点, 这些站点通常又需要会话保持或七层处理。HAProxy 运行在当前的硬件上,完全可以支持数以万计的并发连接。并且它的运行模式使得它可以很简单安全的整 合进您当前的架构中, 同时可以保护你的 web 服务器不被暴露到网络上。系统环境: CenOS 6.5x86_64 Desktop install 将selinux and iptables 设置为disabled图1 为基本的架构图:图2 为IP地址分配。主要用途IPHaproxy+keepalived_master192.168.236.143Haproxy+keepalived_backup192.168.236.192Webser1192.168.236.150Webser2192.168.236.151一:安装过程,在两台HA机器上分别keepalived:#ln -s /usr/src/kernels/2.6.18-128.el5-i686/ /usr/src/linux http://www.keepalived.org/software/ keepalived 的下载地址。版本的话自己可以选择一下版本。楼主选择的版本是1.2.23的版本 [root@mail2 keepalived-1.2.23]# ./configure –sysconf=/etc [root@mail2 keepalived-1.2.23]# make && make install [root@mail2 keepalived-1.2.23]# ln –s /usr/local/sbin/keepalived /sbin [
[email protected]
]#cp /etc/keepalived/keepalived.conf /etc/keepalived/keepalived.conf.bak [
[email protected]
]# ln -s /etc/init.d/keepalived /etc/rc.d/rc3.d/S99keepalived [
[email protected]
]# ln -s /etc/init.d/keepalived /etc/rc.d/rc5.d/S99keepalived二、修改配置文件Director server 1 的配置文件[root@Lserver-1 keepalived]# cat keepalived.confMaster :! Configuration File for keepalived vrrp_script chk_http_port { script "/etc/keepalived/check_haproxy.sh" ######设置了一个keepalived一个脚本 interval 2 weight 2 global_defs { router_id LVS_DEVEL } vrrp_instance VI_1 { state MASTER ###keepalived 的主 interface eth0 virtual_router_id 51 priority 150 #####keepalived 一个ID 号 备的ID一定要小于主的ID advert_int 1 authentication { auth_type PASS auth_pass 1111 } track_script { chk_http_port } virtual_ipaddress { 192.168.236.230 ######一个VIP地址 } } }BACKUP:! Configuration File for keepalived vrrp_script chk_http_port { script "/etc/keepalived/check_haproxy.sh" #####一个keepalived的脚本同主一样 interval 2 weight 2 global_defs { router_id LVS_DEVEL } vrrp_instance VI_1 { state BACKUP ####为keepalived 的backup 备节点 interface eth0 virtual_router_id 51 priority 120 ####### keepalived 的一个ID号,一定要小于主节点 advert_int 1 authentication { auth_type PASS auth_pass 1111 } track_script { chk_http_port } virtual_ipaddress { 192.168.236.230 ##同主 } } }三、Master 主机上:####这里是一个控制haproxy的一个启动脚本 #vi /etc/keepalived/check_haproxy.sh #!/bin/bash A=`ps -C haproxy --no-header | wc -l` if [ $A -eq 0 ];then /usr/local/haproxy/sbin/haproxy -f /usr/local/haproxy/conf/haproxy.cfg echo "haproxy start" sleep 3 if [ `ps -C haproxy --no-header | wc -l`-eq 0 ];then /etc/init.d/keepalived stop echo "keepalived stop" fi fiBackup 备机上:#!/bin/bash A=`ip a | grep 192.168.236.230 | wc -l` B=`ps -ef | grep haproxy | grep -v grep| awk '{print $2}'` if [ $A -gt 0 ];then /usr/local/haproxy/sbin/haproxy -f /usr/local/haproxy/conf/haproxy.cfg else kill -9 $B fi#两台机器分别执行:chmod 755 /etc/keepalived/check_haproxy.sh四、haproxy的安装(主备都一样):yum -y install pcre pcre-devel wget https://fossies.org/linux/misc/haproxy-1.7.5.tar.gz tar xf haproxy-1.7.5.tar.gz cd haproxy-1.7.5 make TARGET=linux26 ARCH=x86_64 PREFIX=/usr/local/haproxy USE_PCRE=1 make install PREFIX=/usr/local/haproxy #cd/usr/local/haproxy/ #mkdir conf #mkdir logs#vi haproxy.cfgglobal log 127.0.0.1 local0 log 127.0.0.1 local1 notice #log loghost local0 info maxconn 4096 # chroot /usr/share/haproxy chroot /usr/local/haproxy uid 99 gid 99 daemon #debug #quiet defaults log global mode http option httplog option dontlognull retries 3 #redispatch maxconn 2000 option redispatch stats uri /haproxy stats auth admin:admin frontend www bind *:80 acl web hdr(host) -i www.lkq.com ####这里是通过域名访问的。如果域名为这个则通过。 use_backend webserver if web backend webserver #webserver作用域 mode http balance roundrobin option httpchk /index.html server s1 192.168.236.151:80 weight 3 check ###这两条记录为后端的两台WEB服务器 server s2 192.168.236.150:80 weight 3 check五、:先主后从,两台机器上都分别启动:/etc/init.d/keepalivedstart (如果之前没有启动haproxy,这条命令会自动把haproxy启动)[root@Rserver-1 conf]# ps -ef |grep haproxy nobody 14766 1 0 19:13 ? 00:00:01 /usr/local/haproxy/sbin/haproxy -f /usr/local/haproxy/conf/haproxy.cfg root 16034 8237 0 19:56 pts/2 00:00:00 grep haproxy [root@Rserver-1 conf]# ps -ef |grep keepalived root 16016 1 0 19:56 ? 00:00:00 keepalived -D root 16018 16016 0 19:56 ? 00:00:00 keepalived -D root 16019 16016 0 19:56 ? 00:00:00 keepalived -D root 16102 8237 0 19:56 pts/2 00:00:00 grep keepalived [root@Rserver-1 conf]#六、再两台HA上分别执行ip addr list |grep 192.168.23master:[root@Rserver-1 conf]# ip addr list |grep 192.168.236 inet 192.168.236.143/24 brd 192.168.236.255 scope global eth0 inet 192.168.236.230/32 scope global eth0 [root@Rserver-1 conf]#Backup:[root@Lserver-1 keepalived]# ip addr list |grep 192.168.236 inet 192.168.236.192/24 brd 192.168.236.255 scope global eth0 [root@Lserver-1 keepalived]#七、停掉主上的haproxy,3秒后keepalived会自动将其再次启动[root@Rserver-1 conf]# killall haproxy [root@Rserver-1 conf]# ps -ef |grep haproxy nobody 14766 1 0 19:13 ? 00:00:02 /usr/local/haproxy/sbin/haproxy -f /usr/local/haproxy/conf/haproxy.cfg root 16826 8237 0 20:01 pts/2 00:00:00 grep haproxy八、停掉主的keepalived,备机马上接管服务Master:[root@Rserver-1 conf]# /etc/init.d/keepalived stop [root@Rserver-1 conf]# ip addr list|grep 192.168.236 inet 192.168.236.143/24 brd 192.168.236.255 scope global eth0 [root@Rserver-1 conf]#Backup:[root@Lserver-1 keepalived]# ip addr list|grep 192.168.236 inet 192.168.236.192/24 brd 192.168.236.255 scope global eth0 inet 192.168.236.230/32 scope global eth0 [root@Lserver-1 keepalived]#
2019年05月11日
12,199 阅读
0 评论
14 点赞
2019-03-29
解决 docker run 报错 oci runtime error
在部署新服务器运行docker镜像的时候遇到了报错,记录下解决方法。docker 启动容器报错:Error response from daemon: oci runtime error: container_linux.go:247: starting container process caused "process_linux.go:258: applying cgroup configuration for process caused \"Cannot set property TasksAccountingdocker 是通过 yum install docker安装的,搜了一把,原来是因为linux与docker版本的兼容性问题。那就卸载旧版本安装最新版试试。0.通过uname -r命令查看你当前的内核版本uname -r1.使用 root 权限登录 Centos。确保 yum 包更新到最新。sudo yum update2.卸载旧版本(如果安装过旧版本的话)sudo yum remove docker docker-common docker-selinux docker-engine3.安装需要的软件包, yum-util 提供yum-config-manager功能,另外两个是devicemapper驱动依赖的sudo yum install -y yum-utils device-mapper-persistent-data lvm24.设置yum源sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo5.可以查看所有仓库中所有docker版本,并选择特定版本安装yum list docker-ce --showduplicates | sort -r6.安装dockersudo yum install docker-ce7.启动并加入开机启动sudo systemctl start dockersudo systemctl enable docker8.验证安装是否成功(有client和service两部分表示docker安装启动都成功了) docker version 经过以上一通操作,pull 一下镜像再执行docker run命令,问题解决。
2019年03月29日
49,608 阅读
0 评论
951 点赞
2019-01-11
docker 部署PHP+ nginx环境
首先push 两个镜像docker pull php:7.2.3-fpm docker pull nginx然后启动一个php docker run --name phpfpm -d -v /root/app:/app php:7.2.3-fpm说明一下 –name 是容器的名字 phpfpm-v 是/root/app 是本机的地址/app 是容器内部的存储位置然后再启动一个nginx docker run --name nginx_server -d -p 80:80 --link phpfpm:phpfpm -v /root/conf/nginx.conf:/etc/nginx/nginx.conf --volumes-from phpfpm nginx— link phpfrpm:phpfpm 是容器之间建立关系–volumes-from phpfpm 就是把/root/app:/app 也会导入到 容器中/app 目录 -v /root/conf/nginx.conf 导入到 /etc/nginx/nginx.conf 宿主机 的nginx.conf 的导入到/etc/nginx/nginx.conf 中 连接PHP的配置如下: location ~ .php$ { root /app; fastcgi_pass phpfpm:9000; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME /app$fastcgi_script_name; include fastcgi_params; }nginx配置文件如下:user root root; worker_processes auto; error_log /tmp/nginx_error.log crit; pid /tmp/nginx.pid; worker_rlimit_nofile 51200; events { use epoll; worker_connections 51200; multi_accept on; } http { include mime.types; 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; server { listen 80; server_name www.bt.cn; index index.html index.htm index.php; root /app; #error_page 404 /404.html; location ~ .php$ { root /app; fastcgi_pass phpfpm:9000; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME /app$fastcgi_script_name; include fastcgi_params; } location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$ { expires 30d; } location ~ .*\.(js|css)?$ { expires 12h; } location ~ /\. { deny all; } access_log /tmp/access.log; } }
2019年01月11日
15,662 阅读
0 评论
40 点赞
2018-09-17
Linux常用命令大全
系统信息 arch 显示机器的处理器架构uname -m 显示机器的处理器架构uname -r 显示正在使用的内核版本 dmidecode -q 显示硬件系统部件 - (SMBIOS / DMI) hdparm -i /dev/hda 罗列一个磁盘的架构特性 hdparm -tT /dev/sda 在磁盘上执行测试性读取操作 cat /proc/cpuinfo 显示CPU info的信息 cat /proc/interrupts 显示中断 cat /proc/meminfo 校验内存使用 cat /proc/swaps 显示哪些swap被使用 cat /proc/version 显示内核的版本 cat /proc/net/dev 显示网络适配器及统计 cat /proc/mounts 显示已加载的文件系统 lspci -tv 罗列 PCI 设备 lsusb -tv 显示 USB 设备 date 显示系统日期 cal 2007 显示2007年的日历表 date 041217002007.00 设置日期和时间 - 月日时分年.秒 clock -w 将时间修改保存到 BIOS 关机 (系统的关机、重启以及登出 ) shutdown -h now 关闭系统init 0 关闭系统telinit 0 关闭系统shutdown -h hours:minutes & 按预定时间关闭系统 shutdown -c 取消按预定时间关闭系统 shutdown -r now 重启reboot 重启logout 注销 文件和目录 cd /home 进入 '/ home' 目录' cd .. 返回上一级目录 cd ../.. 返回上两级目录 cd 进入个人的主目录 cd ~user1 进入个人的主目录 cd - 返回上次所在的目录 pwd 显示工作路径 ls 查看目录中的文件 ls -F 查看目录中的文件 ls -l 显示文件和目录的详细资料 ls -a 显示隐藏文件 ls *[0-9]* 显示包含数字的文件名和目录名 tree 显示文件和目录由根目录开始的树形结构lstree 显示文件和目录由根目录开始的树形结构mkdir dir1 创建一个叫做 'dir1' 的目录' mkdir dir1 dir2 同时创建两个目录 mkdir -p /tmp/dir1/dir2 创建一个目录树 rm -f file1 删除一个叫做 'file1' 的文件' rmdir dir1 删除一个叫做 'dir1' 的目录' rm -rf dir1 删除一个叫做 'dir1' 的目录并同时删除其内容 rm -rf dir1 dir2 同时删除两个目录及它们的内容 mv dir1 new_dir 重命名/移动 一个目录 cp file1 file2 复制一个文件 cp dir/* . 复制一个目录下的所有文件到当前工作目录 cp -a /tmp/dir1 . 复制一个目录到当前工作目录 cp -a dir1 dir2 复制一个目录 ln -s file1 lnk1 创建一个指向文件或目录的软链接 ln file1 lnk1 创建一个指向文件或目录的物理链接 touch -t 0712250000 file1 修改一个文件或目录的时间戳 - (YYMMDDhhmm) file file1 outputs the mime type of the file as text iconv -l 列出已知的编码 iconv -f fromEncoding -t toEncoding inputFile > outputFile creates a new from the given input file by assuming it is encoded in fromEncoding and converting it to toEncoding. find . -maxdepth 1 -name *.jpg -print -exec convert "{}" -resize 80x60 "thumbs/{}" \; batch resize files in the current directory and send them to a thumbnails directory (requires convert from Imagemagick) 文件搜索 find / -name file1 从 '/' 开始进入根文件系统搜索文件和目录 find / -user user1 搜索属于用户 'user1' 的文件和目录 find /home/user1 -name \*.bin 在目录 '/ home/user1' 中搜索带有'.bin' 结尾的文件 find /usr/bin -type f -atime +100 搜索在过去100天内未被使用过的执行文件 find /usr/bin -type f -mtime -10 搜索在10天内被创建或者修改过的文件 find / -name \*.rpm -exec chmod 755 '{}' \; 搜索以 '.rpm' 结尾的文件并定义其权限 find / -xdev -name \*.rpm 搜索以 '.rpm' 结尾的文件,忽略光驱、捷盘等可移动设备 locate \*.ps 寻找以 '.ps' 结尾的文件 - 先运行 'updatedb' 命令 whereis halt 显示一个二进制文件、源码或man的位置 which halt 显示一个二进制文件或可执行文件的完整路径 挂载一个文件系统 mount /dev/hda2 /mnt/hda2 挂载一个叫做hda2的盘 - 确定目录 '/ mnt/hda2' 已经存在 umount /dev/hda2 卸载一个叫做hda2的盘 - 先从挂载点 '/ mnt/hda2' 退出 fuser -km /mnt/hda2 当设备繁忙时强制卸载 umount -n /mnt/hda2 运行卸载操作而不写入 /etc/mtab 文件- 当文件为只读或当磁盘写满时非常有用 mount /dev/fd0 /mnt/floppy 挂载一个软盘 mount /dev/cdrom /mnt/cdrom 挂载一个cdrom或dvdrom mount /dev/hdc /mnt/cdrecorder 挂载一个cdrw或dvdrom mount /dev/hdb /mnt/cdrecorder 挂载一个cdrw或dvdrom mount -o loop file.iso /mnt/cdrom 挂载一个文件或ISO镜像文件 mount -t vfat /dev/hda5 /mnt/hda5 挂载一个Windows FAT32文件系统 mount /dev/sda1 /mnt/usbdisk 挂载一个usb 捷盘或闪存设备 mount -t smbfs -o username=user,password=pass //WinClient/share /mnt/share 挂载一个windows网络共享 磁盘空间 df -h 显示已经挂载的分区列表 ls -lSr |more 以尺寸大小排列文件和目录 du -sh dir1 估算目录 'dir1' 已经使用的磁盘空间' du -sk * | sort -rn 以容量大小为依据依次显示文件和目录的大小 rpm -q -a --qf '%10{SIZE}t%{NAME}n' | sort -k1,1n 以大小为依据依次显示已安装的rpm包所使用的空间 (fedora, redhat类系统) dpkg-query -W -f='${Installed-Size;10}t${Package}n' | sort -k1,1n 以大小为依据显示已安装的deb包所使用的空间 (ubuntu, debian类系统) 用户和群组 groupadd group_name 创建一个新用户组 groupdel group_name 删除一个用户组 groupmod -n new_group_name old_group_name 重命名一个用户组 useradd -c "Name Surname " -g admin -d /home/user1 -s /bin/bash user1 创建一个属于 "admin" 用户组的用户 useradd user1 创建一个新用户 userdel -r user1 删除一个用户 ( '-r' 排除主目录) usermod -c "User FTP" -g system -d /ftp/user1 -s /bin/nologin user1 修改用户属性 passwd 修改口令 passwd user1 修改一个用户的口令 (只允许root执行) chage -E 2005-12-31 user1 设置用户口令的失效期限 pwck 检查 '/etc/passwd' 的文件格式和语法修正以及存在的用户 grpck 检查 '/etc/passwd' 的文件格式和语法修正以及存在的群组 newgrp group_name 登陆进一个新的群组以改变新创建文件的预设群组 文件的权限 - 使用 "+" 设置权限,使用 "-" 用于取消 ls -lh 显示权限 ls /tmp | pr -T5 -W$COLUMNS 将终端划分成5栏显示 chmod ugo+rwx directory1 设置目录的所有人(u)、群组(g)以及其他人(o)以读(r )、写(w)和执行(x)的权限 chmod go-rwx directory1 删除群组(g)与其他人(o)对目录的读写执行权限 chown user1 file1 改变一个文件的所有人属性 chown -R user1 directory1 改变一个目录的所有人属性并同时改变改目录下所有文件的属性 chgrp group1 file1 改变文件的群组 chown user1:group1 file1 改变一个文件的所有人和群组属性 find / -perm -u+s 罗列一个系统中所有使用了SUID控制的文件 chmod u+s /bin/file1 设置一个二进制文件的 SUID 位 - 运行该文件的用户也被赋予和所有者同样的权限 chmod u-s /bin/file1 禁用一个二进制文件的 SUID位 chmod g+s /home/public 设置一个目录的SGID 位 - 类似SUID ,不过这是针对目录的 chmod g-s /home/public 禁用一个目录的 SGID 位 chmod o+t /home/public 设置一个文件的 STIKY 位 - 只允许合法所有人删除文件 chmod o-t /home/public 禁用一个目录的 STIKY 位 文件的特殊属性 - 使用 "+" 设置权限,使用 "-" 用于取消 chattr +a file1 只允许以追加方式读写文件 chattr +c file1 允许这个文件能被内核自动压缩/解压 chattr +d file1 在进行文件系统备份时,dump程序将忽略这个文件 chattr +i file1 设置成不可变的文件,不能被删除、修改、重命名或者链接 chattr +s file1 允许一个文件被安全地删除 chattr +S file1 一旦应用程序对这个文件执行了写操作,使系统立刻把修改的结果写到磁盘 chattr +u file1 若文件被删除,系统会允许你在以后恢复这个被删除的文件 lsattr 显示特殊的属性 打包和压缩文件 bunzip2 file1.bz2 解压一个叫做 'file1.bz2'的文件 bzip2 file1 压缩一个叫做 'file1' 的文件 gunzip file1.gz 解压一个叫做 'file1.gz'的文件 gzip file1 压缩一个叫做 'file1'的文件 gzip -9 file1 最大程度压缩 rar a file1.rar test_file 创建一个叫做 'file1.rar' 的包 rar a file1.rar file1 file2 dir1 同时压缩 'file1', 'file2' 以及目录 'dir1' rar x file1.rar 解压rar包 unrar x file1.rar 解压rar包 tar -cvf archive.tar file1 创建一个非压缩的 tarball tar -cvf archive.tar file1 file2 dir1 创建一个包含了 'file1', 'file2' 以及 'dir1'的档案文件 tar -tf archive.tar 显示一个包中的内容 tar -xvf archive.tar 释放一个包 tar -xvf archive.tar -C /tmp 将压缩包释放到 /tmp目录下 tar -cvfj archive.tar.bz2 dir1 创建一个bzip2格式的压缩包 tar -jxvf archive.tar.bz2 解压一个bzip2格式的压缩包 tar -cvfz archive.tar.gz dir1 创建一个gzip格式的压缩包 tar -zxvf archive.tar.gz 解压一个gzip格式的压缩包 zip file1.zip file1 创建一个zip格式的压缩包 zip -r file1.zip file1 file2 dir1 将几个文件和目录同时压缩成一个zip格式的压缩包 unzip file1.zip 解压一个zip格式压缩包 RPM 包 - (Fedora, Redhat及类似系统) rpm -ivh package.rpm 安装一个rpm包 rpm -ivh --nodeeps package.rpm 安装一个rpm包而忽略依赖关系警告 rpm -U package.rpm 更新一个rpm包但不改变其配置文件 rpm -F package.rpm 更新一个确定已经安装的rpm包 rpm -e package_name.rpm 删除一个rpm包 rpm -qa 显示系统中所有已经安装的rpm包 rpm -qa | grep httpd 显示所有名称中包含 "httpd" 字样的rpm包 rpm -qi package_name 获取一个已安装包的特殊信息 rpm -qg "System Environment/Daemons" 显示一个组件的rpm包 rpm -ql package_name 显示一个已经安装的rpm包提供的文件列表 rpm -qc package_name 显示一个已经安装的rpm包提供的配置文件列表 rpm -q package_name --whatrequires 显示与一个rpm包存在依赖关系的列表 rpm -q package_name --whatprovides 显示一个rpm包所占的体积 rpm -q package_name --scripts 显示在安装/删除期间所执行的脚本l rpm -q package_name --changelog 显示一个rpm包的修改历史 rpm -qf /etc/httpd/conf/httpd.conf 确认所给的文件由哪个rpm包所提供 rpm -qp package.rpm -l 显示由一个尚未安装的rpm包提供的文件列表 rpm --import /media/cdrom/RPM-GPG-KEY 导入公钥数字证书 rpm --checksig package.rpm 确认一个rpm包的完整性 rpm -qa gpg-pubkey 确认已安装的所有rpm包的完整性 rpm -V package_name 检查文件尺寸、 许可、类型、所有者、群组、MD5检查以及最后修改时间 rpm -Va 检查系统中所有已安装的rpm包- 小心使用 rpm -Vp package.rpm 确认一个rpm包还未安装 rpm2cpio package.rpm | cpio --extract --make-directories *bin* 从一个rpm包运行可执行文件 rpm -ivh /usr/src/redhat/RPMS/`arch`/package.rpm 从一个rpm源码安装一个构建好的包 rpmbuild --rebuild package_name.src.rpm 从一个rpm源码构建一个 rpm 包 YUM 软件包升级器 - (Fedora, RedHat及类似系统) yum install package_name 下载并安装一个rpm包 yum localinstall package_name.rpm 将安装一个rpm包,使用你自己的软件仓库为你解决所有依赖关系 yum update package_name.rpm 更新当前系统中所有安装的rpm包 yum update package_name 更新一个rpm包 yum remove package_name 删除一个rpm包 yum list 列出当前系统中安装的所有包 yum search package_name 在rpm仓库中搜寻软件包 yum clean packages 清理rpm缓存删除下载的包 yum clean headers 删除所有头文件 yum clean all 删除所有缓存的包和头文件 DEB 包 (Debian, Ubuntu 以及类似系统) dpkg -i package.deb 安装/更新一个 deb 包 dpkg -r package_name 从系统删除一个 deb 包 dpkg -l 显示系统中所有已经安装的 deb 包 dpkg -l | grep httpd 显示所有名称中包含 "httpd" 字样的deb包 dpkg -s package_name 获得已经安装在系统中一个特殊包的信息 dpkg -L package_name 显示系统中已经安装的一个deb包所提供的文件列表 dpkg --contents package.deb 显示尚未安装的一个包所提供的文件列表 dpkg -S /bin/ping 确认所给的文件由哪个deb包提供 APT 软件工具 (Debian, Ubuntu 以及类似系统) apt-get install package_name 安装/更新一个 deb 包 apt-cdrom install package_name 从光盘安装/更新一个 deb 包 apt-get update 升级列表中的软件包 apt-get upgrade 升级所有已安装的软件 apt-get remove package_name 从系统删除一个deb包 apt-get check 确认依赖的软件仓库正确 apt-get clean 从下载的软件包中清理缓存 apt-cache search searched-package 返回包含所要搜索字符串的软件包名称 查看文件内容 cat file1 从第一个字节开始正向查看文件的内容 tac file1 从最后一行开始反向查看一个文件的内容 more file1 查看一个长文件的内容 less file1 类似于 'more' 命令,但是它允许在文件中和正向操作一样的反向操作 head -2 file1 查看一个文件的前两行 tail -2 file1 查看一个文件的最后两行 tail -f /var/log/messages 实时查看被添加到一个文件中的内容 文本处理 cat file1 file2 ... | command <> file1_in.txt_or_file1_out.txt general syntax for text manipulation using PIPE, STDIN and STDOUT cat file1 | command( sed, grep, awk, grep, etc...) > result.txt 合并一个文件的详细说明文本,并将简介写入一个新文件中 cat file1 | command( sed, grep, awk, grep, etc...) >> result.txt 合并一个文件的详细说明文本,并将简介写入一个已有的文件中 grep Aug /var/log/messages 在文件 '/var/log/messages'中查找关键词"Aug" grep ^Aug /var/log/messages 在文件 '/var/log/messages'中查找以"Aug"开始的词汇 grep [0-9] /var/log/messages 选择 '/var/log/messages' 文件中所有包含数字的行 grep Aug -R /var/log/* 在目录 '/var/log' 及随后的目录中搜索字符串"Aug" sed 's/stringa1/stringa2/g' example.txt 将example.txt文件中的 "string1" 替换成 "string2" sed '/^$/d' example.txt 从example.txt文件中删除所有空白行 sed '/ *#/d; /^$/d' example.txt 从example.txt文件中删除所有注释和空白行 echo 'esempio' | tr '[:lower:]' '[:upper:]' 合并上下单元格内容 sed -e '1d' result.txt 从文件example.txt 中排除第一行 sed -n '/stringa1/p' 查看只包含词汇 "string1"的行 sed -e 's/ *$//' example.txt 删除每一行最后的空白字符 sed -e 's/stringa1//g' example.txt 从文档中只删除词汇 "string1" 并保留剩余全部 sed -n '1,5p;5q' example.txt 查看从第一行到第5行内容 sed -n '5p;5q' example.txt 查看第5行 sed -e 's/00*/0/g' example.txt 用单个零替换多个零 cat -n file1 标示文件的行数 cat example.txt | awk 'NR%2==1' 删除example.txt文件中的所有偶数行 echo a b c | awk '{print $1}' 查看一行第一栏 echo a b c | awk '{print $1,$3}' 查看一行的第一和第三栏 paste file1 file2 合并两个文件或两栏的内容 paste -d '+' file1 file2 合并两个文件或两栏的内容,中间用"+"区分 sort file1 file2 排序两个文件的内容 sort file1 file2 | uniq 取出两个文件的并集(重复的行只保留一份) sort file1 file2 | uniq -u 删除交集,留下其他的行 sort file1 file2 | uniq -d 取出两个文件的交集(只留下同时存在于两个文件中的文件) comm -1 file1 file2 比较两个文件的内容只删除 'file1' 所包含的内容 comm -2 file1 file2 比较两个文件的内容只删除 'file2' 所包含的内容 comm -3 file1 file2 比较两个文件的内容只删除两个文件共有的部分 字符设置和文件格式转换 dos2unix filedos.txt fileunix.txt 将一个文本文件的格式从MSDOS转换成UNIX unix2dos fileunix.txt filedos.txt 将一个文本文件的格式从UNIX转换成MSDOS recode ..HTML < page.txt > page.html 将一个文本文件转换成html recode -l | more 显示所有允许的转换格式 文件系统分析 badblocks -v /dev/hda1 检查磁盘hda1上的坏磁块 fsck /dev/hda1 修复/检查hda1磁盘上linux文件系统的完整性 fsck.ext2 /dev/hda1 修复/检查hda1磁盘上ext2文件系统的完整性 e2fsck /dev/hda1 修复/检查hda1磁盘上ext2文件系统的完整性 e2fsck -j /dev/hda1 修复/检查hda1磁盘上ext3文件系统的完整性 fsck.ext3 /dev/hda1 修复/检查hda1磁盘上ext3文件系统的完整性 fsck.vfat /dev/hda1 修复/检查hda1磁盘上fat文件系统的完整性 fsck.msdos /dev/hda1 修复/检查hda1磁盘上dos文件系统的完整性 dosfsck /dev/hda1 修复/检查hda1磁盘上dos文件系统的完整性 初始化一个文件系统 mkfs /dev/hda1 在hda1分区创建一个文件系统 mke2fs /dev/hda1 在hda1分区创建一个linux ext2的文件系统 mke2fs -j /dev/hda1 在hda1分区创建一个linux ext3(日志型)的文件系统 mkfs -t vfat 32 -F /dev/hda1 创建一个 FAT32 文件系统 fdformat -n /dev/fd0 格式化一个软盘 mkswap /dev/hda3 创建一个swap文件系统 SWAP文件系统 mkswap /dev/hda3 创建一个swap文件系统 swapon /dev/hda3 启用一个新的swap文件系统 swapon /dev/hda2 /dev/hdb3 启用两个swap分区 备份 dump -0aj -f /tmp/home0.bak /home 制作一个 '/home' 目录的完整备份 dump -1aj -f /tmp/home0.bak /home 制作一个 '/home' 目录的交互式备份 restore -if /tmp/home0.bak 还原一个交互式备份 rsync -rogpav --delete /home /tmp 同步两边的目录 rsync -rogpav -e ssh --delete /home ip_address:/tmp 通过SSH通道rsync rsync -az -e ssh --delete ip_addr:/home/public /home/local 通过ssh和压缩将一个远程目录同步到本地目录 rsync -az -e ssh --delete /home/local ip_addr:/home/public 通过ssh和压缩将本地目录同步到远程目录 dd bs=1M if=/dev/hda | gzip | ssh user@ip_addr 'dd of=hda.gz' 通过ssh在远程主机上执行一次备份本地磁盘的操作 dd if=/dev/sda of=/tmp/file1 备份磁盘内容到一个文件 tar -Puf backup.tar /home/user 执行一次对 '/home/user' 目录的交互式备份操作 ( cd /tmp/local/ && tar c . ) | ssh -C user@ip_addr 'cd /home/share/ && tar x -p' 通过ssh在远程目录中复制一个目录内容 ( tar c /home ) | ssh -C user@ip_addr 'cd /home/backup-home && tar x -p' 通过ssh在远程目录中复制一个本地目录 tar cf - . | (cd /tmp/backup ; tar xf - ) 本地将一个目录复制到另一个地方,保留原有权限及链接 find /home/user1 -name '*.txt' | xargs cp -av --target-directory=/home/backup/ --parents 从一个目录查找并复制所有以 '.txt' 结尾的文件到另一个目录 find /var/log -name '*.log' | tar cv --files-from=- | bzip2 > log.tar.bz2 查找所有以 '.log' 结尾的文件并做成一个bzip包 dd if=/dev/hda of=/dev/fd0 bs=512 count=1 做一个将 MBR (Master Boot Record)内容复制到软盘的动作 dd if=/dev/fd0 of=/dev/hda bs=512 count=1 从已经保存到软盘的备份中恢复MBR内容 光盘 cdrecord -v gracetime=2 dev=/dev/cdrom -eject blank=fast -force 清空一个可复写的光盘内容 mkisofs /dev/cdrom > cd.iso 在磁盘上创建一个光盘的iso镜像文件 mkisofs /dev/cdrom | gzip > cd_iso.gz 在磁盘上创建一个压缩了的光盘iso镜像文件 mkisofs -J -allow-leading-dots -R -V "Label CD" -iso-level 4 -o ./cd.iso data_cd 创建一个目录的iso镜像文件 cdrecord -v dev=/dev/cdrom cd.iso 刻录一个ISO镜像文件 gzip -dc cd_iso.gz | cdrecord dev=/dev/cdrom - 刻录一个压缩了的ISO镜像文件 mount -o loop cd.iso /mnt/iso 挂载一个ISO镜像文件 cd-paranoia -B 从一个CD光盘转录音轨到 wav 文件中 cd-paranoia -- "-3" 从一个CD光盘转录音轨到 wav 文件中(参数-3) cdrecord --scanbus 扫描总线以识别scsi通道 dd if=/dev/hdc | md5sum 校验一个设备的md5sum编码,例如一张 CD 网络 - (以太网和WIFI无线) ifconfig eth0 显示一个以太网卡的配置 ifup eth0 启用一个 'eth0' 网络设备 ifdown eth0 禁用一个 'eth0' 网络设备 ifconfig eth0 192.168.1.1 netmask 255.255.255.0 控制IP地址 ifconfig eth0 promisc 设置 'eth0' 成混杂模式以嗅探数据包 (sniffing) dhclient eth0 以dhcp模式启用 'eth0' route -n show routing table route add -net 0/0 gw IP_Gateway configura default gateway route add -net 192.168.0.0 netmask 255.255.0.0 gw 192.168.1.1 configure static route to reach network '192.168.0.0/16' route del 0/0 gw IP_gateway remove static route echo "1" > /proc/sys/net/ipv4/ip_forward activate ip routing hostname show hostname of system host www.example.com lookup hostname to resolve name to ip address and viceversanslookup www.example.com lookup hostname to resolve name to ip address and viceversaip link show show link status of all interfaces mii-tool eth0 show link status of 'eth0' ethtool eth0 show statistics of network card 'eth0' netstat -tup show all active network connections and their PID netstat -tupl show all network services listening on the system and their PID tcpdump tcp port 80 show all HTTP traffic iwlist scan show wireless networks iwconfig eth1 show configuration of a wireless network card hostname show hostname host www.example.com lookup hostname to resolve name to ip address and viceversa nslookup www.example.com lookup hostname to resolve name to ip address and viceversa whois www.example.com lookup on Whois database
2018年09月17日
5,468 阅读
0 评论
3 点赞
2018-04-14
UE为现场演出者推出了价值2200美元的舞台耳返设备
大多数消费者可能熟悉UE推出的色彩鲜艳的蓝牙音箱,但该公司也有一系列定制入耳式耳机,UE刚刚推出了一款新的顶级旗舰机型:2,200美元的UE Live。UE Live耳机是该公司以前的旗舰UE18 Pro型号的进化版本,将每个耳机的扬声器数量从6个增加到8个,共计6个平衡电枢,一个True Tone Plus驱动器和一个6mm钕制动态扬声器,以提供更好的声音。但是,这些改进需要付出代价:UE Live耳机的起价为2,199美元,自定义选项价格可能会更高。Ultimate Ears的定制入耳式耳机倾向于专业音乐家在工作室或舞台上使用,而UE Live也不例外。 Ultimate Ears表示,新款耳机专为在音乐节,舞台和体育场举办音乐会的音乐家而设计 - 尽管如果您只是在家里听音乐,他们听起来也会非常出色。与UE Live一起,Ultimate Ears还宣布推出Ultimate Ears 6 PRO,这是一款价格为699美元的入耳式监听音箱,该监听音箱专为鼓手,贝斯手,DJ和嘻哈音乐家设计,并配有两个动态驱动程序中音和低音。这两款耳返将于2018年5月开始发货。
2018年04月14日
38 阅读
0 评论
1 点赞