Налаштування nginx як бекенду apache

Nginx

Вирішив таки спробувати ввести в практичне застосування VPS сервер. Планував давно, хотів на площадці Hetzner в якогось реселера, який працює з WebMoney. Та якось потрапила на очі контора Selectel, таки там замовив і можна бавитись. Одразу помітив плюс – при реєстрації доступний інтерфейс роботи з name-серверами, причому безкоштовно, а самі сервери підтримують записи типу SRV, що є великим плюсом в наш час.

Щоправда, саме з цими записами не дуже вийшло, як виявилось, інтерфейс не дозволяє додавати повноцінні записи такого типу, а саме

_jabber._tcp IN SRV 5 0 5190 domain.tld

написав тікет в сапорт, обіцяли розібратись.

UPD: Пофіксили оперативно

Вибрав встановлення OS Debian GNU/Linux, так як найбільш знайомий з цим дистрибутивом. Встановив apache, mysql, php5, webmin, підняв веб, залив один сайт туди, який успішно запрацював. Лише мій тарифний план передбачає 256 Мб оперативної пам’яті, що мало. Через це не піднімав BIND, оптимізував mysql, і схотів зекономити на apache. Одним з варіантів вирішення є застосування легкого веб-сервера nginx.

Першим і логічним кроком, – встановити nginx:

apt-get install nginx

Тепер подумати. Nginx виручатиме сервер за наступним принципом: висітиме в процесах і слухатиме 80 порт. В залежності від запиту або віддаватиме сам статичний контент (економія, не запускається важкий apache), у випадку динамічного передаватиме запит apache, і братиме від нього відповідь (якщо в клієнта повільний канал, передаватиме дані не важкий apache, а легкий nginx). Також можливо обійтись взагалі без apache, передаючи динамічний запит fastcgi, та до цього я ще не готовий.

Основний конфіг знаходиться у /etc/nginx/nginx.conf , що природньо, і танцювати будемо від нього.

user www-data;
# юзер в системі, з правами якого працює nginx
worker_processes  2;
# кількість одночасно запущених процесів, рекомендується виставляти рівну кількості ядер процесора
 
error_log  /var/log/nginx/error.log;
# лог помилок, це зрозуміло
pid        /var/run/nginx.pid;
 
events {
worker_connections  1024;
# скільки одночасних з'єднань
}
 
http {
include       /etc/nginx/mime.types;
# Типи файлів для формування заголовків
default_type  application/octet-stream;
# mimetype для інших потоків
 
access_log	/var/log/nginx/access.log;
# лог запитів
 
sendfile        on;
# опція sendfile дозволяє швидше передавати дані в мережу,
# минаючи копіювання в адресний простір, доступна для Linux
#tcp_nopush     on;
 
#keepalive_timeout  ;
keepalive_timeout  30;
# Відведений час для одного з'єднання, згідно потреби, зважаючи на вільні worker_connections
 
tcp_nodelay        on;
 
gzip  on;
gzip_types text/plain text/html text/css application/x-javascript text/xml application/xml application/xml+rss text/javascript;
# Що стискаємо
 
include /etc/nginx/conf.d/*.conf;
include /etc/nginx/sites-enabled/*;
# підключаємо конфіги, подібно до апача, тобто кладемо їх в /etc/nginx/sites-available
# і робим сімлінки в /etc/nginx/sites-enabled/
}

Ось, тепер пройдемось по індивідуальних секціях server{} для кожного віртуалхоста:
Для всіх: /etc/nginx/sites-available/default

server {
server_name localhost;
 
access_log  /var/www/logs/localhost.nginx_access.log;
error_log /var/www/logs/localhost.nginx_error.log;
 
include /etc/nginx/server.conf;
}

Тут зрозуміло, аналогічно, як і для інших, наприклад, /etc/nginx/sites-available/srv.if.ua

server {
server_name srv.if.ua;
 
access_log  /var/www/logs/srv.if.ua.nginx_access.log;
error_log /var/www/logs/srv.if.ua.nginx_error.log;
 
include /etc/nginx/server.conf;
}

і на завершення, спільний конфіг для всіх, який, щоб не повторювати в кожній секції server{},
виніс в окремий файл server.conf

listen 80;
 
# Решту записів пропускаємо апачу на 81 порт
location /
{
proxy_pass http://188.93.19.250:81;
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;
 
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;
}
 
# ніззя по http отримати файл .htaccess
location ~ /\.ht {
deny  all;
}
 
# статику віддаємо і кешуємо на 30 днів
location ~* ^.+\.(gif|jpg|jpeg|png|ico|css|swf|js|xml|txt|gz|zip|bmp|xls)$
{
access_log  off;
expires      30d;
#fastcgi_intercept_errors on;
# $http_host - сюди підставляється ім'я запитаного хоста, в директиві root шлях до кореня сайту,
# щоби для кожного індивідуально не прописувати
root /var/www/$http_host;
}

Як бачимо, конфіг простий і логічний, виходячи з існуючих параметрів, можна нашаманити решту потрібних оптимізацій, включно до повної відмови від apache.
Тепер буде спокій, щоправда, подібний підхід застосовний до своїх серверів, в продакшн шаред хостингах навряд чи статика віддається подібним чином, хіба що створені свої методи.

This entry was posted in GNU\Linux, Розробка web. Bookmark the permalink. Post a comment or leave a trackback: Trackback URL.

2 Comments

  1. Constantine
    Posted 15.07.2010 at 09:57 | Permalink

    Маленьки корективи, без образ. (:
    Бекенд в даному випадку apache, а джікса – фронтенд.
    Замість апача для динаміки краще заюзати fast-cgi у звязці з spawn-fcgi.

    • Posted 15.07.2010 at 16:06 | Permalink

      Все добре, про бекенд і фронт правильно, то я переплутав.

      а fastcgi не хочу, хочу апач зі всіма плюшками (:

Post a Reply to Majesty

You must be logged in to post a comment.