尝试使用 PHP 构建水平分布式集群的 CF Runtime 结果报告
Apache httpd + PHP + php-fpm + redis + MySQL的水平分散集群对于Web行业和游戏行业的服务器端工程师来说是一个非常常见的架构,在Bluemix的CloudFoundry容器中进行了验证(仅限于备忘录)。这是前一篇关于在Bluemix CF容器中连接PHP和DBaaS MySQL并运行应用程序的续集。不幸的是,在Bluemix上,这种架构被发现是反模式,也就是说,这是一种不应该采用的设计。虽然我们验证了一些对策,但由于Bluemix的负载均衡器(gorouter)已经实现了会话亲和功能,所以存储似乎并不是必需的。
追求的结构

然后,我们将使用MySQL来操作RDBMS。Compose的Redis是由两个节点(12)组成的,而MySQL是由三个节点(13)组成的。

PHP ビルドパックは、Bluemix CFコンテナのPHP と DBaaS MySQLを繋いでアプリを動かしてみた の記事で利用した CloudFoundry をベースにしたカスタム・ビルドパックを利用します。 複数のPHP ビルドパックとロードバランサーの設定は、次のスクリーン・コピーの様に、インスタンス数を表すアイコンの + マークをクリックするだけで、処理能力を増強できます。 それぞれのインスタンスへ要求を分配するロードバランサー (gorouter) は、Bluemixに組み込まれており、追加の費用は発生しません。

Bluemix組み込みのロードバランサー (gorouter)は、応答でJSESSIONID Cookieを返すようにアプリを設定することで、常に同じCFランタイムへ要求を転送するセッション・アフィニティを提供します。(2) このため、セッション・ストアを設定しなくても、複数のウェブページ間でセッションを継続する事ができます。 セッション・ストアが無い場合、CFランタイムがクラッシュすると、他のCFランタイムと共有されていないために、セッション情報を失ってしまいます。 この課題に対応するために、Redis を設定します。
样本应用程序的设置
这个示例应用程序可以通过以下设置运行,在GitHub的 https://github.com/takara9/php_sample_apl/tree/store-redis 存放。另外,如何运行该应用的步骤已经在README.md文件中写出,你可以按照实际执行并确认。
$ git clone -b store-redis https://github.com/takara9/php_sample_apl
请参考此存储库中不使用共享会话存储的版本、CleaDB版本和PostgreSQL版本的分支。
与MySQL的连接
请参考PHP运行时(容器)连接到MySQL服务器的方法,通过连接Bluemix CF容器的PHP和DBaaS MySQL运行应用程序来实施。在这个测试应用中,我们使用了PHP7 PDO来通过加密通信连接到MySQL。(14)此外,您可以很容易地参考有关PHP和MySQL协作的资料,包括PHP手册。(15)~(19)
Redis连接(会话存储)
在设置PHP的会话存储方法时,有以下两种方法。在正式运行时,当然选择第一种方法,但是第二种方法在试验时非常方便。
-
- php.ini に設定する方法
- phpスクリプトから一時的に変更する方法
如何设置php.ini的方法
以下的两个设置将应用到构建包的 https://github.com/cloudfoundry/php-buildpack/defaults/config/php/7.1.x/php.ini 文件中。当然,由于无法修改CloudFoundry的构建包,您需要从该版本中进行分支,然后在自己的存储库中进行更改。
session.save_handler = redis
请将以下内容改写成中文: 在这里,如果您将redis用户密码注册到公共的GitHub上,则会被公开,因此需要将其注册为私有。
session.save_path = "tcp://sl-us-south-1-portal.5.dblayer.com:18638?auth=****************"
从php脚本中临时修改的方法
请在示例应用程序中参考最后两行。您可以使用 ini_set 来覆盖 php.ini 的内容。
ini_set('session.save_handler', 'redis');
ini_set('session.save_path','tcp://sl-us-south-1-portal.5.dblayer.com:18638?auth=****************');
PHP手册SessionHandler类的网址是http://php.net/manual/zh/class.sessionhandler.php。
安全问题

这一点也在Compose的Redis手册中有所提及。(3)
セキュリティに関する注意
デフォルトでは、Redisへのすべての接続は暗号化されていません。 これは、Redisのセキュリティページを引用するためです。
Redisは、信頼できる環境内の信頼できるクライアントによってアクセスされるように設計されています。 これは、通常、Redisインスタンスを直接インターネットに公開することや、信頼できないクライアントがRedis TCPポートまたはUNIXソケットに直接アクセスできる環境に直接公開することをお勧めしません。
Composeでは、暗号化されていないインターネットにRedisの展開を公開できますが、IPアドレスをホワイトリストに登録して公開を制限するか、サーバーと他のシステムとの間のトラフィックを暗号化するSSHトンネルを使用するオプションを利用できます Redisデータベース。 デフォルトでは、システムには暗号化されていないTCPポータルが設定されているので、接続を開始し、ホワイトリストを使ってアクセスを制御する方法を説明します。
Redis SSHトンネルでRedis for SSHトンネルを設定する方法について読むことができます。(4)
在当前的Compose控制台上,您可以通过设置来启用Redis的SSH隧道。但是,目前(截至2017年7月),Compose控制台正在积极与Bluemix进行集成,因此尚未提供从Bluemix订购的启用Redis SSH的界面。
由于当前在连接Redis时以明文(明文)流传密码,所以我认为在Bluemix CF运行时中使用Redis作为会话存储是不适当的。然而,即使要流传到互联网上,由于存在严格的物理安全性得到保证的Bluemix PaaS存在于Bluemix 基础架构(旧SoftLayer),可以说几乎没有可能性将窃取数据包。由于这个可能性的问题以及适当的对策是否已经采取的问题是不同的,所以我认为不能说它是适当的。
解决 Redis 安全问题的解决方案(提案)
如果能够对PHP的会话存储中的数据进行加密,那么进行加密通信后风险将得到缓解。我觉得放弃有点可惜,所以考虑了一些对策。PHP具有覆盖会话存储访问的功能(5)。该功能的手册中附有使用AES-256加密写入存储并解密读取的示例代码。因此,我将其嵌入示例应用并进行了测试。
以下屏幕截图显示的是在前述用户ID和密码确认的同一区间内的数据。通过AES-256加密,无法了解其内容。

主要的程序追加部分是位于GitHub https://github.com/takara9/php_sample_apl/blob/master/htdocs/store_encrypter.php的代码。通过在下面代码的最后一行,在调用session_start()之前,连接到redis并在调用session_set_save_handler()之后,扩展具有加密功能的会话处理程序,可以实现相应的功能。
79
80 ini_set('session.save_handler', 'redis');
81 ini_set('session.save_path','tcp://sl-us-south-1-portal.5.dblayer.com:18638?auth=EYZQOJCWBKCZCGIU');
82
83
84 $key = 'secret_string';
85 $handler = new EncryptedSessionHandler($key);
86 session_set_save_handler($handler, true);
87
88 session_start();
总结
Bluemix的负载均衡器(gorouter)具有跟踪JSESSIONID cookie以实现会话亲缘性的功能。即使有多个实例在运行,登录时建立的会话将始终传输到同一实例,因此应用程序可以正常运行,而不需要共享存储,除非实例重新启动或发生其他事件。
如果将Redis作为会话存储,那么应用程序和Redis之间的通信不会进行加密,因此不能直接使用。因此,可以通过在PHP会话处理程序中添加加密功能来确保会话对象的保密性。换句话说,可以通过对写入数据进行加密,而不是对通信进行加密,来保证与通信加密相当的保密性。然而,由于连接到Redis服务器时密码不受保护,因此认为应该避免使用此配置。
这次通过实际实施级别的实验和资料调查,我得出了一个真正能实现的结论。Bluemix(Cloudant)和PHP应用程序之间的互动性很高,因此我希望进一步加强融合。
概述1 构建Mac上的PHP执行环境
PHPのコードを書いて、動作を確認する環境としては、Bluemixのエディタを利用するよりも、Macを開発環境として利用するのが、やはり便利です。 MacOSには、最初からApache httpd と PHP がインストールされているので、これらを有効に使う様にします。または、Vagrant と Virtual Box 上の仮装サーバーに環境を作っても良いと思います。(20)〜(23)
第二则杂感
在互联网上搜索并调查资料时,我找到了NTT通信的Cloud’n资料。根据使用CloudFoundry的方法,我可以看到它关注开发语言如PHP、Ruby和Java。
请参考一下资料。
Can you provide more context or specific information about the phrase “参考资料” so that I can provide a more accurate paraphrase?
(1) 用Bluemix CF容器连接PHP和DBaaS MySQL来运行应用程序
(2) Cloud Foundry文档会话关联性
(3) Compose文档关于安全性的注意事项
(4) Compose文档Redis SSH隧道
(5) PHP手册SessionHandler类
(6) 将PHP会话保存到PhpRedis
(7) 在Ubuntu上使用PHP7使用phpredis
(8) Php的会话存储设置为redis
(9) DigitalOcean如何在Ubuntu 16.04上设置Redis服务器作为PHP的会话处理程序
(10) 使用Redis + phpredis扩展来管理PHP会话
(11) PHP文档会话处理
(12) Compose配置
(13) Compose MySQL耐用性
(14) 我尝试连接Bluemix CF容器中的PHP和DBaaS MySQL来运行应用程序。
(15) PHP文档MySQL驱动程序和插件。
(16) PHP文档MySQL的PHP驱动程序概述,选择哪个API使用。
(17) PHP【保存版!!】从PHP连接MySQL的方法等【数据库】。
(18) w3schools.com PHP连接到MySQL。
(19) PONK软件 使用PHP连接MySQL- PHP入门。
(20) 在Mac上启用Apache+PHP。
(21) 在Mac上启动本地服务器的方法。
(22) 在Apache2.4上出现“由服务器配置拒绝客户端”的错误。
(23) 在Mac上安装Redis。
(24) Cloud’n 手册。