середа, 15 квітня 2015 р.

Що таке CGI і для чого воно потрібно?

Що ж таке CGI?

Незрозуміла абревіатура CGI розшифровується як Common Gateway Interface (дослівно — Загальний Інтерфейс Шлюзу). Стало зрозуміліше? Навряд чи. По суті, CGI — це набір правил, які дозволяють знаходити спільну мову веб-серверу (наприклад, Apache) з будь-якою іншою програмою (наприклад, інтерпретатором Python, Perl чи PHP), при умові, що обидві сторони знають ці правила (мають підтримку CGI).

І для чого воно потрібно?

Ніби все зрозуміло, але відразу виникає запитання: "А навіщо взагалі потрібні веб-серверу якісь додаткові програми?". Насправді, веб-сервер цілком може працювати самостійно, видаючи на запит браузера ті чи інші статичні (збережені на сервері) HTML-сторінки, зображення, каскадні таблиці стилів (CSS), різні файли тощо. І колись, в епоху зародження Інтернету, саме так все і відбувалось.

В сучасному Інтернеті переважна більшість сторінок є динамічними, тобто не зберігаються на сервері, а формуються безпосередньо під час отримання запиту від браузера. Формуються, при потребі враховуючи найрізноманітніші фактори: інформацію, передану у запиті (наприклад при пошуку того чи іншого товару в магазині формується сторінка з результатами пошуку); місцевий час, географічне розташування, мову, вік, стать та особисті налаштування користувача, який здійснив запит до сервера; пристрій, на якому відкриватиметься сторінка, розмір його екрану та інші характеристики. І цей список можна продовжувати. Саме для формування динамічних сторінок веб-сервер звертається по допомогу до сторонніх програм, які генерують потрібну сторінку і повертають її веб-серверу, а він, в свою чергу, передає сторінку веб-браузеру.

Переваги і недоліки CGI

Перевагою CGI є простота налаштування і сумісність практично з будь-якою мовою програмування. Це можуть бути не тільки програми-скрипти, написані на інтерпретованих мовах, на зразок Perl чи PHP, але й exe-файли (для Windows), написані і скомпільовані, для прикладу, на С чи Pascal. Хоча для Web-розробки на стороні сервера зазвичай використовують інтерпретовані мови, але деколи є зміст у використанні скомпільованих програм, оскільки у більшості випадків вони працюють значно швидше.

Недоліком CGI є те, що для кожного запиту запускається окремий процес, тобто окрема копія програми, яка генерує вміст веб-сторінки. При великій кількості запитів це дуже сповільнює роботу, росте навантаження на сервер та споживання пам'яті. Тому зараз хостинг-провайдерами CGI практично не використовується. Але ця технологія залишається корисною для локальних веб-серверів, що використовуються для робробки, а також може використовуватися для окремих сайтів з невеликим навантаженням.

вівторок, 7 квітня 2015 р.

Інструкція по встановленню та налаштуванню web-сервера Apache 2.4.x. на Windows 7

  1. Завантажуємо Apache 2.4.x.

    З певного часу на сайті Apache припинили викладати готові msi-дистрибутиви для Windows, але є доступні версії у вигляді zip-архівів, які можна завантажити з інших ресурсів, наприклад з Apache Lounge. На сайті доступні 32- (Win32) та 64-бітні (Win64) версії веб-сервера, зкомпільовані за допомогою різних версій компілятора Visual C++. Нам потрібна версія, зкомпільована за допомогою Visual Studio C++ 2010 SP1 (на сайті позначена як VC10). На момент написання статті останньою версією була Apache 2.4.12.

    Також перед встановленням веб-сервера потрібно завантажити та встановити Visual C++ 2010 SP1 Redistributable Package (x86 або x64, в залежності від версії Apache).

  2. Встановлюємо Apache 2.4.x.

    Встановлення полягає в копіюванні (розпакуванні) папки Apache24 з архіву в корінь диску C:\, тобто шлях до папки Apache24 має виглядати так: C:\Apache24.

    Якщо з тих чи інших міркувань Ви хочете встановити веб-сервер Apache в інше розташування, то необхідно буде, відповідно до нового розташування, відредагувати параметри ServerRoot, DocumentRoot, Directory, ScriptAlias у файлі налаштувань (конфігурації) httpd.conf, який знаходиться у підпапці conf кореневої папки веб-сервера. Надалі в статті буде припускатися, що Apache встановлено за шляхом C:\Apache24.

    Також в цьому ж файлі параметром ServerName слід задати ім’я сервера. Це може бути ім’я комп’ютера, IP-адреса комп’ютера, зареєстроване DNS-ім’я, а також ім’я "localhost" (без лапок) або IP-адреса 127.0.0.1.

  3. Запускаємо Apache 2.4.x.

    Існує два способи запуску веб-сервера Apache: у вигляді консольної програми та як службу (service) Windows.

    Для запуску у вигляді консольної програми слід запустити файл httpd.exe, який знаходиться у підпапці bin кореневої папки веб-сервера. За допомогою командного рядка:

    C:
    cd C:\Apache24\bin
    httpd.exe

    В результаті має з’явитися консольне вікно з чорним тлом. Також можна створити ярлик для httpd.exe та розмістити його в зручному місці.

    Для того, аби веб-сервер Apache працював як служба Windows,слід встановити її, виконавши у командному рядку наступні команди:

    C:
    cd C:\Apache24\bin
    httpd.exe -k install

    Для керування службою Apache можна скористатися програмою ApacheMonitor, яка також знаходиться в папці bin. За її допомогою можна запускати, зупиняти та перезавантажувати службу Apache2.4, а також перевірити її поточний стан.

    Незалежно від обраного способу запуску веб-сервера Apache перевірити правильність установки та працездатність можна ввівши в рядку адреси будь-якого браузера адресу localhost та натиснувши Enter. При успішному встановленні та відсутності інших непередбачуваних проблем повинна відкритися сторінка з єдиними написом: It works!

  4. Можливі проблеми та їх вирішення.

    При встановленні Apache як служби (service) в командному рядку видається наступне повідомлення:

    Errors reported here must be corrected before the service can be started. AH00558: httpd.exe: Could not reliably determine the server's fully qualified domain name, using xxxx::xxxx:xxxx:xxxx:xxxx. Set the 'ServerName' directive globally to suppress this message

    Таке ж (за винятком першого речення) повідомлення видається при запуску в режимі консольної програми. Підказка щодо вирішення проблеми міститься безпосередньо в тексті помилки: не вказане значення параметру ServerName. Для виправлення ще раз уважно прочитайте останній абзац пункту 2 цієї інструкції.

    Ще одна помилка, яка часто зустрічається, виглядає приблизно так:

    C:\Apache24\bin>httpd.exe
    (OS 10048)╟рчтшўрщ фючтюы ║Є№ё  Є│ы№ъш юфэх тшъюЁшёЄрээ  рфЁхёш ёюъхЄє (яЁюЄюъюы/ьхЁхцэр рфЁхёр/яюЁЄ). : AH00072: make_sock: could not bind to address [::]:80
    (OS 10048)╟рчтшўрщ фючтюы ║Є№ё  Є│ы№ъш юфэх тшъюЁшёЄрээ  рфЁхёш ёюъхЄє (яЁюЄюъюы/ьхЁхцэр рфЁхёр/яюЁЄ). : AH00072: make_sock: could not bind to address 0.0.0.0:80
    AH00451: no listening sockets available, shutting down
    AH00015: Unable to open logs

    Через проблеми з кодуванням українські символи відображаються некоректно, нижче наведений текст помилки у правильному кодуванні:

    C:\Apache24\bin>httpd.exe
    (OS 10048)Зазвичай дозволяється тільки одне використання адреси сокету (протокол/мережна адреса/порт). : AH00072: make_sock: could not bind to address [::]:80
    (OS 10048)Зазвичай дозволяється тільки одне використання адреси сокету (протокол/мережна адреса/порт). : AH00072: make_sock: could not bind to address 0.0.0.0:80
    AH00451: no listening sockets available, shutting down
    AH00015: Unable to open logs

    Щасливих власники англомовних версій Windows бачитимуть таке повідомлення про помилку:

    C:\Apache24\bin>httpd.exe
    (OS 10048)Only one usage of each socket address is normally permitted. : AH00072: make_sock: could not bind to address [::]:80
    (OS 10048)Only one usage of each socket address is normally permitted. : AH00072: make_sock: could not bind to address 0.0.0.0:80
    AH00451: no listening sockets available, shutting down
    AH00015: Unable to open logs

    Ця помилка не залежить від мови, кольору шкіри та релігійних переконань, і, зазвичай, спричинена тим, що порт 80, який Apache по замовчуванню використовує для вхідних з’єднань, зайнятий або блокується іншою програмою. Рішень, відповідно, два: або переналаштувати Apache на використання іншого порта, або знайти програму, яка цей порт використовує, і позбутися чи переналаштувати її.

    В більшості випадків простіше переналаштувати Apache. Для цього достатньо змінити у файлі httpd.conf параметр Listen, вказавши там любий вільний порт. Недоліком (на мою думку, не критичним) такого підходу є те, що тепер при звертанні до сервера у браузері треба буде явно вказувати вибраний порт, наприклад localhost:8080.

    Якщо ж прості шляхи не для Вас, то нашою наступною задачею стане пошук програми, яка "провинилася" і зайняла такий потрібний нам 80-й порт. Зробити це можна за допомогою команди:

    netstat -aon | findstr :80

    Ця команда виводить всі з’єднання і порти, які прослуховуються, а також ідентифікатор процесу, який цим займається, після чого відфільтровує результат роботи команди, залишаючи тільки ті записи, які містять рядок ":80". Потім вже вручну можна вибрати ті записи, які використовують порт 80 (нас цікавить 2-га колонка), виписати їх ідентифікатор процесу (остання колонка) і в Диспетчері завдань Windows знайти по цьому ідентифікатору ім’я потрібного нам процесу.

    Ніби не надто складно і можна би було на цьому зупинитися, але все-таки вирішив пошукати в Google якісь цікавіші, тобто простіші і більш автоматизовані рішення. І, як виявилось, вирішив не даремно. На сайті Habrahabr знайшлася ціла стаття, присвячена цій проблемі. І якась світла голова підказала автору швидший спосіб пошуку процесу, який займає порт 80:

    for /f "tokens=1,2,3,4,5*" %i in ('netstat -aon ^| findstr ":80" ^| findstr /i listening') do @echo %j %l & @tasklist | findstr %m

    Розписувати в деталях даний спосіб не буду, бо такий опис цілком заслуговує на окрему статтю. Вкотре переконуюсь, що командний рядок у вмілих руках — це дуже потужній інструмент, а також в тому, що нема межі досконалості.

    В моєму випадку винуватцем даної помилки був Skype, який використовує 80-й порт "для додаткових вхідних з’єднань". Вимикається так: пункт меню Інструменти, підпункт Налаштування, в лівій панелі вікна, що відкрилося, вибираємо Додатково, далі — З’єднання, після чого в правій частині вікна знімаємо виділення у віконці Використовувати порти 80 та 443 для додаткових вхідних з’єднань, тиснемо Зберегти. Все! Звичайно, дану помилку може викликати не тільки Skype, але я не буду описувати те, з чим не зіткнувся особисто. Ще декілька потенційних джерел виникнення цієї помилки описані у згаданій раніше статті на Habrahabr'і.