Nginx 的优化是一个系统工程，涉及服务器硬件、操作系统、Nginx 配置本身，以及您所服务的应用类型。核心配置优化 (Master-Worker 架构)Nginx 采用 Master-Worker 架构，一个 Master 进程负责读取和解析配置，管理 Worker 进程；Worker 进程则负责处理实际的请求。1. worker_processes auto; auto 是 Nginx 1.8.1 及更高版本推荐的值。Nginx 会根据可用的 CPU 核心数自动调整 Worker 进程的数量。这样可以最大化 CPU 利用率，并避免手动设置可能导致的资源浪费或不足。1. 为什么是 CPU 核心数？ Nginx 是事件驱动的非阻塞服务器。一个 Worker 进程可以高效处理数万甚至数十万并发连接，因为当一个连接处于等待状态（例如等待数据从磁盘读取或网络发送）时，Worker 进程可以立即切换到处理另一个连接。过多的 Worker 进程会导致：- 上下文切换开销: 操作系统需要花费更多时间在 Worker 进程之间切换，这会抵消并行处理带来的益处。- 内存消耗: 每个 Worker 进程都会消耗一定的内存。{callout color="#ff9300"}特殊情况{/callout}磁盘 I/O 密集型应用 (如大型静态文件服务器):** 如果您的 Nginx 主要用于提供大量静态文件，并且这些文件分散在不同的磁盘上，那么适当增加 Worker 进程数量（可能略高于 CPU 核心数）可能有助于利用多磁盘的并行 I/O 能力。但这需要仔细测试。CPU 密集型模块 (不常见): 如果您使用了某些 CPU 密集型的 Nginx 模块 (例如自定义的 Lua 脚本执行大量计算)，那么也可能需要根据实际情况调整。但对于常规使用，auto 或 CPU 核心数通常是最佳选择。worker_connections 10240;(示例子值) 这是单个 Worker 进程可以处理的最大并发连接数。这个值直接影响 Nginx 服务器的总并发能力：总并发连接数 = worker_processes * worker_connections。{callout color="#00fdff"}关键考量:{/callout}文件描述符 (File Descriptors - FD): 每个连接在操作系统中都会占用一个文件描述符。因此，worker_connections 的值不能超过操作系统对单个进程允许的最大文件描述符数量（ulimit -n）。系统级限制: 还需要检查系统级的最大文件描述符限制 (/proc/sys/fs/file-max)。内存消耗 每一个连接都会消耗少量内存，如果 worker_connections 设置过大，可能会导致内存不足。还待更新
{progress percentage="" color="#00fdff"/}环境准备：操作系统： Red Hat Enterprise Linux 8.8 (Ootpa)内核版本： Linux 4.18.0-477.10.1.el8_8.x86_641. 下载/解压软件包 [root@php-server ~]# wget https://www.php.net/distributions/php-8.4.1.tar.gz [root@php-server ~]# tar -xf php-8.4.1.tar.gz -C /usr/local/ [root@php-server php84]# ln -s php-8.4.1 php842. 安装依赖[root@php-server php84]# dnf -y install libjpeg libjpeg-devel libpng libpng-devel oniguruma freetype freetype-devel libxml2 libxml2-devel ncurses ncurses-devel curl curl-devel e2fsprogs e2fsprogs-devel krb5-devel libidn openssl openssl-devel zlib zlib-devel glibc glibc-devel glib2 glib2-devel bzip2-devel openldap-devel automake autoconf libtool make openldap-devel gcc gcc-c++ sqlite-devel libxslt-devel wget vim3. 检查环境./configure --prefix=/usr/local/php8/ --with-config-file-path=/usr/local/php8/etc/ --with-curl --with-freetype-dir --with-gd --with-iconv-dir --with-kerberos --with-libdir=lib64 --with-libxml-dir --with-mysqli --with-openssl --with-pcre-regex --with-pdo-sqlite --with-pear --with-png-dir --with-jpeg --with-xmlrpc --with-xsl --with-zlib --with-bz2 --enable-fpm --enable-bcmath --enable-libxml --enable-inline-optimization --enable-gd-native-ttf --enable-mbregex --with-pdo-mysql --enable-gd --enable-opcache --enable-pcntl --enable-shmop --enable-soap --enable-sockets --enable-sysvsem --enable-sysvshm --enable-zip --with-ldap4. 编译过程[root@php-server php84]# make5. 编译安装(出现以下表示编译成功)[root@php-server php84]# make install Installing shared extensions: /usr/local/php8/lib/php/extensions/no-debug-non-zts-20240924/ Installing PHP CLI binary: /usr/local/php8/bin/ Installing PHP CLI man page: /usr/local/php8/php/man/man1/ Installing PHP FPM binary: /usr/local/php8/sbin/ Installing PHP FPM defconfig: /usr/local/php8/etc/ Installing PHP FPM man page: /usr/local/php8/php/man/man8/ Installing PHP FPM status page: /usr/local/php8/php/php/fpm/ Installing phpdbg binary: /usr/local/php8/bin/ Installing phpdbg man page: /usr/local/php8/php/man/man1/ Installing PHP CGI binary: /usr/local/php8/bin/ Installing PHP CGI man page: /usr/local/php8/php/man/man1/ Installing build environment: /usr/local/php8/lib/php/build/ Installing header files: /usr/local/php8/include/php/ Installing helper programs: /usr/local/php8/bin/ program: phpize program: php-config Installing man pages: /usr/local/php8/php/man/man1/ page: phpize.1 page: php-config.1 Installing PEAR environment: /usr/local/php8/lib/php/6. 需要安装依赖获取方式：RPM resource oniguruma[root@php-server ~ ]# wget https://www.rpmfind.net/linux/almalinux/8.10/AppStream/x86_64/os/Packages/oniguruma-6.8.2-3.el8.x86_64.rpm [root@php-server ~ ]# wget https://www.rpmfind.net/linux/almalinux/8.10/PowerTools/x86_64/os/Packages/oniguruma-devel-6.8.2-3.el8.x86_64.rpm [root@php-server ~ ]# dnf -y install oniguruma-6.8.2-3.el8.x86_64.rpm oniguruma-devel-6.8.2-3.el8.x86_64.rpm7. 启动PHPCopy PHP的配置文件[root@php-server php8]# cp ../php84/php.ini-development etc/php.ini [root@php-server php8]# cp etc/php php-fpm.conf.default php-fpm.d/ php.ini-development [root@php-server php8]# cp etc/php-fpm.d/www.conf.default etc/php-fpm.d/www.conf [root@php-server php8]# cp etc/php-fpm.conf.default etc/php-fpm.conf启动 [root@php-server php8]# sbin/php-fpm查看进程[root@php-server php8]# ss -luntp Netid State Recv-Q Send-Q Local Address:Port Peer Address:Port Process tcp LISTEN 0 128 0.0.0.0:22 0.0.0.0:* users:(("sshd",pid=790,fd=3)) tcp LISTEN 0 2048 127.0.0.1:9000 0.0.0.0:* users:(("php-fpm",pid=150797,fd=5),("php-fpm",pid=150796,fd=5),("php-fpm",pid=150795,fd=7)) tcp LISTEN 0 128 [::]:22 [::]:* users:(("sshd",pid=790,fd=4)) [root@php-server php8]# lsof -i:9000 COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME php-fpm 150795 root 7u IPv4 265939 0t0 TCP localhost:cslistener (LISTEN) php-fpm 150796 nobody 5u IPv4 265939 0t0 TCP localhost:cslistener (LISTEN) php-fpm 150797 nobody 5u IPv4 265939 0t0 TCP localhost:cslistener (LISTEN) 修改PHP服务监听的IP地址；（默认是监听127.0.0.1）修改监听地址[root@php-server php8]# cat etc/php-fpm.d/www.conf | grep listen ; - 'listen' (unixsocket) ; 'ip.add.re.ss:port' - to listen on a TCP socket to a specific IPv4 address on ; '[ip:6:addr:ess]:port' - to listen on a TCP socket to a specific IPv6 address on ; 'port' - to listen on a TCP socket to all addresses ; '/path/to/unix/socket' - to listen on a unix socket. ;listen = 127.0.0.1:9000 ;listen = 0.0.0.0:9000 #监听本机的所有网卡 listen = 192.168.107.119:9000 重启[root@php-server php8]# pkill php-fpm [root@php-server php8]# ss -luntp Netid State Recv-Q Send-Q Local Address:Port Peer Address:Port Process tcp LISTEN 0 128 0.0.0.0:22 0.0.0.0:* users:(("sshd",pid=790,fd=3)) tcp LISTEN 0 128 [::]:22 [::]:* users:(("sshd",pid=790,fd=4)) [root@php-server php8]# sbin/php-fpm [root@php-server php8]# ss -lutnp Netid State Recv-Q Send-Q Local Address:Port Peer Address:Port Process tcp LISTEN 0 128 0.0.0.0:22 0.0.0.0:* users:(("sshd",pid=790,fd=3)) tcp LISTEN 0 2048 192.168.107.119:9000 0.0.0.0:* users:(("php-fpm",pid=150815,fd=5),("php-fpm",pid=150814,fd=5),("php-fpm",pid=150813,fd=7)) tcp LISTEN 0 128 [::]:22
错误信息[y40@localhost ~]$ sudo vgextend rhel /dev/sdb /dev/sdc Cannot use /dev/sdb: device is partitioned Cannot use /dev/sdc: device is partitioned原因：是因为磁盘里的数据没有清楚赶紧导致错误信息解决方法：[y40@localhost ~]$ sudo wipefs --all --backup /dev/sdb /dev/sdb：8 个字节已擦除，位置偏移为 0x00000200 (gpt)：45 46 49 20 50 41 52 54 /dev/sdb：8 个字节已擦除，位置偏移为 0x773c255e00 (gpt)：45 46 49 20 50 41 52 54 /dev/sdb：2 个字节已擦除，位置偏移为 0x000001fe (PMBR)：55 aa [y40@localhost ~]$ sudo wipefs --all --backup /dev/sdc /dev/sdc：8 个字节已擦除，位置偏移为 0x00000200 (gpt)：45 46 49 20 50 41 52 54 /dev/sdc：8 个字节已擦除，位置偏移为 0x7470c05e00 (gpt)：45 46 49 20 50 41 52 54 /dev/sdc：2 个字节已擦除，位置偏移为 0x000001fe (PMBR)：55 aa /dev/sdc：将调用 ioctl 来重新读分区表：成功再次创建PV[y40@localhost ~]$ sudo pvcreate /dev/sdb /dev/sdc Physical volume "/dev/sdb" successfully created. Physical volume "/dev/sdc" successfully created.
一、修改配置/etc/netplan``root@y36-server-ubuntucom:~# cat /etc/netplan/50-cloud-init.yaml # This file is generated from information provided by the datasource. Changes # to it will not persist across an instance reboot. To disable cloud-init's # network configuration capabilities, write a file # /etc/cloud/cloud.cfg.d/99-disable-network-config.cfg with the following: # network: {config: disabled} network: ethernets: enp7s0: dhcp4: true dhcp6: false version: 2 bridges: bri0: interfaces: [enp7s0] addresses: [192.168.107.67/24] gateway4: 192.168.107.254 routes: - to: default via: 192.168.99.1 nameservers: addresses: - 114.114.114.114 - 8.8.8.8 - 8.8.4.4 parameters: stp: true forward-delay: 4 dhcp4: no 切记：注意缩进二、测试文件配置文件是否有误root@y36-server-ubuntucom:~# sudo netplan try 三、应用配置文件root@y36-server-ubuntucom:~# sudo netplan apply
如何在 Linux 上清除 RAM 内存缓存、缓冲区和交换空间
像任何其他操作系统一样，GNU/Linux 已经有效地实现了内存管理，甚至不止于此。但是，如果任何进程正在消耗您的内存并且您想要清除它，Linux 提供了一种刷新或清除 RAM 缓存的方法。在本文中，我们将探讨如何在 Linux 系统上清除 RAM 内存缓存、缓冲区和交换空间以提高整体性能。让我们探索 Linux 系统上的 RAM 内存缓存、缓冲区和交换空间。 RAM Memory Cache RAM内存缓存 RAM内存缓存是内核用来保存定期访问的数据的一种机制。虽然这提高了系统响应能力，但缓存过载可能会导致过时数据的保留，从而影响性能。 Buffer缓冲区 与缓存一样，缓冲区临时保存数据，但用途不同。缓冲区存储在 CPU 和硬盘等组件之间传输的数据，从而促进顺畅通信。但是，过多的缓冲数据会阻碍系统速度。Swap Space 交换空间 交换空间是硬盘上分配的区域，当物理 RAM 耗尽时充当虚拟内存。虽然它可以防止由于内存不足而导致系统崩溃，但如果过度使用，它可能会降低系统速度。清除 Linux 中的缓存、缓冲区和交换空间在某些情况下，您可能需要清除缓存、缓冲区或交换空间，如下所述。清除 PageCache要仅清除 PageCache，您可以使用以下命令，该命令将专门清除 PageCache，从而帮助释放内存资源。# sync; echo 1 > /proc/sys/vm/drop_caches要仅清除 dentries 和 inode，您可以使用以下命令，该命令将同步文件系统并清除 dentries 和 inode，通过释放缓存的目录和 inode 信息来提高系统性能。# sync; echo 2 > /proc/sys/vm/drop_caches清除 PageCache、dentry 和 Inode要清除 pagecache、dentries 和 inode，您可以使用以下命令，该命令将同步文件系统并清除 pagecache、dentries 和 inode，从而有助于释放内存并提高系统性能。# sync; echo 3 > /proc/sys/vm/drop_caches下面是对上述命令的每个部分的说明：sync:将刷新文件系统缓冲区。“;”:分号用于分隔一行上的多个命令。echo 3 > /proc/sys/vm/drop_caches: 命令用于删除页面缓存，这是最近访问的文件的临时存储区域。注意：drop_caches文件控制应清除哪种类型的缓存数据，其值如下：1 – 仅清除页面缓存。2 – 清除 dentries 和 inode。3 – 清除页面缓存、dentries 和 inode。正如内核文档中提到的，写入 drop_caches 将清理缓存而不会杀死任何应用程序/服务，命令 echo 正在执行写入文件的工作。如果必须清除磁盘缓存，则第一个命令在企业和生产环境中最安全，因为“...echo 1 > ….” 将仅清除 PageCache。不建议使用上面的第三个选项“...echo 3 >”，直到你知道自己在做什么，因为它会清除页面缓存、dentries 和 inode。如何在 Linux 中清除交换空间？要清除交换空间，可以使用带有 -a 选项的 swapoff 命令，这将禁用所有交换分区。# swapoff -a然后，通过运行以下命令将其转回，这将激活所有交换分区# swapon -a在 Linux 中释放缓冲区、缓存和交换是否可取？通常，在 Linux 中手动释放 Linux 内核可能使用的缓冲区和缓存不是一个好主意，Linux 内核旨在有效地管理这些资源，手动清除它们可能会破坏系统性能。但是，在极少数情况下，您需要清除缓冲区和缓存，例如，如果您遇到严重的内存压力并且无法通过其他方式释放内存。在这些情况下，您应该谨慎行事，并注意潜在的性能影响。同样，在正常情况下，在 Linux 中清除交换空间通常不是例行或可取的做法。自动执行内存优化要自动执行该过程并定期清除内存，您可以设置一个 cron 作业以按指定的时间间隔运行命令。打开 crontab 配置# crontab -e添加以下行以在每天午夜清除缓存、缓冲区和交换空间：0 0 * * * sudo sync; echo 3 > /proc/sys/vm/drop_caches 0 0 * * * sudo echo 1 > /proc/sys/vm/drop_caches 0 0 * * * sudo sync; echo 2 > /proc/sys/vm/drop_caches 0 0 * * * sudo swapoff -a && sudo swapon -a是否建议清除 Linux 生产服务器上的 RAM 缓存？考虑这样一种情况：您已安排一个脚本在每天凌晨 2 点清除 RAM 缓存。每天凌晨 2 点，执行脚本，刷新 RAM 缓存。然而，有一天，你的网站上有出乎意料的大量用户在线，对你的服务器资源有很大的需求。同时，计划的脚本运行并清除缓存中的所有内容。现在，所有用户都从磁盘检索数据，这可能会导致服务器崩溃和数据库损坏。因此，只有在必要时才清除 RAM 缓存，并注意您的操作。否则，您将面临成为 Cargo Cult 系统管理员的风险。结论高效的内存管理对于Linux系统的顺利运行至关重要。定期清除RAM内存缓存、缓冲区和交换空间可以显着提高系统性能。通过了解这些机制并使用提供的命令，您可以使 Linux 系统保持最佳运行状态。
nginx 部署yum｜dnf 源部署nginx 依赖与第三方源 epel1、安装第三方源[root@localhost lvm-test]# yum -y install epel-release [root@localhost lvm-test]# ls /etc/yum.repos.d/ a.repo_bak bak CentOS-Base.repo epel.repo epel-testing.repo2、查找nignx服务[root@localhost lvm-test]# yum search nginx3、安装nginx[root@localhost lvm-test]# yum install nginx -y 4、启动nginx服务789版本systemclt[系统管理命令] start(开启)｜stop(停止) | reload(重新加载)| enable (开机自启服务) | disable(开机不自启动) [服务的名称] [root@localhost lvm-test]# systemctl start nginx 6版本serivce [服务名称] start ｜stop5、添加防火墙规则7 8 firewalld#临时修改 [root@localhost lvm-test]# firewall-cmd --add-port=80/tcpiptables6、修改Selinux查看selinux状态[root@localhost lvm-test]# getenforce Enforcing #严格模式设置Selinux#临时修改 [root@localhost lvm-test]# setenforce 0 0#表示宽松模式 1#严谨模式Seliunx 工作流程图：7、测试使用搜索引擎浏览器在地址栏中：http://serverIP
一、 什么是nginxnginx [engine x]是一个HTTP和反向代理服务器、邮件代理服务器和通用TCP/UDP代理服务器，最初由Igor Sysoev编写。长期以来，它一直在许多重负载的俄罗斯网站上运行，包括Yandex、Mail.Ru、VK和Rambler。据Netcraft称，nginx在2024年3月服务或代理了20.63%最繁忙的网站。以下是一些成功故事：Dropbox、Netflix、Wordpress.com、FastMail.FM。 我们在学习Nginx时也采用同样的方式,先来看看Nginx的竞争对手——Apache、Lighttpd、Tomcat、Jetty、IIS,它们都是Web服务器,或者叫做WWW(World Wide Web)服务器,相应地也都具备Web服务器的基本功能:基于REST架构风格 ,以统一资源描述符(Uniform Resource Identifier,URI)或者统一资源定位符(Uniform Resource Locator,URL)作为沟通依据,通过HTTP为浏览器等客户端程序提供各种网络服务。 Tomcat和Jetty面向Java语言,先天就是重量级的Web服务器,它的性能与Nginx没有可比性。apache的特点 Apache有许多优点,如稳定、开源、跨平台等,但它出现的时间太长了,在它兴起的年代,互联网的产业规模远远比不上今天,所以它被设计成了一个重量级的、不支持高并发的Web服务器。为什么选择Nginx更快这表现在两个方面:一方面,在正常情况下,单次请求会得到更快的响应;另一方面,在高峰期(如有数以万计的并发请求),Nginx可以比其他Web服务器更快地响应请求；高扩展性Nginx的设计极具扩展性,它完全是由多个不同功能、不同层次、不同类型且耦合度极低的模块组成；高可靠性高可靠性是我们选择Nginx的最基本条件,因为Nginx的可靠性是大家有目共睹的,很多家高流量网站都在核心服务器上大规模使用Nginx；低内存消耗一般情况下,10000个非活跃的HTTP Keep-Alive连接在Nginx中仅消耗2.5MB的内存,这是Nginx支持高并发连接的基础；单机支持10万以上的并发连接这是一个非常重要的特性!随着互联网的迅猛发展和互联网用户数量的成倍增长,各大公司、网站都需要应付海量并发请求,一个能够在峰值期顶住10万以上并发请求的Server,热部署master管理进程与worker工作进程的分离设计,使得Nginx能够提供热部署功能,即可以在7×24小时不间断服务的前提下,升级Nginx的可执行文件；最自由的BSD许可协议这是Nginx可以快速发展的强大动力。BSD许可协议不只是允许用户免费使用Nginx,它还允许用户在自己的项目中直接使用或修改Nginx源码,然后发布；Apache拥有丰富的模块组件支持，稳定性强，BUG少，动态内容处理强。Nginx轻量级，占用资源少，负载均衡，高并发处理强，静态内容处理高效nginx 官网nginx 官网地址nginx 软件下载nginx 官方文档
什么是逻辑卷LVM是Linux的逻辑卷管理器。它提供了对磁盘空间的管理，与基于主和逻辑分区的标准磁盘分区相比，磁盘空间更灵活，限制更少。LVM受到所有主要Linux发行版的支持，它甚至在Fedora和RHEL上默认使用在计算机存储中，逻辑卷管理或LVM提供了一种在大容量存储设备上分配空间的方法，这种方法比传统的分区方案更灵活地存储卷。特别是，卷管理器可以连接、条带在一起或以其他方式将分区（或一般块设备）组合成更大的虚拟分区，管理员可以调整大小或移动，可能不会中断系统使用。LVM是一个用于逻辑卷管理的工具，包括分配磁盘、条带、镜像和调整逻辑卷大小。使用LVM，硬盘驱动器或一组硬盘驱动器被分配给一个或多个物理卷。LVM物理卷可以放置在可能跨越两个或更多磁盘的其他块设备上.物理卷被合并成逻辑卷，但/boot分区除外。/boot分区不能在逻辑卷组上，因为引导加载程序无法读取它。如果根（/）分区位于逻辑卷上，请创建一个单独的/boot分区，该分区不是卷组的一部分。由于物理卷不能跨越多个驱动器，要跨越多个驱动器，请为每个驱动器创建一个或多个物理卷。用途LVM用于以下目的：创建多个物理卷或整个硬盘的单个逻辑卷（有点类似于RAID 0，但更类似于JBOD），允许动态重新调整卷大小。通过允许添加和更换磁盘，而不会停机或服务中断，结合热交换来管理大型硬盘更换。在小型系统（如桌面）上，LVM无需在安装时估计分区需要多大，而是允许文件系统根据需要轻松调整大小。通过拍摄逻辑卷的快照来执行一致的备份。用一个密码加密多个物理分区专业术语物理卷（Physical Volumes 缩写pv）这是LVM使用的物理存储。它可能是整个磁盘或现有分区。卷组（Volume Group vg）这是一个或多个物理卷的集合，它包含逻辑卷。逻辑卷（Logical Volume lv）这是LVM提供的空间，您可以将其用作分区来制作文件系统和存储文件。PE最小存储单元，默认大小（4MB）逻辑卷的管理在Linux系统中如果没有LVM的命令（最小化安装） [root@localhost ~]# dnf search lvm ======================================================= Name Matched: lvm ======================================================== llvm.i686 : The Low Level Virtual Machine llvm.x86_64 : The Low Level Virtual Machine lvm2.x86_64 : Userland logical volume management tools [root@localhost ~]# dnf -y install lvm2.x86_64一、 物理卷管理1.1 创建物理卷命令： pvcreate描述：初始化磁盘或分区供 LVM 使用。Ex:[root@localhost ~]# pvcreate /dev/vdb Wiping dos signature on /dev/vdb. Physical volume "/dev/vdb" successfully created.1.2 查看pv命令： pvdisplay描述： 显示所有的物理卷语法： pvdisplay [pv_name]Ex:[root@localhost ~]# pvdisplay "/dev/vdb" is a new physical volume of "20.00 GiB" --- NEW Physical volume --- PV Name /dev/vdb VG Name PV Size 20.00 GiB Allocatable NO PE Size 0 Total PE 0 Free PE 0 Allocated PE 0 PV UUID jzEyr7-KheP-2PiZ-G1Pz-b1xq-cZcc-G4gzkb1.3 删除 PV命令：pvremove描述： 移除逻辑卷 Ex:[root@localhost ~]# pvremove -f /dev/vdb Labels on physical volume "/dev/vdb" successfully wiped 二、 卷组管理2.1 创建卷组命令：vgcreate语法：vgcreate 卷组名称 {物理卷1 物理卷2 物理卷n}Ex：[root@localhost ~]# vgcreate test_vg /dev/vdb Volume group "test_vg" successfully created2.2 显示卷组 命令： vgdisplayEx:[root@localhost ~]# vgdisplay --- Volume group --- VG Name test_vg System ID Format lvm2 Metadata Areas 1 Metadata Sequence No 1 VG Access read/write VG Status resizable MAX LV 0 Cur LV 0 Open LV 0 Max PV 0 Cur PV 1 Act PV 1 VG Size <20.00 GiB PE Size 4.00 MiB Total PE 5119 Alloc PE / Size 0 / 0 Free PE / Size 5119 / <20.00 GiB VG UUID 3WGvBc-dyNf-1eYn-gIsi-V2zO-OPND-8YlIBY2.3 删除卷组命令： vgremove Ex:[root@localhost ~]# vgremove test_vg Volume group "test_vg" successfully removed三、 逻辑卷管理3.1 创建逻辑卷命令： lvcreate语法： lvcreate [选项] 逻辑卷的名称 VG选项：-L #指定逻辑卷的大小，单位G M K -i #指定raid的级别，磁盘阵列-l #以逻辑扩展为单位指定新 LV 的大小-n #指定逻辑卷的名称Ex:[root@localhost ~]# lvcreate -L5G test_vg WARNING: ext4 signature detected on /dev/test_vg/lvol0 at offset 1080. Wipe it? [y/n]: y Wiping ext4 signature on /dev/test_vg/lvol0. Logical volume "lvol0" created.3.2 查看逻辑卷[root@localhost ~]# lvdisplay --- Logical volume --- LV Path /dev/test_vg/lvol0 LV Name lvol0 VG Name test_vg LV UUID FZ32YS-sg2B-etWG-Y84C-hqyR-gaHG-9TCYnj LV Write Access read/write LV Creation host, time localhost, 2024-05-18 15:34:06 +0800 LV Status available # open 0 LV Size 5.00 GiB Current LE 1280 Segments 1 Allocation inherit Read ahead sectors auto - currently set to 8192 Block device 252:03.3 移除逻辑卷[root@localhost ~]# lvremove /dev/test_vg/lvol0 Do you really want to remove active logical volume test_vg/lvol0? [y/n]: y Logical volume "lvol0" successfully removed.3.4 扩容命令： lvextend描述：Add space to a logical volume 为逻辑卷添加空间Ex:[root@bogon ~]# lvextend -L 10G /dev/test_vg/test_lv Size of logical volume test_vg/test_lv changed from 5.00 GiB (1280 extents) to 10.00 GiB (2560 extents). Logical volume test_vg/test_lv successfully resized. [root@bogon ~]# lvdisplay --- Logical volume --- LV Path /dev/test_vg/test_lv LV Name test_lv VG Name test_vg LV UUID 9c1tLT-Dyul-qvWp-QdsN-pAYA-oyba-XeyKeW LV Write Access read/write LV Creation host, time localhost, 2024-05-18 15:46:39 +0800 LV Status available # open 1 LV Size 10.00 GiB Current LE 2560 Segments 1 Allocation inherit Read ahead sectors auto - currently set to 8192 Block device 252:0 #刷新文件系统 - resize2fs 支持`ext2,3,4` 不支持xfs - xfs_growfs 支持xfs文件系统 [root@bogon ~]# xfs_growfs /dev/mapper/test_vg-test_lv meta-data=/dev/mapper/test_vg-test_lv isize=512 agcount=4, agsize=327680 blks = sectsz=512 attr=2, projid32bit=1 = crc=1 finobt=1, sparse=1, rmapbt=0 = reflink=1 bigtime=0 inobtcount=0 data = bsize=4096 blocks=1310720, imaxpct=25 = sunit=0 swidth=0 blks naming =version 2 bsize=4096 ascii-ci=0, ftype=1 log =internal log bsize=4096 blocks=2560, version=2 = sectsz=512 sunit=0 blks, lazy-count=1 realtime =none extsz=4096 blocks=0, rtextents=0 data blocks changed from 1310720 to 2621440 [root@bogon ~]# df -h Filesystem Size Used Avail Use% Mounted on devtmpfs 1.8G 0 1.8G 0% /dev tmpfs 1.8G 0 1.8G 0% /dev/shm tmpfs 1.8G 25M 1.8G 2% /run tmpfs 1.8G 0 1.8G 0% /sys/fs/cgroup /dev/vda3 17G 5.1G 12G 30% / /dev/vda2 2.0G 47M 2.0G 3% /home /dev/vda1 1014M 212M 803M 21% /boot /dev/mapper/test_vg-test_lv 10G 104M 9.9G 2% /test_lv tmpfs 367M 0 367M 0% /run/user/0四、 格式化逻辑卷(创建文件系统)[root@localhost ~]# mkfs.xfs /dev/test_vg/test_lv meta-data=/dev/test_vg/test_lv isize=512 agcount=4, agsize=327680 blks = sectsz=512 attr=2, projid32bit=1 = crc=1 finobt=1, sparse=1, rmapbt=0 = reflink=1 bigtime=0 inobtcount=0 data = bsize=4096 blocks=1310720, imaxpct=25 = sunit=0 swidth=0 blks naming =version 2 bsize=4096 ascii-ci=0, ftype=1 log =internal log bsize=4096 blocks=2560, version=2 = sectsz=512 sunit=0 blks, lazy-count=1 realtime =none extsz=4096 blocks=0, rtextents=0五、 挂载使用5.1 临时挂载[root@localhost ~]# mkdir /lv_tst [root@localhost ~]# mount /dev/test_vg/test_lv /lv_tst/ [root@localhost ~]# df -h Filesystem Size Used Avail Use% Mounted on devtmpfs 1.8G 0 1.8G 0% /dev tmpfs 1.8G 0 1.8G 0% /dev/shm tmpfs 1.8G 17M 1.8G 1% /run tmpfs 1.8G 0 1.8G 0% /sys/fs/cgroup /dev/vda3 17G 5.1G 12G 30% / /dev/vda2 2.0G 47M 2.0G 3% /home /dev/vda1 1014M 212M 803M 21% /boot tmpfs 367M 0 367M 0% /run/user/0 /dev/sr0 12G 12G 0 100% /mnt /dev/mapper/test_vg-test_lv 5.0G 68M 5.0G 2% /lv_tst5.2 永久挂载实现永久挂载，需要修改主配置文件 /etc/fstab[root@localhost ~]# cat /etc/fstab UUID=787a972d-9811-42a3-b57b-8ecb567e23a4 / xfs defaults 0 0 UUID=2ccfb650-c2b0-4822-bea5-b8da75434b52 /boot xfs defaults 0 0 UUID=0541f6b0-a7f4-4566-8e63-30b87aa83a01 /home xfs defaults 0 0 # 挂载的目录 挂载点 文件系统 defaults 0 0 UUID=9c1tLT-Dyul-qvWp-QdsN-pAYA-oyba-XeyKeW /test_lv xfs defaults 0 0 或者使用文件的路径 /dev/test_vg/test_lv /test_lv xfs defaults 0 0 # 获取UUID [root@localhost ~]# blkid /dev/vdb: UUID="V6TrIv-Aip2-gyat-kxAa-6mK0-3zPL-zzRWEY" TYPE="LVM2_member" /dev/mapper/test_vg-test_lv: UUID="f4366c5b-231b-47d8-a39a-41fc0b55c8b9" BLOCK_SIZE="512" TYPE="xfs"切记：不能写错5.2.1 测试文件是否输入正确[root@localhost ~]# mount -a #读取/etc/fastab文件中的所有内容 [root@localhost ~]# df -h Filesystem Size Used Avail Use% Mounted on /dev/mapper/test_vg-test_lv 5.0G 68M 5.0G 2% /test_lv案例[root@localhost ~]# pvcreate /dev/vd{c..e} Physical volume "/dev/vdc" successfully created. Physical volume "/dev/vdd" successfully created. Physical volume "/dev/vde" successfully created. # 创建卷组 vgcreate my_test_vg /dev/vdc /dev/vdd #创建逻辑卷 lvcreate -L 10G -n test_lv_test my_test_vg #创建文件系统 mkfs.ext4 /dev/my_test_vg/test_lv_test #创建挂载点 mkdir /test_lv_1 #挂载测试 mount /dev/my_test_vg/test_lv_test /test_lv_1/ #扩容 lvextend -L 15G /dev/my_test_vg/test_lv_test #刷新文件系统 [root@localhost ~]# resize2fs /dev/my_test_vg/test_lv_test resize2fs 1.45.6 (20-Mar-2020) Filesystem at /dev/my_test_vg/test_lv_test is mounted on /test_lv_1; on-line resizing required old_desc_blocks = 2, new_desc_blocks = 2 The filesystem on /dev/my_test_vg/test_lv_test is now 3932160 (4k) blocks long. #验证 [root@localhost ~]# df -h Filesystem Size Used Avail Use% Mounted on /dev/mapper/my_test_vg-test_lv_test 15G 24K 14G 1% /test_lv_1 # 添加物理卷到卷组中 [root@localhost ~]# vgextend my_test_vg /dev/vd vda vda1 vda2 vda3 vdb vdc vdd vde [root@localhost ~]# vgextend my_test_vg /dev/vde Volume group "my_test_vg" successfully extended [root@localhost ~]# vgdisplay my_test_vg --- Volume group --- VG Name my_test_vg System ID Format lvm2 Metadata Areas 3 Metadata Sequence No 3 VG Access read/write VG Status resizable MAX LV 0 Cur LV 1 Open LV 1 Max PV 0 Cur PV 3 Act PV 3 VG Size <29.99 GiB PE Size 4.00 MiB Total PE 7677 Alloc PE / Size 2560 / 10.00 GiB Free PE / Size 5117 / <19.99 GiB VG UUID a5wcDK-0edK-LzGd-BV5a-GaSk-wuk3-iVEfct
介绍WebVirtMgr是一个基于libvirt的Web界面，用于管理虚拟机。它允许您创建和配置新域，并调整域的资源分配。VNC查看器向来宾域显示一个完整的图形控制台。KVM是目前唯一支持的虚拟机管理程序。技术：应用程序逻辑是用Python和Django编写的。LIBVIRT Python绑定用于与底层虚拟机管理程序交互。安装1. 查看系统版本[root@web ~]# hostnamectl Static hostname: web.server.com Icon name: computer-desktop Chassis: desktop Machine ID: e57ef32020fa406d9bbee213aba339ed Boot ID: 5a70728f01fd4402a40d90d47e3f10df Operating System: CentOS Linux 7 (Core) CPE OS Name: cpe:/o:centos:centos:7 Kernel: Linux 3.10.0-1160.114.2.el7.x86_64 Architecture: x86-642. 安装]# yum -y install http://dl.fedoraproject.org/pub/epel/7/x86_64/e/epel-release ]# yum -y install git python-pip libvirt-python libxml2-python python-websockify supervisor nginx gcc python-devel ]# pip3 install numpy 3.安装python要求并设置Django环境[root@web ~]# git clone https://github.com/retspen/webvirtmgr.git [root@web ~]# cd webvirtmgr [root@web webvirtmgr]# pip install -r requirements.txt4.同步用户数据[root@web webvirtmgr]# ./manage.py syncdb WARNING:root:No local_settings file found. Creating tables ... Creating table auth_permission Creating table auth_group_permissions Creating table auth_group Creating table auth_user_groups Creating table auth_user_user_permissions Creating table auth_user Creating table django_content_type Creating table django_session Creating table django_site Creating table servers_compute Creating table instance_instance Creating table create_flavor You just installed Django's auth system, which means you don't have any superusers defined. Would you like to create one now? (yes/no): yes Username (leave blank to use 'root'): root Email address: Password: Password (again): Superuser created successfully. Installing custom SQL ... Installing indexes ... Installed 6 object(s) from 1 fixture(s)5.添加一个超级用户[root@web webvirtmgr]# ./manage.py createsuperuser Username: abbott Email address: Password: Password (again): Superuser created successfully.运行服务[root@web webvirtmgr]# ./manage.py runserver & 默认端口："8000"6.配置Nginx作为web代理6.1 将项目文件拷贝到/var/www/在/etc/nginx/conf.d添加文件webvirtmgr.conf:[root@web webvirtmgr]# cp webvirtmgr /var/www/ -R6.2 配置nginx代理server { listen 80 default_server; server_name $hostname; #access_log /var/log/nginx/webvirtmgr_access_log; location /static/ { root /var/www/webvirtmgr/webvirtmgr; # or /srv instead of /var expires max; } location ~ .*\.(js|css)$ { proxy_pass http://127.0.0.1:8000; } location / { proxy_pass http://127.0.0.1:8000; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-for $proxy_add_x_forwarded_for; proxy_set_header Host $host:$server_port; proxy_set_header X-Forwarded-Proto $scheme; proxy_connect_timeout 600; proxy_read_timeout 600; proxy_send_timeout 600; client_max_body_size 1024M; # Set higher depending on your needs } }6.3 检查nginx配置语法是否正确[root@web nginx]# nginx -t nginx: the configuration file /etc/nginx/nginx.conf syntax is ok nginx: configuration file /etc/nginx/nginx.conf test is successful6.4 启动nginx[root@web nginx]# systemctl start nginx [root@web nginx]# systemctl enable nginx最终实现
1. 创建用户在Linux系统中，redhat系列 命令： useradd 描述：创建新用户或更新默认的新用户信息语法： useradd [options] user_name选项：-d, --home-dir HOME_DIR home directory of the new account -u, --uid UID user ID of the new account -m, --create-home create the user's home directory -s, --shell SHELL login shell of the new account -M, --no-create-home 不创建家目录Example 1: 创建一个新的普通用户[root@localhost ~]# useradd dev检查用户是否创建成功[root@localhost ~]# id dev uid=1000(dev) gid=1000(dev) groups=1000(dev) uid: user ID #用户ID gid：group ID #组ID groups: #组名称Example 2: 给用户创建密码命令： passwd[root@localhost ~]# passwd dev Changing password for user dev. New password: #输入一次密码 BAD PASSWORD: The password is shorter than 8 characters #不满足密码的要求 Retype new password: #确认密码 passwd: all authentication tokens updated successfully.Example 3: 使用普通用户登录系统[root@web ~]# ssh dev@192.168.212.161Example 4: 创建新用户的时候且指定家目录[root@localhost ~]# useradd dev03 -d /opt/dev03验证结果：Example 5: 创建用户时指定uid 用户ID [root@localhost ~]# useradd dev04 -u 1100 [root@localhost ~]# id dev04 uid=1100(dev04) gid=1100(dev04) groups=1100(dev04)Example 6: 创建伪用户，不能登录shell 环境[root@localhost ~]# useradd dev05 -s /sbin/nologin [root@localhost ~]# id dev05 uid=1101(dev05) gid=1101(dev05) groups=1101(dev05) [root@localhost ~]# ls /home/ dev dev01 dev04 dev05 #测试 显示用户无法登录系统 [root@localhost ~]# su - dev05 This account is currently not available. # 创建用户时，指定不能登录shell环境，且不创建家目录 [root@localhost ~]# useradd dev06 -M -s /sbin/nologin #验证是否创建家目录 [root@localhost ~]# ls /home/ dev dev01 dev04 dev05 [root@localhost ~]# 在debin （ubuntu）系列中命令： adduser2. 删除用户命令：userdel语法：userdel [options] [user_name]example 1: 删除用户[root@localhost ~]# userdel dev06 [root@localhost ~]# id dev06 id: 'dev06': no such user [root@localhost ~]# id dev05 uid=1101(dev05) gid=1101(dev05) groups=1101(dev05) [root@localhost ~]# userdel dev05 [root@localhost ~]# id dev05 id: 'dev05': no such userexample 2: 删除用户的所有文件[root@localhost ~]# userdel -r dev05 [root@localhost ~]# ls /home/ dev dev01 dev04修改用户命令：usermod语法：usermod [options] [user_name]Example 1: 修改用户的uid[root@localhost ~]# useradd dev01 [root@localhost ~]# id dev01 uid=1000(dev01) gid=1000(dev01) groups=1000(dev01) [root@localhost ~]# [root@localhost ~]# usermod -u 1001 dev01 [root@localhost ~]# id dev01 uid=1001(dev01) gid=1000(dev01) groups=1000(dev01)Example 2: 修改用户的家目录[root@localhost ~]# mkdir /opt/dev01 [root@localhost ~]# usermod -d /opt/dev01 dev01 测试： [root@localhost ~]# su - dev01 Last login: Sat Apr 13 16:36:49 CST 2024 on pts/0 [dev01@localhost ~]$ pwd /opt/dev01 关于用户的主配置文件/etc/passwd # 用户的主配置文件/etc/shadow # 用户的密码文件主配置文件[root@localhost ~]# cat /etc/passwd |grep dev tss:x:59:59:Account used for TPM access:/dev/null:/sbin/nologin dev01:x:1001:1000::/opt/dev01:/bin/bash dev03:x:1100:1100::/opt/dev03:/sbin/nologin 以冒号(:)作为分隔符 dev03:x:1100:1100::/opt/dev03:/sbin/nologin 第一个字段 #用户名 第二个字段 #密码占位符 第三个字段 #用户的ID 第四个字段 #用户组ID 第五个字段 #描述信息 第六个字段 #用户的家目录 第七个字段 #用户是否可以登录shell环境 用户的密码文件[root@localhost ~]# cat /etc/shadow root:$1$ruWCBuGb$dP9mCNiYN1mUuhiKZYo1b.::0:99999:7::: dev03:$6$NYLpnJrtz7T0o0A0$OvJkT3iQEalo0yl2Ht4HZse22:19826:0:99999:7::: 以冒号(:)作为分隔符 第一个字段 #用户名 第二个字段 #用户的密码 第三个字段 #最后修改时间 第四个字段 #最小间隔时间 第五个字段 #最大间隔时间 第六个字段 #警告时间 第七、八个字段 #保留字段切换用户命令：su语法： su [options][username]Example 1 切换用户当不切换所在的位置 - #切换用户的时候，连目录一起切换（系统环境） root@localhost ~]# su - dev04 [dev04@localhost ~]$ pwd /home/dev04