Webinoly 全面示例教程
您肯定已经阅读并体验过我们的快速指南
——著名的 Webinoly 5 分钟安装——
只需几分钟,您第一个Nginx和网站就将准备就绪并完成配置。
在接下来的教程中,我们将展示一些使用 Webinoly 的更高级、更复杂的示例和案例研究, 目的是向您展示该工具的一些潜在功能,并以此作为指导,帮助您以实际操作的方式学习一些命令的使用方法。
Webinoly 自定义安装
更新和升级操作系统始终应该是第一步:sudo apt update && sudo apt -y upgrade
我们将使用“-clean”选项开始清洁化安装 Webinoly,这意味着只会安装 Webinoly 自身/本体,而不会在服务器上安装其他的软件包。
wget -qO weby qrok.es/wy && sudo bash weby -clean
接下来,我们将在安装软件包之前修改一些值:
# Webinoly 配置文件
sudo nano /opt/webinoly/webinoly.conf
# 修改以下变量
max-mb-uploads:200
nginx-ppa:mainline
timezone:America/Mexico_City
我们在 PHP 中设置了最大文件上传大小为 200MB,
同时我们将安装 Nginx 的“mainline”也就是主线版本,并设置您偏好的时区。
现在我们已准备好在服务器上安装和配置所有必要的软件包。
我们将使用“lemp”选项来安装、配置和全面优化 Nginx、PHP 和 MariaDB (MySQL)。
sudo stack -lemp
作为参考,您应该阅读Webinoly官方文档,以及安装说明。
开发工具
我们将首先在子域名中创建一个开发网站:
sudo site dev.example.com -wp -env=development
“开发”环境下的 WordPress 会自动启用调试模式,禁用缓存,并设置搜索引擎“禁止索引”。
由于新 WordPress 站点的后台管理区域增加了基本验证保护,因此需要创建一个用于 HTTP 身份验证的用户才能访问该区域。
sudo httpauth -add
开发完成后,我们现在可以搭建一个测试版网站,然后等待客户批准。
sudo site staging.example.com -env=staging -clone-from=dev.example.com
测试版站点环境将自动禁用 WordPress 调试模式,缓存也将被禁用,并且仍然会设置为“noindex”,以防搜索引擎抓取。
也可以启用或禁用站点,防止意外访客访问:
sudo site dev.example.com -off
sudo site dev.example.com -on
Webinoly 提供了“log”命令,用于实时查看事件日志,它还可以方便地激活和控制 WordPress 日志,这在开发主题和插件时非常有用;此外,它还能控制程序日志,例如 PHP 和 MySQL 日志等,这些日志在几乎所有项目的开发过程中都是必不可少的。
项目完成后,您可以将新的网站替换掉现有的旧网站,并将其部署到生产环境中。
sudo site example.com -clone-from=staging.example.com -cache=on -env=production -overwrite=on
当设置为生产环境并启用搜索引擎索引时,调试模式会自动禁用。当然,FastCGI 缓存也会启用。
最后,我们通过为网站添加 SSL 证书,完成项目交付。
sudo site example.com -ssl=on
最后,我们将设置一个本地副本,以便进行小规模的频繁更新。
sudo site local.example.com -env=local -clone-from=example.com
将更新推送到生产环境:
sudo site example.com -clone-from=local.example.com -cache=on -env=production -overwrite=on
使用 Webinoly 创建网站
公司发展壮大后,我们的客户创建了一个非营利项目,使用 .org 域名来推广。
本次案例中,我们会创建一个简易页面,这个页面会包含项目概况和联系方式,以及一个联系表单,方便访客提交问题,以便我们后续联系他们。
这是一个非常简单的项目,因此我们首先创建一个用于处理联系表单功能的PHP站点。
sudo site example.org -php
然后开启 SFTP 访问权限上传网站文件。
sudo webinoly -login-www-data=on
在经过几次修改后,项目最终完成,我们交付了网站;但我们还在交付之前添加了SSL证书。
sudo site example.org -ssl=on
WordPress 安装在子目录中
最终,客户决定添加一个博客站点来发布文章,
因此我们快速便捷地在现有 PHP 网站的子目录下安装了一个 WordPress 网站。
sudo site example.org -wp=custom -subfolder=/articles
由于该网站将包含数千篇文章,因此我们决定使用亚马逊 AWS 的 RDS 外部数据库服务。
为此,我们选择了“自定义”选项来安装 WordPress,
这样 Webinoly 就会自动请求连接数据库所需的数据并设置网站。
此外,他们还要求移除访问该特定网站 WordPress 管理员区域的 HTTP 身份验证。
尽管不建议这样做,但考虑到该网站将拥有大量作者和用户,这样做是必要的。
sudo httpauth example.com -wp-admin=off -subfolder=/articles
非常重要,请不要忘记为 WordPress 启用缓存:
sudo site example.org -cache=on -subfolder=/articles
WordPress 多站点
我们客户的公司规模不断壮大,在对主网站 example.com 进行了多次更新和改进之后,他们现在要求我们在该网站上添加一个用于发布公司内部文件的非公开区域。
此外,还需要为新成立的附属学校创建一个新的网站,用于销售公司认证课程。
我们首先将主站点转换为多站点模式,这样就可以添加多个站点并在同一个地方进行管理。
sudo site example.com -multisite-convert
我们使用“子目录”选项配置网站,Webinoly 会自动检测我们的选择并进行所有必要的配置。
我们在 WordPress 多站点环境中创建一个新网站:example.com/members,该网站将独立管理。我们还添加了 HTTP 身份验证,以限制只有员工才能访问。
sudo httpauth example.com -path=/members
之前他们使用了一个专属域名 example.net 来搭建一个私有网站,并在上面托管了一个包含一些内部文章的旧博客。现在决定将旧博客的内容迁移到新的网站和会员专区,因此最佳方案是将旧域名重定向到新网站。
sudo site example.net -forward=https://example.com/members
例如:现在 example.net/news 将会自动重定向到 example.com/members/news。
域名映射的 WordPress 多站点
我个人最喜欢WordPress目前的一个功能是,现在不再需要使用插件来实现“域名映射”功能,因为这已经成为WordPress的内置功能。
这是何意味?
现在,您可以为多站点安装的每个子站点使用单独的域名,也就是说,您可以不使用子目录或子域名,而是使用新域名,这样您就可以从同一个 WordPress 安装中管理几个完全不同且独立的网站。
我建议您阅读官方文档 WordPress 多站点域名映射 Webinoly 原生集成了此功能,如下例所示。
为了创建学校的新网站,我们决定采用这种方案。
在WordPress多站点安装中,我们创建了一个新站点:example.com/school,并且我们将使用新域名 www.example.edu 访问该站点,如下例所示:
sudo site example.edu -parked=example.com -domain-mapping-wp-id=2
我们已经使用两个不同的域名创建了两个看似独立的网站,并且这两个网站都由同一个 WordPress 安装实例管理。
现在,我们将添加 SSL 证书并强制使用“www”前缀。
sudo site example.edu -ssl=on -root=example.com
sudo site example.edu -force-redirect=www
不同于其他站点,这个特定站点将由客户公司内的独立部门管理, 因此,他们要求为HTTP身份验证创建独立的用户帐户。
sudo httpauth example.edu -add
通过这种方式,我们可以添加所有必要的用户,并且他们只能访问此网站;
此外,之前在其他网站创建的具有通用访问权限的用户,也将无法访问此网站。
最后,需要启用 FastCGI,并且由于该网站使用查询字符串来显示不同语言的内容,
因此我们需要为 FastCGI 添加例外规则,以便缓存这些页面。
sudo site example.edu -cache=on
sudo webinoly -query-string-cache=lang
一些其他网站
在 example.org 项目网站上,他们有一个托管在 AWS S3 服务上的文件存储库,他们需要通过自己的域名访问该存储库。
我们将创建一个反代网站,以便使用我们自己的域名访问 S3 中的存储库。
sudo site download.example.org -proxy=[https://s3.amazonaws.com/download.example.org/] -dedicated-reverse-proxy
我们再来添加 SSL 证书:
sudo site download.example.org -ssl=on -manual=http
现在我们可以使用以下地址访问该存储库:download.example.org/file.jpg。
为了管理公司的车队,他们部署了一款名为 Traccar 的 GPS 追踪软件(基于 Java 开发), 该软件配置为使用 8082 端口,我们需要将其与我们的网站进行集成。
sudo site gps.example.com -proxy=[localhost:8082]
按照这种方式,您可以配置任何您偏好的应用程序/网站: Laravel、Java、Node、Angular、React、Vue 等
我们还会添加一个 SSL 证书,用于指示跟踪软件的安装路径:
sudo site gps.example.com -ssl=on -root-path=/opt/traccar/web
最后,公司的开发团队正在使用 PHP 框架开发一个新的内部工单系统, 为了方便访问和在服务器上托管该系统,我们将创建一个新的网站:
sudo site internal.example.com -mysql
执行命令后,屏幕上会显示新创建的数据库的数据, 我们将使用这些数据来配置服务器上的新票务应用程序。 本质上,这是一个基于PHP构建、并附带了SQL数据库的网站。
总之
我们创建了许多需求截然不同的网站。
- example.com (WordPress多站点)
- example.com/members (受保护的子站点)
- www.example.edu (子站点已启用域名映射,但已禁用身份验证)
- gps.example.com (经过 Nginx 反代的 Java 程序)
- internal.example.com (附带 MySQL 的 PHP 网站)
- example.org (PHP 网站)
- example.org/articles (子目录安装WordPress,并使用独立的身份验证和外部数据库。)
- download.example.org (S3专用的独立反代)
- example.net (域名转发到 example.com/members)
Webinoly 备份
Webinoly 预装了 Duply 和 Duplicity ,这两个工具几乎能够在任何已知存储介质上执行备份。在本教程中,我们将使用 AWS S3 和本地备份。
Webinoly 原生支持任何兼容 S3 的服务,例如:Backblaze B2、Digital Ocean Spaces、Wasabi、Vultr Object Storage、Linode Object Storage、DreamObjects 等。
我们将首先对我们网站的整个数据目录 /var/www 进行完整备份。
备份采用增量方式,因此只有第一次会传输全部数据,之后只会传输更改的部分。
为了连接到我们的 S3 存储桶,我们必须拥有必要的 IAM 凭证。在这种情况下,我们的服务器是一个 AWS EC2 实例,并且我们已经为其附加了 IAM 角色,因此无需将凭证保存在服务器上。
sudo webinoly -aws-s3-credentials=awsiamrole
通过此操作,我们告知 Webinoly 我们已在服务器上附加了 IAM 角色,因此无需输入凭据。
现在我们准备配置第一个备份:
sudo webinoly -backup=s3 -profile=DataBackup -bucket=america/data -source=/var/www -max-age=3M
我个人觉得最实用的功能之一是,可以在执行我们在上一步配置的备份之前,自动创建一个数据库备份。
sudo webinoly -backup=s3 -profile=DataBackup -add-db-pre=example.com -destination=/var/www/example.com/db-backup -max=10 -bucket=america/db_com
sudo webinoly -backup=s3 -profile=DataBackup -add-db-pre=example.org -subfolder=/articles -max=3
也就是说,每次运行“DataBackup”配置文件时,都会首先对上一步配置的 WordPress 网站的两个数据库进行备份。
此外,在 AWS 中可以配置 S3 存储桶的自动复制功能。 在这种情况下,我们可以将“america”存储桶复制到不同的区域,例如亚洲。
现在我们需要添加一个 Cron 作业,以便每天凌晨 3 点自动运行此备份程序。
运行 sudo crontab -e 命令并添加以下几行:
0 3 * * * sudo webinoly -backup=s3 -profile=DataBackup -run
# Extra backup for the database of both sites
0 15 * * * sudo webinoly -backup=local -wp=example.com -max=10 -bucket=america/db_com
30 15 * * * sudo webinoly -backup=local -wp=example.org -max=5
# Backup of the log fiel of the ticket system.
30 3 * * * sudo webinoly -backup=s3 -send-to-s3=/var/log/internal.log -bucket=america/internal
如果您使用的是非 root 用户,例如在 AWS 环境中,您需要在 Cron(root 用户)中运行任何备份命令之前添加该用户的路径。
0 20 * * * env HOME=/home/user sudo webinoly -backup=s3 -profile=name -run
总而言之,我们已配置以下备份:
- Daily at 3:00am
- Local backup of the database in
/var/www/example.com/db-backupof theexample.comsite and is automatically sent to S3 in the/db_comfolder. - Local backup of the database in
$HOME/webinoly-backups/example.comof theexample.orgsite. - S3 backup of the entire data directory, including backup of the
example.comdatabase for being inside this directory. - S3 backup of the tickets system log file.
- Local backup of the database in
-
Daily at 3:00pm
- Local backup of the database in
$HOME/webinoly-backups/example.comof theexample.comsite and is automatically sent to S3 in the/db_comfolder. - Local backup of the database in
$HOME/webinoly-backups/example.orgof theexample.orgsite.
- Local backup of the database in
-
每天凌晨 3:00
- 将
example.com网站的数据库本地备份到/var/www/example.com/db-backup目录,并自动发送到 S3 的/db_com目录。 - 将
example.org网站的数据库本地备份到$HOME/webinoly-backups/example.org目录。 - 将整个数据目录备份到 S3,包括
example.com数据库(因为它位于该目录中)。 - 将工单系统日志文件备份到 S3。
- 将
- 每天下午 3:00
- 将
example.com网站的数据库本地备份到$HOME/webinoly-backups/example.com目录,并自动发送到 S3 的/db_com目录。 - 将
example.org网站的数据库本地备份到$HOME/webinoly-backups/example.org目录。
- 将
正如您所见,数据库每天备份两次,对于 example.com 而言,除了原始数据之外,我们还有三个备份副本(本地、美国存储桶、亚洲存储桶)。如果这还不够,每个存储桶中还有两个数据库副本,一个位于 /data 目录,另一个位于 /db_com 目录。是不是足够了?
性能、安全性以及Nginx的其他调整
通常情况下,Webinoly 会将 NGINX FastCGI 缓存的过期时间设置为 30 天,这对于访问量非常低的网站来说是一个推荐值。
简单来说,当你第一次访问网站的某个页面时,该页面会被保存到 FastCGI 缓存中,并一直保留到缓存过期。
如果我们的网站每天只有少量访问者,而我们将缓存过期时间设置为例如“1 小时”,那么大多数访问者都会收到未缓存的页面版本,因此启用缓存也就没有任何意义了。
要修改 Webinoly 中 FastCGI 的配置和值,我们使用以下命令:
sudo webinoly -cache-valid
我们将配置缓存时间为 1 小时,非活动时间为 20 分钟,重定向时间为 10 分钟 [1 小时,20 分钟,10 分钟]。这种配置对于流量非常高的网站来说效果会很好。
我们还将修改服务器工具的访问权限。
sudo webinoly -tools-port=18915
sudo webinoly -tools-site=example.com
现在我们将使用指定的域名和端口进行访问:example.com:18915。
项目开发完成后,我们将再次修改 Nginx 的默认响应,作为一项安全措施。
sudo webinoly -default-site=blackhole
尽管我们已经安装了用于发送电子邮件的 Postfix,但我更倾向于使用外部 SMTP 服务,例如 Amazon SES、Mailgun、SendGrid 等。
sudo webinoly -smtp
我们还将修改一些 HTTP 标头。
我们将为 HSTS 设置“preload”选项,并为“Referrer”和“Content-Security-Policy”设置一些自定义值。
# Webinoly Configuration File
sudo nano /opt/webinoly/webinoly.conf
# Modify these variables
header-hsts:preload
header-referrer:origin-when-cross-origin
header-csp:default-src https: 'unsafe-eval' 'unsafe-inline'; object-src 'none'
header-permissions:floc
通配符证书
我们也可以选择为这些网站使用同一张证书:
- example.com
- example.com/members
- gps.example.com
- internal.example.com
首先,我们需要从这些网站上移除现有的证书(使用 -ssl=off 参数),并为主网站创建一个通配符证书。
sudo site example.com -ssl=on -wildcard
最后,我们将剩余的网站添加到此证书中。
sudo site gps.example.com -ssl=on -add-to-wildcard=example.com
sudo site internal.example.com -ssl=on -add-to-wildcard=example.com
Webinoly 内部API
客户最终提出了一个特殊要求:由于内部审计流程复杂,他们对服务器有严格的控制,因此需要将您服务器上创建的每个网站的信息报告给您系统的API,并在完成后显示一条消息。
使用 Webinoly 内部 API ,我们几乎可以在 Webinoly 执行过程的任何阶段添加任何操作。按照说明,我们重命名并使用文件 /opt/webinoly/lib/api-events,并添加以下代码:
api-events_catch_status() {
if [[ $1 == "si1" ]]; then
wget --timeout=10 -t 1 -qO- https://api.example.net/?createsite=true
elif [[ $1 == "sie" ]]; then
echo "All sites are reported to the example.net API in compliance with the computer systems audit."
fi
}
总结
正如我们在之前的示例中所看到的,Webinoly 的理念始终是简化管理 Nginx Web 服务器的日常任务,所有操作只需一条命令即可完成。
因此,Webinoly 已成为网络开发、DevOps 和软件工程等领域的专业人士的首选工具, 它能够帮助他们自动化和简化服务器部署流程。
如果您有任何建议、想法或意见,或者(天哪!)发现了错误,请加入我们的 社区论坛