你可以依靠Nginx作为你唯一的PHP / MySQL的networking服务器

你可以依靠Nginx作为你唯一的networking服务器。 就性能而言,我知道它运行良好,但是它在安全性方面又如何呢? 我知道Apache是​​稳定的,有ModSecurity。 Nginx不是这种情况。

我将使用Nginx作为唯一的Web服务器,并且仅用于dynamic内容。 我的所有静态内容都由CDN提供。

nginx通过“反向代理”将dynamic内容运行到fastcgi服务器。 大多数发行版中的php-cgi软件包包括fast-cgi模式,其中php将启动一个小型fcgi服务器,您也可以连接nginx。

这种分离可以让你做出聪明的事情:

  1. 大多数dynamic语言(php,perl,ruby,python)都可以运行fcgi应用程序
  2. 您可以将dynamic内容作为不同的帐户运行。 或者,即使在chrootedpath下。 在一个VPS上,我pipe理几个朋友,每个用户都有自己的FCGI服务器运行自己的账户。 如果他们的软件被压缩,攻击者只能得到那个用户帐户。
  3. 它鼓励大多数应用程序轻松实现横向扩展。 在任何给定的服务器上,nginx都可以处理比静态负载更多的静态负载。 您可以将多个主机添加到nginx上的上游部分,并根据需要继续添加后端(但是,扩展数据库+文件系统是由您决定的)
  4. 使用一个上游部分的多个端口和一个主机,允许你重新启动wep应用程序而不会导致任何停机:(1)在另一个端口启动php-fcgi(2)停止原始端口上的php-fcgi。 nginx将自动将请求从一个端口redirect到另一个端口
  5. 更好的内存利用率 使用Apache / Mod_Security / Mod_php,每个apache进程都将所有这些模块加载到内存中。 虽然在进程之间共享一些写入时复制内存,但是一旦每个进程改变一个页面,该内存页面就被复制。 通过分离这些任务,nginx可以使用相当小的内存空间,您可以设置一个专用的Web应用程序防火墙(ips / ids设备,专用的反向代理服务器),并且可以独立pipe理您的php应用程序的内存策略。

更新:每个评论下面,这里有一些链接:

fastcgi_pass param – 这是如何指示nginx将请求传递给fastcgi服务器。 FastCGI通过传递variables(有意识地看起来像CGI环境variables)来工作,但是允许你将任意数据从前端传递到后端。 在debian发行版(以及iirc的源代码发行版)中,还有一个fastcgi.conf文件,其中包含所有缺省参数,大多数工具包需要离开地面

上游模块 – 上游模块允许您定义多个上游服务器,可以是其他Web服务器,fastcgi服务器,或不是。 fastcgi_pass模块包含一个使用上游的简短示例。 请注意,在单主机系统上,您甚至可以使用unix域套接字,并且不会产生TCP / IP开销!

PHPFCGI示例 – 这概括了一个完整的示例configuration。 我个人很喜欢daemontools(或者runit,如果你不是djb的粉丝),并且已经编写了非常简单的包装来运行php-fcgi在进程监督下(如果exception终止,将会重启),但是在该页面上提供的脚本是一个可以在/etc/init.d/中折腾的SysV风格的脚本,并在/etc/rcX.d/中添加相应的链接。 在该页面的脚本中,可以调整一些variables来调整运行fcgi应用程序的环境。

虚拟主机是与“服务器”部分促进:

server { server_name www.host.com host.com other_aliases; ... } server { server_name www.host2.com host2.com other_aliases; ... } 

有关更多详细信息,请参阅server_name部分,该页面的其余部分包含大量关于如何configurationcorehttp模块的信息。

在安全方面,Igor(首席开发人员)认真对待安全问题,经常参与他们非常活跃的邮件列表。 这里列出了已知的安全问题 ,下面是他们的邮件列表存档列表

我运行nginx与php-fcgi在高负载的服务器上,它的工作完全令人惊叹。

安全是你自己创造的东西。 总是。 请不要错误地依靠一些软件,当涉及到真正的问题时,会神奇地保护你。 它不会。 好的编码和pipe理将会。

我以为Nginx只能提供静态内容吗? 这使得php成为“不可能完成的任务”