首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >共享文件系统上的PHP文件系统

共享文件系统上的PHP文件系统
EN

Code Review用户
提问于 2021-04-12 20:15:35
回答 1查看 60关注 0票数 2

我有一个项目,我们需要从on解决方案迁移到AWS云。目前,该软件运行在一个实例上。它运行良好,但业务部门希望该软件具有高可用性(HA)。作为HA的一部分,程序将安装在共享文件系统(AWS )上,并将文件系统挂载到多个EC2实例上,以便所有实例访问相同的配置。

我面临的挑战是

代码语言:javascript
复制
PHP_ETC_BASE=/etc/php/7.0
PHP_INI=${PHP_ETC_BASE}/apache2/php.ini

我可以在所有AWS EC2实例(PHP_ETC_BASE)上安装PHP_INI,但是PHP_INI需要在共享文件系统上,以便其他实例可以访问配置。我读到的是,我不能将/etc/ PHP /7.0移动到共享的文件系统,那么PHP就不能工作了。

代码语言:javascript
复制
  installDepsPhp70 () {
  debug "Installing PHP 7.0 dependencies"
  PHP_ETC_BASE=/etc/php/7.0
  PHP_INI=${PHP_ETC_BASE}/apache2/php.ini
  checkAptLock
  sudo apt install -qy \
  libapache2-mod-php \
  php php-cli \
  php-dev \
  php-json php-xml php-mysql php-opcache php-readline php-mbstring php-zip \
  php-redis php-gnupg \
  php-gd

  for key in upload_max_filesize post_max_size max_execution_time max_input_time memory_limit
  do
      sudo sed -i "s/^\($key\).*/\1 = $(eval echo {$key})/" $PHP_INI
  done
  sudo sed -i "s/^\(session.sid_length\).*/\1 = $(eval echo #qcStackCode#{session0sid_length})/" $PHP_INI
  sudo sed -i "s/^\(session.use_strict_mode\).*/\1 = $(eval echo \${session0use_strict_mode})/" $PHP_INI
}

/var/lib/mysql的类似问题

代码语言:javascript
复制
prepareDB () {
  if sudo test ! -e "/var/lib/mysql/mysql/"; then
    #Make sure initial tables are created in MySQL
    debug "Install mysql tables"
    sudo mysql_install_db --user=mysql --basedir=/usr --datadir=/var/lib/mysql
    sudo service mysql start
  fi

  if sudo test ! -e "/var/lib/mysql/misp/"; then
    debug "Start mysql"
    sudo service mysql start
EN

回答 1

Code Review用户

回答已采纳

发布于 2021-04-20 05:17:09

将您的系统分为三个部分:

  • 核心操作系统(ec2上的所有文件)
  • 您的应用程序(我会将核心应用程序文件保存在ec2上--原因如下--但您的方式会奏效)
  • 数据(我将只拥有EFS的“数据”)

Answer第1部分: php.ini使用操作系统。

原因:

  • 梅杰:如果你想在没有停机的情况下升级到一个新的EC2s,你可以用新的操作系统创建新的php.ini,并将它们交换到你的电子邮件库:这不能像你提议的那样使用共享的php.ini。
  • 中介:对php.ini的更改不会立即生效,您可能需要启动http/fcgi才能获得支持--您仍然需要访问每台服务器才能重新启动。

Answer第2部分:实际的应用程序文件也存在于ec2上,而且只有EFS上的数据。

原因:

  • 主要内容:与上面类似,您可以通过使用新代码交换服务器来一次更新一次。
  • 中介:安全性;创建应用程序实例和“锁定”文件比依赖可能错误地连接到另一个EC2上的文件更安全。
  • 测试:您可以将EC2s附加到不同的数据存储区/不同的ELB,以便在连接到现场之前进行测试。
  • 中介:如果您的EFS失败(发生了!)您的应用程序仍然可以回复并说“对不起-请稍后再来”。
  • 介质:你想让EC2在不同的AZs上跑得更快
  • 小调:如果他们共享相同的AZ,速度会稍微快一些。
  • 缺点:更新应用程序会带来更大的痛苦,但您也可以编写脚本。

如何:

好消息是你已经把剧本写好了。将部署划分为稍小的阶段:

( a)创建您的BaseAMI (包括上面脚本中的操作系统、PHP )。这只有在你做一个主要的操作系统更新时才会改变。

( b)使用您的BaseAMI,您可以创建一个将应用程序放在顶部的GoldenAMI。(此时运行较小的OS更新以维护安全,如果您的Base较早)。对于所有的EC2s,这个金色的AMI几乎是相同的

c)使用自动缩放组( ASG ),使用GoldenAMI作为基础,并在需要时使用ASG的用户数据属性进行调整。

当您发布新代码时,启动阶段(b)并创建新的GoldenAMI,并将其用于ASG。杀死旧的服务器和新的服务器神奇地出现=没有停机。

如果您确实需要更新php.ini (这将是非常罕见的),那么在第(a)阶段重新启动以构建BaseAMI,然后在同一时间在一个阶段中启动黄金AMI和交换服务器。

要在更新时“欺骗”(快捷方式),将应用程序代码部署到S3,让每个EC2检查S3 (或者更新发生时通过SNS通知),它可以删除代码和自更新。但是,如果这样做,请确保您的安全性是非常严格的(就像将应用程序代码放在EFS上一样)。

关于MySql,

  • 您不能这样分享,因为文件需要独占打开;
  • 在单个磁盘上使用数据不是"HA";
  • 在EFS上运行数据很慢。

使用AWS提供的RDS解决方案,您可以添加冗余到您的心脏的内容(多个AZs,故障转移,备份)。可能要多花点钱,但医管局会的。

票数 1
EN
页面原文内容由Code Review提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://codereview.stackexchange.com/questions/259430

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档