среда, 5 октября 2011 г.

Настроим CouchDB как веб-сервер

CouchDB, Eclipse - установлены. И уже можем работать с CouchDB через веб-интерфейс по адресу http://127.0.0.1:5984/_utils
Но CouchDB - это не только NoSQL-хранилище, а ещё и полноценный веб-сервер... после небольшой настройки. Здесь будет предложено готовое решение, годное как для домашнего компьютера, так и для высоконагруженного Интернет-сервера.

Для приёма соединений из Интернета будем использовать лёгкий Nginx. Если Nginx Вам не по душе (с чего бы это?), выбирайте HTTP-сервер на свой вкус.


Устанавливаем Nginx

Скачиваем с официального сайта новую стабильную версию >
http://nginx.org/ru/download.html
На момент написания статьи, это была версия 1.0.6.
Разархивируем. Через граф. интерфейс или командой в терминале
~$ tar -zxvf НазваниеАрхива.tar.gz
Заходим в папку с разархивированным Nginx.
~$ cd НазваниеАрхив
Скачиваем и разархивируем новые версии зависимостей: PCRE и ZLIB. Достаточно только разархивировать их: установщик Nginx соберёт всё сам.
~$ sudo aptitude install libpcre3-dev
Собираем и устанавливаем Nginx. Обратите внимание на параметры конфигурации, на версии библиотек: пути должны указывать на разархивированные выше зависимости.
~$ ./configure --with-http_ssl_module \
    --with-pcre=../pcre-8.11 \
    --with-zlib=../zlib-1.2.5
~$ make
~$ sudo make install
Редактируем файл конфигурации.
~$ sudo nano /usr/local/nginx/conf/nginx.conf

Официальный пример файла. В конце поста привёл пример своих конфигов Nginx'а.

Для тонкой настройки Nginx есть хорошая статья на Хабре.
Запускаем Nginx.
~$ sudo /usr/local/nginx/sbin/nginx
Чтобы Nginx стартовал при загрузке Ubuntu, пишем в терминале
~$ sudo nano /etc/rc.local
и добавляем в открывшийся файл строку
~$ /usr/local/nginx/sbin/nginx
Добавляем домен сайта с которым будем работать в файл 'hosts'. Пишем в терминале
~$ sudo nano /etc/hosts
Файл содержит что-то наподобие этого
127.0.0.1 localhost
127.0.1.1 НазваниеСайтаА
127.0.1.1 НазваниеСайтаБ
Сайт будет доступен в браузере по адресу http://НазваниеСайта
Если Вы планируете серьёзно заниматься сервером Nginx, подпишитесь на дайджесты рассылок >

В общем-то, на этом всё: Nginx и CouchDB настроены для работы. А значит, Вы можете создавать на этой системе веб-сайты.
Мне нравится использовать Nginx, т.к. это надёжный, проверенный временем, прокси. Благодаря ему можно значительно снизить нагрузку на продакшн-сервер и настроить короткие ("человеческие") ссылки: в строке браузера вместо, скажем, такого чуда
http://my-site.zone/holidayline/_design/\
    holidayline/_list/choice/holiday\
    ?year=2011&month=10&day=25
написать
http://my-site.zone/2011/10/25

А, вот ещё что. Когда меняется конфигурация, Nginx требует перезапуска. Для этих целей я пишу в терминале
~$ sudo killall -9 nginx
~$ sudo /usr/local/nginx/sbin/nginx



Пример конфигурации Nginx для CouchDB (три файла)
# Файл /usr/local/nginx/conf/nginx.conf

# Используется оптимизация, предложенная в статьях об Nginx
# (см. ссылки выше)

worker_processes  2;


events {
    worker_connections  1024;
    use epoll;
}


