Рекомендуемое развертывание Django [закрывается]

9
задан Zack 12 February 2010 в 22:47
поделиться

4 ответа

Если вам нужна легкая альтернатива Tornado, я бы предложил порождение . Он очень хорош при перезагрузке кода и, кажется, имеет хорошую производительность - хотя, конечно, лучше всего попробовать это самостоятельно.

Я также рекомендовал бы supervisord, независимо от ОС, для поддержания Tornado или создания экземпляров в рабочем состоянии, а также для любых других важных сервисов.

Однако в 9 случаях из 10 узким местом является база данных, и выбор веб-сервера на самом деле не повлияет на производительность и масштабируемость сайта.

3
ответ дан 3 November 2019 в 01:55
поделиться

Лично я считаю, что одна из систем BSD намного превосходит дистрибутивы Linux для задач, связанных с сервером. Дайте шанс OpenBSD или, возможно, FreeBSD. Как только вы это сделаете, вы никогда не вернетесь.

0
ответ дан 3 November 2019 в 01:55
поделиться
$msg = 
   chr(0x20) // Size = 32 (4+1*28)
  . chr(0x1) // Type = 1
  . chr(0x0) // ReqI=0
  . chr(0x1) // NumC=1
    . chr(0x1) . chr(0x0) // node=1
    . chr(0x2) . chr(0x0)  // lap=2
    . chr(0x3) // puid=3
    . chr(0x5) // pos=5
    . chr(0x10) // info=16
    . chr(0x0) //sp3=0
    . chr(0x0) . chr(0x0) . chr(0x1) . chr(0x0) // x=65536
    . chr(0x0) . chr(0x0) . chr(0x2) . chr(0x0) // y=65536*2
    . chr(0x0) . chr(0x0) . chr(0x3) . chr(0x0)  // z=65536*3
    . chr(0x0) . chr(0x20) // speed=8192
    . chr(0x0) . chr(0x10) // dir=4096
    . chr(0x0) . chr(0x8) // heading=2048
    . chr(0x0) . chr(0x4) // AngVel=1024
;

$IS_MCI = unpack('CSize', $msg);
if ( strlen($msg) < $IS_MCI['Size'] ) {
  die("not enough data");
}
$IS_MCI += unpack('CType/CReqI/CNumC', substr($msg, 1));
$IS_MCI['Info'] = array();

for($i=0; $i<$IS_MCI['NumC']; $i++) {
  $data = substr($msg, 4+($i*28), 28);
  $IS_MCI['Info'][] = unpack('vNode/vLap/CPLID/CPosition/CInfo/CSp3/lX/lY/lZ/vSpeed/vDirection/vHeading/sAngVel', $data);
}
print_r($IS_MCI);

Печать

Array
(
    [Size] => 32
    [Type] => 1
    [ReqI] => 0
    [NumC] => 1
    [Info] => Array
        (
            [0] => Array
                (
                    [Node] => 1
                    [Lap] => 2
                    [PLID] => 3
                    [Position] => 5
                    [Info] => 16
                    [Sp3] => 0
                    [X] => 65536
                    [Y] => 131072
                    [Z] => 196608
                    [Speed] => 8192
                    [Direction] => 4096
                    [Heading] => 2048
                    [AngVel] => 1024
                )

        )

)

Теперь этот код делает некоторые предположения, которые, возможно, не следует воспринимать как само собой разумеющиеся (т.е. добавить гораздо больше обработки ошибок/данных для чтения).

  • Предполагается, что пакет ($ msg) был полностью прочитан до запуска кода. Может потребоваться считывание только тех частей, которые в настоящее время необходимы (тогда не требуется использование substr ()). Или, по крайней мере, будьте готовы к тому, что сообщение может прибыть несколькими порциями.
  • Он также воспринимает параметры размера/количества как само собой разумеющиеся, т.е. не проверяет, являются ли значения выполнимыми и достаточно ли данных доступно. Это определенно то, что ты должен изменить. Размер должен быть между 0... 228, NumC должен быть между 0... 8 и оба значения должны соответствовать друг другу и так далее.
  • Также ознакомьтесь с идентификаторами формата, которые я использовал при распаковке (). Для слова я использовал v , которое означает "беззнаковый короткий (всегда 16 бит, маленький порядковый номер байта ). Но для int я использовал l : «signed long (always 32 bit, machine byte order )». Это нормально на моей машине. Но найдите в документации протокола полноту данных.

Данные теста в $ msg взяты из результата

__declspec(align(1)) struct CompCar // Car info in 28 bytes - there is an array of these in the MCI (below)
{
    word    Node;       // current path node
    word    Lap;        // current lap
    byte    PLID;       // player's unique id
    byte    Position;   // current race position : 0 = unknown, 1 = leader, etc...
    byte    Info;       // flags and other info - see below
    byte    Sp3;
    int     X;          // X map (65536 = 1 metre)
    int     Y;          // Y map (65536 = 1 metre)
    int     Z;          // Z alt (65536 = 1 metre)
    word    Speed;      // speed (32768 = 100 m/s)
    word    Direction;  // direction of car's motion : 0 = world y direction, 32768 = 180 deg
    word    Heading;    // direction of forward axis : 0 = world y direction, 32768 = 180 deg
    short   AngVel;     // signed, rate of change of heading : (16384 = 360 deg/s)
};

__declspec(align(1)) struct IS_MCI // Multi Car Info - if more than 8 in race then more than one of these is sent
{
    byte    Size;       // 4 + NumC * 28
    byte    Type;       // ISP_MCI
    byte    ReqI;       // 0 unless this is a reply to an TINY_MCI request
    byte    NumC;       // number of valid CompCar structs in this packet

    CompCar Info[1];    // example: one element, fixed
};

int _tmain(int argc, _TCHAR* argv[])
{
  struct IS_MCI mci = {
    32, 1, 0, 1,
    { 1, 2, 3, 5, 16, 0, 65536, 65536*2, 65536*3, 8192, 4096, 2048, 1024 }
  };

  WSADATA wsaData;
  WORD wVersionRequested = MAKEWORD( 2, 2 );
   int err = WSAStartup( wVersionRequested, &wsaData );
  if ( err != 0 ) {
      /* Tell the user that we could not find a usable */
      /* WinSock DLL.                                  */
      return 1;
  }

  SOCKET s = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
  sockaddr_in addr; 
  addr.sin_family = AF_INET;
  addr.sin_addr.s_addr = inet_addr( "127.0.0.1" );
  addr.sin_port = htons( 8081 );
  if ( 0!=connect( s, (SOCKADDR*) &addr, sizeof(addr) ) ) {
    printf("%X ", WSAGetLastError());
    return 0;
  }
  send(s, (const char*)&mci, sizeof(mci), 0);
  shutdown(s, SD_BOTH);
  closesocket(s);
  return 0;
}
-121--4460150-

Проверьте заголовок HTTP-запроса Ссылка ваших посетителей ( $ _ SERVER ['HTTP _ REFERER'] на ph Это, в 90% всех случаев, даст вам страницу, с которой пришел ваш посетитель. Если это страница поисковой системы, то необходимо декодировать строку запроса ссылки и анализировать данные из нее (обратите внимание, что формат последовательности запроса может измениться).

Это больше работы, чем Google Analytics, и простой пример, который я привел, не дает вам столько данных; но может быть сделано, если вы не комфортно с Google делает сбор данных для вас.

-121--1885284-
  1. Обновите свой вопрос, чтобы удалить неиспользуемые варианты. Если у него есть Python 2,4, и установка - это головная боль, просто уберите его из списка и обновите вопрос, чтобы перечислить реальных кандидатов. Перечислите только те, которые действительно соответствуют вашим требованиям. (Вы не говорите, каковы ваши требования , но минимальные модернизации представляются важными.)

  2. Бросьте монету.

Выбор между двумя платформами, удовлетворяющими вашим требованиям (которые вы не определили), бросание монеты является абсолютным лучшим способом выбора.

Если вы не уверены, соответствует ли что-то вашим требованиям, часто полезно перечислить то, что вы цените. Пока единственное в вопросе, который вы, похоже, цените, - «никаких установок». Кроме того, я могу только догадываться, какие требования у вас на самом деле есть.

Определив набор функций, которые вы ищете, не стесняйтесь подбрасывать монету.

Обратите внимание, что все дистрибутивы Linux имеют более или менее одинаковую базу открытого исходного кода. Выбор среди них - предпочтение упаковке, поддержке и выбору предварительно интегрированных элементов существующей кодовой базы Linux. Просто бросай монету.

Выбор веб-фронтэндов полностью зависит от требуемых функций. Найдите все веб-фронтэнды, которые соответствуют вашим требованиям и подбросите монету, чтобы выбрать среди них.

Ни одно из этих решений не является решением о блокировке. Если вам не нравится дистрибутив Linux, который вы выбрали изначально, вы можете просто выбрать другой. Все они имеют одинаковый базовый номер люкс приложений и одинаковые API. Выбор является лишь вопросом предпочтения.

Вам не нравится выбранный веб-сервер? В конце mod _ wsgi pipe все они отображаются одинаково для вашего приложения Django (плюс или минус несколько изменений конфигурации). Не нравится Лайттпд? Переключитесь на nginx или Apache - ваше приложение Django не изменится. Так что нет никакого захвата и никаких негативных последствий, чтобы сделать неоптимальный выбор.

Когда нет риска, просто бросай монету.

4
ответ дан 3 November 2019 в 01:55
поделиться

На месте I арендовать сервер, они сократили образы Ubuntu до минимума. Предположительно потому, что им все равно пришлось создать специальный образ с правильными драйверами и тому подобным, но я точно не знаю. Они даже удалили wget и nano. Таким образом, вы получаете всю полезную информацию, а не целую кучу «печенькорезных» ОС.

Просто говорю это, потому что я могу представить, что так делают почти везде, и поэтому эксперименты с обычной установкой Ubuntu-сервера не предоставят вам нужной информации для принятия решения.

В остальном, я согласен с остальными, что это не так уж и сложно, так что вы можете просто попробовать что-нибудь.

На стороне веб-сервера я бы посоветовал взглянуть на чероки, если еще не сделал этого. Может, это и не ваша чашка джо, но попробовать ее не причинит вреда. {{1 }} Я предпочитаю простую настройку как Ubuntu, так и Cherokee. Хотя я играю со многими вещами для развлечения, я предпочитаю это для своего бизнеса. У меня есть другие дела, кроме управления серверами, поэтому любое решение, которое помогает мне делать это быстрее, просто хорошо. Если эти проекты предназначены в основном для развлечения, то это, скорее всего, неприменимо, поскольку вы не получите много опыта с помощью этих простых-установочных-с-красивым-графическим интерфейсом и-очень-полезными-мастерами

{{1 }}
3
ответ дан 3 November 2019 в 01:55
поделиться
Другие вопросы по тегам:

Похожие вопросы: