№2 Путь python. Запуск python скрипта, настройка nginx + uwsgi + python + virtualenv

В системе должен быть установлен модуль 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! фразу.

2 comments on “№2 Путь python. Запуск python скрипта, настройка nginx + uwsgi + python + virtualenv

  1. Dmitry 01.12.2015 00:04

    А далее что писать в этот wsgi.py ?
    Импортировать модули и классы писать?
    Как получать инфу из запроса браузера? и т.д.
    Обьясните для чайников или дайте ссылку

  2. admin 01.12.2015 11:06

    Если честно – уже год как закинул и не продолжил изучение python 3.
    По памяти, как видите в функции application передается две переменные:
    def application(environ, start_response)
    Вот из переменной environ (там какой-то массив или словарь) можо достать все данные запроса, url, метод и т.д. Попробуйте сразу в скрипте для себя вывести полснотью все что есть в переменной environ, чтобы понимать что оттуда можно достать.

    То есть, мы должны разбирать uri запроса и уже по ссылке грузить нужное приложение или функцию. Проще всего разбирать ссылки(uri) через regex как и реализован давно велосипед в django фреймворке.

    Итого у меня получилось вот так, Есть переменная URL которая содержит реглярки для какого uri какокую функцию запускать:

    urls = [
    (r’^$’, home),
    (r’^whois$’, whois),
    (r’^ping$’, pingpage),
    (r’^ping/run$’, ping),
    (r’^traceroute$’, traceroutepage),
    (r’^traceroute/run$’, traceroute),
    (r’^nslookup$’, nslookuppage),
    (r’^nslookup/run$’, nslookup),
    ]

    Дальше вот функция application которая запускается по умолчанию:

    def application(environ, start_response):
    path = environ.get(‘PATH_INFO’, ”).lstrip(‘/’)
    for regex, callback in urls:
    match = re.search(regex, path)
    if match is not None:
    environ[‘myapp.url_args’] = match.groups()
    return callback(environ, start_response)
    return not_found(environ, start_response)

    Что там происходит:
    Как видно из environ достаем и вырезаем uri запроса:
    environ.get(‘PATH_INFO’
    Дальше через regex сверяем или прописана такая ссылка у переменной url. Если прописана – запускаем соответствующую функцию указанную в url переменно.

    Например, ссылка у нас _http://ДОМЕН/ попадает под регулярку корневой страницы:
    (r’^$’, home),
    Значит запускается при этом функция home() которая у меня выглядит вот так:

    def home(environ, start_response):
    start_response(“200 OK”, [])
    template = templ_dir.get_template(‘base.html’)
    return [template.render().encode()]

    Я там использовал шаблонизатор jinja2, потому грузится вот нужный темлейт base.html

    Как-то так … весь этот велосипед уже давно реализован в популярном фреймворке django. Но было интересно понимать как это все происходит на уровне чистого python.

    В начале файла ессно импортировал нужные модули для моих функций:

    import sys
    import os
    import re
    from urllib.parse import parse_qs
    from cgi import escape
    from jinja2 import Environment, FileSystemLoader
    from subprocess import Popen, PIPE
    from ipaddress import ip_address

    Ну и тут уже понимая принцип можно играть как угодно, например разложить функции по папкам как отдельные приложения чтобы было удобно и указывать путь к ним.

    P.S. постарался объяснить в меру своего понимая 🙂 дайте знать или на этом уровне доступно или не очень получилось 😉

Leave a Reply

Your email address will not be published.

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>