操作系统工具 – 永夜 https://www.shuijingwanwq.com 没有不值得去解决的问题,也没有不值得去学习的技术! Sat, 30 May 2026 10:59:38 +0000 zh-Hans hourly 1 https://wordpress.org/?v=7.0 解决 Linux 微信「另存为」对话框只显示两个文件夹的问题 https://www.shuijingwanwq.com/2026/05/28/13822/ https://www.shuijingwanwq.com/2026/05/28/13822/#respond Thu, 28 May 2026 02:50:46 +0000 https://www.shuijingwanwq.com/?p=13822 浏览量: 83

问题现象

在 Ubuntu 系统中使用原生 Linux 版微信(通常为 Flatpak 版本),当收到图片或文件并点击「另存为」时,弹出的文件保存对话框中只能看到两个目录:

  • 下载
  • xwechat_files

而本来期望看到的是整个用户目录下的所有文件夹,例如:文档、图片、视频、桌面等。如下图所示,对话框中几乎空荡荡,只有寥寥两项。

图中查找范围为 /home/wangqiang,名称列表里仅有「下载」和「xwechat_files」两个文件夹

原因分析

这是因为 Linux 版微信通常以 Flatpak 沙箱形式运行。为了提高安全性,Flatpak 默认限制应用程序只能访问极少数的系统目录(例如 ~/下载 以及应用自己的数据目录 ~/xwechat_files)。其他如 文档图片桌面 等目录,微信没有权限访问,因此在「另存为」对话框中自然看不到。

这并非微信的 bug,而是 Flatpak 的权限隔离机制。好处是微信无法随意读取你的所有个人文件,坏处就是保存文件时很不方便。

解决方案

有两种方式可以解决:图形化工具(推荐新手)或终端命令(推荐熟悉命令行的用户)。

方案一:使用 Flatseal 图形化界面

  1. 安装 Flatseal
    打开终端,执行:
   flatpak install flathub com.github.tchx84.Flatseal
  1. 启动 Flatseal
    在应用程序菜单中找到并打开 Flatseal
  2. 为微信授权
  • 在左侧应用列表中找到 WeChat(或 com.tencent.WeChat)并单击。
  • 在右侧 Filesystem 区域,打开 All user files 开关(允许微信访问整个用户目录)。
  • 或者更精细地,点击「Other files」旁边的加号,添加 /home/wangqiang/文档/home/wangqiang/图片 等具体目录。
  1. 重启微信
    关闭微信再重新打开,再次点击「另存为」,会发现所有常用目录都出现了。

方案二:使用命令行(一次性授权)

如果更习惯使用终端,可以直接执行以下命令,授予微信访问整个用户家目录的权限:

sudo flatpak override com.tencent.WeChat --filesystem=home

如果只想授权特定目录(例如文档和图片):

sudo flatpak override com.tencent.WeChat --filesystem=/home/wangqiang/文档
sudo flatpak override com.tencent.WeChat --filesystem=/home/wangqiang/图片

执行后同样需要重启微信

如图2,可以看见用户目录下的所有目录了

临时变通方法(不修改权限)

如果不想修改微信的权限,也可以这样做:

  1. 在微信聊天窗口中,右键点击文件 → 选择「下载文件」。
  2. 再次右键同一个文件 → 选择「在文件夹中显示」。
  3. 文件管理器会打开 ~/xwechat_files 目录,里面就是已经下载的文件,可以从这里手动复制到任何其他位置。

这个方法不需要任何配置,但每次都要多几步操作。

延伸发现:保存的文件可能没有扩展名

在解决上述问题后,可能会遇到另一个小麻烦:从微信保存的图片,文件名往往只是一串数字或「1」「2」这样的无后缀名称。例如保存了一张图片,文件名叫 1(而不是 1.jpg)。当尝试上传到某些网页(如 DeepSeek)时,即使文件内容本身就是 JPEG,也可能因为缺少扩展名而被文件选择器过滤掉,导致「看不到文件」。

解决办法:批量给无扩展名的图片添加 .jpg 后缀。使用以下命令(安全版,只处理无点号的文件):

cd /path/to/your/images
for f in *; do
    [ -f "$f" ] && [[ "$f" != *.* ]] && mv -- "$f" "$f.jpg"
done

这样就能让图片在上传时被正常识别。

总结

问题原因解决方案
微信另存为只显示两个文件夹Flatpak 沙箱权限限制使用 Flatseal 或命令行开放文件系统权限
保存的图片没有扩展名微信 Linux 版保存逻辑不完善批量重命名添加 .jpg

通过以上设置, Linux 微信就能像 Windows 版一样自由选择保存路径了。希望这篇经验对同样使用 Ubuntu + 微信的朋友有帮助。


本文基于 Ubuntu 22.04/24.04 + Flatpak 版微信(com.tencent.WeChat)实测。不同版本可能略有差异,但原理相同。

]]>
https://www.shuijingwanwq.com/2026/05/28/13822/feed/ 0
Ubuntu 26.04 软件安装与维护最佳实践:以微信为例 https://www.shuijingwanwq.com/2026/05/27/13807/ https://www.shuijingwanwq.com/2026/05/27/13807/#respond Wed, 27 May 2026 12:47:53 +0000 https://www.shuijingwanwq.com/?p=13807 浏览量: 215

从踩坑到完美落地,一套可复用的 Linux 桌面软件管理方法论

系统:Ubuntu 26.04 (Resolute) + GNOME 50

写在前面

很多人觉得在 Linux 上装微信挺折腾的:官方的 .deb 包缺了沙箱,应用商店里搜出来一堆过时的第三方包,Flatpak 又动不动遇到网络或 D-Bus 问题。其实,只要理清楚 软件源管理 + 图形 + 安全隔离 这几件事,不但能顺利装上微信,以后遇到其他软件也能心里有数。

这篇文章记录了我从零开始在 Ubuntu 26.04 上安装微信的全过程,附带 11 张真实截图 和每一次踩坑的解决方法。里面会聊到:

  • 为什么说 Flatpak + 国内镜像 是 Linux 桌面装图形软件的一个很省心的选择
  • 应用中心搜不到软件、卡在“正在准备…”时,可以怎么排查
  • 怎样给自己搭一套 持续好用、相对安全、不折腾 的软件维护习惯

一、第一次尝试:官网下载 .deb 包(传统思路)

1.1 下载官方安装包

打开 微信 Linux 官网,可以看到最新版本 4.1.1,提供 .deb.rpm 和 AppImage 三种格式。

1.2 使用“应用中心”安装

下载 WeChatLinux_x86_64.deb 后,右键点击文件,选择 “用应用中心打开”

如图2:右键菜单截图,高亮“用应用中心打开”选项。

然而,应用中心随即弹出错误窗口:

如图3:错误提示“出了点问题,非常抱歉,我们无法确定错误所在。”

原因分析:Ubuntu 26.04 自带的应用中心(基于 Snap)在处理本地 .deb 文件时存在稳定性问题,尤其是新版系统。这并非个例。

小结:依赖单个图形工具处理所有安装任务,容易遇到未知错误。我们需要更可靠的方案。

大概一天后,我打算再尝试下,发现打开不再报错。如图12

大概一天后,我打算再尝试下,发现打开不再报错。如图12

二、应用中心搜索:暴露了更大的问题

放弃安装本地 .deb 后,我尝试在应用中心直接搜索“微信”。结果令人失望:

如图4:搜索“微信”,出现 electronic-wechatwechat-web-devtools 等非官方包。

如图4:搜索“微信”,出现 electronic-wechat、wechat-web-devtools 等非官方包。


如图5:搜索“WeChat”同样如此。

如图5:搜索“WeChat”同样如此。


如图6:将筛选条件改为“Debian 包”,结果为空。

如图6:将筛选条件改为“Debian 包”,结果为空。

教训:自带应用中心的软件源质量参差不齐,且默认不包含 Flatpak 仓库。一个优秀的软件商店应当能够聚合多种来源(APT、Snap、Flatpak),并提供清晰的来源标识。


三、转战 Flatpak:构建可靠的软件源

3.1 为什么选择 Flatpak?

  • 沙箱隔离:微信运行在独立环境中,即使有漏洞也不会影响系统。
  • 更新及时:Flathub 上的微信版本与官方几乎同步(当前为 4.1.1.4)。
  • 跨发行版:同样的安装方式适用于 Fedora、Debian 等。

3.2 安装 Flatpak 及 GNOME Software 插件

打开终端,执行:

sudo apt update
sudo apt install flatpak gnome-software-plugin-flatpak

说明gnome-software-plugin-flatpak 是让 GNOME Software 能够显示 Flatpak 应用的关键插件。

3.3 添加 Flathub 仓库(并解决 D-Bus 错误)

第一次执行添加命令时,我遇到了一个奇怪的错误:

flatpak remote-add --if-not-exists flathub https://flathub.org/repo/flathub.flatpakrepo
# 错误: Message recipient disconnected from message bus without replying

解决方法再次执行同样的命令。通常第二次就会成功。原因是用户会话的 D-Bus 环境可能未完全初始化,重试即可。

flatpak remote-add --if-not-exists flathub https://flathub.org/repo/flathub.flatpakrepo
flatpak remotes   # 验证,应看到 flathub


四、速度优化:配置国内镜像(中科大源)

官方 Flathub 服务器在国外,下载速度极慢。切换到国内镜像后,速度从几十 KB/s 飙升到 10+ MB/s。

sudo flatpak remote-modify flathub --url=https://mirrors.ustc.edu.cn/flathub

验证修改:

flatpak remotes --show-details | grep flathub

输出示例flathub Flathub https://mirrors.ustc.edu.cn/flathub/ ...

最佳实践:对于任何 Linux 发行版,第一时间配置国内镜像源(包括系统源和 Flatpak 源),能节省 90% 的等待时间。

如图7:软件中搜索微信,浏览页面也只显示那两个过时项目。

如图7:软件中搜索微信,浏览页面也只显示那两个过时项目。

如图8:再次搜索“WeChat”,多了一个名为 WeChat 的条目

如图8:再次搜索“WeChat”,多了一个名为 WeChat 的条目

如图9:点击“WeChat”,发现是 Tencent 开发,且来源于 Flathub

如图9:点击“WeChat”,发现是 Tencent 开发,且来源于 Flathub

五、图形界面安装:卡在“正在准备…”怎么办?

5.1 重启 GNOME Software 并清除缓存

killall gnome-software 2>/dev/null
rm -rf ~/.cache/gnome-software
gnome-software &

终端执行上述命令后,GNOME Software 重新打开,搜索 “WeChat” 出现来自 Flathub 的官方版本(图标为绿色气泡,来源标有“Flathub”)。

如图10:点击 安装 按钮,进度条显示“正在准备…”。

如图10:点击 安装 按钮,进度条显示“正在准备…”。

5.2 终端刷出大量警告,但安装进程卡住

在终端中,我看到如下输出:

07:06:27:949 Gs  updates-shell: failed to get upgrades: no plugin could handle listing distro upgrades
07:13:40:757 flatpak 警告:在远程仓库 flathub 中没有引用“runtime/org.gtk.Gtk3theme.Yaru/x86_64/3.22”
...

分析

  • failed to get upgrades 是因为缺少 gnome-software-plugin-apt,但这个插件在 Ubuntu 26.04 中已不再提供,该警告无害
  • Flatpak 的那些“没有引用”警告,是因为本地缓存与远程仓库不同步,也不影响安装。

但是,图形界面的进度条卡在 99% 长达 10 分钟。这说明 GNOME Software 在下载或解压阶段出现了挂起。

不过,可以不用理会了。大概率是第一次才需要这么久的时间,并且最终微信也安装成功了。

5.3 用软件安装打开 WeChatLinux_x86_64.deb

当一些特定的软件包在 软件 中搜索不到时,必须要下载 deb 文件。此时可以右键 – 打开方式 – 软件安装。如图13

当一些特定的软件包在 软件 中搜索不到时,必须要下载 deb 文件。此时可以右键 - 打开方式 - 软件安装。如图13

建议后续不论是 在线的还是本地的,都通过 软件安装 来管理了。这样后续可以统一管理。如图14

建议后续不论是 在线的还是本地的,都通过 软件安装 来管理了。这样后续可以统一管理。如图14

六、验证:微信成功运行

安装完成后,在应用菜单中找到 “WeChat” 图标,点击启动。首次启动可能稍慢(沙箱初始化),登录后界面完美运行。

如图11:微信主界面截图,聊天记录正常显示,文件传输、小程序等功能均可用。

如图11:不过终端中的提示可以不用理会,最后微信安装登录成功。

如果界面是英文,登录后点击左下角菜单 → SettingsGeneralLanguage → 选择 简体中文,重启微信即可。


七、总结:一套可复用的软件安装与维护最佳实践

通过这次经历,我总结出以下 5 条核心准则,适用于任何 Linux 发行版:

准则说明对应本文操作
1. 优先选择沙箱化包格式Flatpak / Snap 提供安全隔离,推荐用于闭源或联网应用。选择 Flatpak 版微信而非 .deb
2. 配置国内镜像源系统源(apt,默认是国内)、Flatpak 源都必须换到国内,否则速度无法忍受。系统源使用 cn.archive.ubuntu.com,Flatpak 换中科大源
3. 使用聚合型软件商店GNOME Software 支持 Flatpak + Snap + APT,优于 Ubuntu 自带商店。安装 gnome-software-plugin-flatpak,用 GNOME Software 管理
4. 理解“无害错误”许多警告(如 failed to get upgrades)不影响实际使用,不必过度关注。忽略终端中的黄色警告,专注核心操作

附:常用 Flatpak 命令速查

# 搜索应用(命令行)
flatpak search wechat

# 安装
flatpak install flathub com.tencent.WeChat

# 运行
flatpak run com.tencent.WeChat

# 更新所有 Flatpak 应用
flatpak update

# 卸载
flatpak uninstall com.tencent.WeChat

# 查看已安装列表
flatpak list

后记

除了帮你装上微信,这篇博客还顺带聊了聊 Linux 桌面软件管理的一些常见思路:比如为什么会有多种包格式共存、怎么用国内镜像加速下载、图形界面和命令行如何互相补位。如果你以后遇到类似的软件问题,不妨试试这些方法,也许会发现没那么棘手。希望这份记录能对你有一点实际的帮助。

]]>
https://www.shuijingwanwq.com/2026/05/27/13807/feed/ 0
pnpm : 无法加载文件 C:\Users\Thinkpad\AppData\Roaming\npm\pnpm.ps1,因为在此系统上禁止运行脚本 https://www.shuijingwanwq.com/2024/08/19/8777/ https://www.shuijingwanwq.com/2024/08/19/8777/#respond Mon, 19 Aug 2024 02:04:18 +0000 https://www.shuijingwanwq.com/?p=8777 浏览量: 208 1、pnpm : 无法加载文件 C:\Users\Thinkpad\AppData\Roaming\npm\pnpm.ps1,因为在此系统上禁止运行脚本。如图1
pnpm : 无法加载文件 C:\Users\Thinkpad\AppData\Roaming\npm\pnpm.ps1,因为在此系统上禁止运行脚本

图1



PS E:\wwwroot\object> pnpm install
pnpm : 无法加载文件 C:\Users\Thinkpad\AppData\Roaming\npm\pnpm.ps1,因为在此系统上禁止运行脚本。有关详细信息,请参阅 https:/go.microsoft.com/fwlink/?LinkID=135170 中的 about_Execution_Policies。
所在位置 行:1 字符: 1
+ pnpm install
+ ~~~~
    + CategoryInfo          : SecurityError: (:) [],PSSecurityException
    + FullyQualifiedErrorId : UnauthorizedAccess
PS E:\wwwroot\object>


2、参考:  about_Execution_Policies 。不在终端中执行,而是在 命令提示符 中执行,发现可执行成功。如图2
about_Execution_Policies 。不在终端中执行,而是在 命令提示符 中执行,发现可执行成功

图2

]]>
https://www.shuijingwanwq.com/2024/08/19/8777/feed/ 0
当打开:.trycloudflare.com 的网址时,被360安全大脑提示:假冒的Apple ID登录界面 的解决 https://www.shuijingwanwq.com/2024/01/06/8342/ https://www.shuijingwanwq.com/2024/01/06/8342/#respond Sat, 06 Jan 2024 02:16:37 +0000 https://www.shuijingwanwq.com/?p=8342 浏览量: 77 1、在预览 Shopify 的主题应用扩展时,当打开: https://it-wr-sitting-chen.trycloudflare.com?shop=shuijingwanwq-development.myshopify.com&host=c2h1aWppbmd3YW53cS1kZXZlbG9wbWVudC5teXNob3BpZnkuY29tL2FkbWlu 时,被360安全大脑提示:假冒的Apple ID登录界面 的解决。如图1
当打开:.trycloudflare.com 的网址时,被360安全大脑提示:假冒的Apple ID登录界面

图1



Preview URL: https://it-wr-sitting-chen.trycloudflare.com?shop=shuijingwanwq-development.myshopify.com&host=c2h1aWppbmd3YW53cS1kZXZlbG9wbWVudC5teXNob3BpZnkuY29tL2FkbWlu

error Command failed with exit code 1.
info Visit https://yarnpkg.com/en/docs/cli/run for documentation about this command.


2、点击 忽略提示,继续访问 后,仍然无效。在 360 安全卫士 的设置中心 – 安全防护中心 – 网页安全防护 中,取消勾选 使用URL云查询功能。 如图2
点击 忽略提示,继续访问 后,仍然无效。在 360 安全卫士 的设置中心 - 安全防护中心 - 网页安全防护 中,取消勾选 使用URL去查询功能

图2

3、再次打开同样的网址,不再被拦截。如图3
再次打开同样的网址,不再被拦截

图3

]]>
https://www.shuijingwanwq.com/2024/01/06/8342/feed/ 0
卸载360日历的流程 https://www.shuijingwanwq.com/2022/12/01/7227/ https://www.shuijingwanwq.com/2022/12/01/7227/#respond Thu, 01 Dec 2022 01:29:51 +0000 https://www.shuijingwanwq.com/?p=7227 浏览量: 86

1、在管理通知界面,出现360日历的通知,很是烦人。如图1

在管理通知界面,出现360日历的通知,很是烦人

图1

2、点击系统的时间,发现系统的时间界面也被更新为360日历。如图2

点击系统的时间,发现系统的时间界面也被更新为360日历

图2

3、打开360安全卫士的功能大全 – 已添加,存在 360日历 ,点击管理。如图3

打开360安全卫士的功能大全 - 已添加,存在 360日历 ,点击管理

图3

4、点击管理后,360日历的右上角出现叉号,点击叉号。如图4

点击管理后,360日历的右上角出现叉号,点击叉号

图4

5、您确定删除360日历嘛?确定。如图5

您确定删除360日历嘛?确定

图5

6、点击系统的时间,发现界面已经还原。如图6

点击系统的时间,发现界面已经还原

图6

]]>
https://www.shuijingwanwq.com/2022/12/01/7227/feed/ 0
在 Windows 10 中创建目录符号链接 https://www.shuijingwanwq.com/2022/05/05/6358/ https://www.shuijingwanwq.com/2022/05/05/6358/#respond Thu, 05 May 2022 01:34:39 +0000 https://www.shuijingwanwq.com/?p=6358 浏览量: 211

1、在 Windows 10 中创建目录符号链接,报错:mklink : 无法将“mklink”项识别为 cmdlet、函数、脚本文件或可运行程序的名称。如图1

在 Windows 10 中创建目录符号链接,报错:mklink : 无法将“mklink”项识别为 cmdlet、函数、脚本文件或可运行程序的名称

图1


PS E:\wwwroot\view\packages\theme> mklink /D E:\wwwroot\object\resources\views\theme E:\wwwroot\view\packages\theme
mklink : 无法将“mklink”项识别为 cmdlet、函数、脚本文件或可运行程序的名称。请检查
名称的拼写,如果包括路径,请确保路径正确,然后再试一次。
所在位置 行:1 字符: 1
+ mklink /D E:\wwwroot\object\resources\views\theme E:\wwwro ...
+ ~~~~~~
    + CategoryInfo          : ObjectNotFound: (mklink:String) [], CommandNotFoundE
   xception
    + FullyQualifiedErrorId : CommandNotFoundException

PS E:\wwwroot\view\packages\theme>


2、最终决定在 cmd 中执行此命令,放弃在 PowerShell 中执行。提示:你没有足够的权限执行此操作。如图2

最终决定在 cmd 中执行此命令,放弃在 PowerShell 中执行。提示:你没有足够的权限执行此操作

图2


E:\>mklink /D E:\wwwroot\object\resources\views\theme E:\wwwroot\view\packages\theme
你没有足够的权限执行此操作。



3、以管理员身份运行 cmd 命令提示符。如图3

以管理员身份运行 cmd 命令提示符

图3

4、创建目录符号链接成功。如图4

创建目录符号链接成功

图4


C:\Windows\system32>mklink /D E:\wwwroot\object\resources\views\theme E:\wwwroot\view\packages\theme
为 E:\wwwroot\object\resources\views\theme <<===>> E:\wwwroot\view\packages\theme 创建的符号链接



5、在目录:E:\wwwroot\object\resources\views 下已经存在 theme,查看其属性,其目标:E:\wwwroot\view\packages\theme。符合预期。如图5

在目录:E:\wwwroot\object\resources\views 下已经存在 theme,查看其属性,其目标:E:\wwwroot\with-blade\packages\theme。符合预期

图5

]]>
https://www.shuijingwanwq.com/2022/05/05/6358/feed/ 0
在 Windows 10 中,内存占用持续超出 95% ,但是没有什么高内存占用的进程的分析排查(Heroku 占用了 4GB 的内存) https://www.shuijingwanwq.com/2022/04/15/6289/ https://www.shuijingwanwq.com/2022/04/15/6289/#respond Fri, 15 Apr 2022 01:22:34 +0000 https://www.shuijingwanwq.com/?p=6289 浏览量: 308 1、在 Windows 10 中,内存占用持续超出 95% 。查看任务管理器,占用 98%。但是占用内存最大的 2 个进程加起来也不过 2GB。而内存总大小为 16GB。其他的进程占用内存都不大,理论上来说不至于占用比例这般地高了。如图1
在 Windows 10 中,内存占用持续超出 95% 。查看任务管理器,占用 98%。但是占用内存最大的 2 个进程加起来也不过 2GB。而内存总大小为 16GB。其他的进程占用内存都不大,理论上来说不至于占用比例这般地高了

图1

2、查看性能 – 内存,使用中(已压缩):15.5GB。已提交:25BG/32.7GB。如图2
查看性能 - 内存,使用中(已压缩):15.5GB。已提交:25BG/32.7GB

图2

3、打开360安全卫士 – 优化加速界面,基本上将所有待优化项全部优化后。仍然占用超过 95%。如图3
打开360安全卫士 - 优化加速界面,基本上将所有待优化项全部优化后。仍然占用超过 95%

图3

4、重启电脑后,发现任务栏图标排列未垂直居中。但是内存占用仍然高达 25% 左右。打开360安全卫士 – 优化加速界面 – 优化记录 – 任务栏使用小图标 – 恢复默认。如图4
重启电脑后,发现任务栏图标排列未垂直居中。但是内存占用仍然高达 25% 左右。打开360安全卫士 - 优化加速界面 - 优化记录 - 任务栏使用小图标 - 恢复默认

图4

5、一般习惯于每周一开机,然后持续至周五或者周六关机,一般来说,到周四的时候,内存占用基本上达到 95% 左右。如图5
一般习惯于每周一开机,然后持续至周五或者周六关机,一般来说,到周四的时候,内存占用基本上达到 95% 左右

图5

6、当使用360安全卫士 – 我的电脑 – 立即体检 – 一键修复后,内存占用降低至:50% 左右。查看任务管理器,发现主要是 PhpStorm 的内存占用下降明显。从之前的 3200 MB 左右下降至 900 MB 左右。如图6
当使用360安全卫士 - 我的电脑 - 立即体检 - 一键修复后,内存占用降低至:50% 左右。查看任务管理器,发现主要是 PhpStorm 的内存占用下降明显。从之前的 3200 MB 左右下降至 900 MB 左右

图6

7、但是,基于上间隔不到半天,PhpStorm 的内存占用就基本上又恢复至 3GB 左右。但是 IDE 占用 3GB 也不是不可以接受的。主要在于还有 10 余 GB 的内存,无法确定怎么也被占用得差不多了的。 8、参考:https://answers.microsoft.com/en-us/windows/forum/all/windows-10-upgrade-from-81-99-ram-usage-and/269be2e2-de0f-4e7a-b4fc-cc6dd40da2ca ,Network Diagnostic Usage (Windows 网络数据使用监视器) 简称 NDU 。按 win + R 打开运行,然后输入 regedit,进入注册表编辑页面,依次浏览到下面的选项上。在右侧的 Start 那项上双击,在弹出来的对话框中将数值设为 4,默认是 2,该设置禁用了 ndu 的某些部分。重启电脑,然后观察一下内存、CPU、硬盘等的占用情况有无改善。如图7
Network Diagnostic Usage (Windows 网络数据使用监视器) 简称 NDU

图7



HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Services\Ndu


9、参考:https://answers.microsoft.com/zh-hans/windows/forum/all/win10%E5%86%85%E5%AD%98%E5%8D%A0%E7%94%A8%E8%B6%85/23f4ac65-a125-4012-b541-d15f5f6e7051 。步骤2的时候,非分页缓冲池:1.2 GB。周四的时候,非分页缓冲池:516 MB。如图8
参考:https://answers.microsoft.com/zh-hans/windows/forum/all/win10%E5%86%85%E5%AD%98%E5%8D%A0%E7%94%A8%E8%B6%85/23f4ac65-a125-4012-b541-d15f5f6e7051 。步骤2的时候,非分页缓冲池:1.2 GB。周四的时候,非分页缓冲池:516 MB

图8

10、一般非页面缓冲池越用越高都是一些软件出现了内存泄漏引起的。建议先卸载掉一些不常用的软件。然后再尝试卸载掉有可能导致内存泄漏的软件。最终卸载了软件:heroku,重启电脑后,内存占用降低至 70% 左右。说明 heroku 基本上占用了 4GB 左右的内存(占比 25%)。参考:https://www.shuijingwanwq.com/2021/12/29/5622/ 11、从周一开机至周五,持续运行了 5 天时间,一般每天晚上下班前会处于睡眠状态。现在的内存占用到周五的时候仍然基本上稳定在 85% 左右。相对于图1,PhpStorm 与 Google Chrome 占用的内存相对增加了 3GB 左右 。如图9
从周一开机至周五,持续运行了 5 天时间,一般每天晚上下班前会处于睡眠状态。现在的内存占用到周五的时候仍然基本上稳定在 85% 左右。相对于图1,PhpStorm 与 Google Chrome 占用的内存相对增加了 3GB 左右

图9

]]>
https://www.shuijingwanwq.com/2022/04/15/6289/feed/ 0
Laravel 8.x(LaraBBS) 部署至 阿里云 ECS,基于 MySQL、Redis、Supervisor、Crontab 实现 https://www.shuijingwanwq.com/2022/01/28/5867/ https://www.shuijingwanwq.com/2022/01/28/5867/#respond Fri, 28 Jan 2022 09:14:42 +0000 https://www.shuijingwanwq.com/?p=5867 浏览量: 200 1、Laravel 8.x(LaraBBS) 在本地开发环境已经实现。如图1
Laravel 8.x(LaraBBS) 在本地开发环境已经实现

图1

2、基于 Xshell 7,登录至 阿里云 ECS。查看操作系统版本。列出所有版本信息,执行命令:lsb_release -a。版本:CentOS 7.7。如图2
基于 Xshell 7,登录至 阿里云 ECS。查看操作系统版本。列出所有版本信息,执行命令:lsb_release -a。版本:CentOS 7.7

图2



[root@iZ23wv7v5ggZ ~]# lsb_release -a
LSB Version:	:core-4.1-amd64:core-4.1-noarch
Distributor ID:	CentOS
Description:	CentOS Linux release 7.7.1908 (Core)
Release:	7.7.1908
Codename:	Core



3、参考网址:https://oneinstack.com/ ,基于 OneinStack 来部署。由于此 ECS 中之前已经基于 OneinStack 部署过网站。因此,一些步骤会跳过。事先将云盘创建快照备份,以防万一造成数据损失。如图3
参考网址:https://oneinstack.com/ ,基于 OneinStack 来部署。由于此 ECS 中之前已经基于 OneinStack 部署过网站。因此,一些步骤会跳过。事先将云盘创建快照备份,以防万一造成数据损失

图3

4、建议在快照进度等于 100%,即状态成功后,才开始操作 ECS。如图4
建议在快照进度等于 100%,即状态成功后,才开始操作 ECS

图4

5、在 ECS 上已经部署成功的网址:https://www.shuijingwanwq.com/ 。参考网址:https://www.shuijingwanwq.com/2016/04/25/1050/ 6、目录:/root/oneinstack 早已经存在。如图5
目录:/root/oneinstack 早已经存在

图5

7、查看当前的 PHP 版本:7.4。如图6
查看当前的 PHP 版本:7.4

图6



[root@iZ23wv7v5ggZ oneinstack]# php -v
PHP 7.4.0 (cli) (built: Dec  5 2019 11:56:30) ( NTS )
Copyright (c) The PHP Group
Zend Engine v3.4.0, Copyright (c) Zend Technologies
    with Zend OPcache v7.4.0, Copyright (c), by Zend Technologies


8、升级脚本工具,不影响正在运行环境。执行命令:/upgrade.sh –oneinstack。如图7
升级脚本工具,不影响正在运行环境。执行命令:/upgrade.sh --oneinstack。

图7



[root@iZ23wv7v5ggZ oneinstack]# ./upgrade.sh --oneinstack

#######################################################################
#       OneinStack for CentOS/RedHat 6+ Debian 8+ and Ubuntu 14+      #
#              Upgrade Software versions for OneinStack               #
#       For more information please visit https://oneinstack.com      #
#######################################################################

Congratulations! OneinStack upgrade successful! 

[root@iZ23wv7v5ggZ oneinstack]# 



9、参考网址:https://oneinstack.com/install/ ,添加虚拟主机,执行命令:./vhost.sh。报错:Error: Create Let’s Encrypt SSL Certificate failed! 。原因在于不存在相应的 DNS 记录。如图8
参考网址:https://oneinstack.com/install/ ,添加虚拟主机,执行命令:./vhost.sh。报错:Error: Create Let's Encrypt SSL Certificate failed! 。原因在于不存在相应的 DNS 记录

图8



[root@iZ23wv7v5ggZ oneinstack]# ./vhost.sh

#######################################################################
#       OneinStack for CentOS/RedHat 7+ Debian 8+ and Ubuntu 16+      #
#       For more information please visit https://oneinstack.com      #
#######################################################################

What Are You Doing?
	1. Use HTTP Only
	2. Use your own SSL Certificate and Key
	3. Use Let's Encrypt to Create SSL Certificate and Key
	q. Exit
Please input the correct option: 3

Please input domain(example: www.example.com): app-wangqiang-larabbs.shuijingwanwq.com
domain=app-wangqiang-larabbs.shuijingwanwq.com

Please input the directory for the domain:app-wangqiang-larabbs.shuijingwanwq.com :
(Default directory: /data/wwwroot/app-wangqiang-larabbs.shuijingwanwq.com): 
Virtual Host Directory=/data/wwwroot/app-wangqiang-larabbs.shuijingwanwq.com

Create Virtul Host directory......
set permissions of Virtual Host directory......

Do you want to add more domain name? [y/n]: n

Do you want to redirect all HTTP requests to HTTPS? [y/n]: y

Please enter your email: shuijingwanwq@163.com

[Fri Jan  7 10:36:05 CST 2022] Unknown parameter : -m

Let's Encrypt Verify error! DNS problem: NXDOMAIN looking up A for app-wangqiang-larabbs.shuijingwanwq.com
[Fri Jan  7 10:36:10 CST 2022] Creating domain key
[Fri Jan  7 10:36:10 CST 2022] The domain key is here: /root/.acme.sh/app-wangqiang-larabbs.shuijingwanwq.com/app-wangqiang-larabbs.shuijingwanwq.com.key
[Fri Jan  7 10:36:10 CST 2022] Single domain='app-wangqiang-larabbs.shuijingwanwq.com'
[Fri Jan  7 10:36:10 CST 2022] Getting domain auth token for each domain
[Fri Jan  7 10:36:14 CST 2022] Getting webroot for domain='app-wangqiang-larabbs.shuijingwanwq.com'
[Fri Jan  7 10:36:15 CST 2022] Verifying: app-wangqiang-larabbs.shuijingwanwq.com
[Fri Jan  7 10:36:19 CST 2022] app-wangqiang-larabbs.shuijingwanwq.com:Verify error:DNS problem: NXDOMAIN looking up A for app-wangqiang-larabbs.shuijingwanwq.com - check that a DNS record exists for this domain
[Fri Jan  7 10:36:19 CST 2022] Please add '--debug' or '--log' to check more details.
[Fri Jan  7 10:36:19 CST 2022] See: https://github.com/Neilpang/acme.sh/wiki/How-to-debug-acme.sh
Error: Create Let's Encrypt SSL Certificate failed! 
[root@iZ23wv7v5ggZ oneinstack]# 



10、检查此域是否存在 DNS 记录。先在 DNS 中添加相应的域名:app-wangqiang-larabbs.shuijingwanwq.com 。如图9
检查此域是否存在 DNS 记录。先在 DNS 中添加相应的域名:app-wangqiang-larabbs.shuijingwanwq.com

