Nano Hash - криптовалюты, майнинг, программирование

Основное и бета-приложения WSGI

Итак, я часами осматривался, и это поставило меня в тупик.

У меня есть приложение, которое еще не запущено, и мой клиент хочет, чтобы оно было разделено на менее стабильное и более стабильное. Итак, я решил переместить версию для разработчиков в /var/www/dev, а полустабильную версию скопировать в /var/www/master (пока это не будет отлажено, полустабильная версия также находится в /var/www, чтобы не нарушать доступ слишком сильно). Идея в том, что domain.com всегда будет работать, а новые материалы/тесты будут на dev.domain.com.

Поэтому, согласно документации apache, теперь у меня есть два виртуальных хоста :

<VirtualHost _default_:443>
ServerAdmin [email protected]
DocumentRoot "/var/www/master"
ServerName domain.com
SSLEngine on
# [ssl stuff]
Header add Strict-Transport-Security "max-age=15768000"
WSGIDaemonProcess master_wsgi user=www-data group=www-data
WSGIScriptAlias /master "/var/www/master/src/main.py"
# [ Aliases .... ]
<Directory "/var/www/master/src">
  Options +ExecCGI
  AddHandler wsgi-script .py
  Order allow,deny
  Allow from all
</Directory>
<Directory "/var/www/master">
  Options +ExecCGI
  AddHandler wsgi-script .py
  Order allow,deny
  Allow from all
</Directory>
 <Location /master>
     # [HTTP auth stuff]
     WSGIProcessGroup master_wsgi
 </Location>
 # modules, cache, error directories, etc
</VirtualHost>

Затем продублировано то же самое, за исключением:

DocumentRoot "/var/www/dev"
ServerName dev.domain.com
ServerPath /dev/

и все остальные экземпляры master в псевдонимах, демоне и т. д. становятся dev (я буквально сделал replace-string). Процесс демона и группа процессов были мне преследованием другого ответа SO, который не удался из-за требования подкаталога (поскольку, по-видимому, они оба должны быть в одном VirtualHost, но я не могу указать DocumentRoot в <Location>)

Теперь, если я сделаю это, все, что я получу, это список файлов для обоих. Правильный список файлов, заметьте, но только списки файлов. Если я перейду к любому из них и изменю WSGIScriptAlias на /, где находится старая копия, он отлично работает с этим файлом python, как всегда (хотя, конечно, это означает, что материал разработчика фактически указывает на старые шаблоны, так что это нехорошо, поскольку Я не могу менять шаблоны, только скрипты, так как templateDir = os.path.realpath(os.path.dirname(os.path.realpath(__file__)) + "/../templates/") + "/" всегда /var/www/templates).

Это не ошибка, он просто дает списки файлов, поэтому он указывает в нужном месте, но WSGIScriptAlias ​​не делает то, что должен? Что мне не хватает?

Если это уместно, вот что перед соответствующим VH в httpd.conf, хотя я в этом сомневаюсь:

LoadModule wsgi_module modules/mod_wsgi.so
WSGICallableObject app
WSGIPythonHome /usr/local/bin/python
NameVirtualHost *:80
<VirtualHost *:80>
  ServerName domain.com
  Redirect permanent / https://domain.com/
## Heading ##</VirtualHost>

Ответы:


1

Если вы разделяете экземпляры с помощью VirtualHost, почему вы не хотите монтировать приложение WSGI в «/» сайта? Почему вы используете их по разным дополнительным URL-адресам?

В любом случае, у вас есть куча вещей, которые вы делаете неправильно, независимо от этого вопроса. Таким образом, основными проблемами являются:

1. Вы никогда не должны устанавливать DocumentRoot в качестве родительского каталога, в котором находится исходный код вашего веб-сайта. Это может понадобиться PHP, но не mod_wsgi. Имея свой код в DocumentRoot, вы делаете его таким, чтобы в случае ошибки конфигурации люди могли загрузить ваш исходный код. Я предполагаю, что вы этого не хотите, особенно если код содержит пароли к базе данных и другую конфиденциальную информацию.

2 - Значение WSGIPythonHome должно быть каталогом. Установка его в расположение двоичного файла Python неверна, и установка его таким образом ничего не даст, и, учитывая это, он вам, вероятно, не нужен.

3 - Вам не нужны оба:

<Directory "/var/www/master/src">
  Options +ExecCGI
  AddHandler wsgi-script .py
  Order allow,deny
  Allow from all
</Directory>
<Directory "/var/www/master">
  Options +ExecCGI
  AddHandler wsgi-script .py
  Order allow,deny
  Allow from all
</Directory>

Когда вы указываете блок Directory/Location, он также применяется к подкаталогам/URL-адресам ниже этого.

При этом вам не нужны ни ExecCGI, ни директива AddHandler.

На практике вам нужен блок Directory только для каталога, содержащего файл сценария WSGI, если у вас также нет ресурсов статических файлов.

<Directory "/var/www/master/src">
  Order allow,deny
  Allow from all
</Directory>

Обратите внимание, конечно, предупреждение о наличии вещей в DocumentRoot.

Если у вас есть статические файловые активы, вы должны использовать отдельную директиву Alias ​​для их сопоставления с каталогом, в котором они находятся, с элементами управления доступом Apache, установленными в этом конкретном каталоге по мере необходимости. Каталог статических ресурсов не должен включать ваш код, поэтому не смешивайте их, храните отдельно.

Когда вещи смонтированы в '/' для каждого сайта, тогда поможет лучшее объяснение проблемы, с которой вы столкнулись с шаблонами.

28.08.2014
  • Да, в других каталогах с псевдонимами есть статические файловые ресурсы. Путь python также является каталогом (двоичный файл — python в этом каталоге). Причина в том, что в конечном итоге каждый подкаталог по сути является зеркалом ветки git (выпуск будет иметь ряд этих организационных изменений), поэтому в идеале они должны быть полностью автономными. Следовательно, шаблоны, упомянутые в /var/www/master/src, будут ссылаться на шаблоны в /var/www/master/templates, и то же самое с dev. Идея состоит в том, чтобы посмотреть каталог main.py, а затем выбрать соответствующий шаблон. 28.08.2014
  • Хотя я полагаю, что теперь, когда вы упомянули об этом, если я оставлю приложение в /, я мог бы указать на один каталог, если он запрашивает поддомен, и на другой, если нет .... который должен быть чем-то вроде Request.host_url в webob с некоторым разделением и проверка, но я действительно хотел бы, чтобы все это было самодостаточным на данный момент (см. предостережение о выпуске выше). Это две версии одного и того же, а не два отдельных приложения — они должны вести себя именно так. 28.08.2014
  • Вы указали мне на правильный путь. Несколько чисток и мелких исправлений позже, он начал работать правильно. Спасибо! 28.08.2014
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..