Поможет ли Nginx в качестве обратного прокси-сервера для Apache только для динамического контента - PullRequest
6 голосов
/ 16 апреля 2010

Я планирую переместить весь свой статический контент в CDN, поэтому на моем сервере остался только динамический контент. Теперь у меня Nginx настроен как обратный прокси для Apache. Статический запрос, который поступил напрямую от Nginx без необходимости обращаться к Apache.

В этом случае Nginx обработал большую часть запроса, и я ясно вижу необходимость в Nginx.

Теперь, когда я переместил весь статический контент в другой домен, по-прежнему необходимо иметь nginx перед Apache. Потому что теперь все запросы по умолчанию являются динамическими и все идут в Apache.

Существуют ли другие преимущества использования Nginx и Apache только для динамического содержимого.

Мой динамический контент - PHP / MySQL

Edit:

Для ясности: Теперь у меня есть Nginx в качестве обратного прокси. Он доставляет статический и динамический контент. Но я перемещаю свои статические файлы в CDN. Нужен ли мне тогда Nginx в моем домене?

Ответы [ 5 ]

14 голосов
/ 26 мая 2010

Да, вам абсолютно необходим nginx перед Apache. Apache использует 1 поток или процесс на соединение. Каждый из этих потоков занимает память. Если у вас есть несколько сотен человек, посещающих ваш сайт, и у вас включена поддержка активности активности, каждый из этих браузеров будет поддерживать процесс apache или поток, занимая память на вашем сервере.

Вы можете обойти эту проблему, отключив функцию keepalive на своем сервере apache, но это замедляет работу вашего веб-сайта, поскольку браузеры не могут повторно использовать соединения.

Таким образом, вместо этого вы используете nginx в качестве обратного прокси-сервера с включенной поддержкой активности. Он может поддерживать тысячи соединений с небольшим объемом памяти (около 8 мегабайт). Поскольку nginx является локальным для вашего сервера apache, каждый запрос занимает дочерний элемент или поток apache только в течение нескольких микросекунд. Это означает, что вы можете обслуживать тысячи людей с помощью лишь небольшого числа процессов Apache.

Кроме того, конфигурация nginx гораздо более гибкая, чем у Apache, и, имея ее на внешнем интерфейсе, вы получаете большую гибкость.

3 голосов
/ 16 апреля 2010

То, что я сделал для одного сайта:

  • настроить nginx в качестве обратного прокси-сервера перед Apache
  • настроить так:
    • Запросы к страницам PHP (т.е. динамический контент) отправляются в Apache
    • Запросы к статическим файлам (CSS, JS, ...) напрямую обслуживаются nginx.

Это без необходимости настройки двух доменов: все находятся в одном домене.


По сути, я сделал следующее:

  • показ изображений из nginx, без сжатия gzip, с кэшированием
  • подать js / css (т.е. текстовые файлы) из nginx, со сжатием gzip, с кэшированием
  • служит для некоторых других расширений (pdf, exeutables, ...) формы nginx, без сжатия, без кэширования
  • передать остальные запросы в 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.

2 голосов
/ 20 апреля 2010

Вы также можете использовать nginx для разгрузки обработки SSL из экземпляров apache.

Например, у нас один стек настроен с nginx-> haproxy-> пулом серверов Apache. nginx и haproxy живут вместе в кластере пульса и подают запросы в пул апач-боксов на серверной части. Мы устанавливаем все сертификаты SSL на интерфейс nginx.

2 голосов
/ 17 апреля 2010

Нет, вам больше не нужен nginx.

0 голосов
/ 16 апреля 2010

nginx впереди - лучшее решение, если вы используете Apache 1.3:

nginx может легко обслуживать тысячи соединений, но Apache не может

...