AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / server / 问题 / 32651
Accepted
Arie K
Arie K
Asked: 2009-06-28 05:30:34 +0800 CST2009-06-28 05:30:34 +0800 CST 2009-06-28 05:30:34 +0800 CST

与许多 Web 服务器共享通用 Web 应用程序代码

  • 772

将公共 Web 应用程序代码共享给许多 Web 服务器的最佳方式是什么?

例如,我有一个目录,其中包含用 PHP 编写的 Web 应用程序。现在,我有多台机器将提供相同的内容,每台机器都运行一个网络服务器,使用 TCP/IP 平衡器进行负载平衡。

对于这种情况,我还没有尝试过 NFS。但是根据Slow NFS transfer performance of small files,传输性能会很慢,因为涉及很多[小]文件。

编辑:我想将所有文件集中存储在一个位置,因此网络服务器将立即读取对代码的更新。

php load-balancing web-server
  • 4 4 个回答
  • 1073 Views

4 个回答

  • Voted
  1. Best Answer
    Tommeh
    2009-06-28T07:20:02+08:002009-06-28T07:20:02+08:00

    我将概述几个选项,以通过 NFS 方法显示实时代码的替代方案。

    “最佳”策略取决于您选择的代码部署策略,可能是其中之一:

    • 在实时系统上编辑- 开发人员在一个中心位置更改/更新应用程序,然后实时机器获取更改(这听起来像您的场景)
    • 从源代码控制导出代码- 开发人员对源代码控制系统进行更改,然后运行程序将代码导出到负载平衡池中的所有机器(或等待机器自己执行更新)
    • 通过包系统部署的代码——开发人员对源控制系统进行更改并创建存储在存储库中的软件包(例如,通过 APT 或 YUM)。开发人员运行一个程序来强制负载平衡机器从存储库安装新软件。

    “最佳”策略还取决于应用程序的可用性要求:

    • 理论上的 100% 正常运行时间- 在进行软件更新时应用程序仍然可用(使用您建议的方法,但注意原子性问题:在更新期间,您的 PHP 应用程序可能包含新旧文件的混合)
    • 接受计划维护- 应用程序在进行软件更新时短暂脱机(无原子性问题)

    在上述选项中,我个人会选择包部署方法。但是,对于 Web 请求,通过 NFS 共享少量文件可以很好地工作:与 Internet 相比,NFS 引入的延迟很小。但在您这样做之前,请考虑以下缺点:

    • 考虑正在平衡哪些系统资源:如果您使用多台机器来平衡 CPU 使用率,那么设置可能会运行良好。但是,如果您使用多台机器来平衡 IO,那么通过 NFS(或其他方式)将其转移到一台机器上可能是不明智的。
    • 考虑文件服务器的故障:如果保存文件的机器死了,它可能会使您的整个应用程序脱机(因为网络服务器无法读取文件)。在这种情况下,网络服务器往往会锁定等待,等待 NFS 恢复。

    由于这些可能的障碍(IO 绑定文件服务器、网络服务器故障),我还建议定期将网络服务器与应用程序同步。将更改推送到多台机器应该只需要几秒钟。如果需要,您可以设置一些逻辑,例如:if (time() > 23:59:00) {使用目录 B 中的软件} else {使用目录 A 中的软件})。如果所有机器都必须运行相同的软件版本,例如,如果您刚刚更改了数据库模式,这可能很有用。

    部署期间的几秒钟延迟确实不算太糟糕。开发实时系统的开发人员肯定会注意到延迟,但是开发人员无论如何都不应该编辑实时系统。

    • 6
  2. gbjbaanb
    2009-06-28T05:42:05+08:002009-06-28T05:42:05+08:00

    如果它的内容没有改变,那么任何传输方法都可以,即使是 NFS。如果您先 tar 文件然后解压缩它们,则传输速度会非常快。

    当然,如果您需要定期传输大量小文件,那么您可能没有任何解决方案 - 您的 Web 服务器将始终与最新文件(或更糟糕的是,所需文件)过时。

    如果您确实想设置一种将文件部署到中央服务器的方法,然后让它们自动传输到其他服务器,您可以设置一个 rsync 传输到服务器,那么只有您更改的文件将被传输(如果您使用 rsync 守护进程,它将使用 rsync 的协议,并且几乎不需要任何时间,可能是几秒钟)。

    其他人使用的一个好方法是将 web 文件存储在版本控制系统中,然后使用它将文件导出到其他服务器,然后您只需更新文件,vcs 就会用新版本替换更改的文件。

    顺便说一句,NFS 对小文件不太好,但除此之外,没有什么好说的了。问题更多是关于网络延迟而不是其他任何事情。这仍然不应该让你停止使用它,除非你有一堆文件要传输,否则使用它不会太慢。您可以尝试使用 cifs 传输而不是 nfs,我为我的 Windows 服务器这样做,因为在那里我获得了更好的大文件性能。

    • 1
  3. Martijn Heemels
    2009-06-28T07:31:47+08:002009-06-28T07:31:47+08:00

    Arie,我的 webdev 公司拥有大量由我们的网站共享的库。这些站点在不同数据中心的少数生产服务器上运行。

    由于服务器位于不同的数据中心,我们无法从一个集中的低延迟位置为库提供服务。相反,我们使用 Webistrano(出色的 Capistrano 部署工具的 GUI)直接从我们的 SVN 存储库将库部署到所有服务器。Capistrano 同时部署到所有服务器,只有在所有服务器成功部署后,它才会切换符号链接以指向新的部署目录。否则,它会在所有服务器上回滚。

    换句话说,几乎在同一秒或根本不执行更新在所有服务器上执行。事务性或原子性或任何您想称呼它的东西。

    我们在部署脚本结束时的最后一项任务是优雅地重新启动 Apache,以刷新所有存储了先前路径的 PHP 缓存(real_path、Zend Framework 等)。

    它工作得很好,非常安全,而且由于所有文件都本地存储在每台服务器上,因此延迟非常低。这也很容易;只需单击 Webistrano 中的部署。

    • 1
  4. ae.
    2009-06-30T19:40:29+08:002009-06-30T19:40:29+08:00

    你可以看看 sshfs。基本上,您将拥有一个中央位置,其他服务器将其安装为本地文件夹。

    例如(将服务器挂载为目录)。

    sshfs server.with.content:/home/arie/local_folder
    

    现在您可以像访问本地文件夹一样访问其他服务器。另一个优点是数据传输是加密的。

    谷歌 sshfs 和 fuse。

    • 1

