代码之家  ›  专栏  ›  技术社区  ›  Saif Bechan

nginx作为apache的反向代理是否只对动态内容有帮助?

  •  6
  • Saif Bechan  · 技术社区  · 16 年前

    我计划将所有静态内容移动到一个cdn,因此在服务器上只剩下动态内容。我现在已经将nginx设置为apache的反向代理。nginx直接传递的静态请求,无需转到apache。

    在本例中,nginx处理了大部分请求,我可以清楚地看到nginx的必要性。

    现在我已经将所有静态内容移到了另一个域中,是否仍然需要在apache前面使用nginx。因为现在所有的请求在默认情况下都是动态请求,并且都指向apache。

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

    我的动态内容是php/mysql

    编辑:

    清楚: 我现在有了nginx作为反向代理。它提供静态和动态内容。 但我正在把我的静态文件移到一个CDN。那么我的域名上还需要nginx吗?

    5 回复  |  直到 16 年前
        1
  •  2
  •   goat    16 年前

    不,你不再需要nginx了。

        2
  •  14
  •   Mark Maunder    16 年前

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

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

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

    此外,nginx的配置比apache灵活得多,并且通过在前端使用它,您可以获得很大的灵活性。

        3
  •  3
  •   Pascal MARTIN    16 年前

    我为一个网站所做的是:

    • 在apache前面设置nginx作为反向代理
    • 配置为:
      • 对php页面的请求 (即动态内容) 被送到阿帕奇
      • 对静态文件的请求 (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的负载。

        4
  •  2
  •   Brian Bell    16 年前

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

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

        5
  •  0
  •   Oleg Razgulyaev    16 年前

    如果您使用Apache1.3,前面的nginx是最好的解决方案:

    nginx可以很容易地为数千个连接服务,但是apache不能