Translate

вівторок, 25 грудня 2012 р.

Nginx as reverse proxy for Apache

Усім відомо, що Apache є стандартом де-факто для веб-серверів. Розробники деяких CMS взагалі рекомендують користуватись саме Apache, і для налаштування їх під інший веб-сервер іноді необхідно попотіти. Але також ні для кого не є секретом, що Apache - важкий і ресурсоємкий сервер і на великих проектах від себе показує, м'яко кажучи, не дуже.
Тож одним із самих швидких варіантів оптимізації буде використання веб-серверу Nginx, як фронтенду до Apache. Тобто Nginx буде обробляти всю статику (запити на картинки, джаваскрипти, css і тд), а у випадку якщо відбудеться запит на php-скрипт чи щось таке (динамічний контент) - запит буде відправлено на обробку нашому "жирному" другу Apache-у.
Як показує практика такий варіант значно (!) економить ресурси серверу, адже запущених дочірніх процесів apache буде менше, з левовою часткою запитів буде справлятись Nginx.
Перейдемо до конфігурації.

1) Встановлюємо Apache (чи щось інше що буде у вас бекендом) та nginx з усіма запропонованими залежностями.

2) Конфігуруємо Nginx, щоб він слухав стандартний 80-порт і віддавав всю статику напряму, якщо буде запрошено динамічний контент  - запит буде відсилано Apache-y.

cat /etc/nginx/nginx.conf

# Використовуємо користувача від якого працює сервер Apache
user www-data;
# Кількість дочірніх процесів, обирають за к-тю ядер CPU
worker_processes 4;
worker_rlimit_nofile 8192;

# Місцезнаходження логу помилок і pid-файлу
error_log /var/log/nginx/error.log;
pid /var/run/nginx.pid;

events {
  worker_connections 1024;
  use epoll;
  accept_mutex off;
}

http {
  server_names_hash_bucket_size 64;
  include /etc/nginx/mime.types;
  default_type application/octet-stream;
  access_log /var/log/nginx/access.log;
  sendfile on;
  tcp_nopush on;
  keepalive_timeout 65;

  # Опції reverse proxy
  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;

  # Опції gzip компресії.
  gzip on;
  gzip_http_version 1.0;
  gzip_comp_level 6;
  gzip_min_length 0;
  gzip_buffers 16 8k;
  gzip_proxied any;
  gzip_types text/plain text/css text/xml text/javascript application/xml application/xml+rss application/javascript application/json;
  gzip_disable "MSIE [1-6]\.";
  gzip_vary on;

  # Включення додаткових конфігураційних файлів
  include /etc/nginx/sites-enabled/*.conf;
}

Далі в директорії /etc/nginx/sites-available створюємо конфігураційний файл віртуалхосту:

server {
  listen 80;
  server_name wordpress.site;
  access_log off;
  error_log off;
  location / { proxy_pass http://127.0.0.1:8080; }
  location ~* ^.+\.(htm|html|jpg|jpeg|gif|png|ico|css|zip|tgz|gz|bz2|pdf|odt|txt|tar|bmp|rtf|js|swf|avi|mp4|mp3|ogg|flv)$ {
    expires 30d; #adjust to your static content's update frequency
    root /var/www/wordpress;
  }
}

І тепер робимо лінку на цей файл в /etc/nginx/sites-enabled :

ln -s /etc/nginx/sites-available/worpress.site  /etc/nginx/sites-enabled/worpress.conf

Зроблено це для зручності, тобто для того щоб відключити сайт - можна просто видалити лінку, а не коментувати кожен рядок файлу конфігурації.

Отже, як бачимо з останнього конфігураційного файлу  всі запити на динаміку будуть відсилатись на http://127.0.0.1:8080, а на цьому порту у нас якраз і працює Apache.

3)  Отже міняємо порт Апача з 80, що стоїть по замовчуванню, на 8080. Для цього необхідно змінити директиву Listen на:

Listen 127.0.0.1:8080

Тож тепер 8080 порт буде слухатись лише з localhost і зовні його не буде видно.
Ну і власне конфіг самого віртуалхоста для Apache:

<VirtualHost 127.0.0.1:8080>
        ServerAdmin myemail@example.com
        ServerName wordpress.site

        DocumentRoot /var/www/wordpress
        <Directory />
                Options FollowSymLinks
                AllowOverride None
        </Directory>
        <Directory /var/www/wordpress>
                Options Indexes FollowSymLinks MultiViews
                AllowOverride All
                Order allow,deny
                Allow from all
        </Directory>

        ErrorLog ${APACHE_LOG_DIR}/error.log

        # Possible values include: debug, info, notice, warn, error, crit,
        # alert, emerg.
        LogLevel warn

        CustomLog ${APACHE_LOG_DIR}/access.log combined

</VirtualHost>

Тобто по-суті його особливо змінювати не треба, а треба лиш поправити директиву VirtualHost.

4) Далі робимо рестарт/релоад вебсерверів і для впевненості перевіряємо відкриті порти

netstat -tulpn | egrep '(apache|nginx)'

tcp 0  0    127.0.0.1:8080  0.0.0.0:*   LISTEN   13067/apache2
tcp 0  0    0.0.0.0:80      0.0.0.0:*   LISTEN   12186/nginx


Далі все має працювати.
Зауваження/запитання, будь ласка, пишіть в коментарі.

Корисні лінки:
http://www.cyberciti.biz/tips/using-nginx-as-reverse-proxy.html
http://www.openlogic.com/wazi/bid/188107/Add-a-Nginx-Reverse-Proxy-to-Your-LAMP-Setup

Немає коментарів:

Дописати коментар