6

我计划将我所有的静态内容移动到 CDN,所以在我的服务器上我只剩下动态内容。我现在将 Nginx 设置为 Apache 的反向代理。传入的静态请求由 Nginx 直接交付,无需转到 Apache。

在这种情况下,Nginx 处理了很大一部分请求,我可以清楚地看到 Nginx 的必要性。

既然我把所有的静态内容都移到了另一个域,还有没有必要在 Apache 前面有 nginx。因为现在所有的请求都是默认的动态请求,并且都去 Apache。

只为动态内容运行 Nginx 和 Apache 还有其他好处吗?

我的动态内容是 PHP/MySQL

编辑:

需要明确的是:我现在将 Nginx 作为反向代理。它提供静态和动态内容。但我正在将我的静态文件移动到 CDN。那么我的域上是否还需要 Nginx。

4

5 回答 5

14

是的,你绝对需要在 Apache 前面使用 nginx。Apache 每个连接使用 1 个线程或进程。这些线程中的每一个都占用内存。如果您有数百人访问您的网站并且您启用了 keepalive,则这些浏览器中的每一个都会让 apache 进程或线程忙于占用您服务器上的内存。

您可以通过禁用 apache 服务器上的 keepalive 来解决此问题,但这会降低您网站的性能,因为浏览器无法重用连接。

因此,您改为使用 nginx 作为启用 keepalive 的反向代理。它可以以很小的内存占用(大约 8 兆)维持数千个连接。因为 nginx 对您的 apache 服务器来说是本地的,所以每个请求只占用一个 apache 子或线程几微秒。这意味着您只需很少的 apache 进程就可以为成千上万的人提供服务。

此外,nginx 的配置比 apache 灵活得多,并且通过将它放在前端,它为您提供了很大的灵活性。

于 2010-05-26T11:44:24.090 回答
3

我为一个网站所做的是:

  • 在Apache前面设置nginx做反向代理
  • 配置它:
    • 对 PHP 页面(即动态内容)的请求被发送到 Apache
    • 对静态文件(CSS、JS、...)的请求直接由 nginx 处理。

这无需设置两个域:所有域都在同一个域上。


基本上,我所做的是:

  • 从 nginx 提供图像,没有 gzip 压缩,有缓存
  • 从 nginx 提供 js/css(即文本文件),使用 gzip 压缩,使用缓存
  • 从 nginx 提供一些其他扩展(pdf、可执行文件、...),无需压缩,无需缓存
  • 将其他请求传递给 Apache


这是我的 nginx 的配置文件的样子:

server {
    listen   80;
    server_name  MY_DOMAIN_NAME;

    access_log  /var/log/nginx/MY_DOMAIN_NAME.access.log;

    gzip on;
    gzip_comp_level 2;
    gzip_proxied any;
    gzip_types text/plain text/html text/css text/xml application/xml application/xml+rss application/xml+atom text/javascript application/x-javascript application/javascript;

    location ~* ^.+\.(jpg|jpeg|gif|png|ico)$  {
        root    /home/www/MY_DOMAIN_NAME;
        #access_log off;
        gzip off;
        expires 1d;
    }
    location ~* ^.+\.(css|js)$ {
        root    /home/www/MY_DOMAIN_NAME;
        #access_log off;
        expires 1d;
    }
    location ~* ^.+\.(pdf|gz|bz2|exe|rar|zip|7z)$ {
        root    /home/www/MY_DOMAIN_NAME;
        gzip off;
    }


    location / {
        proxy_pass   http://MY_DOMAIN_NAME:8080;
        proxy_redirect     off;

        proxy_set_header   Host             \$host;
        proxy_set_header   X-Real-IP        \$remote_addr;
        proxy_set_header   X-Forwarded-For  \$proxy_add_x_forwarded_for;
        proxy_max_temp_file_size 0;

        client_max_body_size       10m;
        client_body_buffer_size    128k;

        proxy_connect_timeout      90;
        proxy_send_timeout         90;
        proxy_read_timeout         90;

        proxy_buffer_size          4k;
        proxy_buffers              4 32k;
        proxy_busy_buffers_size    64k;
        proxy_temp_file_write_size 64k;
    }
}


现在,为什么要做这样的事情?

好吧,nginx应该:

  • 需要更少的内存
  • 更快
  • 能够处理更多的连接

所以,我想它可以帮助一个有一点流量的网站,降低 Apache 的负载。

于 2010-04-16T17:36:16.323 回答
2

不,您不再需要 nginx。

于 2010-04-16T21:46:05.563 回答
2

您还可以使用 nginx 从 apache 实例中卸载 SSL 处理。

例如,我们有一个配置了 nginx->haproxy->apache 服务器池的堆栈。nginx 和 haproxy 一起生活在一个心跳集群上,并将请求馈送到后端的一个 apache 盒子池中。我们在 nginx 前端安装所有 SSL 证书。

于 2010-04-20T13:35:56.750 回答
0

如果您使用 Apache 1.3,前面的 nginx 是最好的解决方案:

nginx 可以轻松地服务数千个连接,但 Apache 不能

于 2010-04-16T17:27:34.943 回答