修改boot.wim获取wim索引信息D:\windows_7>dism /Get-ImageInfo /imagefile:src\sources\boot.wim 部署映像服务和管理工具 版本: 10.0.17763.5830 映像详细信息: src\sources\boot.wim 索引: 1 名称: Microsoft Windows PE (x64) 描述: Microsoft Windows PE (x64) 大小: 1,158,437,921 字节 索引: 2 名称: Microsoft Windows Setup (x64) 描述: Microsoft Windows Setup (x64) 大小: 1,257,727,060 字节 操作成功完成。挂载boot.wim第一个映像D:\windows_7>dism /Mount-Image /ImageFile:src\sources\boot.wim /Index:1 /MountDir:"mount" 部署映像服务和管理工具 版本: 10.0.17763.5830 正在安装映像 [==========================100.0%==========================] 操作成功完成。 /MountDir:"mount"：挂载到当前工作目录下的mount文件夹。添加NVMe支持D:\windows_7>dism /Image:"mount" /Add-Package /PackagePath:nvme\hotfix 部署映像服务和管理工具 版本: 10.0.17763.5830 映像版本: 6.1.7601.17514 正在处理 1 (共 2) - 正在添加程序包 D:\windows_7\nvme\hotfix\Windows6.1-KB2990941-v3-x64.msu [==========================100.0%==========================] 正在处理 2 (共 2) - 正在添加程序包 D:\windows_7\nvme\hotfix\Windows6.1-KB3087873-v2-x64.msu [===========================99.6%========================= ] 操作成功完成。 D:\windows_7>dism /Image:mount /Add-Driver /Driver:nvme /Recurse /ForceUnsigned 部署映像服务和管理工具 版本: 10.0.17763.5830 映像版本: 6.1.7601.17514 正在搜索要安装的驱动程序包... 找到 2 个要安装的驱动程序包。 正在安装第 1 个，共有 2 个 - D:\windows_7\nvme\intel\IaNVMe.inf: 驱动程序包已成功安装。 正在安装第 2 个，共有 2 个 - D:\windows_7\nvme\samsung\secnvme.inf: 驱动程序包已成功安装。 操作成功完成。 /Driver:nvme：加载当前工作目录下nvme目录下的驱动程序。添加USB3.1驱动D:\windows_7>dism /Image:mount /Add-Driver /Driver:usb /Recurse /ForceUnsigned 部署映像服务和管理工具 版本: 10.0.17763.5830 映像版本: 6.1.7601.17514 正在搜索要安装的驱动程序包... 找到 13 个要安装的驱动程序包。 正在安装第 1 个，共有 13 个 - D:\windows_7\usb\amd\bolton\amdhub\amdhub30.inf: 驱动程序包已成功安装。 正在安装第 2 个，共有 13 个 - D:\windows_7\usb\amd\bolton\amdxhc\amdxhc.inf: 驱动程序包已成功安装。 正在安装第 3 个，共有 13 个 - D:\windows_7\usb\amd\usb30_zp\amdhub\amdhub3.INF: 驱动程序包已成功安装。 正在安装第 4 个，共有 13 个 - D:\windows_7\usb\amd\usb30_zp\amdxhc\amdxhc.INF: 驱动程序包已成功安装。 正在安装第 5 个，共有 13 个 - D:\windows_7\usb\amd\usb31_pt\amdhub\amdhub31.INF: 驱动程序包已成功安装。 正在安装第 6 个，共有 13 个 - D:\windows_7\usb\amd\usb31_pt\amdxhc\amdxhc31.INF: 驱动程序包已成功安装。 正在安装第 7 个，共有 13 个 - D:\windows_7\usb\asmedia\asmthub3.inf: 驱动程序包已成功安装。 正在安装第 8 个，共有 13 个 - D:\windows_7\usb\asmedia\asmtxhci.inf: 驱动程序包已成功安装。 正在安装第 9 个，共有 13 个 - D:\windows_7\usb\atheros\USBController\ausb3xhc.inf: 驱动程序包已成功安装。 正在安装第 10 个，共有 13 个 - D:\windows_7\usb\atheros\USBHub\ausb3hub.inf: 驱动程序包已成功安装。 正在安装第 11 个，共有 13 个 - D:\windows_7\usb\intel\HCSwitch\iusb3hcs.inf: 驱动程序包已成功安装。 正在安装第 12 个，共有 13 个 - D:\windows_7\usb\intel\Win7\iusb3hub.inf: 驱动程序包已成功安装。 正在安装第 13 个，共有 13 个 - D:\windows_7\usb\intel\Win7\iusb3xhc.inf: 驱动程序包已成功安装。 操作成功完成。 验证并提交D:\windows_7>dism /Unmount-Image /MountDir:"mount" /Commit 部署映像服务和管理工具 版本: 10.0.17763.5830 正在保存映像 [==========================100.0%==========================] 正在卸载映像 [==========================100.0%==========================] 操作成功完成。 挂载boot.wim第二个映像D:\windows_7>dism /Mount-Image /ImageFile:src\sources\boot.wim /Index:2 /MountDir:"mount"添加NVMe支持D:\windows_7>dism /Image:"mount" /Add-Package /PackagePath:nvme\hotfix D:\windows_7>dism /Image:mount /Add-Driver /Driver:nvme /Recurse /ForceUnsigned添加USB3.1驱动D:\windows_7>dism /Image:mount /Add-Driver /Driver:usb /Recurse /ForceUnsigned更新补丁文件将mount\sources目录内文件按修改时间排序，将最新修改的58个文件（arunres.dll、autorun.dll...xmllite.dll）复制到src/sources目录内。验证并提交D:\windows_7>dism /Unmount-Image /MountDir:"mount" /Commit修改install.wim挂载WIM映像D:\windows_7>dism /Mount-Image /ImageFile:src\sources\install.wim /Index:1 /MountDir:"mount"添加NVMe支持D:\windows_7>dism /Image:"mount" /Add-Package /PackagePath:nvme\hotfix D:\windows_7>dism /Image:mount /Add-Driver /Driver:nvme /Recurse /ForceUnsigned添加USB3.1驱动D:\windows_7>dism /Image:mount /Add-Driver /Driver:usb /Recurse /ForceUnsigned验证并提交D:\windows_7>dism /Unmount-Image /MountDir:"mount" /Commit打包镜像Legacy BIOS启动D:\windows_7>oscdimg\amd64\oscdimg -LGSP1RMCPRXVOL_CN_DVD -m -u2 -boscdimg\amd64\etfsboot.com src cn_windows_7_professional_with_sp2_vl_build_x64_dvd.isoLegacy和UEFI BIOS启动复制efi\boot\bootx64.efi到src\efi\boot\bootx64.efi。D:\windows_7>oscdimg\amd64\oscdimg -LGSP1RMCPRXVOL_CN_DVD -h -m -o -u2 -udfver102 -bootdata:2#p0,e,boscdimg\amd64\etfsboot.com#pEF,e,boscdimg\amd64\efisys.bin src cn_windows_7_professional_with_sp2_vl_build_x64_dvd.iso-h：包含隐藏文件。-m：忽略最大大小限制。-o：优化存储（重复文件只存一份）。-u2 -udfver102：生成UDF文件系统（版本1.02），UEFI搭配efisys.bin需要UDF支持。-bootdata:2：创建多引导（multi-boot）镜像，2为引导条目数量。#p0,e,boscdimg\amd64\etfsboot.com：第1条引导条目：p0指定平台ID为BIOS（0x00），e表示禁用软驱，b指定BIOS引导文件。#pEF,e,boscdimg\amd64\efisys.bin：第2条引导条目：pEF指向平台ID为UEFI（0xEF）,b指向UEFI引导文件，除了需要添加UEFI引导，还必须添加efi\boot\bootx64.efi。不带引导的打包镜像（可忽略）D:\windows_7>cdimage.exe -lGSP1RMCPRXVOL_CN_DVD -t08/28/2026,10:00:00 -g -h -n -o -m src cn_windows_7_professional_with_sp2_vl_build_x64_dvd.iso
Beszel（轻量级开源服务器监控平台）搭建与配置指南
项目地址：https://www.github.com/henrygd/beszel安装Hub测试运行beszel hub[root@ecs ~]# cd /usr/local/beszel [root@ecs beszel]# chmod a+x beszel [root@ecs beszel]# ./beszel serve --http 0.0.0.0:8090 2026/08/29 11:03:09 Server started at http://0.0.0.0:8090 ├─ REST API: http://0.0.0.0:8090/api/ └─ Dashboard: http://0.0.0.0:8090/_Server started at http://0.0.0.0:8090表明beszel hub已经启动成功，ctrl + c结束进程，以便接下来通过服务方式启动。注册服务[root@ecs ~]# cat > /etc/systemd/system/beszel.service << EOF [Unit] Description=Beszel Hub After=network.target [Service] Type=simple Restart=always RestartSec=3 User=root WorkingDirectory=/usr/local/beszel ExecStart=/usr/local/beszel/beszel serve --http "0.0.0.0:8090" [Install] WantedBy=multi-user.target EOF启动服务[root@ecs ~]# systemctl enable --now beszel测试访问：http://192.168.1.100:8090/反向代理nginxhttp { server { listen 80; server_name beszel.dev.wiseidc.com; location / { proxy_pass http://127.0.0.1:8090; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; } } }必须设置Upgrade，否则Windows客户端WebSocket连接会失败，报400错误。添加agenthub端添加系统登录beszel hub端，点击右上角的“添加系统”，弹出“添加系统”对话框，切换到“二进制”标签页，填写“名称”和“主机/IP”，“公钥”和“令牌”会自动生成，接下来的步骤要用到。agent端测试运行beszel agent[root@ecs ~]# cd /usr/local/beszel [root@ecs beszel]# chmod a+x beszel-agent [root@ecs beszel]# ./beszel-agent -key "<公钥>" -token "<令牌>" -url "http://beszel.dev.wiseidc.com"-key：为第一步获取的公钥。-token：为第一步获取的令牌。http://beszel.dev.wiseidc.com：是做了反向代理的域名地址，也可以使用IP:45876。当配置了url或HUB_URL后，agent会主动连接hub（WebSocket），这种方式数据传输是实时双向的，性能更好。这种方式要求hub必须处于公网环境（或做内网穿透）。在没做反向代理的情况下，必须开放hub的8090端口。当去掉url或HUB_URL后，hub会主动连接agent（ssh），这种方式数据传输采用轮训模式，开销较大。这种方式要求agent必须处于公网环境且开放45876端口。注册服务[root@ecs ~]# cat > /etc/systemd/system/beszel-agent.service << EOF [Unit] Description=Beszel Agent Service After=network-online.target Wants=network-online.target [Service] ExecStart=/usr/local/beszel/beszel-agent Environment="LISTEN=45876" Environment="KEY=<公钥>" Environment="TOKEN=<令牌>" Environment="HUB_URL=http://beszel.dev.wiseidc.com" Restart=on-failure RestartSec=5 StateDirectory=beszel-agent KeyringMode=private LockPersonality=yes NoNewPrivileges=yes PrivateTmp=yes ProtectClock=yes ProtectHome=read-only ProtectHostname=yes ProtectKernelLogs=yes ProtectSystem=strict RemoveIPC=yes RestrictSUIDSGID=true [Install] WantedBy=multi-user.target EOFWindowsC:\Users\Administrator>beszel-agent -listen 45876 -key "公钥" -token "令牌" -url "http://beszel.dev.wiseidc.com"bat脚本：@echo off nssm install BeszelAgent "C:\beszel\beszel-agent.exe" nssm set BeszelAgent AppDirectory "C:\beszel" nssm set BeszelAgent AppParameters "-listen 45876 -key ""<公钥>"" -token ""<令牌>"" -url ""http://beszel.dev.wiseidc.com""" nssm set BeszelAgent AppStdout "C:\beszel\logs\out.log" nssm set BeszelAgent AppStderr "C:\beszel\logs\error.log" nssm set BeszelAgent Start SERVICE_AUTO_START nssm set BeszelAgent AppExit Default Restart nssm start BeszelAgentnssm命令：命令说明nssm restart BeszelAgent重启BeszelAgent服务nssm stop BeszelAgent停止BeszelAgent服务nssm remove BeszelAgent删除BeszelAgent服务nssm edit BeszelAgent修改BeszelAgent服务启动服务[root@ecs ~]# systemctl enable --now beszel-agent告警配置通知点击hub web管理界面右上角的“设置”（齿轮图标）按钮，打开“设置”界面，切换到“通知”页面。电子邮件通知点击“配置SMTP服务器”，打开PocketBase登录界面（beszel基于PocketBase开发），输入管理员账号和密码，进入后台管理。点击“Settings”，进入“System”管理页面，切换到“Mail settings”页面。Sender name：麦思Sender address：yclyk@qq.com开启“Use SMTP mail server”SMTP server host：smtp.qq.comPort：465Username：yclyk@qq.comPassword：TLS encryption：Always配置完之后，点击“Send test email”，如果收到测试邮件则表明SMTP配置成功了。企业微信通知点击Webhook / 推送通知后面的“添加 URL”按钮，输入企业微信webhook地址（格式为：wecom://<key>，key到企业微信机器人中获取）。点击“测试URL”，如果收到企业微信的推送消息则表明Webhook配置成功了。配置告警规则进入Beszel管理页面，点击客户端列表最后的“铃铛”图标，弹出告警规则设置页面。设置硬盘容量小于80%则告警，且10分钟不重复告警。
安装CentOS 7.9源码安装安装apr[root@ecs ~]# yum install -y bzip2 gcc [root@ecs ~]# cd /usr/local/src && tar -jxvf apr-1.7.6.tar.bz2 && cd apr-1.7.6 [root@ecs apr-1.7.6]# ./configure --prefix=/usr/local/apr [root@ecs apr-1.7.6]# make && make install安装apr-util[root@ecs ~]# yum install -y expat-devel [root@ecs ~]# cd /usr/local/src && tar -jxvf apr-util-1.6.5.tar.bz2 && cd apr-util-1.6.5 [root@ecs apr-util-1.6.5]# ./configure --prefix=/usr/local/apr-util --with-apr=/usr/local/apr [root@ecs apr-util-1.6.5]# make && make installapr-util（Apache Portable Runtime Utility）从1.6.0开始依赖Expat库（xml解析器）。apr-util从1.6.0开始要求gcc不能低于5.0（必须支持__has_attribute ），而CentOS 7.9默认gcc版本为4.8.5，因此必须升级gcc，否则只能安装1.6以下的版本（最高版本1.5.4）。安装apr-util 1.5.4[root@ecs ~]# cd /usr/local/src && tar -jxvf apr-util-1.5.4.tar.bz2 && cd apr-util-1.5.4 [root@ecs apr-util-1.5.4]# ./configure --prefix=/usr/local/apr-util --with-apr=/usr/local/apr [root@ecs apr-util-1.5.4]# make && make install安装pcre[root@ecs ~]# yum install -y gcc-c++ [root@ecs ~]# cd /usr/local/src && tar -jxvf pcre-8.45.tar.bz2 && cd pcre-8.45 [root@ecs pcre-8.45]# ./configure --prefix=/usr/local/pcre [root@ecs pcre-8.45]# make && make install [root@ecs pcre-8.45]# echo "export PATH=\$PATH:/usr/local/pcre/bin" >> /etc/profile [root@ecs pcre-8.45]# source /etc/profile需要将pcre加入PATH环境变量，否则编译apache时会因找不到pcre-config而报错：configure: error: Did not find working script at pcre-config。pcre已停止维护，最后一个版本为8.45，2015年发布了新构版本pcre2，pcre2当前最新版为10.47。安装openssl[root@ecs ~]# yum install -y perl perl-IPC-Cmd perl-Time-Piece [root@ecs ~]# cd /usr/local/src && tar xzvf openssl-3.5.7.tar.gz && cd openssl-3.5.7 [root@ecs openssl-3.5.7]# ./config --prefix=/usr/local/openssl -fPIC no-gost [root@ecs openssl-3.5.7]# make depend && make installOpenSSL在3.0.0之前，版本格式为主版本.次版本.补丁版本[字母]，字母代表补丁级别。如1.0.2表示1.0.2系列的首个版本，1.0.2q则表示1.0.2系列的第17个补丁版本。从3.0.0开始改为标准语义化版本，即Major（主版本）.Minor（次版本）.Patch（补丁版本）。3.5系列为LTS版，此系列当前（2026年8月）最高版为：3.5.7，3.0之前的最高版为：1.1.1w。OpenSSL 3.0之前仅依赖perl，从3.0开始除了依赖perl，还依赖IPC::Cmd和Time::Piece模块，因此必须安装perl-IPC-Cmd和perl-Time-Piece。查看是否支持perl IPC::Cmd模块：perl -MIPC::Cmd -e 'print "success\n"'。安装apache[root@ecs ~]# cd /usr/local/src && tar -xvf httpd-2.4.68.tar.bz2 && cd httpd-2.4.68 [root@ecs httpd-2.4.68]# ./configure --prefix=/usr/local/apache \ --with-apr=/usr/local/apr \ --with-apr-util=/usr/local/apr-util \ --with-pcre=/usr/local/pcre \ --enable-mods-shared=most \ --enable-rewrite \ --enable-ssl \ --with-ssl=/usr/local/openssl \ --enable-mpms-shared=all \ --enable-dav [root@ecs httpd-2.4.68]# make && make install [root@ecs httpd-2.4.68]# echo "export PATH=\$PATH:/usr/local/apache/bin" >> /etc/profile [root@ecs httpd-2.4.68]# source /etc/profile--enable-dav启用dav模块，可以通过dav管理svn。--enable-mpms-shared=all会在modules目录下生成mod_mpm_prefork.so、mod_mpm_worker.so和mod_mpm_event.so三个模块文件，可在httpd.conf中通过LoadModule切换MPM（默认为event模式，查看mpm模式：apachectl -V | grep -i mpm）。 也可在编译时使用--with-mpm=指定MPM模式，有效值：prefork、worker和event，编译后不可切换。如果使用yum方式安装apr、apr-util、pcre和openssl等依赖，则需要调整--with-apr、--with-apr-util、--with-pcre和--with-ssl的参数值：[root@ecs ~]# yum install -y apr-devel apr-util-devel pcre-devel openssl-devel \ bzip2 gcc [root@ecs ~]# cd /usr/local/src && tar -xvf httpd-2.4.68.tar.bz2 && cd httpd-2.4.68 [root@ecs httpd-2.4.68]# ./configure --prefix=/usr/local/apache \ --with-apr=/usr \ --with-apr-util=/usr \ --with-pcre \ --enable-mods-shared=most \ --enable-rewrite \ --enable-ssl \ --with-ssl \ --enable-mpms-shared=all \ --enable-dav [root@ecs httpd-2.4.68]# make && make install [root@ecs httpd-2.4.68]# echo "export PATH=\$PATH:/usr/local/apache/bin" >> /etc/profile [root@ecs httpd-2.4.68]# source /etc/profile注册服务[root@ecs ~]# cp -f /usr/local/apache/bin/apachectl /etc/rc.d/init.d/httpd [root@ecs ~]# sed -i '/#!\/bin\/sh/a\# description: Activates/Deactivates Apache Web Server' /etc/rc.d/init.d/httpd [root@ecs ~]# sed -i '/#!\/bin\/sh/a\# chkconfig: 2345 50 90' /etc/rc.d/init.d/httpd或者：[root@ecs ~]# cat > /usr/lib/systemd/system/httpd.service <<EOF [Unit] Description=The Apache HTTP Server After=network.target remote-fs.target nss-lookup.target Documentation=man:httpd(8) Documentation=man:apachectl(8) [Service] Type=forking PIDFile=/usr/local/apache/logs/httpd.pid ExecStart=/usr/local/apache/bin/apachectl -k start ExecReload=/usr/local/apache/bin/apachectl -k graceful ExecStop=/usr/local/apache/bin/apachectl -k stop PrivateTmp=true Restart=on-failure RestartSec=5 [Install] WantedBy=multi-user.target EOF源码apache默认是后台守护进程，因此用Type=forking。PrivateTmp=true为服务提供隔离的私有文件。开启服务并设置开机自启动[root@ecs ~]# systemctl enable --now httpd防火墙放行端口[root@ecs ~]# firewall-cmd --zone=public --add-port=80/tcp --permanent [root@ecs ~]# firewall-cmd --zone=public --add-port=443/tcp --permanent [root@ecs ~]# firewall-cmd --reload配置apache[root@ecs ~]# groupadd www [root@ecs ~]# useradd -s /sbin/nologin www -g www [root@ecs ~]# sed -i -e "s/^#LoadModule rewrite_module/LoadModule rewrite_module/" \ -e "/^User/cUser www" \ -e "/^Group/cGroup www" \ -e "/^#ServerName/cServerName localhost:80" \ -e "s/DirectoryIndex index.html/DirectoryIndex index.html index.php/" \ -e "s/Options Indexes FollowSymLinks/Options FollowSymLinks/" \ -e '0,/AllowOverride none/s/AllowOverride none/AllowOverride all/' \ /usr/local/apache/conf/httpd.conf自动安装脚本apache.shyum安装安装httpd[root@ecs ~]# yum install -y httpd常见目录说明目录说明/etc/httpd/conf/httpd.conf主配置文件/etc/httpd/conf.d配置片段，会被主配置文件包含/etc/httpd/conf.modules.d/模块加载配置/var/www/html/网站根目录/var/log/httpd/日志目录/usr/sbin/httpdapache主程序文件/usr/lib64/httpd/modules/模块目录
安装CentOS 7.9安装依赖[root@ecs ~]# yum install -y gcc pcre-devel openssl-devel安装nginx[root@ecs ~]# groupadd www && useradd -g www www -s /sbin/nologin [root@ecs ~]# cd /usr/local/src [root@ecs src]# tar -zxvf nginx-1.30.1.tar.gz && cd nginx-1.30.1 [root@ecs src]# ./configure --prefix=/usr/local/nginx \ --with-http_ssl_module \ --with-http_stub_status_module \ --with-http_gzip_static_module \ --user=www --group=www [root@ecs src]# make && make installnginx安装时依赖pcre、openssl和zlib模块。使用yum install -y pcre-devel openssl-devel安装这3个模块（安装openssl-devel会安装依赖zlib-devel），nginx会自动查找依赖模块。如果不想安装这些依赖模块，可以使用--with-pcre=、--with-openssl=和--with-zlib=指定模块源码路径。模块说明：模块说明pcre提供正则表达式支持，rewrite模块依赖PCRE库，编译pcre依赖gcc-c++。下载地址：https://sourceforge.net/projects/pcre/files/pcre/8.45/pcre-8.45.tar.bz2/downloadopenssl--with-http_ssl_module启用ssl模块，依赖openssl。下载地址：https://www.openssl.org/source/openssl-1.1.1v.tar.gzzlib文件压缩和解压缩的库，使用zlib对http数据包进行gzip压缩和解压缩。下载地址：https://zlib.net/fossils/zlib-1.3.1.tar.gz模块源码安装[root@ecs ~]# yum install -y bzip2 gcc-c++ [root@ecs ~]# cd /usr/local/src [root@ecs src]# tar -jxvf pcre-8.45.tar.bz2 [root@ecs src]# tar -zxvf openssl-1.1.1v.tar.gz [root@ecs src]# tar -zxvf zlib-1.3.1.tar.gz [root@ecs src]# groupadd www && useradd -g www www -s /sbin/nologin [root@ecs src]# tar -zxvf nginx-1.30.4.tar.gz && cd nginx-1.30.4 [root@ecs src]# ./configure --prefix=/usr/local/nginx \ --with-http_ssl_module \ --with-http_stub_status_module \ --with-http_gzip_static_module \ --with-pcre=/usr/local/src/pcre-8.45 \ --with-zlib=/usr/local/src/zlib-1.3.1 \ --with-openssl=/usr/local/src/openssl-1.1.1v \ --user=www --group=www [root@ecs src]# make && make install开放防火墙端口[root@ecs ~]# firewall-cmd --zone=public --add-port=80/tcp --permanent [root@ecs ~]# firewall-cmd --zone=public --add-port=443/tcp --permanent [root@ecs ~]# firewall-cmd --reload开机自启动[root@ecs ~]# sed -i '/#pid/apid logs/nginx.pid;' /usr/local/nginx/conf/nginx.conf [root@ecs ~]# cat > /usr/lib/systemd/system/nginx.service <<EOF [Unit] Description=The nginx HTTP and reverse proxy server After=network-online.target remote-fs.target nss-lookup.target Wants=network-online.target [Service] Type=forking PIDFile=/usr/local/nginx/logs/nginx.pid ExecStartPre=/usr/local/nginx/sbin/nginx -t ExecStart=/usr/local/nginx/sbin/nginx ExecReload=/usr/local/nginx/sbin/nginx -s reload ExecStop=/usr/local/nginx/sbin/nginx -s quit KillSignal=SIGQUIT TimeoutStopSec=5 KillMode=process PrivateTmp=true [Install] WantedBy=multi-user.target EOF [root@ecs ~]# chmod a+x /usr/lib/systemd/system/nginx.service [root@ecs ~]# systemctl enable --now nginx设置虚拟主机[root@ecs ~]# mkdir -p /usr/local/nginx/conf/conf.d [root@ecs ~]# sed -i '/^http {$/,/^}$/ { /^}$/ i\ include /usr/local/nginx/conf/conf.d/*.conf; }' /usr/local/nginx/conf/nginx.conf [root@ecs ~]# mkdir -p /data/{wwwroot,wwwlog} [root@ecs ~]# cat > /usr/local/nginx/conf/conf.d/wiseidc.conf <<EOF log_format wiseidc '$remote_addr - $remote_user [$time_local] "$request" $status $body_bytes_sent "$http_referer" "$http_user_agent" "$http_x_forwarded_for"'; server { listen 80; server_name wiseidc.com www.wiseidc.com; return 301 https://$server_name$request_uri; } server { listen 443 ssl; ssl_certificate /etc/letsencrypt/live/wiseidc.com/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/wiseidc.com/privkey.pem; ssl_session_timeout 5m; ssl_protocols TLSv1 TLSv1.1 TLSv1.2; ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE; ssl_prefer_server_ciphers on; server_name wiseidc.com www.wiseidc.com; root /data/wwwroot/wiseidc; location / { proxy_pass http://127.0.0.1:8000; 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; } client_max_body_size 2M; location ~ .*\.(php|php5)?$ { fastcgi_pass 127.0.0.1:9000; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; include fastcgi_params; } location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$ { expires 30d; } location ~ .*\.(js|css)?$ { expires 12h; } location / { index index.html index.htm index.php; if (!-e $request_filename) { rewrite ^(.*)$ /index.php/$1 last; break; } if (!-e $request_filename) { rewrite ^/index.php/(.*)$ /index.php?$1 last; break; } } access_log /data/wwwlog/wiseidc.log wiseidc; } EOF/^http {$/,/^}$/：匹配第一个http {所在行到第一个}所在行之间的所有行。/A/,/B/ {}：对A到B范围内的行执行{}内的命令。/^}$/ i\：在}所在行前插入。禁止IP访问[root@ecs ~]# sed -i '/^[[:space:]]*server[[:space:]]*{/i\ server {\ listen 80;\ server_name localhost;\ deny all;\ }\ ' /usr/local/nginx/conf/nginx.conf或者：[root@ecs ~]# sed -i '0,/server_name localhost;/{ /localhost;$/a\ deny all; }' /usr/local/nginx/conf/nginx.conf部署网站[root@ecs wwwroot]# scp root@172.22.159.123:/data/wwwroot/wiseidc.tar.gz /data/wwwroot/ [root@ecs wwwroot]# tar -zxvf wiseidc.tar.gz [root@ecs wwwroot]# chown -R www:www /data/wwwroot/wiseidc [root@ecs wwwroot]# chmod -R 550 /data/wwwroot/wiseidc [root@ecs wwwroot]# cd /data/wwwroot/wiseidc [root@ecs wiseidc]# chmod -R 770 index.html caches/ uploadfile/ phpsso_server/ [root@ecs wiseidc]# echo "open_basedir=/data/wwwroot/wiseidc/:/tmp/" >> .user.ini [root@ecs wiseidc]# chattr +i .user.iniUbuntuapt安装安装nginxmaisi@ecs:~$ apt-get install nginx maisi@ecs:~$ nginx -v nginx version: nginx/1.18.0 (Ubuntu)启动nginxmaisi@ecs:~$ systemctl enable --now nginx maisi@ecs:~$ systemctl status nginx防火墙放行端口maisi@ecs:~$ sudo ufw allow 80/tcp maisi@ecs:~$ sudo ufw allow 443/tcp或者：maisi@ecs:~$ sudo sudo ufw allow http maisi@ecs:~$ sudo sudo ufw allow https常见目录说明路径说明/usr/sbin/nginx主程序/etc/nginx存放配置文件/usr/share/nginx存放静态文件/var/log/nginx存放日志源码编译安装安装依赖maisi@ecs:~$ apt-get install make gcc zlib1g-dev libpcre3-dev libssl-devUbuntu 26.04maisi@ecs:~$ apt install zlib1g-dev libpcre2-dev libssl-dev编译nginxmaisi@ecs:~$ groupadd www maisi@ecs:~$ useradd -g www www -s /sbin/nologin maisi@ecs:~$ cd /usr/local/src && tar -zxvf nginx-1.24.0.tar.gz && cd nginx-1.24.0 maisi@ecs:/usr/local/src/nginx-1.24.0$ ./configure --prefix=/usr/local/nginx \ --with-http_stub_status_module \ --with-http_gzip_static_module \ --with-http_ssl_module \ --user=www --group=www maisi@ecs:/usr/local/src/nginx-1.24.0$ make && sudo make installnginx安装时依赖pcre、openssl和zlib模块。使用apt-get安装依赖之后，则无需使用--with-pcre=、--with-openssl=和--with-zlib=指定模块源码路径。Ubuntu 26.04root@ecs:~# cd /usr/local/src root@ecs:/usr/local/src# tar -jxvf pcre-8.45.tar.bz2 root@ecs:/usr/local/src# tar -zxvf zlib-1.3.2.tar.gz root@ecs:/usr/local/src# tar -zxvf openssl-3.5.7.tar.gz root@ecs:/usr/local/src# groupadd www && useradd -g www www -s /sbin/nologin root@ecs:/usr/local/src# tar -zxvf nginx-1.30.4.tar.gz && cd nginx-1.30.4 root@ecs:/usr/local/src/nginx-1.30.4# ./configure --prefix=/usr/local/nginx \ --with-http_ssl_module \ --with-http_stub_status_module \ --with-http_gzip_static_module \ --with-pcre=/usr/local/src/pcre-8.45 \ --with-zlib=/usr/local/src/zlib-1.3.2 \ --with-openssl=/usr/local/src/openssl-3.5.7 \ --user=www --group=www root@ecs:/usr/local/src/nginx-1.30.4# make && make install启动nginxmaisi@ecs:~$ sudo /usr/local/nginx/sbin/nginx查看进程maisi@ecs:~$ ps -ef | grep nginx关闭nginxmaisi@ecs:~$ sudo /usr/local/nginx/sbin/nginx -s stop开启自启动maisi@ecs:~$ cat > /etc/systemd/system/nginx.service <<EOF [Unit] Description=The nginx HTTP and reverse proxy server After=network.target [Service] Type=forking PIDFile=/usr/local/nginx/logs/nginx.pid ExecStartPre=/usr/local/nginx/sbin/nginx -t ExecStart=/usr/local/nginx/sbin/nginx ExecReload=/usr/local/nginx/sbin/nginx -s reload ExecStop=/usr/local/nginx/sbin/nginx -s quit [Install] WantedBy=multi-user.target EOF maisi@ecs:~$ chown root:root /etc/systemd/system/nginx.service maisi@ecs:~$ chmod a+x /etc/systemd/system/nginx.service maisi@ecs:~$ systemctl enable --now nginxWindows配置模块
CentOS 7.9php-fpm 5.6.40安装php[root@ecs ~]# cd /usr/local/src && tar -jxvf freetype-2.4.0.tar.bz2 && cd freetype-2.4.0 [root@ecs freetype-2.4.0]# ./configure --prefix=/usr/local/freetype [root@ecs freetype-2.4.0]# make && make install [root@ecs freetype-2.4.0]# yum install -y bzip2 gcc libxml2-devel bzip2-devel curl-devel libjpeg-devel libpng-devel libmcrypt-devel php-gd [root@ecs freetype-2.4.0]# cd /usr/local/src && tar -jxvf php-5.6.40.tar.bz2 && cd php-5.6.40 [root@ecs php-5.6.40]# ./configure --prefix=/usr/local/php \ --enable-fpm \ --with-mcrypt \ --enable-mbstring \ --disable-pdo \ --with-curl \ --disable-debug \ --disable-rpath \ --enable-inline-optimization \ --with-bz2 \ --with-zlib \ --enable-sockets \ --enable-sysvsem \ --enable-sysvshm \ --enable-pcntl \ --enable-mbregex \ --with-mhash \ --enable-zip \ --with-pcre-regex \ --with-mysql \ --with-mysqli \ --with-gd \ --with-jpeg-dir \ --with-freetype-dir=/usr/local/freetype [root@ecs php-5.6.40]# make && make install配置php[root@ecs ~]# cd /usr/local/php/etc/ [root@ecs etc]# cp php-fpm.conf.default php-fpm.conf [root@ecs etc]# sed -i -e '/^;pid =/c\pid = /usr/local/php/var/run/php-fpm.pid' \ -e '/^;daemonize =/c\daemonize = yes' \ -e '/^user =/c\user = www' \ -e '/^group =/c\group = www' \ -e '/^pm.max_children =/c\pm.max_children = 100' php-fpm.conf开机自启动[root@ecs ~]# cat > /usr/lib/systemd/system/php-fpm.service <<EOF [Unit] Description=The PHP FastCGI Process Manager After=syslog.target network.target [Service] Type=simple PIDFile=/usr/local/php/var/run/php-fpm.pid EnvironmentFile=/usr/local/php/etc/php-fpm.conf ExecStart=/usr/local/php/sbin/php-fpm --daemonize ExecReload=/bin/kill -USR2 $MAINPID PrivateTmp=true [Install] WantedBy=multi-user.target EOF [root@ecs ~]# systemctl daemon-reload [root@ecs ~]# systemctl enable --now php-fpm [root@ecs ~]# ps aux | grep php-fpm添加到PATH[root@ecs ~]# echo "export PATH=\$PATH:/usr/local/php/bin" >> /etc/profile [root@ecs ~]# source /etc/profile [root@ecs ~]# php -mUbuntuubuntu 24.04 php-fpm 5.6.40缺少依赖的报错提示依赖报错libxml2-devconfigure: error: xml2-config not found. Please check your libxml2 installationlibbz2-devconfigure: error: Please reinstall the BZip2 distributionzlib1g-devconfigure: error: Cannot find libzlibcurl4-gnutls-devconfigure: error: Please reinstall the libcurl distributionlibcurl4-gnutls-dev与libcurl4-openssl-dev二选一，安装任意一个则会自动卸载另外一个。GnuTLS是OpenSSL的一个分支，设计更现代化、更注重安全性和性能libjpeg-devconfigure: error: jpeglib.h not foundlibpng-devconfigure: error: png.h not foundlibmcrypt-devconfigure: error: mcrypt.h not found. Please reinstall libmcryptlibfreetype-devconfigure: error: freetype-config not found/usr/local/src/php-5.6.40/ext/gd/gd.c:83:12: fatal error: ft2build.h: No such file or directoryopenssl-1.0.2uconfigure: error: Cannot find OpenSSL's <evp.h>libltdl-dev/usr/bin/ld: cannot find -lltdl: No such file or directoryxutils-dev../util/domd: 23: makedepend: not found安装OpenSSLOpenSSL从1.1.0开始，将EVP_PKEY设为opaque（不透明结构体），不再支持通过pkey->pkey.dh等方式直接访问其成员。使用高版本的OpenSSL（如Ubuntu 24.04使用apt-get install libssl-dev安装的libssl-dev:amd64 (3.0.13-0ubuntu3.15)）则会报错：error: invalid use of incomplete typedef ‘EVP_PKEY’ {aka ‘struct evp_pkey_st’}。root@ecs:~# apt install zlib1g-dev make xutils-dev gcc root@ecs:~# cd /usr/local/src && tar -zxvf openssl-1.0.2u.tar.gz && cd openssl-1.0.2u root@ecs:/usr/local/src/openssl-1.0.2u# ./config --prefix=/usr/local/openssl-1.0.2u -fPIC no-gost shared zlib root@ecs:/usr/local/src/openssl-1.0.2u# make depend && make install root@ecs:~# export LD_LIBRARY_PATH=/usr/local/openssl-1.0.2u/lib:$LD_LIBRARY_PATHmake depend依赖xutils-dev和gcc。shared：生成静态库（libssl.a等）的同时生成动态库（libssl.so等）-fPIC：生成位置无关（Position-Independent Code）的libssl.so。不同程序在调用libssl.so时，会将libssl.so加载到不同的内存地址才可以正常运行。如果不加-fPIC，libssl.so会因加载到相同的内存地址而报错。zlib：启用zlib压缩支持，依赖zlib1g-dev开发包。必须在LD_LIBRARY_PATH中指定openssl的lib路径，否则会报错：error while loading shared libraries: libcrypto.so.1.0.0: cannot open shared object file: No such file or directory。也可以下载libssl-dev_1.0.2g-1ubuntu4_amd64.deb（依赖libssl）进行安装：root@ecs:~# apt-get install zlib1g-dev root@ecs:~# wget https://launchpad.net/ubuntu/+archive/primary/+files/libssl1.0.0_1.0.2g-1ubuntu4_amd64.deb root@ecs:~# dpkg -i libssl1.0.0_1.0.2g-1ubuntu4_amd64.deb root@ecs:~# wget https://launchpad.net/ubuntu/+archive/primary/+files/libssl-dev_1.0.2g-1ubuntu4_amd64.deb root@ecs:~# dpkg -i libssl-dev_1.0.2g-1ubuntu4_amd64.deb安装libssl-dev_1.0.2g-1ubuntu4_amd64.deb有时会报错：dpkg: dependency problems prevent configuration of libssl-dev:amd64: libssl-dev:amd64 depends on zlib1g-dev; however: Package zlib1g-dev is not installed.使用apt-get install zlib1g-dev安装zlib1g-dev，又会报错：The following packages have unmet dependencies: zlib1g-dev : Depends: zlib1g (= 1:1.3.dfsg-3.1ubuntu2.2) but 1:1.3.dfsg-3.1ubuntu2.1 is to be installed E: Unmet dependencies. Try 'apt --fix-broken install' with no packages (or specify a solution).再使用apt-get install zlib1g=1:1.3.dfsg-3.1ubuntu2.2升级zlib1g，又会报错：The following packages have unmet dependencies: libssl-dev : Depends: zlib1g-dev but it is not going to be installed Recommends: libssl-doc but it is not going to be installed E: Unmet dependencies. Try 'apt --fix-broken install' with no packages (or specify a solution).升级zlib1g要依赖libssl-dev，libssl-dev又依赖zlib1g-dev，而安装zlib1g-dev又必须升级zlib1g，死循环了。其实只需要卸载libssl-dev，然后再安装zlib1g-dev，依赖问题交由apt-get解决。root@ecs:~# dpkg -l | grep libssl | awk '{print $2,$3}' libssl-dev:amd64 1.0.2g-1ubuntu4 libssl1.0.0:amd64 1.0.2g-1ubuntu4 libssl3t64:amd64 3.0.13-0ubuntu3.15 root@ecs:~# dpkg -r libssl-dev:amd64安装完libssl1.0.0_1.0.2g-1ubuntu4_amd64.deb之后，/usr/lib/x86_64-linux-gnu/目录会安装libssl.so（软链到libssl.so.1.0.0）、libssl.so.1.0.0、libcrypto.so（软链到libcrypto.so.1.0.0）和libcrypto.so.1.0.0。使用deb安装libssl-dev，一定要在最后安装，否则在安装libcurl4-gnutls-dev时，会自动升级libssl-dev到3.0.13-0ubuntu3.15。root@ecs:~# apt-get install binutils root@ecs:~# strings /usr/lib/x86_64-linux-gnu/libssl.so | grep -ioE '[0-9]+\.[0-9]+\.[0-9]+' | sort -V | tail -1 3.0.3 root@ecs:~# dpkg -l | grep libssl | awk '{print $2 $3}' libssl-dev:amd643.0.13-0ubuntu3.15 libssl1.0.0:amd641.0.2g-1ubuntu4 libssl3t64:amd643.0.13-0ubuntu3.15 root@ecs:~# file /usr/lib/x86_64-linux-gnu/libssl.so /usr/lib/x86_64-linux-gnu/libssl.so: symbolic link to libssl.so.3此时编译php 5.6.40，虽然可以找到evp.h和libssl.so，但libssl.so.3与php 5.6.40是不兼容的，依旧会报错：error: invalid use of incomplete typedef ‘EVP_PKEY’ {aka ‘struct evp_pkey_st’}。其它安装包下载地址：https://launchpad.net/ubuntu/+source/openssl/查看历史版本：https://changelogs.ubuntu.com/changelogs/pool/main/o/openssl/openssl_3.0.13-0ubuntu3.4/changelog查看已安装libssl-devroot@ecs:~# apt-get install apt-show-versions root@ecs:~# apt-show-versions libssl-dev卸载libsslroot@ecs:~# dpkg -l | grep libssl root@ecs:~# dpkg -r libssl-dev:amd64 root@ecs:~# dpkg --purge libssl1.0.0:amd64安装libfreetype-devapt-get安装的libfreetype-dev版本为2.13.2+dfsg-1ubuntu0.1，而freetype从2.10.1开始不再安装freetype-config，改用pkg-config来管理CFLAGS和库。http://changelogs.ubuntu.com/changelogs/pool/main/f/freetype/freetype_2.10.1-2/changelog* New upstream release (Closes: #901052):- Avoid dereferencing a NULL pointer (CVE-2018-6942) (Closes: #890450).- The `freetype-config' script is no longer installed by default(Closes: #871470, #886461). All packages depending on libfreetype6-devshould use pkg-config to find the relevant CFLAGS and libraries.使用pkg-config freetype2 --cflags，php会自动查找freetype2的头文件位置（/usr/include/freetype2）。root@ecs:~# apt-get install libfreetype-dev pkg-config root@ecs:~# cat > /usr/local/bin/freetype-config << EOF #!/bin/bash pkg-config freetype2 "\$@" EOF root@ecs:~# chmod a+x /usr/local/bin/freetype-config root@ecs:~# freetype-config --cflags -I/usr/include/freetype2 -I/usr/include/libpng16 root@ecs:~# freetype-config --libs -lfreetype安装php（完整脚本）root@ecs:~# apt-get update root@ecs:~# apt install zlib1g-dev make xutils-dev gcc root@ecs:~# cd /usr/local/src && tar -zxvf openssl-1.0.2u.tar.gz && cd openssl-1.0.2u root@ecs:/usr/local/src/openssl-1.0.2u# ./config --prefix=/usr/local/openssl-1.0.2u -fPIC no-gost shared zlib root@ecs:/usr/local/src/openssl-1.0.2u# make depend && make install root@ecs:~# export LD_LIBRARY_PATH=/usr/local/openssl-1.0.2u/lib:$LD_LIBRARY_PATH root@ecs:~# apt-get install pkg-config libfreetype-dev root@ecs:~# cat > /usr/local/bin/freetype-config << EOF #!/bin/bash pkg-config freetype2 "\$@" EOF root@ecs:~# chmod a+x /usr/local/bin/freetype-config root@ecs:~# apt-get install libxml2-dev libbz2-dev libcurl4-gnutls-dev libjpeg-dev libpng-dev libmcrypt-dev libltdl-dev bzip2 root@ecs:~# ln -s /usr/include/x86_64-linux-gnu/curl/ /usr/local/include/ root@ecs:~# cd /usr/local/src && tar -jxvf php-5.6.40.tar.bz2 && cd php-5.6.40 root@ecs:/usr/local/src/php-5.6.40# ./configure --prefix=/usr/local/php \ --enable-fpm \ --with-mcrypt \ --enable-mbstring \ --disable-pdo \ --with-curl \ --disable-debug \ --disable-rpath \ --enable-inline-optimization \ --with-bz2 \ --with-zlib \ --enable-sockets \ --enable-sysvsem \ --enable-sysvshm \ --enable-pcntl \ --enable-mbregex \ --with-mhash \ --enable-zip \ --with-pcre-regex \ --with-mysql \ --with-mysqli \ --with-gd \ --with-jpeg-dir \ --with-freetype-dir \ --with-iconv \ --with-openssl=/usr/local/openssl-1.0.2u root@ecs:/usr/local/src/php-5.6.40# make && make installphp-fpm是独立的，可以搭配nginx使用。--with-iconv使用glibc内置的iconv。--with-openssl如果不指定openssl的头文件路径，则必须安装pkg-config来自动获取include和lib路径。 编译安装openssl时，既可以在--with-openssl后面指定openssl的安装路径，又可以使用export PKG_CONFIG_PATH=/usr/local/openssl-1.0.2u/lib64/pkgconfig:$PKG_CONFIG_PATH，pkg-config会到PKG_CONFIG_PATH配置的目录读取openssl.pc并获取openssl的头文件和库文件路径。ubuntu 26.04 php-fpm 5.6.40Ubuntu 26.04的libxml2-dev版本是2.15.2+dfsg-0.1ubuntu0.1，新版libxml2部分函数不再兼容php 5.6.40，因此必须安装低版本的libxml2-dev。root@ecs:~# wget https://archive.ubuntu.com/ubuntu/pool/main/i/icu/libicu74_74.2-1ubuntu3.1_amd64.deb root@ecs:~# wget https://archive.ubuntu.com/ubuntu/pool/main/i/icu/icu-devtools_74.2-1ubuntu3.1_amd64.deb root@ecs:~# wget https://archive.ubuntu.com/ubuntu/pool/main/i/icu/libicu-dev_74.2-1ubuntu3.1_amd64.deb root@ecs:~# wget https://archive.ubuntu.com/ubuntu/pool/main/libx/libxml2/libxml2_2.9.14+dfsg-1.3ubuntu3.8_amd64.deb root@ecs:~# wget http://archive.ubuntu.com/ubuntu/pool/main/libx/libxml2/libxml2-dev_2.9.14+dfsg-1.3ubuntu3.8_amd64.deb root@ecs:~# dpkg -i libicu74_74.2-1ubuntu3.1_amd64.deb root@ecs:~# dpkg -i icu-devtools_74.2-1ubuntu3.1_amd64.deb root@ecs:~# dpkg -i libicu-dev_74.2-1ubuntu3.1_amd64.deb root@ecs:~# dpkg -i libxml2_2.9.14+dfsg-1.3ubuntu3.8_amd64.deb root@ecs:~# dpkg -i libxml2-dev_2.9.14+dfsg-1.3ubuntu3.8_amd64.deblibxml2:amd64 depends on libicu74 (>= 74.1-1~);libicu-dev:amd64 depends on icu-devtools (>= 74.2-1ubuntu3.1);其余步骤和ubuntu 24.04 php-fpm 5.6.40完全一致。php 5.6.40安装依赖root@ecs:~# apt-get install libxml2-dev zlib1g-dev libcurl4-gnutls-dev libjpeg-dev libpng-dev libfreetype-dev root@ecs:~# ln -s /usr/include/x86_64-linux-gnu/curl /usr/include/curl root@ecs:~# cd /usr/local/src && tar -zxvf libmcrypt-2.5.8.tar.gz && cd libmcrypt-2.5.8 root@ecs:/usr/local/src/libmcrypt-2.5.8# ./configure --prefix=/usr/local/libmcrypt root@ecs:/usr/local/src/libmcrypt-2.5.8# make && make install root@ecs:/usr/local/src/libmcrypt-2.5.8# cd /usr/local/src && tar -zxvf libiconv-1.14.tar.gz && cd libiconv-1.14 root@ecs:/usr/local/src/libiconv-1.14# ./configure --prefix=/usr/local/libiconv root@ecs:/usr/local/src/libiconv-1.14# make && make install安装phproot@ecs:~# cd /usr/local/src && tar -jxvf php-5.6.40.tar.bz2 && cd php-5.6.40 root@ecs:/usr/local/src/php-5.6.40# apt-get install pkg-config autoconf root@ecs:/usr/local/src/php-5.6.40# sed -i "s/freetype-config/pkg-config/g" ./ext/gd/config.m4 root@ecs:/usr/local/src/php-5.6.40# sed -i "s/FREETYPE2_CONFIG --cflags/FREETYPE2_CONFIG freetype2 --cflags/g" ./ext/gd/config.m4 root@ecs:/usr/local/src/php-5.6.40# sed -i "s/FREETYPE2_CONFIG --libs/FREETYPE2_CONFIG freetype2 --libs/g" ./ext/gd/config.m4 root@ecs:/usr/local/src/php-5.6.40# ./buildconf --force root@ecs:/usr/local/src/php-5.6.40# ./configure --prefix=/usr/local/php \ --with-apxs2=/usr/local/apache/bin/apxs \ --with-mysql \ --with-mysqli \ --with-pdo-mysql \ --enable-calendar \ --enable-exif \ --enable-ftp \ --with-gd \ --with-jpeg-dir \ --with-png-dir \ --with-zlib-dir \ --with-freetype-dir \ --enable-gd-native-ttf \ --enable-mbstring \ --enable-bcmath \ --with-curl \ --with-openssl=/usr/local/openssl \ --enable-soap \ --enable-zip \ --with-config-file-path=/usr/local/php/lib \ --with-mcrypt=/usr/local/libmcrypt \ --with-iconv-dir=/usr/local/libiconv root@ecs:/usr/local/src/php-5.6.40# make && make install注：安装apache时已经安装了openssl，--with-openssl指定openssl的安装路径/usr/local/openssl。--with-iconv-dir=指定GNU libiconv的安装路径。freetype 2.10.1开始不再安装freetype-config，而是使用pkg-config来管理CFLAGS和库。需要修改./ext/gd/config.m4中freetype-config为pkg-config，否则会报错：configure: error: freetype-config not found.。apache添加php扩展root@ecs:~# echo "AddType application/x-httpd-php .php" >> /usr/local/apache/conf/httpd.conf root@ecs:~# systemctl restart httpd root@ecs:~# cat >> /usr/local/apache/htdocs/index.php << EOF <?php phpinfo(); EOF配置phproot@ecs:~# cp -f php.ini-development /usr/local/php/lib/php.ini root@ecs:~# sed -i '/^;date.timezone =/cdate.timezone = "Asia/Shanghai"' /usr/local/php/lib/php.ini root@ecs:~# sed -i '/^expose_php = On/cexpose_php = Off' /usr/local/php/lib/php.ini root@ecs:~# sed -i "s/^;session.save_path/session.save_path/" /usr/local/php/lib/php.ini root@ecs:~# chmod -R 777 /tmpDockerphp 5.6.40部署容器[root@ecs ~]# docker run --name php-fpm \ -e TZ=Asia/Shanghai \ -v /data/wwwroot:/data/wwwroot \ -v /tmp:/tmp \ -p 9000:9000 \ --privileged=true --restart=always \ -d php:5.6.40-fpm统一用户[root@ecs ~]# cat /etc/passwd | grep www [root@ecs ~]# docker exec -it php-fpm /bin/sh # groupadd www # useradd -g www -s /sbin/nologin www # usermod -u 1000 www && groupmod -g 1000 www # sed -i -e '/user =/a \user = www' \ -e '/group =/a \group = www' \ /usr/local/etc/php-fpm.d/www.conf通过ID让宿主机的www用户和php-fpm容器内的www用户识别为同一个用户。php-fpm进程的默认用户为www-data，而宿主机的网站用户为www，这2个用户不一致则要求给文件或文件夹设置权限时必须设置其他用户（ugo中的o）权限。宿主机的www用户id为1000，容器内www-data用户id为33，如果直接修改www-data的用户id为1000则会报错：usermod: user www-data is currently used by process 7，而如果关闭php-fpm进程则会自动退出容器，因此可以在容器内新建www组和www用户，并设置php-fpm进程的用户和组为www。安装mysqli扩展[root@ecs ~]# docker exec -it php-fpm /bin/sh # ln -snf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime \ && echo "Asia/Shanghai" > /etc/timezone # cat > /etc/apt/sources.list << EOF deb [trusted=yes] http://mirrors.aliyun.com/debian-archive/debian/ stretch main contrib non-free deb [trusted=yes] http://mirrors.aliyun.com/debian-archive/debian-security/ stretch/updates main contrib non-free EOF # apt-get update \ && apt-get -y --no-install-recommends install \ zlib1g-dev libfreetype6-dev libjpeg62-turbo-dev libpng-dev \ && docker-php-ext-configure gd \ --with-freetype-dir=/usr --with-jpeg-dir=/usr --with-png-dir=/usr \ && docker-php-ext-install -j$(nproc) bcmath gd pcntl opcache \ mysqli pdo pdo_mysqlphp 5.6.40-fpm基于debian stretch(debian 9)，目前已经EOL，/etc/apt/sources.list需要使用Debian过期源地址。php 7.4部署容器[root@ecs ~]# docker run --name php-fpm \ -e TZ=Asia/Shanghai \ -v /data/wwwroot:/data/wwwroot \ -v /tmp:/tmp \ -v /var/run/docker.sock:/var/run/docker.sock \ -v /usr/bin/docker:/usr/bin/docker \ -p 9000:9000 \ --privileged=true --restart=always \ -d maisi/php:7.4-fpm/usr/bin/docker:/usr/bin/docker非必须，但如果php需要调用docker程序，则必须设置docker映射。yum install docker方式安装的docker最高版本为：1.13.1，使用-v /usr/bin/docker:/usr/bin/docker，在容器中执行docker命令会报错：Can't open /etc/sysconfig/docker，必须完全卸载后再安装高版本的docker-ce。安装mysqli扩展[root@ecs ~]# docker exec -it php-fpm /bin/sh # ln -snf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime \ && echo "Asia/Shanghai" > /etc/timezone # sed -i 's/deb.debian.org/mirrors.aliyun.com/;s/security.debian.org/mirrors.aliyun.com/g' /etc/apt/sources.list # apt-get update \ && apt-get -y --no-install-recommends install \ cron rsyslog supervisor \ zlib1g-dev libpng-dev libzip-dev \ && docker-php-ext-configure gd \ && docker-php-ext-install -j$(nproc) bcmath gd pcntl opcache zip \ mysqli pdo pdo_mysql
安装certbot[root@ecs ~]# yum install -y certbot证书操作http-01验证签发证书[root@ecs ~]# certbot certonly -d wiseidc.com -d www.wiseidc.com --webroot -w /data/wwwroot/wiseidc注：使用http-01验证方式，必须保证http://www.wiseidc.com和http://wiseidc.com能够正常访问。续签证书[root@ecs ~]# certbot renew --deploy-hook "systemctl restart nginx" [root@ecs ~]# certbot renew --renew-hook "/usr/local/nginx/sbin/nginx -s reload"删除证书[root@ecs ~]# certbot delete --cert-name wiseidc.comdns-01验证安装aliyun-cli[root@ecs ~]# cd /usr/local/src [root@ecs src]# wget https://aliyuncli.alicdn.com/aliyun-cli-linux-latest-amd64.tgz [root@ecs src]# tar xzvf aliyun-cli-linux-latest-amd64.tgz [root@ecs src]# mv aliyun /usr/local/bin [root@ecs src]# aliyun version 3.4.11配置凭证[root@ecs ~]# aliyun configure set --profile default --mode AK \ --access-key-id ****** \ --access-key-secret ****** \ --region cn-shanghai--profile default：配置profile名称为default，cat ~/.aliyun/config.json可以看到有多个profiles，通过描述名区分不同的profile。验证ak凭证是否生效，查看当前region区域内的ecs列表：[root@ecs ~]# aliyun ecs DescribeInstances --profile default安装certbot-dns-aliyun[root@ecs ~]# cd /usr/local/src [root@ecs ~]# wget http://cdn.jsdelivr.net/gh/justjavac/certbot-dns-aliyun@main/alidns.sh [root@ecs ~]# mv alidns.sh /usr/local/bin [root@ecs ~]# chmod +x /usr/local/bin/alidns.sh [root@ecs ~]# ln -s /usr/local/bin/alidns.sh /usr/local/bin/alidns签发证书[root@ecs ~]# certbot certonly -d wiseidc.com -d *.wiseidc.com \ --manual --preferred-challenges dns \ --manual-auth-hook "alidns" \ --manual-cleanup-hook "alidns clean" \ --dry-run-d wiseidc.com：指定域名，可以指定多个域名。manual：手动模式。preferred-challenges dns：使用DNS-01方式验证。manual-auth-hook "alidns"：在DNS验证时调用alidns脚本。manual-cleanup-hook "alidns clean"：在DNS验证完成后调用alidns clean脚本。--dry-run：模拟签发过程，不会实际签发证书，正式签发不需要此参数。续期证书[root@ecs ~]# certbot renew --quiet --preferred-challenges dns \ --manual-auth-hook "alidns" \ --manual-cleanup-hook "alidns clean" \ --deploy-hook "systemctl restart nginx"
CentOS 7.9安装LibreOffice安装JRE[root@ecs ~]# cd /usr/local/src [root@ecs src]# tar -zxvf server-jre-8u301-linux-x64.tar.gz [root@ecs src]# mv /usr/local/src/jdk1.8.0_301 /usr/local/jdk [root@ecs src]# cat >> /etc/profile << EOF export JAVA_HOME=/usr/local/jdk export JRE_HOME=\$JAVA_HOME/jre export CLASSPATH=.:\$JAVA_HOME/lib:\$JRE_HOME/lib export PATH=\$JAVA_HOME/bin:\$PATH EOF [root@ecs src]# source /etc/profile安装LibreOffice安装主程序[root@ecs ~]# cd /usr/local/src [root@ecs src]# tar -zxvf LibreOffice_7.5.7.1_Linux_x86-64_rpm.tar.gz [root@ecs src]# cd LibreOffice_7.5.7.1_Linux_x86-64_rpm/RPMS && yum install -y *.rpm安装中文语言包如需处理中文字体，必须安装中文语言包，否则无法正确识别中文字体名称。[root@ecs ~]# cd /usr/local/src [root@ecs ~]# tar -zxvf LibreOffice_7.5.7.1_Linux_x86-64_rpm_langpack_zh-CN.tar.gz [root@ecs ~]# cd LibreOffice_7.5.7.1_Linux_x86-64_rpm_langpack_zh-CN && yum install -y *.rpm安装依赖[root@ecs ~]# yum install -y libXinerama cairo cups-libs不安装依赖会出现以下报错：/opt/libreoffice7.5/program/oosplash: error while loading shared libraries: libXinerama.so.1: cannot open shared object file: No such file or directory/opt/libreoffice7.5/program/soffice.bin: error while loading shared libraries: libcairo.so.2: cannot open shared object file: No such file or directory/opt/libreoffice7.5/program/soffice.bin: error while loading shared libraries: libcups.so.2: cannot open shared object file: No such file or directory安装中文字体必须安装中文字体，否则LibreOffice在处理文档时，中文字体会变成方框。[root@ecs ~]# cp /usr/local/src/fonts/*.ttf /usr/share/fonts切换中文系统语言在非中文系统语言下，LibreOffice将无法识别中文字体名称，从而认为字体缺失，LibreOffice会使用第一个中文字体（按照拼音首字母排序）替换，如果找不到中文字体，则显示为方框。[root@ecs ~]# sed -i "/^LANG=\"en_US.UTF-8\"/cLANG=\"zh_CN.UTF-8\"" /etc/locale.conf [root@ecs ~]# reboot在安装CentOS 7.9时默认已经包含了大量语言包，因此可以直接修改/etc/locale.conf即可切换中文语言。但如果使用极简安装（如Docker CentOS），默认可能没有安装中文语言包，即使修改了/etc/locale.conf也无法显示中文，因为缺少语言包文件。查看系统已安装语言包：[root@ecs ~]# locale -a | grep zh_CN安装中文语言包[root@ecs ~]# localedef -c -f UTF-8 -i zh_CN zh_CN.UTF-8临时中文显示[root@ecs ~]# LC_ALL=zh_CN.UTF-8 date 2026年 08月 06日 星期四 13:05:12 CS切换语言[root@ecs ~]# sed -i "/^LANG=/cLANG=\"zh_CN.UTF-8\"" /etc/locale.conf或者：[root@ecs ~]# localectl set-locale LANG=zh_CN.UTF-8应用格式转换[root@ecs ~]# /opt/libreoffice7.5/program/soffice \ --headless --invisible --convert-to pdf:writer_pdf_Export \ --outdir /usr/local/src/ /usr/local/src/demo.docx 2>&1设置水印[root@ecs ~]# /opt/libreoffice7.5/program/soffice \ --headless --invisible \ --convert-to pdf:writer_pdf_Export:'{"Watermark":{"type":"string","value":"draft"}, "WatermarkColor":{"type":"long","value":"8355711"}, "WatermarkFontName":{"type":"string","value":"Times"}, "WatermarkFontHeight":{"type":"long","value":"100"}, "WatermarkRotateAngle":{"type":"long","value":"450"}}' \ --outdir /usr/local/src/ /usr/local/src/demo.docx 2>&1服务器模式[root@ecs ~]# /opt/libreoffice7.5/program/soffice --headless \ --accept="socket,host=127.0.0.1,port=3000;urp;" --nofirststartwizard &查看进程[root@ecs ~]# yum install -y net-tools [root@ecs ~]# netstat -anp | grep :3000 tcp 0 0 127.0.0.1:3000 0.0.0.0:* LISTEN 17416/soffice.bin [root@ecs ~]# ps -ef | grep libreoffice root 17394 1186 0 14:13 pts/0 00:00:00 /opt/libreoffice7.5/program/oosplash --headless --accept=socket,host=127.0.0.1,port=3000;urp; --nofirststartwizard root 17416 17394 0 14:13 pts/0 00:00:00 /opt/libreoffice7.5/program/soffice.bin --headless --accept=socket,host=127.0.0.1,port=3000;urp; --nofirststartwizardunoconv安装[root@ecs ~]# cd /usr/local/src [root@ecs src]# tar -zxvf unoconv-0.8.2.tar.gz [root@ecs src]# cd unoconv-0.8.2 && make installsocket连接LibreOffice以服务器模式运行后，unoconv可以直接通过UNO协议进行通信。[root@ecs ~]# unoconv --connection 'socket,host=127.0.0.1,port=3000,tcpNoDelay=1;urp;StarOffice.ComponentContext' -f pdf demo.docx或者：[root@ecs ~]# unoconv -f pdf -p 3000 demo.docx监听模式unoconv包含直接模式（Direct Mode）和监听模式（Listener Mode）。可以以服务器模式启动LibreOffice，然后unoconv通过--connection或-p直接连接。也可以使用unoconv --listener创建Listener（默认端口号2002）。[root@ecs ~]# unoconv --listener --server=0.0.0.0 --port=2002 &unoconv在执行文档转换时，默认尝试连接2002端口的Listener，如果unoconv --listener监听在其它端口，连接就会失败。连接失败后会自动启动一个2002端口的Listener。新的Listener会尝试启动soffice.bin，但由于unoconv --listener已经启动了soffice.bin进程，因此新的Listener将2002端口路由到soffice.bin后就终止Listener进程，转换动作没完成，终端会报错：Error: Unable to connect or start own listener. Aborting.。解决方法（二选一）：使用-p指定连接端口直接指定连接端口，避免新建listener。[root@ecs ~]# unoconv -f pdf -p 2002 demo.docx重新执行再次执行时，由于2002端口已经路由到soffice.bin，因此可以正常执行。[root@ecs ~]# unoconv -f pdf demo.docx查看执行过程：[root@ecs ~]# unoconv -vvv -f pdf demo.docx查看端口监听状态[root@ecs ~]# netstat -tlnp | grep 2002 tcp 0 0 127.0.0.1:2002 0.0.0.0:* LISTEN 1342/soffice.bin [root@ecs ~]# lsof -i:2002 -P -n soffice.b 1342 root 14u IPv4 137618 0t0 TCP 127.0.0.1:2002 (LISTEN) [root@ecs ~]# ss -tlnp | grep -E "2002|3000" LISTEN 0 128 127.0.0.1:2002 *:* users:(("soffice.bin",pid=1342,fd=14)) LISTEN 0 128 *:3000 *:* users:(("soffice.bin",pid=1342,fd=11))新的Listener在尝试启动soffice.bin时，如果没有发现已存在的soffice.bin进程，则会进入直接模式，执行完转换任务后，会自动终止Listener进程。直接模式每次都会创建soffice.bin进程，转换完成后再终止soffice.bin进程。因此在没有执行unoconv --listener的情况下，每次执行unoconv -f pdf demo.docx都需要等待一会儿，因为每次都需要先启动soffice.bin（比较消耗时间），转换完成后再终止soffice.bin。Docker部署自建镜像创建DockerfileFROM maisi/centos:7.9.2009 WORKDIR /opt/libreoffice7.5/program ENV LANG=zh_CN.UTF-8 \ LC_ALL=zh_CN.UTF-8 ADD http://mirrors.aliyun.com/repo/Centos-7.repo /etc/yum.repos.d/CentOS-Base.repo RUN yum clean all && yum makecache RUN yum install libXinerama cairo cups-libs -y \ yum clean all && \ rm -rf /tmp/* rm -rf /var/cache/yum/* && \ localedef -c -f UTF-8 -i zh_CN zh_CN.UTF-8 && \ sed -i "/^LANG=/cLANG=\"zh_CN.UTF-8\"" /etc/locale.conf && \ ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime ADD LibreOffice_7.5.7.1_Linux_x86-64_rpm.tar.gz /usr/local/src/ ADD LibreOffice_7.5.7.1_Linux_x86-64_rpm_langpack_zh-CN.tar.gz /usr/local/src/ RUN cd /usr/local/src/LibreOffice_7.5.7.1_Linux_x86-64_rpm/RPMS/ && \ yum localinstall *.rpm -y && \ cd /usr/local/src/LibreOffice_7.5.7.1_Linux_x86-64_rpm_langpack_zh-CN/RPMS/ && \ yum localinstall *.rpm -y ENV PATH=/opt/libreoffice7.5/program/:/opt/libreoffice7.5/program/python-core-3.8.18/bin:${PATH} ARG JDK_PATH=/usr/local/jdk ADD server-jre-8u351-linux-x64.tar.gz /usr/local/src/ RUN mv /usr/local/src/jdk1.8.0_351 ${JDK_PATH} ENV JAVA_HOME=${JDK_PATH} \ JRE_HOME=${JDK_PATH}/jre \ CLASSPATH=.:${JDK_PATH}/lib:${JDK_PATH}/jre\lib \ PATH=${JDK_PATH}/bin:${PATH} ADD setuptools-68.2.2.tar.gz /usr/local/src/ ADD pip-23.3.1.tar.gz /usr/local/src/ RUN cd /usr/local/src/setuptools-68.2.2 && \ python setup.py install && \ cd /usr/local/src/pip-23.3.1 && \ python setup.py install && \ rm -rf /usr/local/src/*.* && yum clean all RUN python -m pip install -i https://pypi.tuna.tsinghua.edu.cn/simple --trusted-host pypi.tuna.tsinghua.edu.cn unoserver flask gunicorn && \ ln -s /opt/libreoffice7.5/program/soffice libreoffice && \ sed -i s#/program/python.bin#/program/python#g /opt/libreoffice7.5/program/python-core-3.8.18/bin/unoserver && \ sed -i s#/program/python.bin#/program/python#g /opt/libreoffice7.5/program/python-core-3.8.18/bin/unoconvert && \ sed -i s#/program/python.bin#/program/python#g /opt/libreoffice7.5/program/python-core-3.8.18/bin/gunicorn COPY ./app /app EXPOSE 3000 # CMD ["soffice", "--headless", "--accept=socket,host=0.0.0.0,port=3000;urp;", "--nofirststartwizard"] ENTRYPOINT unoserver --daemon & gunicorn -w 2 -b :3000 --chdir /app app:app构建镜像[root@ecs ~]# docker build -t libreoffice:7.5.7.1-centos7.9.2009 --progress=plain --no-cache .创建容器[root@ecs ~]# docker run --name=libreoffice \ --restart unless-stopped \ --privileged=true \ -e TZ=Asia/Shanghai \ -p 3000:3000 \ -v /data/libreoffice:/data \ -d libreoffice:7.5.7.1-centos7.9.2009中文支持[root@ecs ~]# docker cp /data/libreoffice/fonts/STKaiti.ttf libreoffice:/opt/libreoffice7.5/share/fonts/truetype [root@ecs ~]# docker cp /data/libreoffice/fonts/方正仿宋_gbk.ttf libreoffice:/opt/libreoffice7.5/share/fonts/truetype [root@ecs ~]# docker restart libreoffice上传镜像[root@ecs ~]# docker tag libreoffice:7.5.7.1-centos7.9.2009 registry.cn-shanghai.aliyuncs.com/maisi/libreoffice:7.5.7.1-centos7.9.2009 [root@ecs ~]# docker push registry.cn-shanghai.aliyuncs.com/maisi/libreoffice:7.5.7.1-centos7.9.2009格式转换容器内调用[root@ecs ~]# docker exec -it libreoffice /bin/bash [root@cc3b8a72e553 program]# ./soffice --headless --invisible --convert-to pdf --outdir /data /data/demo.docx [root@cc3b8a72e553 program]# unoconvert /data/demo.docx --convert-to pdf /data/demo.pdf宿主机调用[root@ecs ~]# docker exec libreoffice ./soffice --headless --invisible --convert-to pdf --outdir /data /data/demo.docx容器间调用[root@ecs ~]# docker run -it --rm --privileged --name node \ -v /var/run/docker.sock:/var/run/docker.sock maisi/node:22-alpine sh / # apk add --no-cache docker-cli / # docker exec libreoffice ./soffice --versionapi转换容器内文件[root@ecs ~]# curl -X POST http://127.0.0.1:3000/convert-to/pdf \ -H "Content-Type: application/x-www-form-urlencoded" \ -d "file=/data/demo.docx"返回：/data/l29126e7v3nn037y6bi7vnbhkwramafq.pdf。将容器内的文件/data/demo.docx转换后保存到容器/data/l29126e7v3nn037y6bi7vnbhkwramafq.pdf。api转换宿主机文件[root@ecs ~]# curl -X POST http://127.0.0.1:3000/convert-to/pdf \ -F 'file=@/data/libreoffice/demo.docx' > /data/libreoffice/demo.pdf将宿主机的文件/data/libreoffice/demo.docx上传到api服务器，再将转换后的文件下载到宿主机/data/libreoffice/demo.pdf。使用LibreOffice/online创建容器[root@ecs ~]# docker run --name=libreoffice \ --restart unless-stopped \ --privileged=true \ -e TZ=Asia/Shanghai \ -e username=admin -e password=123456 \ -e extra_params=--o:ssl.enable=false \ -p 9980:9980 \ -v /data/libreoffice:/data:Z \ -d libreoffice/online控制台不允许有特殊字符，如果密码设置为admin@123，实际密码会变成admin。libreoffice/online默认开启ssl，强制https方式访问，如果需要通过http方式访问，必须关闭ssl。设置环境变量-e extra_params=--o:ssl.enable=false即可关闭ssl。:Z和:z仅在操作系统启用了SELinux时才有效。:z映射的卷可以被多个容器共享，而:Z仅限当前容器私有使用。浏览器访问：http://192.168.3.103:9980，返回OK表示部署已成功。管理中心：http://192.168.3.103:9980/loleaflet/dist/admin/admin.html查看启动日志[root@ecs ~]# docker logs --tail 50 --follow --timestamps libreoffice关闭ssl访问除了通过设置环境变量-e extra_params=--o:ssl.enable=false来关闭ssl之外，还可以通过修改配置文件来关闭ssl。[root@ecs ~]# docker exec -it libreoffice sed -i "/SSL support to enable./s/>true/>false/" /etc/loolwsd/loolwsd.xml [root@ecs ~]# docker restart libreoffice允许使用本地文件系统[root@ecs ~]# docker exec -it libreoffice sed -i "/filesystem/s/false/true/" /etc/loolwsd/loolwsd.xml [root@ecs ~]# docker restart libreoffice打开本地文件：http://127.0.0.1:9980/loleaflet/dist/loleaflet.html?file_path=file:///data/hello.docx/data/hello.docx是容器内的文件路径，-v /data/libreoffice:/data:Z将宿主机的/data/libreoffice挂载到容器内的/data目录，因此/data/hello.docx实际是宿主机的/data/libreoffice/hello.docx。添加中文字体[root@ecs ~]# docker cp /data/libreoffice/fonts/STKaiti.ttf libreoffice:/opt/libreoffice/share/fonts/truetype [root@ecs ~]# docker cp /data/libreoffice/fonts/方正仿宋_gbk.ttf libreoffice:/opt/libreoffice/share/fonts/truetype [root@ecs ~]# docker restart libreoffice转换文件[root@ecs ~]# curl -F "data=@/data/libreoffice/demo.docx" http://127.0.0.1:9980/lool/convert-to/pdf > demo.pdf
基础概念容器格式（Container Format）容器格式又称封装格式，用于封装视频、音频、字幕、元数据（标题、章节信息等）等各种流媒体内容，容器决定了文件的扩展名。常见的容器格式：容器格式说明mp4支持多种编解码器，广泛用于互联网和移动设备mkv支持多轨音频、字幕，灵活性强，常用于高清电影和视频avi支持功能有限，但兼容性强mov苹果格式，主要用于QuickTimeflvFlash流媒体，现在使用较少webm由Google提出，专为web视频流设计，轻量且开放ogg免费、无专利限制、高质量的音频压缩格式编码格式（Codec）编码格式也称编解码器（Codec，Compressor/Decompressor），是对音视频数据进行压缩和解压缩的技术。编码器将原始多媒体数据压缩为更小的文件，以便于存储和传输，而解码器则负责将压缩的数据还原为可播放的音频或视频。常见的视频编码格式：编码格式说明H.264 (AVC)最常用的压缩标准，广泛用于网络流媒体、蓝光等H.265 (HEVC)H.264的升级版，压缩效率更高，适用于4K、8K视频MPEG-4早期的压缩标准，主要用于流媒体和在线视频VP9Google开发的开源编解码器，常用于YouTube视频AV1更先进的开源编解码器，旨在取代H.265和VP9容器格式和编码格式密切相关，但职责不同。容器负责封装和管理音视频、字幕等数据，编码格式负责压缩和解压实际的音视频数据。同一容器可以支持多种编码格式。例如mp4容器可以使用H.264、H.265等不同的编解码器，mkv容器支持H.264、VP9等多种音视频编码。安装编译环境nasm/yasmnasm/yasm都是汇编编译器，yasm是从nasm的基础上开发出来的，属于同宗，使用了相同的语法，所以nasm的代码可以用yasm编译。yasm对nasm一些不合理的地方进行了改良。但yasm更新较慢，而nasm更新较快，能支持更新的指令集，而且还支持Gas语法和AMD64（EM64T）架构，跨平台，支持多种目标文件格式。在Window平台上，fasm支持最好。必须安装nasm/yasm，否则会报错：nasm/yasm not found or too old. Use --disable-x86asm for a crippled build.。nasm下载地址：https://www.nasm.us/pub/nasm/releasebuilds/[root@ecs ~]# yum install -y gcc [root@ecs ~]# tar -xvf nasm-2.15.05.tar.gz && cd nasm-2.15.05 [root@ecs nasm-2.15.05]# ./configure && make && make installnasm和yasm二者安装其一即可，但由于x265 2.6版之后，只能使用nasm 2.13或更高版本编译，因此如果要安装x265 2.6之后的版本就只能选择nasm。安装媒体开发库SDLSDL是一套开源的跨平台多媒体开发库，专注于提供图形、音频和输入设备的访问。SDL主要用于：图形显示：提供对窗口、渲染器和纹理的控制，用于显示图像或视频；音频输出：处理和播放音频数据；输入处理：管理键盘、鼠标等输入设备。SDL通常和ffmpeg搭配使用，可以实现功能上的互补。ffmpeg主要负责音视频解码，再由SDL负责将视频原始帧数据显示到屏幕，将解码后的音频数据输出到扬声器。在需要实时处理和播放的音视频应用中，ffmpeg解码后的数据通过SDL进行渲染和播放。编译ffmpeg的时候加上参数--enable-ffplay即可生成ffplay。[root@ecs ~]# cd /usr/local/src [root@ecs src]# tar -zxvf SDL2-2.0.20.tar.gz && cd SDL2-2.0.20 [root@ecs SDL2-2.0.20]# ./configure && make -j 16 && make install注：SDL只有在生成ffplay时才是必须的，如果不需要编译ffplay则忽略SDL。安装依赖库libmp3lame[root@ecs ~]# cd /usr/local/src [root@ecs src]# tar xzvf lame-3.100.tar.gz && cd lame-3.100 [root@ecs src]# ./configure --enable-nasm && make && make installffmpeg不支持mp3编码，因此需要依赖libmp3lame实现编码功能，但ffmpeg支持mp3解码，因此无需安装libMAD。xvidxvid是一个开放源代码的MPEG-4（Moving Picture Experts Group-4 Part 2）视频编解码器。与x264相比，相同质量下，x264压缩的视频体积更小。下载地址：https://downloads.xvid.org/downloads/xvidcore-1.3.7.tar.gz[root@ecs ~]# cd /usr/local/src [root@ecs src]# tar -zxvf xvidcore-1.3.7.tar.gz && cd xvidcore/build/generic [root@ecs src]# ./configure && make && make installlibx264H.264(AVC)，全称MPEG-4 Part 10或Advanced Video Coding(AVC)，是由ITU-T的视频编码专家组（VCEG）和ISO/IEC的动态图像专家组（MPEG）联合制定的视频编码标准。ITU-T称为H.264，ISO/IEC则归纳与MPEG系列，称为MPEG-4 Part 10，另一个代称是MPEG-4 AVC。x264是一个开源的H.264/MPEG-4 AVC视频编码库，是最好的有损视频编码器之一。下载地址：https://www.videolan.org/developers/x264.html[root@ecs ~]# cd /usr/local/src [root@ecs src]# tar -zxvf x264-master.tar.gz && cd x264-master [root@ecs src]#./configure --enable-shared --enable-static --disable-asm [root@ecs src]#make && make installlibx265H.265又称High Efficiency Video Coding(HEVC)，是H.264的升级版。x265是一个开源的H.265视频编码库。下载地址：https://www.videolan.org/developers/x265.htmlx265需要CMake 2.8.8或更高版本，yum的cmake版本为2.8.12，因此直接yum安装即可。[root@ecs ~]# yum install -y gcc-c++ cmake numactl-devel [root@ecs ~]# cd /usr/local/src [root@ecs src]# tar -zxvf x265_4.0.tar.gz [root@ecs src]# cd x265_4.0/build/linux [root@ecs linux]# sed -i 's/string(SUBSTRING "\${X265_REVISION_ID}" 0 12 X265_REVISION_ID)/set(X265_LATEST_TAG "4.0")\n set(X265_TAG_DISTANCE "23")\n set(X265_REVISION_ID "487105d")\n string(SUBSTRING "\${X265_REVISION_ID}" 0 7 X265_REVISION_ID)/g' /usr/local/src/x265_4.0/source/cmake/Version.cmake [root@ecs linux]# cmake -G "Unix Makefiles" ../../source [root@ecs linux]# make -j$(nproc) && make install常见报错：报错：CMake Error: your CXX compiler: "CMAKE_CXX_COMPILER-NOTFOUND" was not found.，解决方法：安装gcc-c++。报错：Could NOT find nasm，解决方法：安装nasm。报错：Could NOT find NUMA (missing: NUMA_ROOT_DIR NUMA_INCLUDE_DIR NUMA_LIBRARY)，解决方法：安装numactl-devel。注：ffmpeg自身支持H.264和H.265的解码，因此无需安装其它解码器。libvpxVP8是google定义并开源的视频编解码标准和编解码库实现。MPEG系列格式商用需要缴纳授权费用，因此Google和On2 Technologies制定了VP8，并在收购On2 Technologies之后将VP8开源（BSD授权），使其成为可免费授权使用的高品质视频编码格式。VP8号称比H.264编码性能更好，实际上没那么夸张，差不多相当于ffmpeg内置默认的openh264编解码库。VP8的压缩实现与H.264有点区别就是VP8没有B帧，而H.264有B帧。VP8的优点是开源，没有H.264/H.265的专利版权风险，除了IE9以下版本的浏览器外，现代浏览器都支持VP8视频编码，即webm视频格式。VP9也是google开源的，用于比拼H.265(HEVC)的编解码器。兼容性方面，除了IE9以下版本的浏览器外，现代浏览器都支持VP9视频编码。libvpx是WebM项目的子库，可以同时支持VP8和VP9视频编码。下载地址：https://github.com/webmproject/libvpx/archive/v1.11.0/libvpx-1.11.0.tar.gz[root@ecs ~]# yum install -y perl [root@ecs ~]# cd /usr/local/src [root@ecs src]# tar -zvxf libvpx-1.11.0.tar.gz && cd libvpx-1.11.0 [root@ecs src]# ./configure --enable-shared && make && make installaacAAC全称Advanced Audio Coding，高级音频编码。是目前最常用的一种音频编码格式，与MP3相比，AAC是一种编码效果更好，编码音质更高的音频编码格式，常见的使用AAC编码后的文件存储格式为m4a。ffmpeg可以调用的AAC编码器主要有：aac：ffmpeg自带的aac编码器；libfaac：第三方aac编码器，faac是aac音频编码库，可将pcm音频编码为aac格式。faad是aac音频解码库，可将aac格式数据解码为pcm数据；libfdk_aac：第三方aac编解码器。libfaac和libfdk_aac为非GPL协议，所以在预编译时需采用nonfree支持。性能对比：libfdk_aac > aac > libfaac，新版ffmpeg已经弃用了--enable-libfaac，因此只能选择libfdk_aac。fdk-aac下载地址：https://downloads.sourceforge.net/opencore-amr/fdk-aac-2.0.1.tar.gz[root@ecs ~]# cd /usr/local/src [root@ecs src]# tar xzvf fdk-aac-2.0.1.tar.gz && cd fdk-aac-2.0.1 [root@ecs src]# ./configure && make && make installoggOgg是一种流式容器格式，提供对流式数据进行分割、存储、排序、按时间顺序查找以及检查数据丢失的框架。Ogg格式主要采用Vorbis/Opus编码格式。Vorbis是Xiph.Org基金会为了对抗MP3收费音频格式而推出的一种有损压缩音频编码格式，支持多通道。它完全免费、开放且没有专利限制。libvorbis是Vorbis的编解码库，下载地址：https://www.xiph.org/downloads/。[root@ecs ~]# cd /usr/local/src [root@ecs src]# tar -xzvf libogg-1.3.5.tar.gz && cd libogg-1.3.5 [root@ecs libogg-1.3.5]# ./configure && make && make install [root@ecs libogg-1.3.5]# echo /usr/local/lib >> /etc/ld.so.conf; ldconfig [root@ecs libogg-1.3.5]# cd /usr/local/src [root@ecs src]# tar -zxvf libvorbis-1.3.7.tar.gz && cd libvorbis-1.3.7 [root@ecs libvorbis-1.3.7]# ./configure && make && make install [root@ecs libvorbis-1.3.7]# echo export PKG_CONFIG_PATH="\$PKG_CONFIG_PATH:/usr/local/lib/pkgconfig" >> /etc/profile [root@ecs libvorbis-1.3.7]# source /etc/profilelibvorbis依赖于libogg，安装完libogg后，需要配置ld.so.conf，否则会报错：configure: error: must have Ogg installed!。安装好libvorbis后，还需要配置PKG_CONFIG_PATH，否则编译ffmpeg时会报错：ERROR: vorbis not found using pkg-config。或者直接安装libvorbis-devel（自动安装libogg-devel）。Vorbis在中高码率时优势明显，低码率时效果不佳。Xiph.Org随后开发了Speex有损压缩音频格式，专攻低码率语音，适用于视频通话、游戏聊天、有声读物等。后来Xiph研发CELT技术（继承自Vorbis的MDCT）以改进Speex，互联网工程任务组（IETF）将CELT和Skype公司的SILK（LP线性预测）这两个技术集成为Opus。Opus是一个完全开源、免费、通用性高的音频编解码器，由Xiph和Skype合作开发，8kHz以下（语音）用LP，8~20kHz用MDCT，强强联手，无缝切换，不仅音质极佳，而且适用范围广。[root@ecs ~]# cd /usr/local/src [root@ecs src]# tar -zxvf opus-1.3.1.tar.gz && cd opus-1.3.1 [root@ecs opus-1.3.1]# ./configure --disable-static && make && make install或者直接安装opusfile-devel（自动安装libogg-devel和opus-devel）。flacFLAC既是一个容器格式，也是一个编码格式。是目前最快、支持最广泛的无损音频格式，也是唯一一个开源无专利的无损音频格式。FLAC原为Josh Coalson发起的项目，后并入Xiph.Org基金会。ffmpeg支持flac的编解码，无需安装编解码库。安装FFmpeg[root@ecs ~]# cd /usr/local/src [root@ecs src]# yum install -y bzip2 [root@ecs src]# tar -jvxf ffmpeg-7.0.2.tar.bz2 && cd ffmpeg-7.0.2 [root@ecs ffmpeg-7.0.2]# ./configure --prefix=/usr/local/ffmpeg \ --enable-ffplay --enable-libmp3lame \ --enable-libfdk-aac --enable-nonfree \ --disable-static --enable-shared \ --enable-libx264 --enable-libx265 --enable-gpl --enable-version3 \ --enable-libvpx --enable-libxvid [root@ecs ffmpeg-7.0.2]# make -j$(nproc) && make install [root@ecs ffmpeg-7.0.2]# cat >> /etc/profile << EOF export PATH=\$PATH:/usr/local/ffmpeg/bin LD_LIBRARY_PATH=/usr/local/ffmpeg/lib:/usr/local/lib:\$LD_LIBRARY_PATH EOF [root@ecs ffmpeg-7.0.2]# source /etc/profile编译参数说明：参数说明--prefix安装目录--enable-debug打开debug模式--disable-static --enable-shared编译成动态库，默认编译成静态库--disable-static：禁止编译静态链接库（.a或.lib）--enable-shared：编译动态链接库（.so、.dll或.dylib）--enable-ffplay生成ffplay（默认编译不带ffplay）,必须先安装SDL，否则即使--enable-ffplay也无法生成ffplay--enable-libx264 --enable-gpllibx264采用GPL协议，所以用到libx264的ffmpeg必须gpl--enable-version3启用‌LGPLv3（GNU Lesser General Public License version 3）许可，必须先--enable-gpl--enable-filter=delogo启用去水印滤镜--enable-libfdk-aac --enable-nonfree使用libfdk-aac库进行aac编解码fdk-aac使用非自由许可证，与GPL不兼容，必须添加--enable-nonfree，生成的FFmpeg（库或二进制文件）不可公开分发必须将/usr/local/ffmpeg/lib目录加入环境变量LD_LIBRARY_PATH中，否则在使用ffmpeg的过程中就会出现类似cannot open shared object file: No such file or directory这样的报错。如果需要避免运行时依赖，须要同时设置：--enable-static --disable-shared。注：只设置--enable-static而不设置--disable-shared，ffmpeg会同时生成.a和.so，默认情况下gcc链接时优先使用.so，导致ffmpeg仍是动态链接的。常见报错ffmpeg: error while loading shared libraries: libavdevice.so.61: cannot open shared object file: No such file or directory。此类报错一般会出现在--enable-shared方式编译的情况下。查看ffmpeg依赖[root@ecs ~]# ldd /usr/local/ffmpeg/bin/ffmpeg linux-vdso.so.1 => (0x00007ffcd1fbb000) libavdevice.so.61 => not found libavfilter.so.10 => not found libavformat.so.61 => not found libavcodec.so.61 => not found libpostproc.so.58 => not found libswresample.so.5 => not found libswscale.so.8 => not found libavutil.so.59 => not found libm.so.6 => /lib64/libm.so.6 (0x00007fb088914000) libpthread.so.0 => /lib64/libpthread.so.0 (0x00007fb0886f8000) libc.so.6 => /lib64/libc.so.6 (0x00007fb08832a000) /lib64/ld-linux-x86-64.so.2 (0x00007fb088c16000)发现很多都是not found，查找libavdevice.so.59共享库：[root@ecs ~]# find / -name libavdevice.so /usr/local/ffmpeg/lib/libavdevice.so/usr/local/ffmpeg/lib/存在libavdevice.so，但为什么还提示not found呢？ffmpeg在调用动态链接库时，会到系统默认的动态链接库路径下查找，查看系统默认的动态链接库路径：[root@ecs ~]# ld --verbose | grep SEARCH SEARCH_DIR("=/usr/x86_64-redhat-linux/lib64"); SEARCH_DIR("=/usr/lib64"); SEARCH_DIR("=/usr/local/lib64"); SEARCH_DIR("=/lib64"); SEARCH_DIR("=/usr/x86_64-redhat-linux/lib"); SEARCH_DIR("=/usr/local/lib"); SEARCH_DIR("=/lib"); SEARCH_DIR("=/usr/lib");返回的路径中并没有/usr/local/ffmpeg/lib/，因此就无法找到libavdevice.so了。解决方法只需将/usr/local/ffmpeg/lib/添加到动态链接库路径即可。[root@ecs ~]# echo export LD_LIBRARY_PATH="/usr/local/ffmpeg/lib:/usr/local/lib:\$LD_LIBRARY_PATH" >> /etc/profile [root@ecs ~]# source /etc/profile或者：[root@ecs ~]# echo "/usr/local/ffmpeg/lib" >> /etc/ld.so.conf; ldconfig
安装SoX安装依赖libmp3lamelibmp3lame是目前最好的mp3编码器，编码高质量mp3最好也是唯一的选择。[root@ecs ~]# yum install -y lame-devellame-devel包含了libmp3lame.so，SoX调用libmp3lame.so实现解码mp3功能。windows sox默认不支持编解码mp3，需要依赖libmp3lame-0.dll和libmad-0.dll才能实现编解码功能。将wav等音频格式转为mp3时，使用libmp3lame-0.dll进行编码。将mp3转为wav等格式时，使用libmad-0.dll进行解码。linux lame即可以编码，也可以解码mp3、wav和aif格式，等效于windows sox + libmp3lame-0.dll + libmad-0.dll。wav转mp3[root@ecs ~]# lame -h input.wav output.mp3mp3转wav[root@ecs ~]# lame input.mp3 output.wavlibmadlibMAD是一个开源的高精度MPEG音频解码库，支持MPEG-1。MPEG-1音频分3层，分别是：MPEG-1 Layer1、MPEG-1 Layer2和MPEG-1 Layer3（简称mp3）。[root@ecs ~]# yum install -y libmad-devel虽然lame工具有解码mp3的功能，但libmp3lame并不具备解码mp3的功能，因此SoX需要依赖libmad实现mp3解码功能。id3tagmp3格式标准里没有特别定义保存曲目相关信息的结构，于是在1996年有人提出在mp3文件的末尾添加128字节额外的数据空间用于存储歌曲名、演唱者、专辑名、音轨编号、曲目类型等信息，这些信息成为ID3Tag。[root@ecs ~]# yum install -y libid3tag-devel zlib-devel注：sox编译id3tag时依赖zlib库。towlameTwoLAME is an optimised MPEG Audio Layer 2 (MP2) encoder based on tooLAME by Mike Cheng, which in turn is based upon the ISO dist10 code and portions of LAME.[root@ecs ~]# yum install -y twolame-devel注：twolame-devel自动安装twolame-libs。lame-devel、libmad-devel和twolame-libs均来自epel源，需要先安装epel源。flacflac是一套著名的自由音频无损压缩编码器，不同于其它有损编码（mp3、aac等），flac不会破坏任何原有的音频信息。[root@ecs ~]# yum install -y flac-develvorbis有损音频编解码器（需配合ogg容器使用），完全免费、开放，没有专利限制。[root@ecs ~]# yum install -y libvorbis-developus有损音频编解码器，和vorbis都是由xiph.org基金会开发。opus后由IETF（互联网工程任务组）进行标准化，目的用一种格式包含声音和语音，取代speex和vorbis。[root@ecs ~]# yum install -y opusfile-develwindows可以使用opus-tools实现ogg音频转换，opus-tools等效于sox + libogg-0.dll。wav转ogg[root@ecs ~]# opusenc input.wav output.oggogg转wav[root@ecs ~]# opusdec input.ogg output.wav查看ogg信息[root@ecs ~]# opusinfo input.oggamr全称Adaptive Multi-Rate，自适应多速率编码，主要用于移动设备的音频，压缩比大，但相对其他的压缩格式质量差，多用于人声通话。amr一般是指amr-nb，8kHz采样，有8种比特率的编解码算法，另外有amr-wb，16kHz采样，有9种比特率的编解码算法。由于amr-wb采样率高，所以复杂度大概是amr-nb的两倍。amr-nb和amr-wb都属于speech codec，对audio的编码效果并不好。[root@ecs ~]# yum install -y gcc-c++ [root@ecs ~]# tar -zxvf opencore-amr-0.1.6.tar.gz && cd opencore-amr-0.1.6 [root@ecs opencore-amr-0.1.6]# ./configure [root@ecs opencore-amr-0.1.6]# make && make install或者：[root@ecs ~]# cd /usr/local/src [root@ecs src]# rpm -ivh opencore-amr-devel-0.1.6-1.el7.x86_64.rpm注：opencore-amr（包含amrnb和amrwb）wavpack由David Bryant于1998年开发的一款自由、开放的无损音频编解码器。[root@ecs ~]# yum install -y wavpack-devellibsndfile一款专注于音频文件读写的跨平台C语言库，支持wav、flac等主流格式，适用于音频数据处理、格式转换等场景。sox通常自带对大量音频格式支持，同时也支持通过libsndfile库扩展其格式处理能力，sox不强制依赖libsndfile。[root@ecs ~]# yum install -y libsndfile-devellibmagic智能处理没有扩展名或扩展名错误的音频，通过读取文件头部的magic number来确认真实格式。[root@ecs ~]# yum install -y file-devel安装驱动ALSA[root@ecs ~]# yum install -y alsa-lib-devel不安装驱动不影响SoX的音频处理能力，但会导致play和rec命令无法调用系统的扬声器和麦克风。PulseAudio[root@ecs ~]# yum install -y pulseaudio-libs-develAO[root@ecs ~]# yum install -y libao-devel安装libao-devel会自动安装flac-libs、libogg、libsndfile、libvorbis和pulseaudio-libs等。安装SoX[root@ecs ~]# yum install -y gcc libtool-ltdl-devel [root@ecs ~]# cd /usr/local/src && tar -zxvf sox-14.4.2.tar.gz && cd sox-14.4.2 [root@ecs sox-14.4.2]# ./configure --prefix=/usr/local/sox \ --enable-dl-amrnb \ --enable-dl-amrwb \ --enable-dl-lame \ --enable-dl-mad \ --enable-dl-twolame \ --enable-dl-sndfile \ --enable-shared [root@ecs sox-14.4.2]# make -s && make install [root@ecs sox-14.4.2]# echo export PATH="\$PATH:/usr/local/sox/bin" >> /etc/profile [root@ecs sox-14.4.2]# source /etc/profile将--enable-shared改成--enable-static可以生成静态文件，对比生成的sox程序大小：ll -h /usr/local/sox/bin/sox注：--enable-dl-*生效，必须先安装libtool-ltdl-devel。如果使用--enable-dl-amrnb，可无需安装opencore-amr。--enable-dl使用动态链接，推荐搭配--enable-shared，不使用--enable-dl则可以使用--enable-static。安装脚本[root@ecs ~]# yum install -y gcc lame-devel libmad-devel libid3tag-devel zlib-devel twolame-devel \ flac-devel \ libvorbis-devel opusfile-devel \ wavpack-devel libsndfile-devel file-devel \ alsa-lib-devel pulseaudio-libs-devel \ libtool-ltdl-devel [root@ecs ~]# cd /usr/local/src [root@ecs src]# rpm -ivh opencore-amr-0.1.6-1.el7.x86_64.rpm opencore-amr-devel-0.1.6-1.el7.x86_64.rpm [root@ecs src]# tar -zxvf sox-14.4.2.tar.gz && cd sox-14.4.2 [root@ecs sox-14.4.2]# ./configure --prefix=/usr/local/sox \ --enable-dl-amrnb \ --enable-dl-amrwb \ --enable-dl-lame \ --enable-dl-mad \ --enable-dl-twolame \ --enable-dl-sndfile \ --enable-shared [root@ecs sox-14.4.2]# make -s && make install [root@ecs sox-14.4.2]# echo export PATH="\$PATH:/usr/local/sox/bin" >> /etc/profile [root@ecs sox-14.4.2]# source /etc/profile [root@ecs sox-14.4.2]# sox --version sox: SoX v14.4.2操作SoXsox可以处理self-describing和raw格式音频文件，self-describing音频包含一个用于描述编码属性的文件头（如wav、flac、mp3等），而raw格式不包含这些信息，使用sox时需要通过以下选项指定相关信息：参数说明-b, --bits指定采样大小音频采样时用于存储每个样本的数据位数（bits），目前广泛使用的是16bit采样大小-c, --channels指定通道数文件包含的音频通道数量。目前常见的有单声道（mono）和双声道（stereo）-e, --encoding指定编码器-r, --rate指定采样率指声音由模拟信号（平滑的波形）转换成数字信号（锯齿的波形）的过程中，每秒从连续信号中提取的用于组成离散信号的样本个数。CD的采样率通常使用44100Hz，即1秒内采样44100次-t, --type指定音频文件类型-C指定比特率大小一个单位时间内编码音频信号占用的存储空间大小未压缩格式（wav）比特率不能指定，而是通过采样率 × 采样位深 × 声道数计算而来对于有损压缩，可以按照指定大小做限制播放音频[root@ecs ~]# sox input.wav -t waveaudio -d-t waveaudio：指定输出文件类型为waveaudio（windows特有设备驱动程序别名，代表声卡输出）-d：代表输出设备为默认（default）设备linux系统去掉-t waveaudio（windows专属）放大音量[root@ecs ~]# sox input.wav -t waveaudio -d vol 2.02倍速播放[root@ecs ~]# sox input.wav -t waveaudio -d tempo 22倍速播放[root@ecs ~]# sox input.wav -t waveaudio -d speed 2speed 2会重新采样，丢掉一半的采样点，加原本1秒的数据压缩到0.5秒内播放完，速度和音调都会翻倍。录音从默认设备（麦克风）读取音频数据，输出（录制）到record.mp3文件。[root@ecs ~]# sox -t waveaudio -d record.mp3获取音频元数据[root@ecs ~]# sox --i input.flac查看比特率[root@ecs ~]# sox --i -B input.flac双声道变单声道[root@ecs ~]# sox input.flac -c 1 output.mp3融合声道将左右声道的数据融合（mix）成单声道。[root@ecs ~]# sox input.flac output.mp3 remix 1,2合并声道[root@ecs ~]# sox -M left.wav right.wav output.flacmp3最多支持双声道，当声道数超过2个时，不能导出mp3。放大音量[root@ecs ~]# sox -v 1 input.wav output.wav为了防止过大造成消波，可以使用sox input.wav -n stat -v查看可放大倍数。裁剪[root@ecs ~]# sox input.flac output.wav trim 0 30 [root@ecs ~]# sox input.flac output.wav trim 2:00 1:00trim接收2个参数，第一个参数为裁剪的起始位置，第二个参数为音频持续时间。持续时间可以为正整数（单位秒），也可以使用hh:mm:ss.fs时间格式。拼接[root@ecs ~]# sox input1.mp3 input2.mp3 output.mp3拼接不同于-M合并，拼接是将所有音频放在同一个声道按顺序连接到一起。混合[root@ecs ~]# sox -m input.flac -v 1.1 input.wav output.mp3将input.flac音量提高1.1倍后与input.wav融合（mix）。注：-m（Mix）是将输入音频相同声道的数据进行叠加，叠加后声道数据不可逆。而-M（Merge）是将输入音频存放于不同的声道，每个声道的数据是相互独立的。