Запускаем Django на uwsgi + nginx

Число проектов на сервере росло, а оперативная память не добавлялось так получилось что старый метод на большом числе проектов поедает много оперативной памяти. и вот пришло время разобраться с uwsgi – это WSGI сервер с некоторыми фенями, сам умеет пере запускаться когда обновляется код проекта (как в devserver) умеет сам убивать потомком если они начинают “тупить”.

Теперь по порядку
[cc lang=”bash”]aptitude install python-pip build-essential python-dev libxml2-dev
easy_install install uwsgi[/cc]

Для виртуал хоста используем примерно вот такой конфг, найденный на просторах тырнета

[cc lang=”bash”]
server {
listen 80;
listen 443;

# указываем свой домен
server_name odmin4eg.org www.odmin4eg.org;

# здесь мы задаем абсолютные пути к логам.
# как я упоминал уже выше, каталог с логами у меня хранится в каталоге
# с проектом, поэтому пути следующие:
access_log /home/odmin4eg.org/logs/nginx_access.log;
error_log /home/odmin4eg.org/logs/nginx_error.log;

# ниже указывается каталог с django-проектом. как я указывал выше,
# я храню его в подкаталоге www, поэтому путь такой:
root /home/odmin4eg.org/www/;

location /
{
# ниже надо указать путь к socket’у, при помощи которого
# nginx и uwsgi будут сообщаться.
# в данном случае путь это ‘/var/tmp/odmin4eg_uwsgi.sock’
uwsgi_pass unix:///var/tmp/odmin4eg_uwsgi.sock;
include uwsgi_params;

# 8 — число буфферов
# 128k — размер буфера
# фактически, мы сможем передать от Django в nginx только 1 мб информации.
# играйтесь с этим значением при поднятии своего проекта
uwsgi_buffers 8 128k;
}

# ниже описывается директория со статическими файлами проекта (css,js,etc)
# /static/ — это STATIC_URL, который вы должны посмотреть в
# в settings.py своего django проекта.
location /static/ {
# а вот здесь указываем абсолютный путь к директории со
# статическими файлами
alias /home/odmin4eg.org/www/static/;
expires 30d;
}
# Это уже у кого как статика для админки
location /media_admin {
alias /usr/local/lib/python2.6/dist-packages/django/contrib/admin/media;
}

}[/cc]

Дальше конфигурируем uwsgi – создаём файл
/home/odmin4eg.org/www/uwsgi.yaml
[cc lang=”bash”]
uwsgi:
# указываем socket, при помощи которого будет происходить
# взаимодействие между nginx и uwsgi
socket: /var/tmp/odmin4eg_uwsgi.sock
# здесь указываем путь к django-проекту
pythonpath: /home/odmin4eg.org/www
# устанавливаем переменную окружения, которая хранит имя settings файла
env: DJANGO_SETTINGS_MODULE=settings
# это имя модуля, который будет запускаться на выполнение
# в такой постановке, будет запускаться wsgi.py из директории
# указанной выше в ‘pythonpath’
module: wsgi
# путь к лог файлу
daemonize: /home/odmin4eg.org/logs/uwsgi.log
# прочие настройки, значения который можно посмотреть на сайте uWSGI
max-requests: 5000
buffer-size: 32768
harakiri: 30
reload-mercy: 8
master: 1
no-orphans: 1
# если выполнить команду “touch <имя ниже указанного файла>“,
# то произойдет перезапуск uwsgi демона.
touch-reload: /home/odmin4eg.org/uwsgi[/cc]

ну и создаём файлик который будем пинать для перезагрузки демона
[cc lang=”bash”]touch /home/odmin4eg.org/uwsgi[/cc]

ну и последнее осталось написать wsgi.py и положить его в каталог указанный в pythonpath (i.g., в /home/odmin4eg.org/www). wsgi.py выглядит до безумия просто:

[cc lang=”python”]
import django.core.handlers.wsgi
application = django.core.handlers.wsgi.WSGIHandler()[/cc]

запускаем
[cc lang=”bash”]
service nginx restart
uwsgi -y /home/odmin4eg.org/conf/uwsgi.yaml[/cc]

У меня всё поехало после этого.
по мативам kalnitsky.org

WARNING: You are launching IDE using OpenJDK Java runtime.

PyCharm ругается при запуске вот так

[cc lang=”bash”]developer-HP bin # ./pycharm.sh
OpenJDK Runtime Environment (IcedTea6 1.11pre) (6b23~pre11-0ubuntu1.11.10.1)
OpenJDK Client VM (build 20.0-b11, mixed mode, sharing)
WARNING: You are launching IDE using OpenJDK Java runtime.

