В системе должен быть установлен модуль python virtualenv, если не установлен ставим:
pip install virtualenv -U
или
pip3.3 install virtualenv -U
создаем пользователя и виртуальную среду python (virtualenv)
useradd -m -s /bin/bash pyuser1
chmod 750 /home/pyuser1
chgrp www-data /home/pyuser1 # или chgrp nginx (надо менять группу папки на пользователя под которым запускается nginx)
su - pyuser1
virtualenv-3.3 /home/pyuser1/.venv
в файлы .bashrc и .bash_profile пользователя добавляем активацию среды python (под пользователем pyuser1):
echo ". " ~/".venv/bin/activate" >> ~/.bashrc
echo ". " ~/".venv/bin/activate" >> ~/.bash_profile
перелогиниться под пользователем или активировать вручную среду python:
. ~/.venv/bin/activate
создаем папку где будут размещаться python скрипты:
mkdir /home/pyuser1/project1
пишем тестовый скрипт в файл /home/pyuser1/project1/wsgi.py:
def application(environ, start_response):
status = '200 OK'
response_headers = []
start_response(status, response_headers)
template = templ_dir.get_template('base.html')
response_body = 'Hello World!'
return [response_body.encode()]
Установка сервера приложений uwsgi
pip install uwsgi -U
mkdir /home/pyuser1/logs #создадим папку для лог-файлов
конфиг для запуска uwsgi в файл /home/pyuser1/project1/uwsgi.xml
<uwsgi>
<socket>/tmp/project1.sock</socket>
<home>/home/pyuser1/project1/</home>
<master/>
<daemonize>/home/pyuser1/logs/project1-daemon.log</daemonize>
<pidfile>/home/pyuser1/logs/project1-uwsgi.pid</pidfile>
<uid>project1</uid>
<gid>project1</gid>
<wsgi-file>/home/pyuser1/project1/wsgi.py</wsgi-file>
<processes>2</processes>
<logdate/>
<logto>/home/pyuser1/logs/project1-uwsgi.log</logto>
</uwsgi>
запуск uwsgi
uwsgi -x /home/pyuser1/project1/uwsgi.xml
Установка настройка nginx
yum install nginx # в Centos
apt-get install nginx # в Debian
в файл /etc/nginx/nginx.conf добавляем vhost нашего приложения:
server {
listen IP:80;
server_name project1-domain.com;location / {
uwsgi_pass unix:/tmp/cpapi.sock;
include uwsgi_params;
gzip on;
}
}
перезапускаем nginx (service nginx reload) и проверяем по домену или по IP должно вывести Hello World! фразу.
А далее что писать в этот wsgi.py ?
Импортировать модули и классы писать?
Как получать инфу из запроса браузера? и т.д.
Обьясните для чайников или дайте ссылку
Если честно – уже год как закинул и не продолжил изучение python 3.
По памяти, как видите в функции application передается две переменные:
def application(environ, start_response)
Вот из переменной environ (там какой-то массив или словарь) можо достать все данные запроса, url, метод и т.д. Попробуйте сразу в скрипте для себя вывести полснотью все что есть в переменной environ, чтобы понимать что оттуда можно достать.
То есть, мы должны разбирать uri запроса и уже по ссылке грузить нужное приложение или функцию. Проще всего разбирать ссылки(uri) через regex как и реализован давно велосипед в django фреймворке.
Итого у меня получилось вот так, Есть переменная URL которая содержит реглярки для какого uri какокую функцию запускать:
Дальше вот функция application которая запускается по умолчанию:
Что там происходит:
Как видно из environ достаем и вырезаем uri запроса:
environ.get(‘PATH_INFO’
Дальше через regex сверяем или прописана такая ссылка у переменной url. Если прописана – запускаем соответствующую функцию указанную в url переменно.
Например, ссылка у нас _http://ДОМЕН/ попадает под регулярку корневой страницы:
(r’^$’, home),
Значит запускается при этом функция home() которая у меня выглядит вот так:
Я там использовал шаблонизатор jinja2, потому грузится вот нужный темлейт base.html
Как-то так … весь этот велосипед уже давно реализован в популярном фреймворке django. Но было интересно понимать как это все происходит на уровне чистого python.
В начале файла ессно импортировал нужные модули для моих функций:
Ну и тут уже понимая принцип можно играть как угодно, например разложить функции по папкам как отдельные приложения чтобы было удобно и указывать путь к ним.
P.S. постарался объяснить в меру своего понимая 🙂 дайте знать или на этом уровне доступно или не очень получилось 😉