Интересное

Сообщение об ошибке

Warning: ini_set(): A session is active. You cannot change the session module's ini settings at this time in drupal_environment_initialize() (line 684 of /home/www/nixtalk.com/includes/bootstrap.inc).

Связка Apache nginx

Опубликовано пн, 12/05/2011 - 15:23 пользователем Demontager

Хотел бы рассказать как можно увеличить производительность Apache сервера в связке с nginx. Сам по себе nginx, не может заменить полностью Apache если у вас динамические сайты, поэтому в данном примере мы настроим веб сервер таким образом, что на входе посетителя будет встречать очень быстрый nginx, а если требуется произвести выдачу какого-то динамического контента, то он будет обращаться к Apache. Далее буду ссылаться на расположение конфигурационных файлов в Debian, как наиболее популярному дистрибутиву для веб-сервера.

Устанавливаем nginx:

  1. apt-get install nginx

Также понадобится модуль mod-rpaf, он не обязателен, но если его не будет, то в логах Apache вместо реального IP посетителя будет отображаться IP на котором работает nginx.

  1. apt-get install libapache2-mod-rpaf

Стандартное расположение его конфиг-файлов frontend (тоесть nginx) в /etc/nginx и основной его конфиг называется nginx.conf. Привожу его контент в таком виде как он у меня:

  1. user www-data;
  2. worker_processes 1;
  3.  
  4. error_log /var/log/nginx/error.log;
  5. pid /var/run/nginx.pid;
  6.  
  7. events {
  8. worker_connections 1024;
  9. # multi_accept on;
  10. }
  11.  
  12. http {
  13. include /etc/nginx/mime.types;
  14.  
  15. # access_log /var/log/nginx/access.log;
  16.  
  17. sendfile on;
  18. #tcp_nopush on;
  19.  
  20. #keepalive_timeout 0;
  21. keepalive_timeout 65;
  22. tcp_nodelay on;
  23.  
  24. gzip on;
  25. # gzip_disable "MSIE [1-6]\.(?!.*SV1)";
  26.  
  27. server_names_hash_bucket_size 64;
  28.  
  29. server {
  30. listen 80 default;
  31. server_name localhost;
  32.  
  33. location / {
  34. proxy_pass http://127.0.0.1:8080/;
  35. proxy_redirect off;
  36. proxy_set_header Host $host;
  37. proxy_set_header X-Real-IP $remote_addr;
  38. proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
  39. }
  40. }
  41.  
  42. include /etc/nginx/sites-enabled/*.conf;
  43. ## Block spammers and other unwanted visitors ##
  44. include /etc/nginx/blockips.conf;
  45. limit_zone lzone $binary_remote_addr 10m;
  46.  
  47. # limit connections from one ip
  48. limit_conn lzone 10;
  49. client_max_body_size 100m;
  50. }

Главные составляющие это:

  • user www-data от какого пользователя работает, у меня как и apache от www-data
  • worker_processes 1 Стоит 1, потомучто на моём арендуемом VDS одно ядро процессора.
  • listen 80 default на каком порту слушает входящие соединения nginx, так как все браузеры сразу пытаются соединится к 80 порту, логично оставить его по умолчанию
  • proxy_pass http://127.0.0.1:8080/ указывает что через этот адрес nginx будет обращаться к Apache за данными.
  • include /etc/nginx/sites-enabled/*.conf где искать файлы конфигураций виртуал-хостов.
  • include /etc/nginx/blockips.conf файл в котором я храню список блокированных IP. Пишется в таком виде deny XXX.XXX.XXX.XXX;
  • client_max_body_size 100m об этом уже писал в заметке http://nixtalks.com/413request

Про остальные, менее важные параметры, как всегда можно прочесть на официальном сайте nginx: http://wiki.nginx.org/DirectiveIndex (директивы кликабельны).
Nginx как и Apache поддерживает виртуальные хосты, они у меня прописаны в файле инклуда /etc/nginx/sites-enabled/*.conf, для каждого сайта создан отдельный конфиг, вот к примеру моих два сайта:

  1. /etc/nginx/sites-enabled/nixtalks.com.conf
  2. /etc/nginx/sites-enabled/nixtalks.net.conf

Содержимое первого файла аналогично другим, с той лишь разницей, что указаны другие пути:

  1. server {
  2. listen 80;
  3. server_name nixtalks.com www.nixtalks.com;
  4.  
  5. access_log /var/log/nginx/nixtalks/access.log;
  6. error_log /var/log/nginx/nixtalks/nerror.log;
  7.  
  8. location / {
  9. proxy_pass http://127.0.0.1:8080/;
  10. proxy_redirect off;
  11. proxy_set_header Host $host;
  12. proxy_set_header X-Real-IP $remote_addr;
  13. proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
  14. }
  15. location ~* \.(jpg|gif|png|js|css|zip|rar|swf|ico)$ {
  16. root /var/www/nixtalks;
  17. expires 7d;
  18. error_page 404 502 504 = @fallback;
  19. }
  20. location @fallback {
  21. proxy_pass http://127.0.0.1:8080;
  22. proxy_set_header Host $host;
  23. proxy_set_header X-Real-IP $remote_addr;
  24. proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
  25. }
  26. }

Все директивы справедливы как и для основного файла конфигурации nginx, таким образом достигается гибкая настройка любого сайта.
С nginx на этом всё, но пока не запускаем его, потому что всё равно не заработает. Отправляемся редактировать основной конфиг Apache:

  1. nano /etc/apache2/apache2.conf

Ставим Apache на прослушку 8080 порта

  1. Listen 8080

Далее редактируем файлы виртуал хостов, я хосты в apache держу в одном файлы, у кого-то могут быть отдельные, но это не столь важно. Вешаем все сайты на 8080 порт
Пример конфигурации одного сайта:

  1. <VirtualHost 127.0.0.1:8080>
  2. ServerAdmin webmaster@nixtalks.com
  3. DocumentRoot "/var/www/nixtalks"
  4. ServerName www.nixtalks.com
  5. ServerAlias nixtalks.com
  6. ErrorLog "/var/log/nixtalks.com-error_log"
  7. CustomLog "/var/log/nixtalks.com-access_log" common
  8.  
  9. <Directory "/var/www/nixtalks">
  10. Options Indexes FollowSymlinks MultiViews
  11. AllowOverride All
  12. Order allow,deny
  13. Allow from all
  14. </Directory>
  15. </VirtualHost>

Всё, теперь можно испытать нашу конструкцию apache+nginx, останавливаем apache и стартуем всё по порядку:

  1. /etc/init.d/apache2 stop
  2. /etc/init.d/nginx start
  3. /etc/init.d/apache2 start

Если никаких ошибок не выдало, должно всё работать, проверяйте.
Перед запуском nginx, желательно проверить его конфиг на ошибки, иначе сервер будет лежать пока вы не поправите конфиг.

  1. service nginx configtest

Не забудьте также перед стартом создать папки для логов.

Лично я, свой сервер до и после применения оптимизации, не тестировал каким-либо специальным софтом. Но просто по наблюдениям в top, заметил значительное падение нагрузки, но ниже предлагаю ознакомится с примерной статистикой нагрузки, которую можно добится, в данном случае также произвели настройку стандартно, без всяких кеширующих способов:
Производительность веб-сервера
Скрин взят со статьи: http://www.opennet.ru/base/net/nginx_frontend_apache.txt.html

Поделится: 

2 комментария

Аватар пользователя Antonio

автор Antonio вкл вт, 07/03/2012 - 23:27

Подтверждаю Nginx классный помощник Апачу

Аватар пользователя Алексей

автор Алексей вкл вс, 11/02/2014 - 13:41

Неужели всё так просто настраивается? Спасибо! Ушел пробовать связку.

Добавить комментарий