Month: 3月 2019

共享APC或OPcache:为什么多个PHP-FPM主机更好

前面我们说了,设置多个php-fpm进程池来分离网站。今天来聊聊多PHP-FPM主机。

您可能不知道APC或OPcache实际上是由PHP中的主进程持有的。APC的任何配置都需要来自.INI配置,以后不能通过ini_set()php_admin_value覆盖这是因为生成的PHP-FPM进程对APC缓存的大小或配置没有影响,因为它由主进程启动和管理。

这本质上意味着APC / OPcache缓存在所有PHP-FPM池之间共享。如果您只有一个网站可供服务,那就没问题了。如果您通过PHP-FPM在同一台服务器上有几十个站点,您应该知道它们都共享相同的APC / OPcache缓存。然后,APC或OPcache大小应该足够大,以保存所有站点的操作码缓存。

为避免这种情况,每个PHP-FPM池也可以单独启动并拥有自己的主进程。这意味着每个站点都可以拥有自己的APC或OPcache,并且可以独立于所有其他PHP-FPM池启动/停止。当需要激活新配置时,一个池配置的更改不会导致重新加载所有其他FPM池,这是“/etc/init.d/php-fpm reload”的默认行为(它将重新加载所有池)。…

        

解决PHP的一个长期存在的通过Opcache泄漏敏感数据的问题。

PHP中有一个非常古老的安全漏洞,它涉及在单个主进程共享多个PHP-FPM池的环境中处理OPCache的方式。这是现在运行PHP的最常见方式,也可能会对您产生影响。

漏洞

PHP有一种加速其解释器动态特性的方法,称为字节码缓存。PHP在每个页面加载中进行解释,这意味着PHP被转换为服务器理解并可以执行的字节码。由于大多数PHP页面不会每秒都更改,因此PHP会将该字节码缓存在内存中,并将其作为响应提供,而不必 每次都编译(“ 解释 ”)PHP脚本。…

        

为PHP-FPM和nginx设置多个进程池而安全地运行多个网站

为PHP-FPM和nginx设置多个进程池而安全地运行多个网站

在本文中,我们将向您展示在不同Linux用户的LEMP上运行站点的安全性和隔离性优势。这将通过为每个nginx服务器块(站点或虚拟主机)创建不同的php-fpm进程池来完成。

设置安全LEMP的原因

在常见的LEMP设置下,只有一个php-fpm进程池为同一用户下的所有站点运行所有PHP脚本。这带来两个主要问题:

  • 如果一个nginx服务器块上的Web应用程序(即子域或单独的站点)受到攻击,此服务器上的所有站点也将受到影响。攻击者能够读取其他站点的配置文件,包括数据库详细信息,甚至可以更改其文件。
  • 如果您想让用户访问服务器上的站点,您几乎可以访问所有站点。例如,您的开发人员需要处理开发环境。但是,即使拥有非常严格的文件权限,您仍然可以在相同的服务器上访问所有站点,包括您的主站点。
                

nginx不同站点的php-fpm的PHP_ADMIN_VALUE值会覆盖其它站点值的问题!

让我们看看这两个Nginx配置:

server {
    listen         80;
    server_name    example.com;
    location / {
        fastcgi_pass 127.0.0.1:9000;
        fastcgi_param SCRIPT_FILENAME  /var/www/html/site1/i.php;
        fastcgi_param PHP_ADMIN_VALUE "open_basedir=$document_root:/var/www/html/site1:/tmp/:/proc/"; #禁止跨目录访问 
        include fastcgi_params;
    }
}
server { 
    listen         80;
    server_name    example.net;
    location / {
        fastcgi_pass 127.0.0.1:9000;
        fastcgi_param SCRIPT_FILENAME  /var/www/html/site2/i.php;
        include fastcgi_params;
    }
            

MySQL索引失效的几种情况

1.索引不存储null值

更准确的说,单列索引不存储null值,复合索引不存储全为null的值。索引不能存储Null,所以对这列采用is null条件时,因为索引上根本

没Null值,不能利用到索引,只能全表扫描。

为什么索引列不能存Null值?

将索引列值进行建树,其中必然涉及到诸多的比较操作。Null值的特殊性就在于参与的运算大多取值为null。

这样的话,null值实际上是不能参与进建索引的过程。也就是说,null值不会像其他取值一样出现在索引树的叶子节点上。…

    

WebSocket协议 8 问

WebSocket协议 8 问

WebSocket是一种比较新的协议,它是伴随着html5规范而生的,虽然还比较年轻,但大多主流浏览器都已经支持。它使用方面、应用广泛,已经渗透到前后端开发的各种场景中。

对http一问一答中二式流程的不满,催生了支持双向通信的WebSocket诞生。WebSocket是个不太干净协议。

一、WebSocket协议只能浏览器发起么?

不是。目前此协议的受众的也不仅仅是web开发者。

WebSocket只是一种协议,它和http协议一样,使用类似okhttp的组件,可以在任何地方进行调用,甚至可以借助WebSocket实现RPC框架。

二、WebSocket和HTTP什么关系?

WebSocket和http一样,都是处于OSI模型中的最高层:应用层

WebSocket借助http协议进行握手,握手成功后,就会变身为TCP通道,从此与http不再相见。使用netstat或者ss,能够看到对应的连接,它与处于抽象层的socket,在外观上没有区别。

三、WebSocket和长轮询有什么区别?

长轮询,就是客户端发送一个请求,服务端将一直在这个连接上等待(当然有一个超长的超时时间),直到有数据才返回,它依然是一个一问一答的模式。比如著名的comted。

WebSocket在握手成功后,就是全双工的TCP通道,数据可以主动从服务端发送到客户端,处于链接两端的应用没有任何区别。

WebSocket创建的连接和Http的长连接是不一样的。由于Http长连接底层依然是Http协议,所以它还是一问一答,只是Hold住了一条命长点的连接而已。

长轮询和Http长连接是阻塞的I/O,但WebSocket可以是非阻塞的(具体是多路复用)。

四、如何创建一个连接?

WebSocket的连接创建是借助Http协议进行的。这样设计主要是考虑兼容性,在浏览器中就可以很方便的发起请求,看起来比较具有迷惑性。

        

互联网架构实践心得:屡试不爽的架构三马车

这里所说的三架马车是指微服务消息队列定时任务。如下图所示,这里是一个三驾马车共同驱动的一个立体的互联网项目的架构。不管项目是大是小,这个架构模板的形态一旦定型了之后就不太会变,区别只是我们有更多的服务有更复杂的调用,更复杂的消息流转,更多的Job,整个架构整体是可扩展的,而且不会变形,这个架构可以在很长的一段时间内无需有大的调整。…

网站应用扩展图说教程

本指南总结了扩展的基本原则-从单个服务器到能够为数百万用户提供服务的 web 应用。它针对的是在技术领域工作的新手和非开发人员--因此, 如果您刚刚部署了您的multi-cloud-terraform-vpn-setup, 则此设置不适合您。

不过, 对其他人来说: 让我们开始吧!

扩展是什么?

你刚刚建完你的网站、网上商店、社交网络或任何你正在做的事情, 把它放到网上, 事情非常顺利: 每天都有几百名访客访问你的网站, 请求得到了快速的响应, 订单得到了快速的处理,一切都很好。

你成功了!

越来越多的用户涌入, 几千, 几万, 每小时,分钟, 秒钟...这对于你的业务来说是好消息,但对你的基础设施是坏消息;因为现在, 它需要扩展。这意味着它需要能够:

同时为更多的客户提供服务
始终可用, 没有停机时间
为全球用户提供服务…