相关问题

  • 什么是最有效的 Windows 负载平衡解决方案?

  • 使用 IIS7 请求路由和负载平衡模块进行负载平衡

  • 软件http负载均衡器?

  • mod_rewrite 不转发 GET 参数

  • 更改 PHP 的默认配置设置?

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    SFTP 使用什么端口?

    • 6 个回答
  • Marko Smith

    从 IP 地址解析主机名

    • 8 个回答
  • Marko Smith

    如何按大小对 du -h 输出进行排序

    • 30 个回答
  • Marko Smith

    命令行列出 Windows Active Directory 组中的用户?

    • 9 个回答
  • Marko Smith

    Windows 中执行反向 DNS 查找的命令行实用程序是什么?

    • 14 个回答
  • Marko Smith

    如何检查 Windows 机器上的端口是否被阻塞?

    • 4 个回答
  • Marko Smith

    我应该打开哪个端口以允许远程桌面?

    • 9 个回答
  • Marko Smith

    什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同?

    • 3 个回答
  • Marko Smith

    如何确定bash变量是否为空?

    • 15 个回答
  • Martin Hope
    MikeN 在 Nginx 中,如何在维护子域的同时将所有 http 请求重写为 https? 2009-09-22 06:04:43 +0800 CST
  • Martin Hope
    Tom Feiner 如何按大小对 du -h 输出进行排序 2009-02-26 05:42:42 +0800 CST
  • Martin Hope
    0x89 bash中的双方括号和单方括号有什么区别? 2009-08-10 13:11:51 +0800 CST
  • Martin Hope
    kch 如何更改我的私钥密码? 2009-08-06 21:37:57 +0800 CST
  • Martin Hope
    Kyle Brandt IPv4 子网如何工作? 2009-08-05 06:05:31 +0800 CST
  • Martin Hope
    Noah Goodrich 什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同? 2009-05-19 18:24:42 +0800 CST
  • Martin Hope
    Brent 如何确定bash变量是否为空? 2009-05-13 09:54:48 +0800 CST
  • Martin Hope
    cletus 您如何找到在 Windows 中打开文件的进程? 2009-05-01 16:47:16 +0800 CST

热门标签

linux nginx windows networking ubuntu domain-name-system amazon-web-services active-directory apache-2.4 ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve