你能依靠 Nginx 作为你唯一的 php/mysql 网络服务器吗?

Sai*_*han 7 mysql php nginx web-server

你能依靠 Nginx 作为你唯一的网络服务器吗?我知道在性能方面它运行良好,但它在安全性方面表现如何。我知道 Apache 很稳定并且有 ModSecurity。这不是 Nginx 的情况。

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

Jas*_*son 11

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

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

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

更新:根据下面的评论,这里有一些链接:

fastcgi_pass 参数- 这是您指示 nginx 将请求传递给 fastcgi 服务器的方式。FastCGI 通过传递变量(故意看起来像 CGI 环境变量)来工作,但允许您从前端向后端传递任意数据。在 debian 发行版(以及源代码发行版中的 iirc)中,有一个 fastcgi.conf 文件,其中包含大多数工具包启动所需的所有默认参数

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

PHPFCGI 示例- 这概述了一个完整的示例配置。我个人是 daemontools(或 runit,如果您不是 djb 粉丝)的粉丝,并且编写了非常简单的包装器来在进程监督下运行 php-fcgi(如果异常终止,它将重新启动),但是该页面上提供的脚本是一个 SysV 风格的脚本,您可以将其放入 /etc/init.d/ 并在 /etc/rcX.d/ 中添加适当的链接。在该页面上的脚本中,您可以调整一些变量来调整 fcgi 应用程序运行的环境。

“服务器”部分有助于虚拟主机:

server { 
     server_name www.host.com host.com other_aliases;
     ... 
}
server { 
     server_name www.host2.com host2.com other_aliases;
     ...
}
Run Code Online (Sandbox Code Playgroud)

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

在安全性方面,Igor(首席开发人员)非常重视安全性,并经常参与他们非常活跃的邮件列表。这是已确认的安全问题列表,这是他们的邮件列表存档列表