http {
    include       mime.types;

    log_format my_combined
      '$remote_addr - $remote_user [$time_local] '
      '"$request" $status $body_bytes_sent '
      '"$http_referer" "$http_user_agent" '
      '$upstream_response_time "$host"'

    sendfile        on;
    #tcp_nopush     on;

    keepalive_timeout  50;
    tcp_nodelay        on;

    client_header_buffer_size 1k;
    large_client_header_buffers 4 4k;

    client_max_body_size 64k;
    client_body_buffer_size 128k;

    proxy_buffer_size 16k;
    proxy_buffers 16 32k;
    proxy_busy_buffers_size 64k;
    proxy_temp_file_write_size 64k;

    proxy_intercept_errors on;

    ssi off;

    gzip  on;
    gzip_min_length 2000;
    gzip_buffers 64 8k;
    gzip_comp_level 3;
    gzip_http_version 1.1;
    gzip_proxied any;
    gzip_types text/plain
      text/css
      application/x-javascript
      application/json
      application/xml;
    gzip_disable "MSIE [1-6]\.(?!.*SV1)";


    upstream backendCouchDB {
      server localhost:5984;
    }

    include site/*;
}

# Файл /usr/local/nginx/conf/proxy.conf

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_connect_timeout 35s;
proxy_read_timeout 50s;
proxy_send_timeout 50s;

# Файл /usr/local/nginx/conf/site/ДоменВашегоСайта.conf

# Пример настроек для работы с хранилищем CouchDB.
# Название хранилища > 'cargo'

server {
  server_name НазваниеДомена;
  listen 80;

  # Если будете работать с несколькими сайтами на одном
  # компьютере, Вы будете рады, что вынесли некоторые
  # настройки в отдельный файл
  include /usr/local/nginx/conf/proxy.conf;

  # Требуется для репликации больших баз CouchDB
  client_max_body_size 1000m;

  # Оптимизация. См. по ссылкам выше статьи по Nginx.
  client_body_buffer_size 64k;

  proxy_buffer_size 1k;
  proxy_buffers 16 1K;
  proxy_busy_buffers_size 8k;
  proxy_temp_file_write_size 8k;

  # Если при разработке сайта необходимр знать, куда направляет
  # запросы Nginx, переключаем в 'on'
  access_log off;


  # Подружим Nginx с CouchDB
  # @see http://wiki.apache.org/couchdb/Nginx_As_a_Reverse_Proxy

  # Я использую перенаправление внешних запросов к хранилищу
  # CouchDB исключительно с помощью Nginx. Но есть и другая
  # возможность создавать короткие ссылки.
  # @see http://wiki.apache.org/couchdb/Rewriting_urls

  # Главная страница сайта ссылается на статический файл HTML
  location = / {
    proxy_pass
      http://backendCouchDB/cargo/_design/cargo/index.html;
    break;
  }

  location = /index.html {
    proxy_pass
      http://backendCouchDB/cargo/_design/cargo/index.html;
    break;
  }

  # Адрес вида http://domain.zone/in формируется из представления
  location = /in {
  proxy_pass
  http://backendCouchDB/cargo/_design/cargo/_show/in/in-configure;
  break;
  }

  # В этом сайте я использую приставки 'cargo' и '/cargo/design',
  # чтобы обращаться со страниц непосредственно к документам
  # хранилища
  location /cargo/design {
    rewrite ^/cargo/design/(.*) /cargo/_design/cargo/$1 break;
    proxy_pass http://backendCouchDB;
    break;
  }
  
  location /cargo {
    proxy_pass http://backendCouchDB;
    break;
  }

  # Ссылку на иконку и файлы для роботов имеет смысл закешировать
  location = /favicon.ico {
    proxy_pass
      http://backendCouchDB/cargo/_design/cargo/favicon.ico;
    expires 50d;
    break;
  }
  
  location = /robots.txt {
    proxy_pass
      http://backendCouchDB/cargo/_design/cargo/robots.txt;
    expires 50d;
    break;
  }

  # Карту сайта формируем динамически, из представления
  location = /sitemap.xml {
    proxy_pass
      http://backendCouchDB/cargo/_design/cargo/_list/sitemap/page;
    expires 10d;
    break;
  }


  # Мы должны пропускать запросы, начинающиеся с '/_utils/script',
  # если сайт использует js-библиотеки, идущие вместе с CouchDB
  location /_utils/script {
    rewrite
      ^/_utils/script/(.*)
      /_utils/script/$1
      break;
    proxy_pass http://backendCouchDB;
    break;
  }

  # В этих папках хранятся библиотеки, которые могут быть
  # затребованы сайтом
  location ~ /cargo/design/vendor {
    rewrite
      ^/cargo/design/vendor/(.*)
      /cargo/_design/cargo/vendor/$1
      break;
    proxy_pass http://backendCouchDB;
    break;
  }

  location ~ /vendor/couchapp {
    rewrite
      ^/vendor/couchapp/(.*)
      /cargo/_design/cargo/vendor/couchapp/$1
      break;
    proxy_pass http://backendCouchDB;
    break;
  }

  # Для репликации и отслеживания изменений в документах CouchDB
  location ~ ^/(.*)/_changes {
    proxy_pass http://backendCouchDB;
    proxy_buffering off;
    expires off;
    access_log off;
  }

}

Комментариев нет: