繁体   English   中英

运行php作为没有Apache的服务器

[英]run php as server without Apache

目前我正在使用PHP编程,我发现只能通过使用PHP CL加载网页,所以我不明白为什么我们必须安装其他服务器,如Apache或Nginx。

php.exe服务器

我不知道为什么你的问题被否决了。 我认为这是一个关注一个稍微宽泛但高度相关的问题的问题:为什么我们要特别小心地只让特定的软件进入面向公众的基础设施? 而且,更一般地说,什么样的软件可以放在面向公众的基础设施上? 其必然结果是,良好的服务器软件是什么样的?

首先,没有安全软件这样的东西。 这意味着您应始终对打开计算机上的单个端口以启用网络连接(在任一方向上)的任何内容持怀疑态度。 然而,有一小部分软件已经有足够的眼球来保证一定的最低水平的保证,事情可能不会出现可怕的错误。 Apache是​​目前经过时间考验最多的服务器,就现代网络服务器而言,Nginx紧随其后。 对于面向公众的系统而言,内置的PHP HTTP服务器不是一个好的选择,更不用说测试生产软件,因为它缺乏良好的网络服务器设计质量,并且可能存在未被发现的安全漏洞。 出于这些原因和其他原因,开发人员不得使用内置PHP服务器的警告。 它被添加是因为用户一直在要求它,但这并不意味着它应该被使用。

不信任由不知道自己在做什么的人编写的网络服务器也是一个好主意。 我经常看到用Node或Go编写的构思错误的网络服务器,通常是基于WebSocket的解决方案,或者只是用于解决另一个软件的某些问题,即使作者不打算在基础架构中隐含地打开安全漏洞这样做。 仅仅因为某人可以做某事并不意味着他们应该这样做,而且在编写网络服务器时,他们不应该这样做。 这些服务器经常在Apache或Nginx后面代理,这可以防御标准攻击。 但是,一旦攻击者超越了Apache或Nginx的防御,软件就可以提供自己的防御,遗憾的是,几乎总是缺乏这种防御。 因此,每当我看到在主机上运行代理服务时,我就会为自己不可避免的安全灾难做好准备 - Ruby,Node和Go开发人员是最大的冒犯者。 开发人员决定编写网络服务器的那一刻是他们可能选择错误策略的那一刻,除非他们有非常具体的理由这样做并且必须意识到并准备好抵御各种各样的攻击场景。 在完成编写网络服务器(可扩展或其他)的极其困难的任务之前,开发人员需要精通各种各样的学科。 根据我的经验,很少有开发人员实际上能够执行该任务,而不会在他们自己或用户的基础架构中引入重大安全漏洞。 虽然PHP核心开发人员通常知道他们在其他地方做了什么,但我个人在他们的核心网络逻辑中发现了几个关键错误,这表明他们在该部门中缺乏共同点。 因此,如果有的话,应该谨慎使用他们的内置Web服务器。

除了安全性之外,Apache和Nginx旨在处理“加载”,而不是内置的PHP服务器。 什么负载意味着问题的答案,“每秒可以提供多少请求?” 答案实际上非常复杂。 根据代码复杂性,托管内容,正在使用的硬件以及在任何时间点运行的内容,单个主机可以处理每秒20到20,000个请求,并且该数量可能随时变化很大。 Apache附带了一个名为Apache Bench(ab)的工具,可用于对Web服务器的性能进行基准测试。 但是,基准测试应该始终坚持不懈,并从“我们能否让这个应用程序更快?”的角度来看待。 而不是“我的应用程序比你的更快”。

至于在PHP中开发软件(因为SO是编程问题站点),我建议尽可能地尝试镜像您的生产环境。 如果Apache将远程运行,那么在本地运行Apache可以提供真实的最佳模拟,这样就不会有一堆最后的惊喜。 在Apache模块下运行的PHP代码可能与在内置PHP服务器下运行的PHP代码有明显不同的行为(例如$ _SERVER差异)!

如果你像我一样,不喜欢设置Apache和PHP而且不需要Apache一直运行,我维护了一组脚本来设置Apache,PHP和Maria DB的可移植版本(大致相当于MySQL) )对于这里的Windows:

https://github.com/cubiclesoft/portable-apache-maria-db-php-for-windows/

如果您的软件应用程序实际上是要使用内置的PHP服务器(例如,仅限本地主机服务器)运行,那么我强烈建议您引入一个缓冲层,例如CubicleSoft WebServer类:

https://github.com/cubiclesoft/ultimate-web-scraper/

通过使用像这样的PHP用户空间类,您可以获得内置PHP服务器无法提供的某些保证,同时仍然是纯PHP解决方案(即没有额外的依赖关系):服务器是否更少,如果有的话,缓冲区溢出机会通过Zend引擎解释,导致更少的恶意代码执行机会,并且具有比内置服务器更多的功能,包括服务器请求/响应周期本身的完全自定义。 PHP本身可以通过使用类似于Service Manager的工具在操作系统启动期间启动此类服务器:

https://github.com/cubiclesoft/service-manager/

当然,这意味着用户必须信任应用程序的代码,该代码打开了在其计算机上运行的端口。 例如,如果网站通过用户的Web浏览器启动端口扫描localhost端口会发生什么? 而且,如果他们确实找到了运行您的软件的端口,那么该网站是否可以开始删除文件或运行安装恶意软件的代码? 这是不寻常的攻击,真的会让你失望。 具有“断开网络电缆/禁用WiFi”策略的“零开放端口”是真正保护设备的唯一已知方式。 每个开放端口和已建立的连接都存在风险

良好的网络软件将经过严格的测试和强化,可以抵御各种攻击。 编写此类软件是一项责任,需要花费大量时间才能做到正确,并且通常会显示它是否出错。 PHP的内置服务器感觉很草率,缺乏基本的配置选项。 我不能推荐它用于任何合理的目的。

如果您参考PHP文档:

警告

此Web服务器旨在帮助应用程序开发。 它也可用于测试目的或在受控环境中运行的应用程序演示。 它不是一个功能齐全的Web服务器。 它不应该在公共网络上使用。

http://php.net/manual/en/features.commandline.webserver.php

所以是的,正如它所说,这是一个用于测试目的的好工具。 您可以快速启动服务器并在浏览器中测试脚本。 但这并不意味着它提供了生产级服务器(如apache或Nginx :)的所有功能。

您可以在本地开发环境中使用内置服务器。 但是,您应该在生产环境中使用更安全,功能丰富的Web服务器,这需要更多安全性,处理大量请求等功能。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM