2.7.4. Проксування трафіку у веб-застосунки

Тільки для бізнес-хостингу

Можливість запускати веб-застосунки доступна тільки на бізнес-хостингу і входить у вартість тарифу. При зміні тарифу на віртуальний хостинг веб-застосунки перестануть працювати.

На хостингу доступна можливість проксувати HTTP-трафік на локальну IP-адресу, завдяки чому можна запускати застосунки на PHP, Python і Go.

Ми видаємо вам унікальну локальну IP-адресу виду 127.*.*.*.*, де * — будь-яке число від 0 до 255, і порт за замовчуванням — 3000. Ви використовуєте ці значення у своєму застосунку — вказуєте їх у команді запуску або безпосередньо в коді.

flowchart LR C([Клієнт]) H1[sub.example.com:80] H2[sub.example.com:443] L[127.*.*.*:3000] A([Застосунок]) C-->H1 C-->H2 H1-->L H2-->L L-->A

Порядок обробки запиту:

  1. Запит надходить на загальний сервер через порт 80 або 443.
  2. На основі імені хоста перенаправляється застосунку на локальну IP-адресу.
  3. Застосунок отримує дані, обробляє їх і повертає відповідь.

Реальна IP-адреса відвідувача передається в заголовку X-REAL-IP.

Додаткові порти на виділеному IP

За наявності виділеного IP на нього можна додатково приймати запити на будь-який порт у діапазоні 3000-3100. Це дає змогу одному застосунку приймати трафік на сайт і одночасно приймати інший тип трафіку на порт виділеного IP. Також можна запускати застосунок і без проксування запитів на сайт — зайняти порт на виділеному IP і обробляти різні з'єднання тільки на ньому.
  1. Відкрийте розділ «Налаштування сайту».
  2. Переключіть «Веб-сервер» на «Проксування трафіку» і збережіть зміни:
  3. Розмістіть файли вашого застосунку на хостингу в потрібному каталозі.
  4. Відкрийте розділ «Налаштування веб-застосунку».
  5. Вкажіть каталог і команду для запуску вашого застосунку:
    • Каталог запуску — шлях до каталогу, з якого має запускатися ваш застосунок. Якщо залишити порожнім, буде використовуватися кореневий каталог сайту.
    • Команда запуску — команда для запуску вашого застосунку. Можна використовувати стандартні оператори керування Bash (&&, ;, ||) для об'єднання кількох послідовних команд. У команді запуску або в коді самого застосунку використовуйте локальну IP-адресу та порт із блоку «Проксування HTTP-трафіку в застосунок»:
  6. Збережіть зміни та перевірте роботу застосунку:

У блоці «Логи застосунку» можна в реальному часі стежити за логами в процесі запуску і роботи застосунку.

Увага!

У всіх командах замість example.com використовуйте адресу вашого домену, замість sub — назву вашого піддомену.
Запуск простого HTTP-сервера на PHP:
  1. У розділі «Налаштування хостинг-акаунта» (або «Хостинг → Налаштування хостинг-акаунта») встановіть для PHP версію 8.0 або вище та збережіть зміни.
  2. Підключіться до хостингу по SSH.
  3. Перейдіть у каталог піддомену, в якому будуть розташовані файли вашого проєкту:
    cd example.com/sub
  4. Встановіть Workerman:
    composer require workerman/workerman
  5. Створіть файл index.php з таким вмістом (приклад «An http server» з репозиторію Workerman):
    <?php
    
    use Workerman\Worker;
    
    require_once __DIR__ . '/vendor/autoload.php';
    
    // #### http worker ####
    $http_worker = new Worker('http://0.0.0.0:2345');
    
    // 4 processes
    $http_worker->count = 4;
    
    // Emitted when data received
    $http_worker->onMessage = function ($connection, $request) {
        //$request->get();
        //$request->post();
        //$request->header();
        //$request->cookie();
        //$request->session();
        //$request->uri();
        //$request->path();
        //$request->method();
    
        // Send data to client
        $connection->send("Hello World");
    };
    
    // Run all workers
    Worker::runAll();

    У рядку $http_worker = new Worker('http://0.0.0.0:2345'); замість 0.0.0.0 і 2345 використовуйте IP-адресу і порт зі сторінки налаштувань веб-застосунку.

  6. На сторінці з налаштуваннями веб-застосунку вкажіть команду запуску (у команді використовуйте свої дані):
    /usr/local/php84/bin/php -c /home/example/.system/php/sub.example.com.ini /home/example/example.com/sub/index.php start
  7. Збережіть зміни, запустіть застосунок і перевірте роботу сайту.

У разі успіху на сайті має відображатися текст «Hello World».

Запуск простого WebSocket-сервера на PHP:
  1. У розділі «Налаштування хостинг-акаунта» (або «Хостинг → Налаштування хостинг-акаунта») встановіть для PHP версію 8.0 або вище та збережіть зміни.
  2. Підключіться до хостингу по SSH.
  3. Перейдіть у каталог піддомену, в якому будуть розташовані файли вашого проєкту:
    cd example.com/sub
  4. Встановіть Workerman:
    composer require workerman/workerman
  5. Створіть файл index.php з таким вмістом (приклад «A websocket server» з репозиторію Workerman):
    <?php
    
    use Workerman\Worker;
    
    require_once __DIR__ . '/vendor/autoload.php';
    
    // Create a Websocket server
    $ws_worker = new Worker('websocket://0.0.0.0:2346');
    
    // Emitted when new connection come
    $ws_worker->onConnect = function ($connection) {
        echo "New connection\n";
    };
    
    // Emitted when data received
    $ws_worker->onMessage = function ($connection, $data) {
        // Send hello $data
        $connection->send('Hello ' . $data);
    };
    
    // Emitted when connection closed
    $ws_worker->onClose = function ($connection) {
        echo "Connection closed\n";
    };
    
    // Run worker
    Worker::runAll();

    У рядку $ws_worker = new Worker('websocket://0.0.0.0:2346'); замість 0.0.0.0 і 2345 використовуйте IP-адресу і порт зі сторінки налаштувань веб-застосунку.

  6. На сторінці з налаштуваннями веб-застосунку вкажіть команду запуску (у команді використовуйте свої дані):
    /usr/local/php84/bin/php -c /home/example/.system/php/sub.example.com.ini /home/example/example.com/sub/index.php start
  7. Збережіть зміни та запустіть застосунок.
  8. Перевірте роботу WebSocket:
    1. Відкрийте в браузері консоль розробника.
    2. По черзі виконайте команди (у першій команді використовуйте адресу вашого сайту):
      const ws = new WebSocket('wss://example.com')
      ws.onmessage = m => console.log(m.data)
      ws.send('lorem ipsum')
    3. У разі успіху в консолі має відображатися текст «Hello lorem ipsum».
Детальна інформація щодо роботи з Django доступна в офіційній документації.

Запуск Django 4.2 на Python 3.10:

  1. У розділі «Налаштування хостинг-акаунта» (або «Хостинг → Налаштування хостинг-акаунта») встановіть для Python версію 3.10 або вище та збережіть зміни.
  2. Підключіться до хостингу по SSH.
  3. Встановіть Django:
    pip install --user Django
  4. Перейдіть у каталог піддомену, в якому будуть розташовані файли вашого проєкту:
    cd example.com/sub
  5. Створіть новий проєкт з назвою project:
    django-admin startproject project .
  6. Застосуйте міграції:
    python manage.py migrate
  7. Відредагуйте файл налаштувань вашого проєкту project/settings.py і в рядку ALLOWED_HOSTS = [] у квадратних дужках вкажіть в одинарних лапках адресу вашого сайту 'sub.example.com'.
  8. На сторінці з налаштуваннями веб-застосунку вкажіть команду запуску:
    python3.10 manage.py runserver 127.*.*.*:3000

    У команді замість 127.*.*.* і 3000 використовуйте IP-адресу і порт зі сторінки налаштувань веб-застосунку.

  9. Збережіть зміни, запустіть застосунок і перевірте роботу сайту.

У разі успіху на сайті має відобразитися сторінка з текстом «The install worked successfully! Congratulations!».

Вирішення проблеми зі стилями в адмін-панелі Django:

  1. Відредагуйте файл налаштувань вашого проєкту project/settings.py і після рядка STATIC_URL = 'static/' додайте такі:
    import os
    STATIC_ROOT = os.path.join(BASE_DIR, 'static')
  2. У каталозі проєкту виконайте команду:
    python manage.py collectstatic
Детальна інформація щодо роботи з Flask доступна в офіційній документації.

Запуск Flask 2.3 на Python 3.10:

  1. У розділі «Налаштування хостинг-акаунта» (або «Хостинг → Налаштування хостинг-акаунта») встановіть для Python версію 3.10 або вище та збережіть зміни.
  2. Підключіться до хостингу по SSH.
  3. Перейдіть у каталог піддомену, в якому будуть розташовані файли вашого проєкту:
    cd example.com/sub
  4. Створіть віртуальне середовище Python:
    python -m venv .venv
  5. Активуйте створене віртуальне середовище:
    source .venv/bin/activate
  6. Встановіть Flask:
    pip install --user Flask
  7. Деактивуйте віртуальне середовище:
    deactivate
  8. Створіть файл hello.py з таким вмістом (приклад «A Minimal Application» з офіційної документації):
    from flask import Flask
    
    app = Flask(__name__)
    
    @app.route("/")
    def hello_world():
        return "<p>Hello, World!</p>"
  9. На сторінці з налаштуваннями веб-застосунку вкажіть команду запуску:
    source .venv/bin/activate && python3.10 -m flask --app hello.py run --host 127.*.*.* --port 3000

    У команді замість 127.*.*.* і 3000 використовуйте IP-адресу і порт зі сторінки налаштувань веб-застосунку.

  10. Збережіть зміни, запустіть застосунок і перевірте роботу сайту.

У разі успіху на сайті відобразиться текст «Hello, World!».

Детальна інформація щодо роботи з Go доступна в офіційній документації.

Запуск простого застосунку на Go 1.20:

  1. У розділі «Налаштування хостинг-акаунта» (або «Хостинг → Налаштування хостинг-акаунта») встановіть для Go версію 1.20 або вище та збережіть зміни.
  2. Підключіться до хостингу по SSH.
  3. Перейдіть у каталог піддомену, в якому будуть розташовані файли вашого проєкту:
    cd example.com/sub
  4. Створіть файл simple.go з таким вмістом (приклад «Introducing the net/http package (an interlude)» з офіційної документації):
    package main
    
    import (
        "fmt"
        "log"
        "net/http"
    )
    
    func handler(w http.ResponseWriter, r *http.Request) {
        fmt.Fprintf(w, "Hi there, I love %s!", r.URL.Path[1:])
    }
    
    func main() {
        http.HandleFunc("/", handler)
        log.Fatal(http.ListenAndServe("127.*.*.*:3000", nil))
    }

    У рядку log.Fatal(http.ListenAndServe("127.*.*.*:3000", nil)) замість 127.*.*.* і 3000 використовуйте IP-адресу і порт зі сторінки налаштувань веб-застосунку.

  5. Скомпілюйте створений файл:
    go build simple.go
  6. Встановіть для скомпільованого файлу права 750:
    chmod 750 simple
  7. На сторінці з налаштуваннями веб-застосунку вкажіть команду запуску:
    ./simple
  8. Збережіть зміни, запустіть застосунок і перевірте роботу сайту.

У разі успіху на сайті має відображатися текст «Hi there, I love!» з назвою сторінки, до якої ви звернулися.

Зміст

    (2)

    Коментарі

    ihorkram
    Як підключити проект Django до MySQL? Що писати в налаштуваннях?
    karlov
    Зверніться в онлайн-чат, будь ласка. Треба дивитись конкретний приклад.
    ihorkram
    Насправді, я розібрався:
    1. треба створити базу даних на в розділі "Бази даних"
    2. і просто вписати її в settings.py

    DATABASES = {
    'default': {
    'ENGINE': 'mysql.connector.django',
    'NAME': 'назва бази даних - вказана в панелі керування базами даними',
    'HOST': 'localhost',
    'USER': 'юзернейм - вказаний в панелі керування базами даними',
    'PASSWORD': 'пароль - вказаний в панелі керування базами даними',
    'PORT': '3306'
    }
    }
    ihorkram
    Django - Як редарувати nginx configurations щоб по url "/static/" відкривалися файли з папки "myproject/staticfiles"?
    karlov
    Аналогічно, зверніться в онлайн-чат.
    RusAnd
    Чи йде проксування трафіку на додаток через HTTP/2? Питаю чи є сенс вмикати в golang додатку підтримку http/2 на http сервері.
    karlov
    Так, йде. Сенс вмикати є.
    RusAnd
    Роблю автоматичний деплой на хостинг. Є питання як зробити рестар додатку щоб запустилась актуальна версія бінарнику (Go).
    Чи є якісь заготовлені команди в linux щоб зробити рестарт додатку через SSH? Чи прийдеться все таки через HTTP запит на API хостингу робити перезапуск додатку?
    verliber
    Нажаль, але ні, для керування додатком потрібно використовувати API https://adm.tools/user/api/#/tab-sandbox/hosting/account/app/systemd/restart