Я использовал nginx-full
вместо nginx-extras
из-за этой самой проблемы. Я бегу 14.10, потому что я хочу Postgres 9.4.
Я продолжал получать кучу странных ошибок, и я случайно продолжал следовать указаниям Пассажира, следуя инструкциям APT. Упс. Поэтому я изначально следовал ответу @ Maciej-adamczewski, но он добавляет пассажирскую установку Debian 7 вместо установки Ubuntu 14.04. Это испортило меня.
Вот что я сделал, чтобы отсортировать меня:
sudo apt-mark showhold # apparently I had nothing in here
sudo apt-get autoclean
sudo apt-get update && sudo apt-get upgrade
# I hoped upgrade would get rid of that error re: nginx-extras
# it didn't at all, so decided to scrap and start over
sudo apt-get purge nginx* # to get rid of everything nginx
sudo apt-get remove nginx* # paranoia
sudo apt-get purge passenger
sudo apt-get remove passenger # paranoia again
sudo apt-get autoremove
sudo apt-get update
sudo apt-get install nginx-full passenger
Бум! Получил nginx для правильной работы.
Это не говорит о части Digital Ocean, но если вы установили RVM вместо ruby напрямую, вам нужно выяснить, где находится ваш rvm ruby:
rvm use
passenger-config --ruby-command
И затем скопируйте и вставьте информацию nginx с надписью passenger_ruby /usr/local/...
и переопределите исходную строку passenger_ruby в вашем файле /etc/nginx/nginx.conf
.
Позже, когда вы создаете сайты, убедитесь, что вы добавили в passenger_enabled on;
в блоке своего сервера для nginx!
mad props этому чуваку: Настройка рельсов на DO
You could probably (ab?)use a bloom filter for something like this.
Предполагая, что адреса IPv4, существует пространство поиска 2 32 . Вам нужно не более 1 бита на IP-адрес (0 == без посещения, 1 == посещение). Без учета накладных расходов на хранилище для этого потребуется 512 МБ (2 29 ). Таким образом, в упрощенной реализации будет выделен массив размером 512 МБ (или таблица с 2 29 строками, каждая из которых хранит байт, или 2 27 строк, каждая из которых хранит 32-разрядное целое число, или 2 26 строк, каждая из которых хранит 64-битное целое число, или ...)
Вы можете оптимизировать это для разреженного населения, превратив его в дерево.
Определите размер «страницы» для 2 x бит. Вы будете выделять память для одной страницы за раз.
Разделите пространство поиска (2 32 ) на размер вашей страницы. Это общее количество страниц, необходимых для представления всех возможных адресов в вашем пространстве поиска.
Затем, чтобы определить, есть ли совпадение в вашем хэше, вы сначала определите, присутствует ли страница, и если да, то установлен соответствующий бит на странице. Чтобы кэшировать адрес, вы сначала определите, присутствует ли страница; если нет, вы создадите это. Затем вы установите соответствующий бит.
Это довольно легко преобразуется в таблицу базы данных. Вам понадобится всего два столбца: индекс страницы и двоичный массив. Когда вы выделяете страницу, вы просто сохраняете строку в таблице с правильным индексом страницы и пустым двоичным массивом.
Например, для размера страницы 1024 бит (что дает максимум 2 22 страниц), вы можете структурировать свою таблицу следующим образом:
CREATE TABLE VisitedIPs(
PageIndex int NOT NULL PRIMARY KEY,
PageData binary(128) NOT NULL
)
Чтобы проверить, посещался ли IP-адрес, вы должны использовать код, похожий на (псевдокод):
uint ip = address.To32Bit();
string sql =
"SELECT PageData " +
"FROM VisitedIPs " +
"WHERE PageIndex = " + (ip >> 10);
byte[] page = (byte[])GetFromDB(sql);
byte b = page[(ip & 0x3FF) >> 3];
bool hasVisited = (b & (1 << (ip & 7)) != 0;
Настройка посещенного IP-адреса аналогична:
uint ip = address.To32Bit();
string sql =
"SELECT PageData " +
"FROM VisitedIPs " +
"WHERE PageIndex = " + (ip >> 10);
byte[] page = (byte[])GetFromDB(sql);
page[(ip & 0x3FF) >> 3] |= (1 << (ip & 7));
sql =
"UPDATE VisitedIPs " +
"SET PageData = @pageData " +
"WHERE PageIndex = " + (ip >> 10);
ExecSQL(sql, new SqlParam("@pageData", page));
Все операции хеширования выполняются с потерями в силу принципа сундука . Вы неизбежно пытаетесь втиснуть N вещей в M слотов (где N >> M). Все, что вам нужно сделать, это просто не обрабатывать случаи коллизии и выбрать достаточно большую хеш-таблицу.
Sure! Decide how many "bins" you can afford (at one bit each), say N; hash the IP address to a string of bits B; take B modulo N. You can compute the probability of accidental collisions (with some approximation, such as, assume all hashed IP addresses form equally likely bitstrings B) and determine N accordingly if you have a constraint on maximum accidental collision probability that's acceptable for your application.
Integer (ipv4) or string (ipv6) hashing without collision handling, using the hash-value (modulo hash table size) as the index to a bitmap-array.
Начать усечение битов.
Вероятность хеш-коллизии становится 50%, когда у вас есть 2 ^ (n / 2) элементов из возможных 2 ^ n. IP-адрес - 2 ^ 32, поэтому вероятность столкновения составляет 50%, если в контейнере находится 2 ^ 16 элементов.
Уменьшайте, как вам удобно.