图9

11、再次执行命令:./vhost.sh。添加虚拟主机成功。如图10
再次执行命令:./vhost.sh。添加虚拟主机成功

图10



[root@iZ23wv7v5ggZ oneinstack]# ./vhost.sh

#######################################################################
#       OneinStack for CentOS/RedHat 7+ Debian 8+ and Ubuntu 16+      #
#       For more information please visit https://oneinstack.com      #
#######################################################################

What Are You Doing?
	1. Use HTTP Only
	2. Use your own SSL Certificate and Key
	3. Use Let's Encrypt to Create SSL Certificate and Key
	q. Exit
Please input the correct option: 3

Please input domain(example: www.example.com): app-wangqiang-larabbs.shuijingwanwq.com
domain=app-wangqiang-larabbs.shuijingwanwq.com

Please input the directory for the domain:app-wangqiang-larabbs.shuijingwanwq.com :
(Default directory: /data/wwwroot/app-wangqiang-larabbs.shuijingwanwq.com): 
Virtual Host Directory=/data/wwwroot/app-wangqiang-larabbs.shuijingwanwq.com

Create Virtul Host directory......
set permissions of Virtual Host directory......

Do you want to add more domain name? [y/n]: n

Do you want to redirect all HTTP requests to HTTPS? [y/n]: y

Please enter your email: shuijingwanwq@163.com

[Fri Jan  7 10:48:20 CST 2022] Unknown parameter : -m
[Fri Jan  7 10:48:24 CST 2022] Single domain='app-wangqiang-larabbs.shuijingwanwq.com'
[Fri Jan  7 10:48:24 CST 2022] Getting domain auth token for each domain
[Fri Jan  7 10:48:29 CST 2022] Getting webroot for domain='app-wangqiang-larabbs.shuijingwanwq.com'
[Fri Jan  7 10:48:29 CST 2022] Verifying: app-wangqiang-larabbs.shuijingwanwq.com
[Fri Jan  7 10:48:34 CST 2022] Success
[Fri Jan  7 10:48:34 CST 2022] Verify finished, start to sign.
[Fri Jan  7 10:48:34 CST 2022] Lets finalize the order, Le_OrderFinalize: https://acme-v02.api.letsencrypt.org/acme/finalize/73156074/53280741960
[Fri Jan  7 10:48:37 CST 2022] Download cert, Le_LinkCert: https://acme-v02.api.letsencrypt.org/acme/cert/04ed99c0b6706b74ad4a5a19389500b0add1
[Fri Jan  7 10:48:38 CST 2022] Cert success.
-----BEGIN CERTIFICATE-----
xxxxxxxxxx
-----END CERTIFICATE-----
[Fri Jan  7 10:48:38 CST 2022] Your cert is in  /root/.acme.sh/app-wangqiang-larabbs.shuijingwanwq.com/app-wangqiang-larabbs.shuijingwanwq.com.cer 
[Fri Jan  7 10:48:38 CST 2022] Your cert key is in  /root/.acme.sh/app-wangqiang-larabbs.shuijingwanwq.com/app-wangqiang-larabbs.shuijingwanwq.com.key 
[Fri Jan  7 10:48:39 CST 2022] The intermediate CA cert is in  /root/.acme.sh/app-wangqiang-larabbs.shuijingwanwq.com/ca.cer 
[Fri Jan  7 10:48:39 CST 2022] And the full chain certs is there:  /root/.acme.sh/app-wangqiang-larabbs.shuijingwanwq.com/fullchain.cer 

Do you want to add hotlink protection? [y/n]: y

Allow Rewrite rule? [y/n]: y

Please input the rewrite of programme :
wordpress,opencart,magento2,drupal,joomla,codeigniter,laravel
thinkphp,pathinfo,discuz,typecho,ecshop,nextcloud,zblog,whmcs rewrite was exist.
(Default rewrite: other): laravel
You choose rewrite=laravel

Allow Nginx/Tengine/OpenResty access_log? [y/n]: y
You access log file=/data/wwwlogs/app-wangqiang-larabbs.shuijingwanwq.com_nginx.log

nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok
nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful
Reload Nginx......

#######################################################################
#       OneinStack for CentOS/RedHat 7+ Debian 8+ and Ubuntu 16+      #
#       For more information please visit https://oneinstack.com      #
#######################################################################
Your domain:                  app-wangqiang-larabbs.shuijingwanwq.com
Virtualhost conf:             /usr/local/nginx/conf/vhost/app-wangqiang-larabbs.shuijingwanwq.com.conf
Directory of:                 /data/wwwroot/app-wangqiang-larabbs.shuijingwanwq.com
Rewrite rule:                 /usr/local/nginx/conf/rewrite/laravel.conf
Let's Encrypt SSL Certificate:/usr/local/nginx/conf/ssl/app-wangqiang-larabbs.shuijingwanwq.com.crt
SSL Private Key:              /usr/local/nginx/conf/ssl/app-wangqiang-larabbs.shuijingwanwq.com.key
[root@iZ23wv7v5ggZ oneinstack]# ^C
[root@iZ23wv7v5ggZ oneinstack]# 



12、管理FTP账号,执行命令:./pureftpd_vhost.sh 。如图11
管理FTP账号,执行命令:./pureftpd_vhost.sh

图11



[root@iZ23wv7v5ggZ oneinstack]# ./pureftpd_vhost.sh

#######################################################################
#       OneinStack for CentOS/RedHat 7+ Debian 8+ and Ubuntu 16+      #
#                 FTP virtual user account management                 #
#       For more information please visit https://oneinstack.com      #
#######################################################################

What Are You Doing?
	1. UserAdd
	2. UserMod
	3. UserPasswd
	4. UserDel
	5. ListAllUser
	6. ShowUser
	q. Exit
Please input the correct option: 1

Please input a username: app-wangqiang-larabbs.shuijingwanwq.com

Please input the password: s0etwJ9DGm3e6CwP

Please input the directory(Default directory: /data/wwwroot): /data/wwwroot/app-wangqiang-larabbs.shuijingwanwq.com
Password: 
Enter it again: 
#####################################

[app-wangqiang-larabbs.shuijingwanwq.com] create successful! 

You user name is : app-wangqiang-larabbs.shuijingwanwq.com
You Password is : xxxxxxxxxx
You directory is : /data/wwwroot/app-wangqiang-larabbs.shuijingwanwq.com


What Are You Doing?
	1. UserAdd
	2. UserMod
	3. UserPasswd
	4. UserDel
	5. ListAllUser
	6. ShowUser
	q. Exit
Please input the correct option: q
[root@iZ23wv7v5ggZ oneinstack]# 



13、打开 FlashFXP,通过 FTP 上传源代码至 目录:/data/wwwroot/app-wangqiang-larabbs.shuijingwanwq.com 。如图12
打开 FlashFXP,通过 FTP 上传源代码至 目录:/data/wwwroot/app-wangqiang-larabbs.shuijingwanwq.com

图12

14、登录阿里云 RDS 控制台,创建数据库:app_wangqiang_larabbs,且授权帐号:app_wangqiang_larabbs。如图13
登录阿里云 RDS 控制台,创建数据库:app_wangqiang_larabbs,且授权帐号:app_wangqiang_larabbs

图13

15、登录 RDS 实例后,已经存在数据库:app_wangqiang_larabbs。如图14
登录 RDS 实例后,已经存在数据库:app_wangqiang_larabbs

图14

16、编辑虚拟主机配置文件:/usr/local/nginx/conf/vhost/app-wangqiang-larabbs.shuijingwanwq.com.conf 。网站根目录添加 /public。然后重启 Nginx 服务,执行命令:service nginx restart。如图15
编辑虚拟主机配置文件:/usr/local/nginx/conf/vhost/app-wangqiang-larabbs.shuijingwanwq.com.conf 。网站根目录添加 /public。然后重启 Nginx 服务,执行命令:service nginx restart

图15



