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