THIS IS STRICTLY UNSUPPORTED DUE TO KNOWN PERFORMANCE AND GRAPHICS PROBLEMS!

NOTE: If you have both Oracle (Sun) JDK and OpenJDK installed
please validate either PYCHARM_JDK, JDK_HOME, or JAVA_HOME environment variable points to valid Oracle (Sun) JDK installation.
See http://ow.ly/6TuKQ for more info on switching default JDK

Press Enter to continue.[/cc]

Решается проблема просто
Ставим JRE
[cc lang=”bash”]apt-get install sun-java6-jdk sun-java6-jre[/cc]
и выбираем дефолтную жаву
[cc lang=”bash”]
$ sudo update-alternatives –config java
There are 2 choices for the alternative java (providing /usr/bin/java).

Selection Path Priority Status
————————————————————
* 0 /usr/lib/jvm/java-6-openjdk/jre/bin/java 1061 auto mode
1 /usr/lib/jvm/java-6-openjdk/jre/bin/java 1061 manual mode
2 /usr/lib/jvm/java-6-sun/jre/bin/java 63 manual mode[/cc]

Выбираем 2 и жмём энтер.

profit

WordPress + nginx + cache (Настройка nginx + кэширование + WP)

У nginx с версии 0.7(чёта-там) появилась функция кэширования ответов от бэкэнда.
штука крайне полезная, в условиях высоких нагрузок, но настроить на корректную работу для WP оказалось не так просто.

Но попробуем
Создаём каталог где будет храниться кэш, назначаем права работы с ним (у меня nginx работает под www-data)
[cc lang=”bash”]
mkdir /var/cache/nginx
chown www-data:www-data /var/cache/nginx/[/cc]

в файле nginx.conf
пишем[cc lang=”bash”]
## Создаем кеш зону pagecache (память под ключи в 16Мб) с настройками:
# inactive: xранить кеш 1 день (если к нему не было обращений)
# max_size: максимальный размер кеш данные 256Мб
proxy_cache_path /var/cache/nginx levels=2 keys_zone=pagecache:16m inactive=1d max_size=256m;[/cc]

теперь для нужного нам Виртуал хоста в диррективе SERVER прописываем, привожу полный конфиг своего vhost

[cc lang=”bash”]server {
listen 80;
server_name www.krasfun.ru krasfun.ru krasfan.ru www.krasfan.ru;

#access_log /var/log/nginx/krasfun/access2.log;
access_log off;
error_log /var/log/nginx/krasfun/error3.log error;

#client_max_body_size 300m
# Сетевое ускорение
tcp_nopush on;
tcp_nodelay on;

#30 одновременных коннектов
#limit_conn one 30;

index index.php;

if ($http_cookie ~* «comment_author_|wordpress_(?!test_cookie)|wp-postpass_» ) {
set $do_not_cache 1;
}

root /var/www/krasfun;

fastcgi_cache_bypass $do_not_cache;
fastcgi_no_cache $do_not_cache;
fastcgi_pass_header Cookie;
fastcgi_cache pagecache;
fastcgi_cache_key $request_method|$host|$request_uri;
fastcgi_cache_valid 301 8h;
fastcgi_cache_valid 404 1h;
fastcgi_cache_valid 200 15m;

set $Mybackend unix:/tmp/php5-fpm.sock;

location / {
try_files $uri $uri/ @wordpress;
}
# Это чтоб Админка, логинизация, и регистрация не кэшировались
location ~ ^/(wp-admin/.*\.php|wp-login\.php|wp-register\.php|(feed|comment/feed)(/.*)?)$ {
try_files $uri @wordpress;
set $do_not_cache 1;
fastcgi_cache_bypass 1;
fastcgi_no_cache 1;
fastcgi_pass $Mybackend;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_index index.php;
include /etc/nginx/fastcgi_params;
}

location ~ \.php$ {
try_files $uri @wordpress;
include /etc/nginx/fastcgi_params;
fastcgi_pass $Mybackend;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
if ($do_not_cache != «1″) {
add_header Vary Cookie;
}
}

location @wordpress {
fastcgi_pass $Mybackend;
fastcgi_param SCRIPT_FILENAME $document_root/index.php;
include /etc/nginx/fastcgi_params;
fastcgi_cache pagecache;
fastcgi_param SCRIPT_NAME /index.php;
if ($do_not_cache != “1”) {
add_header Vary Cookie;
}
}

#Static files location
location ~* ^.+.(jpg|jpeg|gif|png|ico|css|zip|tgz|gz|rar|bz2|doc|xls|exe|pdf|ppt|txt|tar|mid|midi|wav|bmp|rtf|js|html|flv|mp3)$ {
root /var/www/krasfun; }

}
[/cc]

проверяем nginx -t и перезапускам nginx

тыкаем по сайту и потом смотри что у нас появилось в /var/cache/nginx

Прирост производительности? да конечно же есть.

тест номер1
[cc lang=”bash”]
# ab -n 1000 -c 5 http://www.krasfun.ru/
This is ApacheBench, Version 2.3 <$Revision: 655654 $>
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Licensed to The Apache Software Foundation, http://www.apache.org/

Benchmarking www.krasfun.ru (be patient)
Completed 100 requests
Completed 200 requests
Completed 300 requests
Completed 400 requests
Completed 500 requests
Completed 600 requests
Completed 700 requests
Completed 800 requests
Completed 900 requests
Completed 1000 requests
Finished 1000 requests

Server Software: nginx/0.8.53
Server Hostname: www.krasfun.ru
Server Port: 80

Document Path: /
Document Length: 37725 bytes

Concurrency Level: 5
Time taken for tests: 3.577 seconds
Complete requests: 1000
Failed requests: 0
Write errors: 0
Total transferred: 37972000 bytes
HTML transferred: 37725000 bytes
Requests per second: 279.54 [#/sec] (mean)
Time per request: 17.887 [ms] (mean)
Time per request: 3.577 [ms] (mean, across all concurrent requests)
Transfer rate: 10365.83 [Kbytes/sec] received

Connection Times (ms)
min mean[+/-sd] median max
Connect: 0 2 1.0 2 6
Processing: 7 16 46.0 14 1038
Waiting: 1 3 2.1 2 26
Total: 9 18 45.9 17 1039

Percentage of the requests served within a certain time (ms)
50% 17
66% 17
75% 18
80% 18
90% 19
95% 21
98% 28
99% 31
100% 1039 (longest request)
[/cc]

Без кэширования этот тест провалился куда-то

PECL memcache extension (debian)

Для работы плагина кэширования в memcached к WordPress

написано поставить PECL memcache extension
ну чтож в тырнетах фигня всякая написана

на самом деле нам нужно 2 комманды
[cc lang=”bash”]
apt-get install memcached php5-dev php-pear
pear install -f pecl/memcache[/cc]

и в php.ini добавить
extension=memcache.so

Сколько можно заработать на sape и linkmaniya

Выкладываю свой маленький отчёт, маленький юбилей

И так, одним июльским вечером, ко мне в Асю постучался некий человек, и предложил выкупить у меня рекламу с сайта.. но в ходе обсуждения мне стало ясно, что это очередная биржа ссылок, только работает она по другому принципу, а не как в sape

В общем поддался я соблазну влезть в ещё одну биржу ссылок, с условием что я не буду убирать sape, они согласились…

в чём отличия их биржи?

да просто у меня есть площадка я её добавляю на сайт размещаю код на сайте и всё, ни цены ничего я не регулирую, просто получаю фиксированный доход.

для моего сайта это получилось 466р. в сутки, неплохо да после 150-200 саповских рублей?

ну вот прошло 3 месяца с момента старта и деньги потикали уже полноценные, по 100% тарифу.

Вот так выглядит кабинет на сайте, вот и весь функционал сайта, без всяких там лишних удобств

запоминаем цифру с картинки
37986.96 – доход с линкмании
по sape всё немного похуже, число купленных ссылок упало, доход упал со 150 до 120-130р в сутки.

запоминаем циферку с сапы
64 160,87сапа

37986.96 + 64 160,87 = 102 146
Неплохо для пассивного дохода верно?

на скриншотах сайт я не замазывал, вот такой он у меня 😉

PS и ещё, вы наверное заметили что ссылки на сапу у меня пригласительные, ведь сапа чуть чуть доплачивает за новых приведённых пользователей

Партнерское вознаграждение составляет 2,5% от оборота привлеченного пользователя (т.е. и от сделок покупки и от сделок продажи).

и показываю вам статистику, она смешная, но ведь бложик у меня то не сеошный и не манимейкерский, а админский и читатель тут может быть совершенно случайный, но всёже.
100р. мне принёс какой-то господин 😉

Всем спасибо 😉