[root@iZ23wv7v5ggZ oneinstack]# cat /usr/local/nginx/conf/vhost/app-wangqiang-larabbs.shuijingwanwq.com.conf
server {
  listen 80;
  listen 443 ssl http2;
  ssl_certificate /usr/local/nginx/conf/ssl/app-wangqiang-larabbs.shuijingwanwq.com.crt;
  ssl_certificate_key /usr/local/nginx/conf/ssl/app-wangqiang-larabbs.shuijingwanwq.com.key;
  ssl_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3;
  ssl_ciphers TLS13-AES-256-GCM-SHA384:TLS13-CHACHA20-POLY1305-SHA256:TLS13-AES-128-GCM-SHA256:TLS13-AES-128-CCM-8-SHA256:TLS13-AES-128-CCM-SHA256:EECDH+CHACHA20:EECDH+AES128:RSA+AES128:EECDH+AES256:RSA+AES256:EECDH+3DES:RSA+3DES:!MD5;
  ssl_prefer_server_ciphers on;
  ssl_session_timeout 10m;
  ssl_session_cache builtin:1000 shared:SSL:10m;
  ssl_buffer_size 1400;
  add_header Strict-Transport-Security max-age=15768000;
  ssl_stapling on;
  ssl_stapling_verify on;
  server_name app-wangqiang-larabbs.shuijingwanwq.com;
  access_log /data/wwwlogs/app-wangqiang-larabbs.shuijingwanwq.com_nginx.log combined;
  index index.html index.htm index.php;
  root /data/wwwroot/app-wangqiang-larabbs.shuijingwanwq.com/public;
  if ($ssl_protocol = "") { return 301 https://$host$request_uri; }
  
  include /usr/local/nginx/conf/rewrite/laravel.conf;
  #error_page 404 /404.html;
  #error_page 502 /502.html;
  location ~ .*\.(wma|wmv|asf|mp3|mmf|zip|rar|jpg|gif|png|swf|flv|mp4)$ {
    valid_referers none blocked *.shuijingwanwq.com app-wangqiang-larabbs.shuijingwanwq.com;
    if ($invalid_referer) {
        return 403;
    }
  }
  location ~ [^/]\.php(/|$) {
    #fastcgi_pass remote_php_ip:9000;
    fastcgi_pass unix:/dev/shm/php-cgi.sock;
    fastcgi_index index.php;
    include fastcgi.conf;
  }

  location ~ .*\.(gif|jpg|jpeg|png|bmp|swf|flv|mp4|ico)$ {
    expires 30d;
    access_log off;
  }
  location ~ .*\.(js|css)?$ {
    expires 7d;
    access_log off;
  }
  location ~ /(\.user\.ini|\.ht|\.git|\.svn|\.project|LICENSE|README\.md) {
    deny all;
  }
  location /.well-known {
    allow all;
  }
}
[root@iZ23wv7v5ggZ oneinstack]# service nginx restart
Redirecting to /bin/systemctl restart nginx.service



17、查看 Laravel 的伪静态配置文件,/usr/local/nginx/conf/rewrite/laravel.conf


[root@iZ23wv7v5ggZ oneinstack]# cat /usr/local/nginx/conf/rewrite/laravel.conf
location / {
  try_files $uri $uri/ /index.php?$query_string;
}
[root@iZ23wv7v5ggZ oneinstack]# 


18、第 13 步骤完成后,设置 Laravel 目录权限。参考网址:https://learnku.com/laravel/t/62112 。www 是我的 web 服务的 用户与用户组。目录设置为 755,所有的文件设置为 644。权限方面,已经被 OneinStack 自动设置好了的。因此,像目录:/bootstrap/cache、/storage、/public/uploads,皆无需要再设置额外的权限。如图16
第 13 步骤完成后,设置 Laravel 目录权限。参考网址:https://learnku.com/laravel/t/62112 。www 是我的 web 服务的 用户与用户组。目录设置为 755,所有的文件设置为 644。权限方面,已经被 OneinStack 自动设置好了的。因此,像目录:/bootstrap/cache、/storage、/public/uploads,皆无需要再设置额外的权限

图16

19、在 ECS 中编辑文件 /data/wwwroot/app-wangqiang-larabbs.shuijingwanwq.com/.env。 20、执行数据库迁移与填充,执行成功。如图17
执行数据库迁移与填充,执行成功

图17



[root@iZ23wv7v5ggZ app-wangqiang-larabbs.shuijingwanwq.com]# php artisan migrate:refresh --seed
Migration table not found.
Migration table created successfully.
Migrating: 2014_10_12_000000_create_users_table
Migrated:  2014_10_12_000000_create_users_table (47.50ms)
Migrating: 2014_10_12_100000_create_password_resets_table
Migrated:  2014_10_12_100000_create_password_resets_table (29.91ms)
Migrating: 2019_08_19_000000_create_failed_jobs_table
Migrated:  2019_08_19_000000_create_failed_jobs_table (36.63ms)
Migrating: 2019_12_14_000001_create_personal_access_tokens_table
Migrated:  2019_12_14_000001_create_personal_access_tokens_table (40.31ms)
Migrating: 2021_12_31_134920_add_avatar_and_introduction_to_users_table
Migrated:  2021_12_31_134920_add_avatar_and_introduction_to_users_table (240.63ms)
Migrating: 2021_12_31_155234_create_categories_table
Migrated:  2021_12_31_155234_create_categories_table (37.03ms)
Migrating: 2021_12_31_155935_seed_categories_data
Migrated:  2021_12_31_155935_seed_categories_data (12.72ms)
Migrating: 2021_12_31_161159_create_topics_table
Migrated:  2021_12_31_161159_create_topics_table (62.53ms)
Migrating: 2022_01_04_175444_create_replies_table
Migrated:  2022_01_04_175444_create_replies_table (49.36ms)
Migrating: 2022_01_05_101230_create_notifications_table
Migrated:  2022_01_05_101230_create_notifications_table (72.61ms)
Migrating: 2022_01_05_101456_add_notification_count_to_users_table
Migrated:  2022_01_05_101456_add_notification_count_to_users_table (41.74ms)
Migrating: 2022_01_05_114704_create_permission_tables
Migrated:  2022_01_05_114704_create_permission_tables (462.25ms)
Migrating: 2022_01_05_115758_seed_roles_and_permissions_data
Migrated:  2022_01_05_115758_seed_roles_and_permissions_data (252.50ms)
Migrating: 2022_01_05_164147_create_links_table
Migrated:  2022_01_05_164147_create_links_table (40.32ms)
Migrating: 2022_01_05_170327_add_references
Migrated:  2022_01_05_170327_add_references (133.90ms)
Migrating: 2022_01_06_094656_add_last_actived_at_to_users_table
Migrated:  2022_01_06_094656_add_last_actived_at_to_users_table (25.63ms)
Seeding: Database\Seeders\UsersTableSeeder
Seeded:  Database\Seeders\UsersTableSeeder (188.79ms)
Seeding: Database\Seeders\TopicsTableSeeder
Seeded:  Database\Seeders\TopicsTableSeeder (1,517.44ms)
Seeding: Database\Seeders\RepliesTableSeeder
Seeded:  Database\Seeders\RepliesTableSeeder (4,513.18ms)
Seeding: Database\Seeders\LinksTableSeeder
Seeded:  Database\Seeders\LinksTableSeeder (25.96ms)
Database seeding completed successfully.
[root@iZ23wv7v5ggZ app-wangqiang-larabbs.shuijingwanwq.com]# 



21、打开网址:https://app-wangqiang-larabbs.shuijingwanwq.com/ ,提示:InvalidArgumentException No hint path defined for [sudosu]. 。如图18
打开网址:https://app-wangqiang-larabbs.shuijingwanwq.com/ ,提示:InvalidArgumentException No hint path defined for [sudosu].

图18

22、编辑文件 config/sudosu.php ,添加 com


    'allowed_tlds' => ['dev', 'local', 'com'],


23、在命令行启动队列系统,报错:Symfony\Component\Process\Exception\LogicException 。 The Process class relies on proc_open, which is not available on your PHP installation.。如图19
在命令行启动队列系统,报错:Symfony\Component\Process\Exception\LogicException 。  The Process class relies on proc_open, which is not available on your PHP installation.

图19



[root@iZ23wv7v5ggZ app-wangqiang-larabbs.shuijingwanwq.com]# php artisan queue:listen

   Symfony\Component\Process\Exception\LogicException 

  The Process class relies on proc_open, which is not available on your PHP installation.

  at vendor/symfony/process/Process.php:146
    142▕      */
    143▕     public function __construct(array $command, string $cwd = null, array $env = null, $input = null, ?float $timeout = 60)
    144▕     {
    145▕         if (!\function_exists('proc_open')) {
  ➜ 146▕             throw new LogicException('The Process class relies on proc_open, which is not available on your PHP installation.');
    147▕         }
    148▕ 
    149▕         $this->commandline = $command;
    150▕         $this->cwd = $cwd;

      +16 vendor frames 
  17  artisan:37
      Illuminate\Foundation\Console\Kernel::handle()



24、编辑 /usr/local/php/etc/php.ini 文件,搜索 disable_functions,将其值中的 proc_open 、proc_get_status 删除掉。然后重启 PHP 服务 。如图20
编辑 /usr/local/php/etc/php.ini 文件,搜索 disable_functions,将其值中的 proc_open 、proc_get_status 删除掉。然后重启 PHP 服务

图20



[root@iZ23wv7v5ggZ etc]# vi php.ini
[root@iZ23wv7v5ggZ etc]# 
[root@iZ23wv7v5ggZ etc]# service php-fpm restart
Redirecting to /bin/systemctl restart php-fpm.service
[root@iZ23wv7v5ggZ etc]# 



25、在命令行启动队列系统,队列在启动完成后会进入监听状态。但是,仍然报错: Symfony\Component\Process\Exception\ProcessTimedOutException 。 The process “‘/usr/local/php/bin/php’ ‘artisan’ ‘queue:work’ ‘–once’ ‘–name=default’ ‘–queue=default’ ‘–backoff=0’ ‘–memory=128’ ‘–sleep=3’ ‘–tries=1′” exceeded the timeout of 60 seconds.。添加选项 –timeout=0,不再报错。如图21
在命令行启动队列系统,队列在启动完成后会进入监听状态。但是,仍然报错: Symfony\Component\Process\Exception\ProcessTimedOutException 。  The process "'/usr/local/php/bin/php' 'artisan' 'queue:work' '--once' '--name=default' '--queue=default' '--backoff=0' '--memory=128' '--sleep=3' '--tries=1'" exceeded the timeout of 60 seconds.。添加选项 --timeout=0,不再报错

图21

<pre class="wp-block-syntaxhighlighter-code">

[root@iZ23wv7v5ggZ app-wangqiang-larabbs.shuijingwanwq.com]# php artisan queue:listen
[2022-01-07 17:04:21][9iy9L39pxxNvZ7NL9YQ0xQMXxI4EwI0j] Processing: App\Jobs\TranslateSlug
[2022-01-07 17:04:22][9iy9L39pxxNvZ7NL9YQ0xQMXxI4EwI0j] Failed:     App\Jobs\TranslateSlug
[2022-01-07 17:04:23][oho1xFRRasdVKHL8f4T19vz51vwzf241] Processing: App\Jobs\TranslateSlug
[2022-01-07 17:04:24][oho1xFRRasdVKHL8f4T19vz51vwzf241] Failed:     App\Jobs\TranslateSlug
[2022-01-07 17:04:25][qCqFpPSu9ImA0JggR4IiMlIKLWL3EB8H] Processing: App\Jobs\TranslateSlug
[2022-01-07 17:04:28][qCqFpPSu9ImA0JggR4IiMlIKLWL3EB8H] Failed:     App\Jobs\TranslateSlug
[2022-01-07 17:04:28][uxRYiXpFXEXBvpPxJTDKIDkCCXAgBTG9] Processing: App\Jobs\TranslateSlug
[2022-01-07 17:04:29][uxRYiXpFXEXBvpPxJTDKIDkCCXAgBTG9] Failed:     App\Jobs\TranslateSlug
[2022-01-07 17:04:29][kgqbausYzFSzLYgjlAvvXfrgVaGBwZME] Processing: App\Jobs\TranslateSlug
[2022-01-07 17:04:29][kgqbausYzFSzLYgjlAvvXfrgVaGBwZME] Failed:     App\Jobs\TranslateSlug
[2022-01-07 17:04:30][wdweaoBl2V2k0iCCwynnjE3imiHxmUZK] Processing: App\Jobs\TranslateSlug

   Symfony\Component\Process\Exception\ProcessTimedOutException 

  The process "'/usr/local/php/bin/php' 'artisan' 'queue:work' '--once' '--name=default' '--queue=default' '--backoff=0' '--memory=128' '--sleep=3' '--tries=1'" exceeded the timeout of 60 seconds.

  at vendor/symfony/process/Process.php:1204
    1200▕ 
    1201▕         if (null !== $this->timeout && $this->timeout < microtime(true) - $this->starttime) {
    1202▕             $this->stop(0);
    1203▕ 
  ➜ 1204▕             throw new ProcessTimedOutException($this, ProcessTimedOutException::TYPE_GENERAL);
    1205▕         }
    1206▕ 
    1207▕         if (null !== $this->idleTimeout && $this->idleTimeout < microtime(true) - $this->lastOutputTime) {
    1208▕             $this->stop(0);

      +18 vendor frames 
  19  artisan:37
      Illuminate\Foundation\Console\Kernel::handle()
[root@iZ23wv7v5ggZ app-wangqiang-larabbs.shuijingwanwq.com]# php artisan queue:listen --timeout=0
[2022-01-07 17:08:38][crCkj0LVPcowMiTlvjeGcGNHkPh1E4rY] Processing: App\Jobs\TranslateSlug
[2022-01-07 17:08:39][crCkj0LVPcowMiTlvjeGcGNHkPh1E4rY] Processed:  App\Jobs\TranslateSlug
[2022-01-07 17:08:40][a6UvDyYukqW1sUSNcbjw7P6QzpFnt1dU] Processing: App\Jobs\TranslateSlug
[2022-01-07 17:08:42][a6UvDyYukqW1sUSNcbjw7P6QzpFnt1dU] Processed:  App\Jobs\TranslateSlug
[2022-01-07 17:08:43][m8I0VIyZL9TguYR0XnxINv72wLgXqDCv] Processing: App\Jobs\TranslateSlug
[2022-01-07 17:08:43][m8I0VIyZL9TguYR0XnxINv72wLgXqDCv] Processed:  App\Jobs\TranslateSlug
[2022-01-07 17:08:44][NM3oLDGUOhcsT5cIy9tAiM4WR1kOHTDw] Processing: App\Jobs\TranslateSlug
[2022-01-07 17:08:46][NM3oLDGUOhcsT5cIy9tAiM4WR1kOHTDw] Processed:  App\Jobs\TranslateSlug
[2022-01-07 17:08:46][AGlsFITpj9Aqy2Iu0SOJZoxyNYcTl7ax] Processing: App\Jobs\TranslateSlug
[2022-01-07 17:08:47][AGlsFITpj9Aqy2Iu0SOJZoxyNYcTl7ax] Processed:  App\Jobs\TranslateSlug
[2022-01-07 17:08:48][F8UO802DJzIt6nrIfAd5KZU0SmrFWg60] Processing: App\Jobs\TranslateSlug
[2022-01-07 17:08:49][F8UO802DJzIt6nrIfAd5KZU0SmrFWg60] Processed:  App\Jobs\TranslateSlug
[2022-01-07 17:08:49][uN38Doj9q9xwDWtQcU7dGZLOub3W9Sqg] Processing: App\Jobs\TranslateSlug
[2022-01-07 17:08:50][uN38Doj9q9xwDWtQcU7dGZLOub3W9Sqg] Processed:  App\Jobs\TranslateSlug
[2022-01-07 17:08:50][i2Fpvio1WVFbCbVFwmM8F6Gm9FWgveYq] Processing: App\Jobs\TranslateSlug
[2022-01-07 17:08:51][i2Fpvio1WVFbCbVFwmM8F6Gm9FWgveYq] Processed:  App\Jobs\TranslateSlug
[2022-01-07 17:08:52][Ac7q3FzkUum0PN6jMVWYCqbbXRfInRM3] Processing: App\Jobs\TranslateSlug
[2022-01-07 17:08:52][Ac7q3FzkUum0PN6jMVWYCqbbXRfInRM3] Processed:  App\Jobs\TranslateSlug
[2022-01-07 17:08:53][JstjmnEAp5ttbdPyqLXri7SwMs8Q7ple] Processing: App\Jobs\TranslateSlug
[2022-01-07 17:08:54][JstjmnEAp5ttbdPyqLXri7SwMs8Q7ple] Processed:  App\Jobs\TranslateSlug
[2022-01-07 17:08:55][k7n2iJdSelQcgQWXsrjyci4KG1vNsAlq] Processing: App\Jobs\TranslateSlug
[2022-01-07 17:08:55][k7n2iJdSelQcgQWXsrjyci4KG1vNsAlq] Processed:  App\Jobs\TranslateSlug
[2022-01-07 17:08:56][LcSujDiTXczEUgE1YZ5Cwf459he4yxSD] Processing: App\Jobs\TranslateSlug
[2022-01-07 17:08:57][LcSujDiTXczEUgE1YZ5Cwf459he4yxSD] Processed:  App\Jobs\TranslateSlug
[2022-01-07 17:08:57][t2Umbs1fLco6N4ZfjYkEEbMdEHje0r9d] Processing: App\Jobs\TranslateSlug
[2022-01-07 17:08:59][t2Umbs1fLco6N4ZfjYkEEbMdEHje0r9d] Processed:  App\Jobs\TranslateSlug
[2022-01-07 17:08:59][m4ttqh4axQ6JpFPQoL6Skpa1qBPAB6EC] Processing: App\Jobs\TranslateSlug
[2022-01-07 17:09:01][m4ttqh4axQ6JpFPQoL6Skpa1qBPAB6EC] Processed:  App\Jobs\TranslateSlug
[2022-01-07 17:09:01][ARlo5v4zTyv3RUyKlBiR6HiYiwtuY6r5] Processing: App\Jobs\TranslateSlug
[2022-01-07 17:09:03][ARlo5v4zTyv3RUyKlBiR6HiYiwtuY6r5] Processed:  App\Jobs\TranslateSlug
[2022-01-07 17:09:03][0DAnnrmFlwmZ6u1DGpZT0lL3fVc2GoTP] Processing: App\Jobs\TranslateSlug
[2022-01-07 17:09:05][0DAnnrmFlwmZ6u1DGpZT0lL3fVc2GoTP] Processed:  App\Jobs\TranslateSlug
[2022-01-07 17:09:05][RXGEod7NPKnjrvzp0LB0xG7tumOTZQB3] Processing: App\Jobs\TranslateSlug
[2022-01-07 17:09:07][RXGEod7NPKnjrvzp0LB0xG7tumOTZQB3] Processed:  App\Jobs\TranslateSlug
[2022-01-07 17:09:08][ebi2yS5WyyaZgfdHHdM0bPr6voETTHOY] Processing: App\Jobs\TranslateSlug
[2022-01-07 17:09:10][ebi2yS5WyyaZgfdHHdM0bPr6voETTHOY] Processed:  App\Jobs\TranslateSlug
[2022-01-07 17:09:10][oCUs3UGYliYMEIldq3bOvbXEAuHJxH74] Processing: App\Jobs\TranslateSlug
[2022-01-07 17:09:11][oCUs3UGYliYMEIldq3bOvbXEAuHJxH74] Processed:  App\Jobs\TranslateSlug
[2022-01-07 17:09:12][qS3aEkUuUx7s9eekD6txazQFCGXdZf95] Processing: App\Jobs\TranslateSlug
[2022-01-07 17:09:12][qS3aEkUuUx7s9eekD6txazQFCGXdZf95] Processed:  App\Jobs\TranslateSlug
[2022-01-07 17:09:13][0M5eGoCrf44T0bHqi6CSnJWhIcRScx7V] Processing: App\Jobs\TranslateSlug
[2022-01-07 17:09:13][0M5eGoCrf44T0bHqi6CSnJWhIcRScx7V] Processed:  App\Jobs\TranslateSlug
[2022-01-07 17:09:14][ILzNa3JxWqzi4hMEbKsywvspJR0cSG7V] Processing: App\Jobs\TranslateSlug
^C
[root@iZ23wv7v5ggZ app-wangqiang-larabbs.shuijingwanwq.com]# 


</pre>
26、发现队列作业未按预期起作用,查看表:failed_jobs,里面存在一些失败的队列记录。可以忽略掉,因为这是偶发事件,应该是一瞬间的调用频率过高所导致。如图22
发现队列作业未按预期起作用,查看表:failed_jobs,里面存在一些失败的队列记录。可以忽略掉,因为这是偶发事件,应该是一瞬间的调用频率过高所导致

图22

<pre class="wp-block-syntaxhighlighter-code">

GuzzleHttp\Exception\ServerException: Server error: `GET http://api.fanyi.baidu.com/api/trans/vip/translate?q=Aut+et+assumenda+esse+necessitatibus+et+soluta+quia+temporibus.&from=zh&to=en&appid=20220104001046264&salt=1641546261&sign=6bf4c1c8f9779e1124e4e7b9a0dacd93` resulted in a `502 No data received from server or forwarder` response:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html>

<head>
  <title>502 - (truncated...)
 in /data/wwwroot/app-wangqiang-larabbs.shuijingwanwq.com/vendor/guzzlehttp/guzzle/src/Exception/RequestException.php:113
Stack trace:
#0 /data/wwwroot/app-wangqiang-larabbs.shuijingwanwq.com/vendor/guzzlehttp/guzzle/src/Middleware.php(69): GuzzleHttp\Exception\RequestException::create()
#1 /data/wwwroot/app-wangqiang-larabbs.shuijingwanwq.com/vendor/guzzlehttp/promises/src/Promise.php(204): GuzzleHttp\Middleware::GuzzleHttp\{closure}()
#2 /data/wwwroot/app-wangqiang-larabbs.shuijingwanwq.com/vendor/guzzlehttp/promises/src/Promise.php(153): GuzzleHttp\Promise\Promise::callHandler()
#3 /data/wwwroot/app-wangqiang-larabbs.shuijingwanwq.com/vendor/guzzlehttp/promises/src/TaskQueue.php(48): GuzzleHttp\Promise\Promise::GuzzleHttp\Promise\{closure}()
#4 /data/wwwroot/app-wangqiang-larabbs.shuijingwanwq.com/vendor/guzzlehttp/promises/src/Promise.php(248): GuzzleHttp\Promise\TaskQueue->run()
#5 /data/wwwroot/app-wangqiang-larabbs.shuijingwanwq.com/vendor/guzzlehttp/promises/src/Promise.php(224): GuzzleHttp\Promise\Promise->invokeWaitFn()
#6 /data/wwwroot/app-wangqiang-larabbs.shuijingwanwq.com/vendor/guzzlehttp/promises/src/Promise.php(269): GuzzleHttp\Promise\Promise->waitIfPending()
#7 /data/wwwroot/app-wangqiang-larabbs.shuijingwanwq.com/vendor/guzzlehttp/promises/src/Promise.php(226): GuzzleHttp\Promise\Promise->invokeWaitList()
#8 /data/wwwroot/app-wangqiang-larabbs.shuijingwanwq.com/vendor/guzzlehttp/promises/src/Promise.php(62): GuzzleHttp\Promise\Promise->waitIfPending()
#9 /data/wwwroot/app-wangqiang-larabbs.shuijingwanwq.com/vendor/guzzlehttp/guzzle/src/Client.php(187): GuzzleHttp\Promise\Promise->wait()
#10 /data/wwwroot/app-wangqiang-larabbs.shuijingwanwq.com/vendor/guzzlehttp/guzzle/src/ClientTrait.php(44): GuzzleHttp\Client->request()
#11 /data/wwwroot/app-wangqiang-larabbs.shuijingwanwq.com/app/Handlers/SlugTranslateHandler.php(42): GuzzleHttp\Client->get()
#12 /data/wwwroot/app-wangqiang-larabbs.shuijingwanwq.com/app/Jobs/TranslateSlug.php(29): App\Handlers\SlugTranslateHandler->translate()
#13 /data/wwwroot/app-wangqiang-larabbs.shuijingwanwq.com/vendor/laravel/framework/src/Illuminate/Container/BoundMethod.php(36): App\Jobs\TranslateSlug->handle()
#14 /data/wwwroot/app-wangqiang-larabbs.shuijingwanwq.com/vendor/laravel/framework/src/Illuminate/Container/Util.php(40): Illuminate\Container\BoundMethod::Illuminate\Container\{closure}()
#15 /data/wwwroot/app-wangqiang-larabbs.shuijingwanwq.com/vendor/laravel/framework/src/Illuminate/Container/BoundMethod.php(93): Illuminate\Container\Util::unwrapIfClosure()
#16 /data/wwwroot/app-wangqiang-larabbs.shuijingwanwq.com/vendor/laravel/framework/src/Illuminate/Container/BoundMethod.php(37): Illuminate\Container\BoundMethod::callBoundMethod()
#17 /data/wwwroot/app-wangqiang-larabbs.shuijingwanwq.com/vendor/laravel/framework/src/Illuminate/Container/Container.php(653): Illuminate\Container\BoundMethod::call()
#18 /data/wwwroot/app-wangqiang-larabbs.shuijingwanwq.com/vendor/laravel/framework/src/Illuminate/Bus/Dispatcher.php(128): Illuminate\Container\Container->call()
#19 /data/wwwroot/app-wangqiang-larabbs.shuijingwanwq.com/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(128): Illuminate\Bus\Dispatcher->Illuminate\Bus\{closure}()
#20 /data/wwwroot/app-wangqiang-larabbs.shuijingwanwq.com/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(103): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}()
#21 /data/wwwroot/app-wangqiang-larabbs.shuijingwanwq.com/vendor/laravel/framework/src/Illuminate/Bus/Dispatcher.php(132): Illuminate\Pipeline\Pipeline->then()
#22 /data/wwwroot/app-wangqiang-larabbs.shuijingwanwq.com/vendor/laravel/framework/src/Illuminate/Queue/CallQueuedHandler.php(120): Illuminate\Bus\Dispatcher->dispatchNow()
#23 /data/wwwroot/app-wangqiang-larabbs.shuijingwanwq.com/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(128): Illuminate\Queue\CallQueuedHandler->Illuminate\Queue\{closure}()
#24 /data/wwwroot/app-wangqiang-larabbs.shuijingwanwq.com/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(103): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}()
#25 /data/wwwroot/app-wangqiang-larabbs.shuijingwanwq.com/vendor/laravel/framework/src/Illuminate/Queue/CallQueuedHandler.php(122): Illuminate\Pipeline\Pipeline->then()
#26 /data/wwwroot/app-wangqiang-larabbs.shuijingwanwq.com/vendor/laravel/framework/src/Illuminate/Queue/CallQueuedHandler.php(70): Illuminate\Queue\CallQueuedHandler->dispatchThroughMiddleware()
#27 /data/wwwroot/app-wangqiang-larabbs.shuijingwanwq.com/vendor/laravel/framework/src/Illuminate/Queue/Jobs/Job.php(98): Illuminate\Queue\CallQueuedHandler->call()
#28 /data/wwwroot/app-wangqiang-larabbs.shuijingwanwq.com/vendor/laravel/framework/src/Illuminate/Queue/Worker.php(428): Illuminate\Queue\Jobs\Job->fire()
#29 /data/wwwroot/app-wangqiang-larabbs.shuijingwanwq.com/vendor/laravel/framework/src/Illuminate/Queue/Worker.php(378): Illuminate\Queue\Worker->process()
#30 /data/wwwroot/app-wangqiang-larabbs.shuijingwanwq.com/vendor/laravel/framework/src/Illuminate/Queue/Worker.php(329): Illuminate\Queue\Worker->runJob()
#31 /data/wwwroot/app-wangqiang-larabbs.shuijingwanwq.com/vendor/laravel/framework/src/Illuminate/Queue/Console/WorkCommand.php(117): Illuminate\Queue\Worker->runNextJob()
#32 /data/wwwroot/app-wangqiang-larabbs.shuijingwanwq.com/vendor/laravel/framework/src/Illuminate/Queue/Console/WorkCommand.php(101): Illuminate\Queue\Console\WorkCommand->runWorker()
#33 /data/wwwroot/app-wangqiang-larabbs.shuijingwanwq.com/vendor/laravel/framework/src/Illuminate/Container/BoundMethod.php(36): Illuminate\Queue\Console\WorkCommand->handle()
#34 /data/wwwroot/app-wangqiang-larabbs.shuijingwanwq.com/vendor/laravel/framework/src/Illuminate/Container/Util.php(40): Illuminate\Container\BoundMethod::Illuminate\Container\{closure}()
#35 /data/wwwroot/app-wangqiang-larabbs.shuijingwanwq.com/vendor/laravel/framework/src/Illuminate/Container/BoundMethod.php(93): Illuminate\Container\Util::unwrapIfClosure()
#36 /data/wwwroot/app-wangqiang-larabbs.shuijingwanwq.com/vendor/laravel/framework/src/Illuminate/Container/BoundMethod.php(37): Illuminate\Container\BoundMethod::callBoundMethod()
#37 /data/wwwroot/app-wangqiang-larabbs.shuijingwanwq.com/vendor/laravel/framework/src/Illuminate/Container/Container.php(653): Illuminate\Container\BoundMethod::call()
#38 /data/wwwroot/app-wangqiang-larabbs.shuijingwanwq.com/vendor/laravel/framework/src/Illuminate/Console/Command.php(136): Illuminate\Container\Container->call()
#39 /data/wwwroot/app-wangqiang-larabbs.shuijingwanwq.com/vendor/symfony/console/Command/Command.php(298): Illuminate\Console\Command->execute()
#40 /data/wwwroot/app-wangqiang-larabbs.shuijingwanwq.com/vendor/laravel/framework/src/Illuminate/Console/Command.php(121): Symfony\Component\Console\Command\Command->run()
#41 /data/wwwroot/app-wangqiang-larabbs.shuijingwanwq.com/vendor/symfony/console/Application.php(1005): Illuminate\Console\Command->run()
#42 /data/wwwroot/app-wangqiang-larabbs.shuijingwanwq.com/vendor/symfony/console/Application.php(299): Symfony\Component\Console\Application->doRunCommand()
#43 /data/wwwroot/app-wangqiang-larabbs.shuijingwanwq.com/vendor/symfony/console/Application.php(171): Symfony\Component\Console\Application->doRun()
#44 /data/wwwroot/app-wangqiang-larabbs.shuijingwanwq.com/vendor/laravel/framework/src/Illuminate/Console/Application.php(94): Symfony\Component\Console\Application->run()
#45 /data/wwwroot/app-wangqiang-larabbs.shuijingwanwq.com/vendor/laravel/framework/src/Illuminate/Foundation/Console/Kernel.php(129): Illuminate\Console\Application->run()
#46 /data/wwwroot/app-wangqiang-larabbs.shuijingwanwq.com/artisan(37): Illuminate\Foundation\Console\Kernel->handle()
#47 {main}

</pre>
27、在开发环境中,我们为了测试方便,直接在命令行里调用 artisan queue:listen 进行队列监控。然而在生产环境中,我们需要配置一个进程管理工具来监控 queue:work 进程的状态并在需要时进行重启。安装 Supervisor,Supervisor 是一个用于 Linux 操作系统的进程监视器。如果它失败了,它将自动重启 queue 进程。安装 Supervisor,你可以使用以下命令。报错:[Errno 14] HTTP Error 502 – Bad Gateway


[root@iZ23wv7v5ggZ app-wangqiang-larabbs.shuijingwanwq.com]# yum install supervisor
Loaded plugins: fastestmirror
Determining fastest mirrors
http://mirrors.cloud.aliyuncs.com/centos/7/os/x86_64/repodata/repomd.xml: [Errno 14] HTTP Error 502 - Bad Gateway
Trying other mirror.
http://mirrors.cloud.aliyuncs.com/epel/7/x86_64/repodata/repomd.xml: [Errno 14] HTTP Error 502 - Bad Gateway
Trying other mirror.
http://mirrors.cloud.aliyuncs.com/centos/7/extras/x86_64/repodata/repomd.xml: [Errno 14] HTTP Error 502 - Bad Gateway
Trying other mirror.
http://mirrors.cloud.aliyuncs.com/centos/7/updates/x86_64/repodata/repomd.xml: [Errno 14] HTTP Error 502 - Bad Gateway
Trying other mirror.
Resolving Dependencies
--> Running transaction check
---> Package supervisor.noarch 0:3.4.0-1.el7 will be installed
--> Processing Dependency: python-meld3 >= 0.6.5 for package: supervisor-3.4.0-1.el7.noarch
--> Processing Dependency: python-setuptools for package: supervisor-3.4.0-1.el7.noarch
--> Running transaction check
---> Package python-meld3.x86_64 0:0.6.10-1.el7 will be installed
---> Package python-setuptools.noarch 0:0.9.8-7.el7 will be installed
--> Processing Dependency: python-backports-ssl_match_hostname for package: python-setuptools-0.9.8-7.el7.noarch
--> Running transaction check
---> Package python-backports-ssl_match_hostname.noarch 0:3.5.0.1-1.el7 will be installed
--> Processing Dependency: python-ipaddress for package: python-backports-ssl_match_hostname-3.5.0.1-1.el7.noarch
--> Processing Dependency: python-backports for package: python-backports-ssl_match_hostname-3.5.0.1-1.el7.noarch
--> Running transaction check
---> Package python-backports.x86_64 0:1.0-8.el7 will be installed
---> Package python-ipaddress.noarch 0:1.0.16-2.el7 will be installed
--> Finished Dependency Resolution

Dependencies Resolved

==============================================================================================================================
 Package                                           Arch                 Version                      Repository          Size
==============================================================================================================================
Installing:
 supervisor                                        noarch               3.4.0-1.el7                  epel               498 k
Installing for dependencies:
 python-backports                                  x86_64               1.0-8.el7                    base               5.8 k
 python-backports-ssl_match_hostname               noarch               3.5.0.1-1.el7                base                13 k
 python-ipaddress                                  noarch               1.0.16-2.el7                 base                34 k
 python-meld3                                      x86_64               0.6.10-1.el7                 epel                73 k
 python-setuptools                                 noarch               0.9.8-7.el7                  base               397 k

Transaction Summary
==============================================================================================================================
Install  1 Package (+5 Dependent packages)

Total download size: 1.0 M
Installed size: 5.1 M
Is this ok [y/d/N]: y
Downloading packages:
python-backports-1.0-8.el7.x86 FAILED                                          
http://mirrors.cloud.aliyuncs.com/centos/7/os/x86_64/Packages/python-backports-1.0-8.el7.x86_64.rpm: [Errno 14] HTTP Error 502 - Bad Gateway
Trying other mirror.
python-backports-ssl_match_hos FAILED                                          
http://mirrors.cloud.aliyuncs.com/centos/7/os/x86_64/Packages/python-backports-ssl_match_hostname-3.5.0.1-1.el7.noarch.rpm: [Errno 14] HTTP Error 502 - Bad Gateway
Trying other mirror.
python-meld3-0.6.10-1.el7.x86_ FAILED                                          
http://mirrors.cloud.aliyuncs.com/epel/7/x86_64/Packages/p/python-meld3-0.6.10-1.el7.x86_64.rpm: [Errno 14] HTTP Error 502 - Bad Gateway
Trying other mirror.
python-ipaddress-1.0.16-2.el7. FAILED                                          
http://mirrors.cloud.aliyuncs.com/centos/7/os/x86_64/Packages/python-ipaddress-1.0.16-2.el7.noarch.rpm: [Errno 14] HTTP Error 502 - Bad Gateway
Trying other mirror.
python-setuptools-0.9.8-7.el7. FAILED                                          
http://mirrors.cloud.aliyuncs.com/centos/7/os/x86_64/Packages/python-setuptools-0.9.8-7.el7.noarch.rpm: [Errno 14] HTTP Error 502 - Bad Gateway
Trying other mirror.
supervisor-3.4.0-1.el7.noarch. FAILED                                          
http://mirrors.cloud.aliyuncs.com/epel/7/x86_64/Packages/s/supervisor-3.4.0-1.el7.noarch.rpm: [Errno 14] HTTP Error 502 - Bad Gateway
Trying other mirror.


Error downloading packages:
  python-backports-1.0-8.el7.x86_64: [Errno 256] No more mirrors to try.
  python-backports-ssl_match_hostname-3.5.0.1-1.el7.noarch: [Errno 256] No more mirrors to try.
  python-setuptools-0.9.8-7.el7.noarch: [Errno 256] No more mirrors to try.
  supervisor-3.4.0-1.el7.noarch: [Errno 256] No more mirrors to try.
  python-ipaddress-1.0.16-2.el7.noarch: [Errno 256] No more mirrors to try.
  python-meld3-0.6.10-1.el7.x86_64: [Errno 256] No more mirrors to try.




28、缘由应该是 yum 源已经过期了,重新配置阿里云的 CentOS 7 yum 源,参考网址:https://oneinstack.com/faq/yum-apt/ 。如图23
缘由应该是 yum 源已经过期了,重新配置阿里云的 CentOS 7 yum 源,参考网址:https://oneinstack.com/faq/yum-apt/

图23



[root@iZ23wv7v5ggZ ~]# cd /etc/yum.repos.d
[root@iZ23wv7v5ggZ yum.repos.d]# ls
CentOS-Base.repo  epel.repo
[root@iZ23wv7v5ggZ yum.repos.d]# rm -rf /etc/yum.repos.d/*.repo
[root@iZ23wv7v5ggZ yum.repos.d]# ls
[root@iZ23wv7v5ggZ yum.repos.d]# curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100  2523  100  2523    0     0   4059      0 --:--:-- --:--:-- --:--:--  4056
[root@iZ23wv7v5ggZ yum.repos.d]# curl -o /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100   664  100   664    0     0    639      0  0:00:01  0:00:01 --:--:--   640
[root@iZ23wv7v5ggZ yum.repos.d]# ls
CentOS-Base.repo  epel.repo
[root@iZ23wv7v5ggZ yum.repos.d]# yum makecache
Loaded plugins: fastestmirror
Determining fastest mirrors
 * base: mirrors.cloud.aliyuncs.com
 * extras: mirrors.cloud.aliyuncs.com
 * updates: mirrors.cloud.aliyuncs.com
base                                                            | 3.6 kB  00:00:00     
epel                                                            | 4.7 kB  00:00:00     
extras                                                          | 2.9 kB  00:00:00     
updates                                                         | 2.9 kB  00:00:00     
(1/13): epel/x86_64/updateinfo                                  | 1.0 MB  00:00:00     
(2/13): epel/x86_64/prestodelta                                 |  450 B  00:00:00     
(3/13): base/7/x86_64/filelists_db                              | 7.2 MB  00:00:01     
(4/13): epel/x86_64/filelists_db                                |  12 MB  00:00:01     
(5/13): epel/x86_64/primary_db                                  | 7.0 MB  00:00:00     
(6/13): extras/7/x86_64/primary_db                              | 243 kB  00:00:00     
(7/13): extras/7/x86_64/filelists_db                            | 259 kB  00:00:00     
(8/13): epel/x86_64/other_db                                    | 3.4 MB  00:00:00     
(9/13): extras/7/x86_64/other_db                                | 145 kB  00:00:00     
(10/13): updates/7/x86_64/filelists_db                          | 7.4 MB  00:00:01     
(11/13): updates/7/x86_64/other_db                              | 955 kB  00:00:00     
(12/13): updates/7/x86_64/primary_db                            |  13 MB  00:00:02     
base/7/x86_64/other_db         FAILED                                          
http://mirrors.aliyuncs.com/centos/7/os/x86_64/repodata/ecaab5cc3b9c10fefe6be2ecbf6f9fcb437231dac3e82cab8d9d2cf70e99644d-other.sqlite.bz2: [Errno 12] Timeout on http://mirrors.aliyuncs.com/centos/7/os/x86_64/repodata/ecaab5cc3b9c10fefe6be2ecbf6f9fcb437231dac3e82cab8d9d2cf70e99644d-other.sqlite.bz2: (28, 'Operation too slow. Less than 1000 bytes/sec transferred the last 30 seconds')
Trying other mirror.
(13/13): base/7/x86_64/other_db                                 | 2.6 MB  00:00:00     
Metadata Cache Created
[root@iZ23wv7v5ggZ yum.repos.d]# ^C
[root@iZ23wv7v5ggZ yum.repos.d]# 



29、参考 Supervisor 配置:https://learnku.com/docs/laravel/8.5/queues/10395#e45763 ,再次安装 Supervisor。安装成功。


[root@iZ23wv7v5ggZ yum.repos.d]# yum install supervisor
Loaded plugins: fastestmirror
Loading mirror speeds from cached hostfile
 * base: mirrors.cloud.aliyuncs.com
 * extras: mirrors.cloud.aliyuncs.com
 * updates: mirrors.cloud.aliyuncs.com
Resolving Dependencies
--> Running transaction check
---> Package supervisor.noarch 0:3.4.0-1.el7 will be installed
--> Processing Dependency: python-meld3 >= 0.6.5 for package: supervisor-3.4.0-1.el7.noarch
--> Processing Dependency: python-setuptools for package: supervisor-3.4.0-1.el7.noarch
--> Running transaction check
---> Package python-meld3.x86_64 0:0.6.10-1.el7 will be installed
---> Package python-setuptools.noarch 0:0.9.8-7.el7 will be installed
--> Processing Dependency: python-backports-ssl_match_hostname for package: python-setuptools-0.9.8-7.el7.noarch
--> Running transaction check
---> Package python-backports-ssl_match_hostname.noarch 0:3.5.0.1-1.el7 will be installed
--> Processing Dependency: python-ipaddress for package: python-backports-ssl_match_hostname-3.5.0.1-1.el7.noarch
--> Processing Dependency: python-backports for package: python-backports-ssl_match_hostname-3.5.0.1-1.el7.noarch
--> Running transaction check
---> Package python-backports.x86_64 0:1.0-8.el7 will be installed
---> Package python-ipaddress.noarch 0:1.0.16-2.el7 will be installed
--> Finished Dependency Resolution

Dependencies Resolved

=======================================================================================
 Package                                 Arch       Version             Repository
                                                                                  Size
=======================================================================================
Installing:
 supervisor                              noarch     3.4.0-1.el7         epel     498 k
Installing for dependencies:
 python-backports                        x86_64     1.0-8.el7           base     5.8 k
 python-backports-ssl_match_hostname     noarch     3.5.0.1-1.el7       base      13 k
 python-ipaddress                        noarch     1.0.16-2.el7        base      34 k
 python-meld3                            x86_64     0.6.10-1.el7        epel      73 k
 python-setuptools                       noarch     0.9.8-7.el7         base     397 k

Transaction Summary
=======================================================================================
Install  1 Package (+5 Dependent packages)

Total download size: 1.0 M
Installed size: 5.1 M
Is this ok [y/d/N]: y
Downloading packages:
No Presto metadata available for base
(1/6): python-backports-1.0-8.el7.x86_64.rpm                    | 5.8 kB  00:00:00     
(2/6): python-backports-ssl_match_hostname-3.5.0.1-1.el7.noarch |  13 kB  00:00:00     
(3/6): python-ipaddress-1.0.16-2.el7.noarch.rpm                 |  34 kB  00:00:00     
(4/6): python-meld3-0.6.10-1.el7.x86_64.rpm                     |  73 kB  00:00:00     
(5/6): python-setuptools-0.9.8-7.el7.noarch.rpm                 | 397 kB  00:00:00     
(6/6): supervisor-3.4.0-1.el7.noarch.rpm                        | 498 kB  00:00:00     
---------------------------------------------------------------------------------------
Total                                                     726 kB/s | 1.0 MB  00:01     
Running transaction check
Running transaction test
Transaction test succeeded
Running transaction
  Installing : python-meld3-0.6.10-1.el7.x86_64                                    1/6 
  Installing : python-ipaddress-1.0.16-2.el7.noarch                                2/6 
  Installing : python-backports-1.0-8.el7.x86_64                                   3/6 
  Installing : python-backports-ssl_match_hostname-3.5.0.1-1.el7.noarch            4/6 
  Installing : python-setuptools-0.9.8-7.el7.noarch                                5/6 
  Installing : supervisor-3.4.0-1.el7.noarch                                       6/6 
  Verifying  : supervisor-3.4.0-1.el7.noarch                                       1/6 
  Verifying  : python-backports-1.0-8.el7.x86_64                                   2/6 
  Verifying  : python-ipaddress-1.0.16-2.el7.noarch                                3/6 
  Verifying  : python-meld3-0.6.10-1.el7.x86_64                                    4/6 
  Verifying  : python-setuptools-0.9.8-7.el7.noarch                                5/6 
  Verifying  : python-backports-ssl_match_hostname-3.5.0.1-1.el7.noarch            6/6 

Installed:
  supervisor.noarch 0:3.4.0-1.el7                                                      

Dependency Installed:
  python-backports.x86_64 0:1.0-8.el7                                                  
  python-backports-ssl_match_hostname.noarch 0:3.5.0.1-1.el7                           
  python-ipaddress.noarch 0:1.0.16-2.el7                                               
  python-meld3.x86_64 0:0.6.10-1.el7                                                   
  python-setuptools.noarch 0:0.9.8-7.el7                                               

Complete!
[root@iZ23wv7v5ggZ yum.repos.d]# 



30、创建一个 /etc/supervisord.d/app-wangqiang-larabbs-worker.ini 文件,启动并监视 queue:work 进程。指示 Supervisor 运行 2 个 queue:work 进程并监视所有进程。如图24
创建一个 /etc/supervisord.d/app-wangqiang-larabbs-worker.ini 文件,启动并监视 queue:work 进程。指示 Supervisor 运行 2 个 queue:work 进程并监视所有进程

图24



[root@iZ23wv7v5ggZ supervisord.d]# cat app-wangqiang-larabbs-worker.ini 
[program:app-wangqiang-larabbs-worker]
process_name=%(program_name)s_%(process_num)02d
command=php /data/wwwroot/app-wangqiang-larabbs.shuijingwanwq.com/artisan queue:work sqs --sleep=3 --tries=3 --max-time=600
autostart=true
autorestart=true
stopasgroup=true
killasgroup=true
user=www
numprocs=2
redirect_stderr=true
stdout_logfile=/data/wwwroot/app-wangqiang-larabbs.shuijingwanwq.com/worker.log
stopwaitsecs=600
[root@iZ23wv7v5ggZ supervisord.d]# 



31、创建配置文件后,你可以更新 Supervisor 配置并使用以下命令启动进程。报错:unix:///var/run/supervisor/supervisor.sock no such file
<pre class="wp-block-syntaxhighlighter-code">

[root@iZ23wv7v5ggZ supervisord.d]# cd ~
[root@iZ23wv7v5ggZ ~]# supervisorctl reread
error: <class 'socket.error'>, [Errno 2] No such file or directory: file: /usr/lib64/python2.7/socket.py line: 224
[root@iZ23wv7v5ggZ ~]# supervisorctl status
unix:///var/run/supervisor/supervisor.sock no such file


</pre>
32、重启 ECS 实例后,执行命令:easy_install supervisor。查看 supervisord 运行状态:supervisorctl status,报错:can’t find command ‘php’。如图25
重启 ECS 实例后,执行命令:easy_install supervisor。查看 supervisord 运行状态:supervisorctl status,报错:can't find command 'php'

图25



[root@iZ23wv7v5ggZ ~]# easy_install supervisor
Searching for supervisor
Best match: supervisor 3.4.0
Adding supervisor 3.4.0 to easy-install.pth file
Installing echo_supervisord_conf script to /usr/bin
Installing pidproxy script to /usr/bin
Installing supervisorctl script to /usr/bin
Installing supervisord script to /usr/bin

Using /usr/lib/python2.7/site-packages
Processing dependencies for supervisor
Finished processing dependencies for supervisor
[root@iZ23wv7v5ggZ ~]# systemctl enable supervisord
Created symlink from /etc/systemd/system/multi-user.target.wants/supervisord.service to /usr/lib/systemd/system/supervisord.service.
[root@iZ23wv7v5ggZ ~]# systemctl restart supervisord
[root@iZ23wv7v5ggZ ~]# supervisorctl status
app-wangqiang-larabbs-worker:app-wangqiang-larabbs-worker_00   FATAL     can't find command 'php'
app-wangqiang-larabbs-worker:app-wangqiang-larabbs-worker_01   FATAL     can't find command 'php'
[root@iZ23wv7v5ggZ ~]# 


33、查看 php 的运行目录 which php,ini 配置文件的 command 的 php 加上绝对路径。如图26
查看 php 的运行目录 which php,ini 配置文件的 command 的 php 加上绝对路径

图26



[root@iZ23wv7v5ggZ ~]# which php
/usr/local/php/bin/php
[root@iZ23wv7v5ggZ ~]# vim /etc/supervisord.d/app-wangqiang-larabbs-worker.ini
[root@iZ23wv7v5ggZ ~]# cat /etc/supervisord.d/app-wangqiang-larabbs-worker.ini
[program:app-wangqiang-larabbs-worker]
process_name=%(program_name)s_%(process_num)02d
command=/usr/local/php/bin/php /data/wwwroot/app-wangqiang-larabbs.shuijingwanwq.com/artisan queue:work sqs --sleep=3 --tries=3 --max-time=600
autostart=true
autorestart=true
stopasgroup=true
killasgroup=true
user=www
numprocs=2
redirect_stderr=true
stdout_logfile=/data/wwwroot/app-wangqiang-larabbs.shuijingwanwq.com/worker.log
stopwaitsecs=600
[root@iZ23wv7v5ggZ ~]# 



34、重启 supervisord 后,查看状态,运行成功,但是提示:退出太快(进程日志可能有详细信息)。如图27
重启 supervisord 后,查看状态,运行成功,但是提示:退出太快(进程日志可能有详细信息)

图27



[root@iZ23wv7v5ggZ ~]# service supervisord restart
Redirecting to /bin/systemctl restart supervisord.service
[root@iZ23wv7v5ggZ ~]# supervisorctl status
app-wangqiang-larabbs-worker:app-wangqiang-larabbs-worker_00   BACKOFF   Exited too quickly (process log may have details)
app-wangqiang-larabbs-worker:app-wangqiang-larabbs-worker_01   STARTING  
[root@iZ23wv7v5ggZ ~]# 


35、查看 /data/wwwroot/app-wangqiang-larabbs.shuijingwanwq.com/worker.log,提示:Class ‘Aws\Sqs\SqsClient’ not found。如图29
查看 /data/wwwroot/app-wangqiang-larabbs.shuijingwanwq.com/worker.log,提示:Class 'Aws\Sqs\SqsClient' not found

图29



[root@iZ23wv7v5ggZ app-wangqiang-larabbs.shuijingwanwq.com]# cat worker.log 

   Error 

  Class 'Aws\Sqs\SqsClient' not found

  at /data/wwwroot/app-wangqiang-larabbs.shuijingwanwq.com/vendor/laravel/framework/src/Illuminate/Queue/Connectors/SqsConnector.php:26
     22▕             $config['credentials'] = Arr::only($config, ['key', 'secret', 'token']);
     23▕         }
     24▕ 
     25▕         return new SqsQueue(
  ➜  26▕             new SqsClient($config),
     27▕             $config['queue'],
     28▕             $config['prefix'] ?? '',
     29▕             $config['suffix'] ?? '',
     30▕             $config['after_commit'] ?? null

      +18 vendor frames 
  19  /data/wwwroot/app-wangqiang-larabbs.shuijingwanwq.com/artisan:37
      Illuminate\Foundation\Console\Kernel::handle()

      +18 vendor frames 
  19  /data/wwwroot/app-wangqiang-larabbs.shuijingwanwq.com/artisan:37
      Illuminate\Foundation\Console\Kernel::handle()



36、ini 配置文件的 command 的 php ,删除掉 sqs,然后重启后,查看状态,一直处于运行中。如图30
ini 配置文件的 command 的 php ,删除掉 sqs,然后重启后,查看状态,一直处于运行中

图30



[root@iZ23wv7v5ggZ ~]# vim /etc/supervisord.d/app-wangqiang-larabbs-worker.ini
[root@iZ23wv7v5ggZ ~]# cat /etc/supervisord.d/app-wangqiang-larabbs-worker.ini
[program:app-wangqiang-larabbs-worker]
process_name=%(program_name)s_%(process_num)02d
command=/usr/local/php/bin/php /data/wwwroot/app-wangqiang-larabbs.shuijingwanwq.com/artisan queue:work --sleep=3 --tries=3 --max-time=600
autostart=true
autorestart=true
stopasgroup=true
killasgroup=true
user=www
numprocs=2
redirect_stderr=true
stdout_logfile=/data/wwwroot/app-wangqiang-larabbs.shuijingwanwq.com/worker.log
stopwaitsecs=600
[root@iZ23wv7v5ggZ app-wangqiang-larabbs.shuijingwanwq.com]# service supervisord restart
Redirecting to /bin/systemctl restart supervisord.service
[root@iZ23wv7v5ggZ app-wangqiang-larabbs.shuijingwanwq.com]# supervisorctl status
app-wangqiang-larabbs-worker:app-wangqiang-larabbs-worker_00   RUNNING   pid 2277, uptime 0:00:07
app-wangqiang-larabbs-worker:app-wangqiang-larabbs-worker_01   RUNNING   pid 2276, uptime 0:00:07




37、测试队列是否生效,重启 ECS 后,新建一个话题,其详情页面的网址为:https://app-wangqiang-larabbs.shuijingwanwq.com/topics/105 。刷新一下,其会 301 跳转至:https://app-wangqiang-larabbs.shuijingwanwq.com/topics/105/a-german 。表明队列生效中。如图31
测试队列是否生效,重启 ECS 后,新建一个话题,其详情页面的网址为:https://app-wangqiang-larabbs.shuijingwanwq.com/topics/105 。刷新一下,其会 301 跳转至:https://app-wangqiang-larabbs.shuijingwanwq.com/topics/105/a-german 。表明队列生效中

图31

38、计划任务的实现,使用调度器时,我们需要修改系统的 Cron 计划任务配置信息,运行以下命令,添加新的调度任务。部署完毕。如图32
计划任务的实现,使用调度器时,我们需要修改系统的 Cron 计划任务配置信息,运行以下命令,添加新的调度任务。部署完毕

图32



[root@iZ23wv7v5ggZ ~]# export EDITOR=vi && crontab -e
crontab: installing new crontab

* * * * * /usr/local/php/bin/php /data/wwwroot/app-wangqiang-larabbs.shuijingwanwq.com/artisan schedule:run >> /dev/null 2>&1


]]>
https://www.shuijingwanwq.com/2022/01/28/5867/feed/ 0
在 Windows 10 专业版中搭建 Laravel Sail 开发环境 https://www.shuijingwanwq.com/2021/12/23/5559/ https://www.shuijingwanwq.com/2021/12/23/5559/#respond Thu, 23 Dec 2021 01:45:36 +0000 https://www.shuijingwanwq.com/?p=5559 浏览量: 307 1、Laravel Sail 要求支持 WSL 2 的 Windows 10 系统。在 2020 年五月份发布的 2004 版本才支持 WSL 2 功能,所以我们的系统需更新到等于或大于 2004 版本。查看系统版本,可以使用 winver 命令,参考 Windows 10 release information ,版本的发布时间大于 1909 即可。系统版本符合要求。如图1
查看系统版本,可以使用 winver 命令,参考 Windows 10 release information ,版本的发布时间大于 1909 即可。

图1

2、先基于 360 升级至:最新的 21H1 的版本。如图2
先基于 360 升级至:最新的 21H1 的版本。

图2

3、查看系统版本,已经升级至:21H1 的版本。如图3
查看系统版本,已经升级至:21H1 的版本。

图3

4、搜索打开 Windows 功能管理 窗口,确保下图红框框住的两个地方都已开启:适用于 Linux 的 Windows 子系统、远程差分压缩 API 支持。如图4
搜索打开 Windows 功能管理 窗口,确保下图红框框住的两个地方都已开启:适用于 Linux 的 Windows 子系统、远程差分压缩 API 支持。

图4

5、为了更好地访问 Windows 的子系统,推荐使用 Windows Terminal 作为命令行工具。打开微软商店,搜索关键字 Windows Terminal ,在搜索结果中点击安装即可。如图5
为了更好地访问 Windows 的子系统,推荐使用 Windows Terminal 作为命令行工具。打开微软商店,搜索关键字 Windows Terminal ,在搜索结果中点击安装即可。

图5

6、下载和安装子系统:Ubuntu 。打开微软商店,搜索关键词 Ubuntu,第一和第二个都可以,选择第二个:Ubuntu 20.04 LTS。如图6
下载和安装子系统:Ubuntu 。打开微软商店,搜索关键词 Ubuntu,第一和第二个都可以,选择第二个:Ubuntu 20.04 LTS。

图6

7、提示创建一个 Ubuntu 系统的用户,入用户名,接下来输入密码即可完成 Ubuntu 子系统的安装。这个 Ubuntu 为当前 Windows 系统的子系统,接下来我们的 Docker 会基于此系统运行。如图7
提示创建一个 Ubuntu 系统的用户,输入用户名,接下来输入密码即可完成 Ubuntu 子系统的安装。这个 Ubuntu 为当前 Windows 系统的子系统,接下来我们的 Docker 会基于此系统运行。

图7

8、前往 Docker 官网下载 Docker Desktop:https://hub.docker.com/editions/community/docker-ce-desktop-windows ,下载完成后点击安装包安装,一直下一步即可。 9、提示:WSL 2 installation is incomplete. WSL 2 安装不完整。如图8
提示:WSL 2 installation is incomplete. WSL 2 安装不完整。

图8



WSL 2 installation is incomplete.
The WSL 2 Linux kernel is now installed using a separate MSI update package. Please click the link and follow the instructions to install the kernel update:https://aka.ms/wsl2kernel

Press restart after installing the Linux kernel


10、点击链接并按照说明安装内核更新:https://aka.ms/wsl2kernel 。下载并安装 Linux 内核更新包。如图9
点击链接并按照说明安装内核更新:https://aka.ms/wsl2kernel 。下载并安装 Linux 内核更新包。

图9

11、重启电脑,再次打开 Docker Desktop,报错:Docker failed to initialize。暂时不用理会。如图10
重启电脑,再次打开 Docker Desktop,报错:Docker failed to initialize。暂时不用理会。

图10

12、再次重启电脑后。打开 Docker Desktop,未再报错。进入配置页面 – General,默认已勾选 Use the WSL 2 based engine,开启 WSL2 模式。如图11
再次重启电脑后。打开 Docker Desktop,未再报错。进入配置页面 - General,默认已勾选 Use the WSL 2 based engine,开启 WSL2 模式。

图11

13、配置 – Resources – WSL Integration,选择我们上一步安装的 Ubuntu 系统,但是不存在 ubuntu 选项。如图12
配置 - Resources - WSL Integration,选择我们上一步安装的 Ubuntu 系统,但是不存在 ubuntu 选项。

图12

14、参考网址:https://learnku.com/articles/54890 。打开:Windows Terminal,转换为 WSL 2。如图13
参考网址:https://learnku.com/articles/54890 。打开:Windows Terminal,转换为 WSL 2。

图13



PS C:\Users\Lenovo> wsl --list --verbose
  NAME                   STATE           VERSION
* Ubuntu-20.04           Running         1
  docker-desktop-data    Running         2
  docker-desktop         Running         2
PS C:\Users\Lenovo> wsl --set-version Ubuntu-20.04 2
正在进行转换,这可能需要几分钟时间...
有关与 WSL 2 的主要区别的信息,请访问 https://aka.ms/wsl2
转换完成。
PS C:\Users\Lenovo>


15、点击按钮 Refresh,选项 Ubuntu-20.04 已经出现,开启。如图14
点击按钮 Refresh,选项 Ubuntu-20.04 已经出现,开启。

图14

16、创建测试项目,打开 Windows Terminal 命令行,按照以下指示进入 Ubuntu 系统。如图15
创建测试项目,打开 Windows Terminal 命令行,按照以下指示进入 Ubuntu 系统。

图15

17、Ubuntu 作为 Windows 子系统,可以访问到主系统下的硬盘。为了方便管理代码,我在 E 盘下早已创建了 wwwroot 目录,进入此目录后,使用以下命令进行创建一个测试的 Laravel 项目。如图16
Ubuntu 作为 Windows 子系统,可以访问到主系统下的硬盘。为了方便管理代码,我在 E 盘下早已创建了 wwwroot 目录,进入此目录后,使用以下命令进行创建一个测试的 Laravel 项目。

图16



wangqiang@DESKTOP-QLPK8QM:/mnt/c/Users/Lenovo$ cd /mnt/e
wangqiang@DESKTOP-QLPK8QM:/mnt/e$ ls
'$RECYCLE.BIN'  'System Volume Information'   cms   pagefile.sys    phpuploadtmp
 Develop         c                            css   phpsessiontmp   wwwroot
wangqiang@DESKTOP-QLPK8QM:/mnt/e$ cd wwwroot/
wangqiang@DESKTOP-QLPK8QM:/mnt/e/wwwroot$ curl -s https://laravel.build/example-app | bash
Unable to find image 'laravelsail/php81-composer:latest' locally
latest: Pulling from laravelsail/php81-composer
eff15d958d66: Pull complete
933427dc39f7: Pull complete
35bb08dc7ee2: Pull complete
58a3f26800d7: Pull complete
28803bfad74c: Pull complete
341a482d0bd3: Pull complete
03c4148389b1: Pull complete
fa3a9bfc7793: Pull complete
024907232600: Pull complete
df5987d70de6: Pull complete
e2a72a518bd8: Pull complete
b1ba689993c8: Pull complete
3bd142ab0b85: Pull complete
872fe34989f0: Pull complete
Digest: sha256:b27920b769ad8dc036a9ede3ae36f51a280d370ec7d125e77ca1924c9fa21dbb
Status: Downloaded newer image for laravelsail/php81-composer:latest

 _                               _
| |                             | |
| |     __ _ _ __ __ ___   _____| |
| |    / _` | '__/ _` \ \ / / _ \ |
| |___| (_| | | | (_| |\ V /  __/ |
|______\__,_|_|  \__,_| \_/ \___|_|

Warning: TTY mode requires /dev/tty to be read/writable.
    Creating a "laravel/laravel" project at "./example-app"
    Installing laravel/laravel (v8.6.9)
      - Downloading laravel/laravel (v8.6.9)
      - Installing laravel/laravel (v8.6.9): Extracting archive
    Created project in /opt/example-app
    > @php -r "file_exists('.env') || copy('.env.example', '.env');"
    Loading composer repositories with package information
    Updating dependencies
    Lock file operations: 110 installs, 0 updates, 0 removals
      - Locking asm89/stack-cors (v2.0.3)
  - Locking brick/math (0.9.3)
      - Locking dflydev/dot-access-data (v3.0.1)
  - Locking doctrine/inflector (2.0.4)
      - Locking doctrine/instantiator (1.4.0)
      - Locking doctrine/lexer (1.2.1)
  - Locking dragonmantank/cron-expression (v3.1.0)
      - Locking egulias/email-validator (2.1.25)
      - Locking facade/flare-client-php (1.9.1)
      - Locking facade/ignition (2.17.2)
      - Locking facade/ignition-contracts (1.0.2)
      - Locking fakerphp/faker (v1.17.0)
      - Locking filp/whoops (2.14.4)
      - Locking fruitcake/laravel-cors (v2.0.4)
      - Locking graham-campbell/result-type (v1.0.4)
  - Locking guzzlehttp/guzzle (7.4.1)
  - Locking guzzlehttp/promises (1.5.1)
  - Locking guzzlehttp/psr7 (2.1.0)
      - Locking hamcrest/hamcrest-php (v2.0.1)
  - Locking laravel/framework (v8.76.2)
  - Locking laravel/sail (v1.12.12)
  - Locking laravel/sanctum (v2.13.0)
  - Locking laravel/serializable-closure (v1.0.5)
      - Locking laravel/tinker (v2.6.3)
  - Locking league/commonmark (2.1.0)
  - Locking league/config (v1.1.1)
  - Locking league/flysystem (1.1.9)
  - Locking league/mime-type-detection (1.9.0)
      - Locking mockery/mockery (1.4.4)
  - Locking monolog/monolog (2.3.5)
      - Locking myclabs/deep-copy (1.10.2)
  - Locking nesbot/carbon (2.55.2)
      - Locking nette/schema (v1.2.2)
      - Locking nette/utils (v3.2.6)
      - Locking nikic/php-parser (v4.13.2)
      - Locking nunomaduro/collision (v5.10.0)
      - Locking opis/closure (3.6.2)
      - Locking phar-io/manifest (2.0.3)
      - Locking phar-io/version (3.1.0)
      - Locking phpdocumentor/reflection-common (2.2.0)
      - Locking phpdocumentor/reflection-docblock (5.3.0)
      - Locking phpdocumentor/type-resolver (1.5.1)
      - Locking phpoption/phpoption (1.8.1)
  - Locking phpspec/prophecy (v1.15.0)
      - Locking phpunit/php-code-coverage (9.2.10)
  - Locking phpunit/php-file-iterator (3.0.6)
      - Locking phpunit/php-invoker (3.1.1)
  - Locking phpunit/php-text-template (2.0.4)
      - Locking phpunit/php-timer (5.0.3)
  - Locking phpunit/phpunit (9.5.10)
      - Locking psr/container (1.1.2)
      - Locking psr/event-dispatcher (1.0.0)
      - Locking psr/http-client (1.0.1)
      - Locking psr/http-factory (1.0.1)
  - Locking psr/http-message (1.0.1)
  - Locking psr/log (2.0.0)
  - Locking psr/simple-cache (1.0.1)
      - Locking psy/psysh (v0.10.12)
  - Locking ralouphie/getallheaders (3.0.3)
      - Locking ramsey/collection (1.2.2)
      - Locking ramsey/uuid (4.2.3)
  - Locking sebastian/cli-parser (1.0.1)
      - Locking sebastian/code-unit (1.0.8)
      - Locking sebastian/code-unit-reverse-lookup (2.0.3)
  - Locking sebastian/comparator (4.0.6)
  - Locking sebastian/complexity (2.0.2)
      - Locking sebastian/diff (4.0.4)
      - Locking sebastian/environment (5.1.3)
  - Locking sebastian/exporter (4.0.4)
      - Locking sebastian/global-state (5.0.3)
  - Locking sebastian/lines-of-code (1.0.3)
      - Locking sebastian/object-enumerator (4.0.4)
  - Locking sebastian/object-reflector (2.0.4)
      - Locking sebastian/recursion-context (4.0.4)
      - Locking sebastian/resource-operations (3.0.3)
      - Locking sebastian/type (2.3.4)
      - Locking sebastian/version (3.0.2)
      - Locking swiftmailer/swiftmailer (v6.3.0)
      - Locking symfony/console (v5.4.1)
      - Locking symfony/css-selector (v6.0.1)
  - Locking symfony/deprecation-contracts (v3.0.0)
      - Locking symfony/error-handler (v5.4.1)
      - Locking symfony/event-dispatcher (v6.0.1)
      - Locking symfony/event-dispatcher-contracts (v3.0.0)
      - Locking symfony/finder (v5.4.0)
  - Locking symfony/http-foundation (v5.4.1)
      - Locking symfony/http-kernel (v5.4.1)
  - Locking symfony/mime (v5.4.0)
      - Locking symfony/polyfill-ctype (v1.23.0)
      - Locking symfony/polyfill-iconv (v1.23.0)
      - Locking symfony/polyfill-intl-grapheme (v1.23.1)
  - Locking symfony/polyfill-intl-idn (v1.23.0)
      - Locking symfony/polyfill-intl-normalizer (v1.23.0)
      - Locking symfony/polyfill-mbstring (v1.23.1)
  - Locking symfony/polyfill-php72 (v1.23.0)
      - Locking symfony/polyfill-php73 (v1.23.0)
      - Locking symfony/polyfill-php80 (v1.23.1)
      - Locking symfony/polyfill-php81 (v1.23.0)
      - Locking symfony/process (v5.4.0)
      - Locking symfony/routing (v5.4.0)
      - Locking symfony/service-contracts (v2.4.1)
      - Locking symfony/string (v6.0.1)
  - Locking symfony/translation (v6.0.1)
      - Locking symfony/translation-contracts (v3.0.0)
      - Locking symfony/var-dumper (v5.4.1)
      - Locking theseer/tokenizer (1.2.1)
      - Locking tijsverkoyen/css-to-inline-styles (2.2.4)
      - Locking vlucas/phpdotenv (v5.4.1)
      - Locking voku/portable-ascii (1.5.6)
  - Locking webmozart/assert (1.10.0)
    Writing lock file
    Installing dependencies from lock file (including require-dev)
    Package operations: 110 installs, 0 updates, 0 removals
      - Downloading doctrine/inflector (2.0.4)
      - Downloading doctrine/lexer (1.2.1)
      - Downloading dragonmantank/cron-expression (v3.1.0)
      - Downloading symfony/var-dumper (v5.4.1)
      - Downloading symfony/string (v6.0.1)
      - Downloading psr/container (1.1.2)
      - Downloading symfony/service-contracts (v2.4.1)
      - Downloading symfony/console (v5.4.1)
      - Downloading psr/log (2.0.0)
      - Downloading monolog/monolog (2.3.5)
      - Downloading voku/portable-ascii (1.5.6)
      - Downloading phpoption/phpoption (1.8.1)
      - Downloading graham-campbell/result-type (v1.0.4)
      - Downloading vlucas/phpdotenv (v5.4.1)
      - Downloading symfony/css-selector (v6.0.1)
      - Downloading tijsverkoyen/css-to-inline-styles (2.2.4)
      - Downloading symfony/routing (v5.4.0)
      - Downloading symfony/polyfill-php72 (v1.23.0)
      - Downloading symfony/polyfill-intl-idn (v1.23.0)
      - Downloading symfony/mime (v5.4.0)
      - Downloading symfony/http-foundation (v5.4.1)
      - Downloading psr/event-dispatcher (1.0.0)
      - Downloading symfony/event-dispatcher-contracts (v3.0.0)
      - Downloading symfony/event-dispatcher (v6.0.1)
      - Downloading symfony/error-handler (v5.4.1)
      - Downloading symfony/http-kernel (v5.4.1)
      - Downloading symfony/finder (v5.4.0)
      - Downloading symfony/polyfill-iconv (v1.23.0)
      - Downloading egulias/email-validator (2.1.25)
      - Downloading swiftmailer/swiftmailer (v6.3.0)
      - Downloading symfony/polyfill-php81 (v1.23.0)
      - Downloading ramsey/collection (1.2.2)
      - Downloading brick/math (0.9.3)
      - Downloading ramsey/uuid (4.2.3)
      - Downloading psr/simple-cache (1.0.1)
      - Downloading opis/closure (3.6.2)
      - Downloading symfony/translation-contracts (v3.0.0)
      - Downloading symfony/translation (v6.0.1)
      - Downloading nesbot/carbon (2.55.2)
      - Downloading league/mime-type-detection (1.9.0)
      - Downloading league/flysystem (1.1.9)
      - Downloading nette/utils (v3.2.6)
      - Downloading nette/schema (v1.2.2)
      - Downloading dflydev/dot-access-data (v3.0.1)
      - Downloading league/config (v1.1.1)
      - Downloading league/commonmark (2.1.0)
      - Downloading laravel/serializable-closure (v1.0.5)
      - Downloading laravel/framework (v8.76.2)
      - Downloading facade/ignition-contracts (1.0.2)
      - Downloading facade/flare-client-php (1.9.1)
      - Downloading facade/ignition (2.17.2)
      - Downloading fakerphp/faker (v1.17.0)
      - Downloading asm89/stack-cors (v2.0.3)
      - Downloading fruitcake/laravel-cors (v2.0.4)
      - Downloading psr/http-message (1.0.1)
      - Downloading psr/http-client (1.0.1)
      - Downloading ralouphie/getallheaders (3.0.3)
      - Downloading psr/http-factory (1.0.1)
      - Downloading guzzlehttp/psr7 (2.1.0)
      - Downloading guzzlehttp/promises (1.5.1)
      - Downloading guzzlehttp/guzzle (7.4.1)
      - Downloading laravel/sail (v1.12.12)
      - Downloading laravel/sanctum (v2.13.0)
      - Downloading nikic/php-parser (v4.13.2)
      - Downloading psy/psysh (v0.10.12)
      - Downloading laravel/tinker (v2.6.3)
      - Downloading hamcrest/hamcrest-php (v2.0.1)
      - Downloading mockery/mockery (1.4.4)
      - Downloading filp/whoops (2.14.4)
      - Downloading nunomaduro/collision (v5.10.0)
      - Downloading phpunit/php-file-iterator (3.0.6)
      - Downloading phpunit/php-code-coverage (9.2.10)
      - Downloading phpspec/prophecy (v1.15.0)
      - Installing doctrine/inflector (2.0.4): Extracting archive
      - Installing doctrine/lexer (1.2.1): Extracting archive
      - Installing symfony/polyfill-ctype (v1.23.0): Extracting archive
      - Installing webmozart/assert (1.10.0): Extracting archive
      - Installing dragonmantank/cron-expression (v3.1.0): Extracting archive
      - Installing symfony/polyfill-php80 (v1.23.1): Extracting archive
      - Installing symfony/polyfill-mbstring (v1.23.1): Extracting archive
      - Installing symfony/var-dumper (v5.4.1): Extracting archive
      - Installing symfony/polyfill-intl-normalizer (v1.23.0): Extracting archive
      - Installing symfony/polyfill-intl-grapheme (v1.23.1): Extracting archive
      - Installing symfony/string (v6.0.1): Extracting archive
      - Installing psr/container (1.1.2): Extracting archive
      - Installing symfony/service-contracts (v2.4.1): Extracting archive
      - Installing symfony/polyfill-php73 (v1.23.0): Extracting archive
      - Installing symfony/deprecation-contracts (v3.0.0): Extracting archive
      - Installing symfony/console (v5.4.1): Extracting archive
      - Installing psr/log (2.0.0): Extracting archive
      - Installing monolog/monolog (2.3.5): Extracting archive
      - Installing voku/portable-ascii (1.5.6): Extracting archive
      - Installing phpoption/phpoption (1.8.1): Extracting archive
      - Installing graham-campbell/result-type (v1.0.4): Extracting archive
      - Installing vlucas/phpdotenv (v5.4.1): Extracting archive
      - Installing symfony/css-selector (v6.0.1): Extracting archive
      - Installing tijsverkoyen/css-to-inline-styles (2.2.4): Extracting archive
      - Installing symfony/routing (v5.4.0): Extracting archive
      - Installing symfony/process (v5.4.0): Extracting archive
      - Installing symfony/polyfill-php72 (v1.23.0): Extracting archive
      - Installing symfony/polyfill-intl-idn (v1.23.0): Extracting archive
      - Installing symfony/mime (v5.4.0): Extracting archive
      - Installing symfony/http-foundation (v5.4.1): Extracting archive
      - Installing psr/event-dispatcher (1.0.0): Extracting archive
      - Installing symfony/event-dispatcher-contracts (v3.0.0): Extracting archive
      - Installing symfony/event-dispatcher (v6.0.1): Extracting archive
      - Installing symfony/error-handler (v5.4.1): Extracting archive
      - Installing symfony/http-kernel (v5.4.1): Extracting archive
      - Installing symfony/finder (v5.4.0): Extracting archive
      - Installing symfony/polyfill-iconv (v1.23.0): Extracting archive
      - Installing egulias/email-validator (2.1.25): Extracting archive
      - Installing swiftmailer/swiftmailer (v6.3.0): Extracting archive
      - Installing symfony/polyfill-php81 (v1.23.0): Extracting archive
      - Installing ramsey/collection (1.2.2): Extracting archive
      - Installing brick/math (0.9.3): Extracting archive
      - Installing ramsey/uuid (4.2.3): Extracting archive
      - Installing psr/simple-cache (1.0.1): Extracting archive
      - Installing opis/closure (3.6.2): Extracting archive
      - Installing symfony/translation-contracts (v3.0.0): Extracting archive
      - Installing symfony/translation (v6.0.1): Extracting archive
      - Installing nesbot/carbon (2.55.2): Extracting archive
      - Installing league/mime-type-detection (1.9.0): Extracting archive
      - Installing league/flysystem (1.1.9): Extracting archive
      - Installing nette/utils (v3.2.6): Extracting archive
      - Installing nette/schema (v1.2.2): Extracting archive
      - Installing dflydev/dot-access-data (v3.0.1): Extracting archive
      - Installing league/config (v1.1.1): Extracting archive
      - Installing league/commonmark (2.1.0): Extracting archive
      - Installing laravel/serializable-closure (v1.0.5): Extracting archive
      - Installing laravel/framework (v8.76.2): Extracting archive
      - Installing facade/ignition-contracts (1.0.2): Extracting archive
      - Installing facade/flare-client-php (1.9.1): Extracting archive
      - Installing facade/ignition (2.17.2): Extracting archive
      - Installing fakerphp/faker (v1.17.0): Extracting archive
      - Installing asm89/stack-cors (v2.0.3): Extracting archive
      - Installing fruitcake/laravel-cors (v2.0.4): Extracting archive
      - Installing psr/http-message (1.0.1): Extracting archive
      - Installing psr/http-client (1.0.1): Extracting archive
      - Installing ralouphie/getallheaders (3.0.3): Extracting archive
      - Installing psr/http-factory (1.0.1): Extracting archive
      - Installing guzzlehttp/psr7 (2.1.0): Extracting archive
      - Installing guzzlehttp/promises (1.5.1): Extracting archive
      - Installing guzzlehttp/guzzle (7.4.1): Extracting archive
      - Installing laravel/sail (v1.12.12): Extracting archive
      - Installing laravel/sanctum (v2.13.0): Extracting archive
      - Installing nikic/php-parser (v4.13.2): Extracting archive
      - Installing psy/psysh (v0.10.12): Extracting archive
      - Installing laravel/tinker (v2.6.3): Extracting archive
      - Installing hamcrest/hamcrest-php (v2.0.1): Extracting archive
      - Installing mockery/mockery (1.4.4): Extracting archive
      - Installing filp/whoops (2.14.4): Extracting archive
      - Installing nunomaduro/collision (v5.10.0): Extracting archive
      - Installing phpdocumentor/reflection-common (2.2.0): Extracting archive
      - Installing phpdocumentor/type-resolver (1.5.1): Extracting archive
      - Installing phpdocumentor/reflection-docblock (5.3.0): Extracting archive
      - Installing sebastian/version (3.0.2): Extracting archive
      - Installing sebastian/type (2.3.4): Extracting archive
      - Installing sebastian/resource-operations (3.0.3): Extracting archive
      - Installing sebastian/recursion-context (4.0.4): Extracting archive
      - Installing sebastian/object-reflector (2.0.4): Extracting archive
      - Installing sebastian/object-enumerator (4.0.4): Extracting archive
      - Installing sebastian/global-state (5.0.3): Extracting archive
      - Installing sebastian/exporter (4.0.4): Extracting archive
      - Installing sebastian/environment (5.1.3): Extracting archive
      - Installing sebastian/diff (4.0.4): Extracting archive
      - Installing sebastian/comparator (4.0.6): Extracting archive
      - Installing sebastian/code-unit (1.0.8): Extracting archive
      - Installing sebastian/cli-parser (1.0.1): Extracting archive
      - Installing phpunit/php-timer (5.0.3): Extracting archive
      - Installing phpunit/php-text-template (2.0.4): Extracting archive
      - Installing phpunit/php-invoker (3.1.1): Extracting archive
      - Installing phpunit/php-file-iterator (3.0.6): Extracting archive
      - Installing theseer/tokenizer (1.2.1): Extracting archive
      - Installing sebastian/lines-of-code (1.0.3): Extracting archive
      - Installing sebastian/complexity (2.0.2): Extracting archive
      - Installing sebastian/code-unit-reverse-lookup (2.0.3): Extracting archive
      - Installing phpunit/php-code-coverage (9.2.10): Extracting archive
      - Installing doctrine/instantiator (1.4.0): Extracting archive
      - Installing phpspec/prophecy (v1.15.0): Extracting archive
      - Installing phar-io/version (3.1.0): Extracting archive
      - Installing phar-io/manifest (2.0.3): Extracting archive
      - Installing myclabs/deep-copy (1.10.2): Extracting archive
      - Installing phpunit/phpunit (9.5.10): Extracting archive
    76 package suggestions were added by new dependencies, use `composer suggest` to see details.
    Package swiftmailer/swiftmailer is abandoned, you should avoid using it. Use symfony/mailer instead.
Generating optimized autoload files
    > Illuminate\Foundation\ComposerScripts::postAutoloadDump
    > @php artisan package:discover --ansi
    Discovered Package: facade/ignition
Discovered Package: fruitcake/laravel-cors
Discovered Package: laravel/sail
Discovered Package: laravel/sanctum
    Discovered Package: laravel/tinker
Discovered Package: nesbot/carbon
    Discovered Package: nunomaduro/collision
    Package manifest generated successfully.
    77 packages you are using are looking for funding.
Use the `composer fund` command to find out more!
    > @php artisan vendor:publish --tag=laravel-assets --ansi --force
    No publishable resources for tag [laravel-assets].
Publishing complete.
    > @php artisan key:generate --ansi
    Application key set successfully.

Application ready! Build something amazing.
Sail scaffolding installed successfully.

Please provide your password so we can make some final adjustments to your application's permissions.

[sudo] password for wangqiang:

Thank you! We hope you build something incredible. Dive in with: cd example-app && ./vendor/bin/sail up
wangqiang@DESKTOP-QLPK8QM:/mnt/e/wwwroot$


18、最终创建成功的界面。如图17
最终创建成功的界面。

图17

19、打开 E:\wwwroot\example-app 目录。如图18
打开 E:\wwwroot\example-app 目录。

图18

20、查看 Dockerfile 文件,Laravel 8 默认用的是 vendor/laravel/sail/runtimes/8.0 目录下的 Dockerfile。如图19
查看 Dockerfile 文件,Laravel 8 默认用的是 vendor/laravel/sail/runtimes/8.0 目录下的 Dockerfile。

图19

21、运行容器,在项目的根目录下,执行以下命令:./vendor/bin/sail up。第一次运行的时候,会初始化容器。建议翻墙。我一般不倾向于使用国内的镜像。报错。如图20
运行容器,在项目的根目录下,执行以下命令:./vendor/bin/sail up。第一次运行的时候,会初始化容器。建议翻墙。我一般不倾向于使用国内的镜像。报错。

图20



ERROR: for mysql  Cannot start service mysql: Ports are not available: listen tcp 0.0.0.0:3306: bind: Only one usage of each socket address (protocol/network address/port) is normally permitted.
ERROR: Encountered errors while bringing up the project.


22、原因应该在于本地的 mysql 数据库已经使用了 3306 端口,决定先将本地 mysql 数据库的端口修改为 3307。打开目录 C:\ProgramData\MySQL\MySQL Server 5.7,编辑 my.ini 文件。


[client]

# pipe
# socket=0.0
port=3307


[mysqld]

# The next three options are mutually exclusive to SERVER_PORT below.
# skip-networking

# enable-named-pipe

# shared-memory

# shared-memory-base-name=MYSQL

# The Pipe the MySQL Server will use
# socket=MYSQL

# The TCP/IP Port the MySQL Server will listen on
port=3307


23、重启电脑后,基于端口 3307 连接本地 mysql 数据库成功。如图21
重启电脑后,基于端口 3307 连接本地 mysql 数据库成功。

图21

24、再次运行命令:./vendor/bin/sail up。会从 mysql 处开始运行,总计耗费时长:20分钟。sail up 命令运行成功后,会一直显示软件的实时日志界面。如图22
再次运行命令:./vendor/bin/sail up。会从 mysql 处开始运行,总计耗费时长:。sail up 命令运行成功后,会一直显示软件的实时日志界面。

图22

25、此时你可以 ctrl+c 中断运行,再次运行时,可以使用 -d 参数让 sail up 命令在后台运行。如图23
此时你可以 ctrl+c 中断运行,再次运行时,可以使用 -d 参数让 sail up 命令在后台运行。

图23



meilisearch_1   | [2021-12-21T03:09:36Z INFO  actix_web::middleware::logger] 127.0.0.1:51806 "GET /health HTTP/1.1" 200 22 "-" "Wget" 0.000297
^CGracefully stopping... (press Ctrl+C again to force)
Stopping example-app_laravel.test_1 ... done
Stopping example-app_mailhog_1      ... done
Stopping example-app_mysql_1        ... done
Stopping example-app_selenium_1     ... done
Stopping example-app_redis_1        ... done
Stopping example-app_meilisearch_1  ... done
wangqiang@DESKTOP-QLPK8QM:/mnt/e/wwwroot/example-app$ ./vendor/bin/sail up -d
example-app_laravel.test_1   start-container                  Exit 137
Shutting down old Sail processes...
Creating network "example-app_sail" with driver "bridge"
Creating example-app_redis_1       ... done
Creating example-app_mailhog_1     ... done
Creating example-app_meilisearch_1 ... done
Creating example-app_selenium_1    ... done
Creating example-app_mysql_1       ... done
Creating example-app_laravel.test_1 ... done
wangqiang@DESKTOP-QLPK8QM:/mnt/e/wwwroot/example-app$


26、打开 Docker Desktop,容器列表中存在容器:example-app,状态为运行中。如图24
打开 Docker Desktop,容器列表中存在容器:example-app,状态为运行中。

图24

27、在浏览器中打开网址:http://localhost/ ,响应 200 。Laravel v8.76.2 (PHP v8.1.0)。开发环境部署成功。如图25
在浏览器中打开网址:http://localhost/ ,响应 200 。Laravel v8.76.2 (PHP v8.1.0)。开发环境部署成功。

图25

28、针对 3306 端口被占用的问题,还有另外一种方案,即修改容器的端口为 43306。本地 mysql 数据库仍然使用 3306 端口。计划后续基于 Nginx Proxy Manager 实现。 29、编辑 C:/Windows/System32/Drivers/etc/hosts 文件,指定 IP 与域名之间的映射关系。


127.0.0.1 example-app.test


30、在浏览器中打开网址:http://example-app.test/ 。响应 200。如图26
在浏览器中打开网址:http://example-app.test/ 。响应 200。

图26

]]>
https://www.shuijingwanwq.com/2021/12/23/5559/feed/ 0
在终端调用以下命令来安装 API:go install google.golang.org/api/urlshortener/v1,报错:can’t load package: package google.golang.org/api/urlshortener/v1 https://www.shuijingwanwq.com/2020/09/05/4495/ https://www.shuijingwanwq.com/2020/09/05/4495/#respond Sat, 05 Sep 2020 01:48:14 +0000 https://www.shuijingwanwq.com/?p=4495 浏览量: 108

1、在终端调用以下命令来安装 API:go install google.golang.org/api/urlshortener/v1,报错:can’t load package: package google.golang.org/api/urlshortener/v1。如图1

在终端调用以下命令来安装 API:go install google.golang.org/api/urlshortener/v1,报错:can't load package: package google.golang.org/api/urlshortener/v1。

图1


PS E:\wwwroot\go\src\uc> go install google.golang.org/api/urlshortener/v1
can't load package: package google.golang.org/api/urlshortener/v1: cannot find package "google.golang.org/api/urlshorten
er/v1" in any of:
        c:\go\src\google.golang.org\api\urlshortener\v1 (from $GOROOT)
        C:\Users\Administrator\go\src\google.golang.org\api\urlshortener\v1 (from $GOPATH)
        E:\wwwroot\go\src\google.golang.org\api\urlshortener\v1


2、参考:https://github.com/googleapis/google-api-go-client/blob/master/GettingStarted.md 。在终端调用以下命令来安装 API:go get -u google.golang.org/api/urlshortener/v1,报错:package google.golang.org/api/urlshortener/v1: unrecognized import path “google.golang.org/api/urlshortener/v1″。如图2

参考:https://github.com/googleapis/google-api-go-client/blob/master/GettingStarted.md 。在终端调用以下命令来安装 API:go get -u google.golang.org/api/urlshortener/v1,报错:package google.golang.org/api/urlshortener/v1: unrecognized import path "google.golang.org/api/urlshortener/v1"。

图2


PS E:\wwwroot\go\src\uc> go get -u google.golang.org/api/urlshortener/v1
package google.golang.org/api/urlshortener/v1: unrecognized import path "google.golang.org/api/urlshortener/v1" (https f
etch: Get https://google.golang.org/api/urlshortener/v1?go-get=1: dial tcp 216.239.37.1:443: connectex: A connection att
empt failed because the connected party did not properly respond after a period of time, or established connection faile
d because connected host has failed to respond.)


3、参考:https://www.shuijingwanwq.com/2019/12/28/3784/ 。在终端调用以下命令来安装 API:go get -u google.golang.org/api/urlshortener/v1。如图3

参考:https://www.shuijingwanwq.com/2019/12/28/3784/ 。在终端调用以下命令来安装 API:go get -u google.golang.org/api/urlshortener/v1。

图3


C:\Users\Administrator>set HTTP_PROXY=http://127.0.0.1:50999

C:\Users\Administrator>set HTTPS_PROXY=http://127.0.0.1:50999

C:\Users\Administrator>ping golang.org

正在 Ping golang-consa.l.google.com [216.239.37.1] 具有 32 字节的数据:
请求超时。
请求超时。
请求超时。
请求超时。

216.239.37.1 的 Ping 统计信息:
    数据包: 已发送 = 4,已接收 = 0,丢失 = 4 (100% 丢失),

C:\Users\Administrator>curl -vv http://www.google.com
* Rebuilt URL to: http://www.google.com/
*   Trying 127.0.0.1...
* TCP_NODELAY set
* Connected to 127.0.0.1 (127.0.0.1) port 50999 (#0)
> GET http://www.google.com/ HTTP/1.1
> Host: www.google.com
> User-Agent: curl/7.55.1
> Accept: */*
> Proxy-Connection: Keep-Alive
>
&lt; HTTP/1.1 301 Moved Permanently
&lt; Connection: close
&lt; Cache-Control: max-age:86400
&lt; Date: Thursday, 27-Aug-20 19:44:50 CST
&lt; Expires: Fri, 28 Aug 2020 19:44:50 GMT
&lt; Keep-Alive: timeout=58
&lt; Location: https://www.google.com/
&lt; Content-Length: 0
&lt;
* Closing connection 0

C:\Users\Administrator> go get -u google.golang.org/api/urlshortener/v1
# cd .; git clone -- https://github.com/grpc/grpc-go C:\Users\Administrator\go\src\google.golang.org\grpc
Cloning into 'C:\Users\Administrator\go\src\google.golang.org\grpc'...
fatal: the remote end hung up unexpectedly
error: RPC failed; curl 18 transfer closed with outstanding read data remaining
package google.golang.org/grpc: exit status 128
package google.golang.org/grpc/codes: cannot find package "google.golang.org/grpc/codes" in any of:
        c:\go\src\google.golang.org\grpc\codes (from $GOROOT)
        C:\Users\Administrator\go\src\google.golang.org\grpc\codes (from $GOPATH)
        E:\wwwroot\go\src\google.golang.org\grpc\codes
package google.golang.org/grpc/status: cannot find package "google.golang.org/grpc/status" in any of:
        c:\go\src\google.golang.org\grpc\status (from $GOROOT)
        C:\Users\Administrator\go\src\google.golang.org\grpc\status (from $GOPATH)
        E:\wwwroot\go\src\google.golang.org\grpc\status

C:\Users\Administrator> go get -u google.golang.org/api/urlshortener/v1

C:\Users\Administrator>



4、查看目录:C:\Users\Administrator\go\src\google.golang.org\api,目录:urlshortener 已经存在,安装 API 成功。如图4

查看目录:C:\Users\Administrator\go\src\google.golang.org\api,目录:urlshortener 已经存在,安装 API 成功。

图4

]]>
https://www.shuijingwanwq.com/2020/09/05/4495/feed/ 0