使用Nginx作为Apache的反向代理,是否对动态内容有帮助?

6
我计划将所有静态内容移至CDN,这样我的服务器上只剩下动态内容。我现在已经设置了Nginx作为Apache的反向代理。直接传递给Nginx的静态请求无需经过Apache。
在这种情况下,Nginx处理了大部分请求,我可以清楚地看到需要Nginx。
现在我将所有静态内容移至另一个域名,是否仍需要在Apache前使用Nginx?因为现在所有请求都是默认的动态请求,并且全部发送到Apache。
是否有其他好处可以让Nginx和Apache仅运行于动态内容?
我的动态内容是PHP/MySQL。
编辑:
明确一点:我现在拥有Nginx作为反向代理。它传递静态和动态内容。但我正在将我的静态文件移至CDN。那么,我是否仍然需要在我的域名上使用Nginx?

这与AppEngine有什么关系? - Adam Crossland
“动态内容”是指每个用户的不同内容,还是仅指通过PHP生成的内容?如果同一页面用于多个用户,则可以将其缓存几秒钟以供Nginx使用,在处理重负载时会有很大帮助。 - Ryan Doherty
没有页面总是相同的。我想不需要Nginx。 - Saif Bechan
5个回答

14

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

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

因此,您可以使用启用了keepalive的nginx作为反向代理来解决这个问题。它可以保持数千个连接,并且仅占用极小的内存(大约8兆字节)。由于nginx本地到您的apache服务器,因此每个请求只占用apache的子线程或进程几微秒的时间。这意味着您可以使用仅有一小部分apache进程来服务数千人。

此外,nginx的配置比apache更加灵活,并且将其放在前端可以为您提供很多灵活性。


1
从技术角度来看,这显然是最好的答案。您不希望使用预分叉Apache处理客户端连接并使用保持活动状态。当然,您可以禁用保持活动状态,但那样会导致所有用户抱怨您的网站速度慢(尤其是远程用户)。 - diq
非常好的答案,但是让我们不要忘记nginx可以做的所有其他好事。其中一个与这个问题非常相关的是缓存。对动态内容进行缓存进一步是有意义的(在可能的情况下)。所以,是的,nginx会帮助很多。 - anonymous-one

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的负载。


好的,也许我的问题没有表达清楚。但这是我现在的设置。这在我的第一段中已经解释了。但现在我要将我的静态文件移动到另一个域。这样我使用的资源就会更少。但我想知道的是,我是否仍然需要Nginx。 - Saif Bechan

2
不需要使用nginx了。

你能给我一些解释为什么这不再需要了吗?它对Apache没有任何帮助了吗? - Saif Bechan
2
我对你的问题感到有些困惑。你添加了nginx,只是为了提供静态内容服务。现在你不再提供静态内容,但你还在疑惑是否仍需要nginx?它现在没有任何作用,只会增加负担。 - goat
1
也许它对于动态内容也有帮助。 - Saif Bechan

2
您可以使用nginx将SSL处理从apache实例卸载。例如,我们配置了一个堆栈,其中包含nginx-haproxy-apache服务器池。nginx和haproxy共同存在于心跳集群中,并将请求发送到后端的一组apache服务器。我们在nginx前端安装所有SSL证书。

0
在使用Apache 1.3版本时,最好的解决方案是将nginx放在前面:
nginx可以轻松处理数千个连接,而Apache则做不到。

你能详细说明一下你的意思吗?因为我只通过Apache提供动态内容。而且我使用的是Apache 2。 - Saif Bechan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接