Как работает Python

Хостинг - как работает Python

В хостинге некоторые решения могут показаться вам нестандартными.
Поэтому перед началом работы мы бы рекомендовали ознакомиться с вводной статьей.

1. Запуск Python
2. Смена версий
3. Работа с MySQL
4. Работа с Redis
5. Работа с Memcached
6. Перезапуск сервиса после изменения кода
7. Собственные настройки uwsgi
8. Работа с ошибками приложения

1. Запуск Python

Python запускается через WSGI. Для работы сайта предоставляется 4 процесса (processes), на каждый процесс 2 потока (threads).

1.1 При создании сайта необходимо выбрать, что сайт работает на Python:

Настройки

1.2 Загрузить файлы сайта можно подключившись по SFTP.

Файлы вашего приложения можно расположить в каталоге sitename/app , а статические файлы (.css, .jpg, .png и другие) - в каталоге sitename/static.

1.3 Далее нужно указать файл для запуска вашего приложения. Этот файл может называться wsgi.py (если вы используете Django), или любым другим образом (main.py, projectname.py и т.д.).

Откройте настройки сайта в панели управления и в параметре APP_PATH укажите путь до файла для запуска, аналогично тому, как это сделано на скриншоте ниже:

Настройки

1.4 В параметре APPLICATION укажите объект, с которого вебсервер начнет обрабатывать код вашего сайта. В Django он называется application. В Flask название такого объекта не стандартизировано. В каждом проекте он может называться по разному.

К примеру, в приложении

from flask import Flask
app = Flask(__name__)

@app.route("/")
def hello():
    return "Hello World!"

if __name__ == "__main__":
    app.run()

В строке app = Flask(__name__) создается экземпляр сервера Flask в переменной app. Именно она нам и нужна.

А значит в панели управления нужно будет указать APPLICATION=app.


Установка пакетов и отладка сайта

Управлять проектом можно подключившись по SSH.

После входа на сервер по SSH можно, например, установить необходимые для работы вашего сайта пакеты.

Для каждого сайта уже создано индивидуальное виртуальное окружение. Свое собственное виртуальное окружение создавать не требуется.

При установке пакетов через pip install сначала перейдите в каталог с сайтом и виртуальное окружение активируется автоматически:

c3087@h2:~$
c3087@h2:~$ cd mydomain-py.com/
(mydomain-py.com/env:python3.7)c3087@h2:~/mydomain-py.com$

Далее можно установить нужные расширения:

(mydomain-py.com/env:python3.7)c3087@h2:~/mydomain-py.com$ pip install Flask

Для отладки можно запустить любой скрипт, выполнив его напрямую:

(mydomain-py.com/env:python3.7)c3087@h2:~/mydomain-py.com$ python app/somescript.py

По умолчанию в app/wsgi.py уже загружен файл, который при обращении через браузер выводит “Hello world!”.

def application(env, start_response):
    start_response('200 OK', [('Content-Type','text/html')])
    return [b"Hello world!\n"]

2. Смена версий Python

Изменение версии Python сбрасывает виртуальное окружение. Установленные через pip install пакеты при смене версии удаляются.

3. Работа с MySQL

MySQL доступен только через сокет /run/mysqld/mysqld.sock и недоступен по сети. Но большинство приложений будут обращаться именно к сокету при подключении через localhost.

Рассмотрим блок подключения к MySQL в Django. Можно в качестве хоста использовать сокет:

'ENGINE': 'django.db.backends.mysql',
        'HOST': '/var/run/mysqld/mysqld.sock',
        'NAME': 'cxxx_pythonmysql_ru',
        'USER': 'cxxx_pythonmysql_ru',
        'PASSWORD': 'WoHtePamnevdjaf63',

Или localhost:

'ENGINE': 'django.db.backends.mysql',
        'HOST': 'localhost',
        'NAME': 'cxxx_pythonmysql_ru',
        'USER': 'cxxx_pythonmysql_ru',
        'PASSWORD': 'WoHtePamnevdjaf63',

Будут работать оба варианта.

Однако некоторые приложения при подключении через localhost обращаются только к сети по 127.0.0.1, а такой способ работать не будет. Поэтому рекомендуется подключение именно через сокет.

4. Работа с Redis

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

Перейдем в каталог с сайтом, чтобы устанавить пакет для определенного сайта

cd ~/mydomain-py.com

Установим драйвер для работы с redis

pip install redis
#!/usr/bin/env python

import redis

r = redis.StrictRedis(host='localhost', port=6379, db=0)

r.set('ProtossAirUnits', 'Observer,Shuttle,Scout,Carrier,Carrier\'sInterceptor,Arbiter,Corsair')

print(r.get('ProtossAirUnits'))

Сохраним этот код в файл app/sc1units2redis.py и разместим в каталоге с сайтом.

После подключения по SSH можно вручную запустить app/sc1units2redis.py.

Перейдем в каталог с сайтом, чтобы запускать app/sc1units2redis.py в окружении для определенного сайта

cd ~/mydomain-py.com
(mydomain-py.com/env:python3.7)c3087@h2:~/mydomain-py.com$ python app/sc1units2redis.py
b"Observer,Shuttle,Scout,Carrier,Carrier'sInterceptor,Arbiter,Corsair"

В данном случае мы получили значение ключа ProtossAirUnits.

5. Работа с Memcached

Пример подключения к Memcached и сохранения данных на 15 секунд.

#!/usr/bin/env python

import memcache
client = memcache.Client([('127.0.0.1', 11211)])
sample_obj = {"name": "Soliman",
"lang": "Python"}
client.set("sample_user", sample_obj, time=15)
print("Stored to memcached, will auto-expire after 15 seconds")
print(client.get("sample_user"))

Сохраним этот код в файл app/mem.py и разместим в каталоге с сайтом.

После подключения по SSH можно вручную запустить app/mem.py.

Перейдем в каталог с сайтом, чтобы запускать app/mem.py в окружении для определенного сайта

cd ~/mydomain-py.com
(mydomain-py.com/env:python3.7)c3087@h2:~/mydomain-py.com$ python app/mem.py
Stored to memcached, will auto-expire after 15 seconds
{'name': 'Soliman', 'lang': 'Python'}

В данном случае мы получили значение ключа sample_user.

6. Перезапуск сервиса после изменения кода сайта

Откройте настройки сайта в панели управления.

Нажмите кнопку “Перезапустить Python”.

Альтернативный вариант - подключитесь по SSH, и далее в папке с сайтом выполните команду

touch reload

Например

c3087@h2:~/mydomain-py.com$ touch reload

7. Собственные настройки uwsgi

Создайте файл mydomain-py.com/etc/wsgi.ini ( mydomain-py.com следует изменить на имя вашего сайта).

В wsgi.ini укажите нужные вам настройками uwsgi. Стоит писать не весь конфиг целиком, а только дополнительные нужные вам опции.

После этого перезапустите uwsgi. Настройки загрузятся и применятся автоматически.

8. Работа с ошибками приложения

Если при обращении к сайту вы видите ошибку 502 Bad Gateway, то:

Нас интересуют параметры APP_PATH и APPLICATION.

* Проверьте, что в APP_PATH путь до wsgi.py указан аналогично тому, как на скриншоте ниже:

В параметре APPLICATION укажите объект, с которого вебсервер начнет обрабатывать код вашего сайта. В Django он называется application. В Flask название такого объекта не стандартизировано. В каждом проекте он может называться по разному.

К примеру, в приложении

from flask import Flask
app = Flask(__name__)

@app.route("/")
def hello():
    return "Hello World!"

if __name__ == "__main__":
    app.run()

В строке @app.route("/") видно, что нужный нам объект будет называться app.

А значит в панели управления нужно будет указать APPLICATION=app.

После этого нажмите кнопку “Перезапустить Python” в верхней части страницы. Попробуйте открыть ваш сайт еще раз.

По-прежнему 502 Bad Gateway? Тогда стоит обратиться к логам ошибок.

Подключитесь к серверу по SFTP.

Посмотрите файл имя_сайта/log/wsgi-runlog/current. Последние ошибки будут в конце файла.

Хостинг
Хостинг
Хостинг
Создавайте неограниченное количество сайтов в изолированных контейнерах
С 2003 года
Надежность.
Нам доверяют десятки тысяч компаний и разработчиков
20 лет
Предоставляем услуги профессионального хостинга
35 000
Клиентов доверяют нам размещение своих сайтов
99.99%
Подтвержденный uptime
наших серверов хостинга
Наши клиенты
Наши клиенты
Наши клиенты
Наши клиенты
Наши клиенты
Наши клиенты
Наши клиенты
Наши клиенты
Наши клиенты
Наши клиенты
Наши клиенты
Наши клиенты
Наши клиенты
Наши клиенты
Наши клиенты
Наши клиенты
Наши клиенты
Наши клиенты
Наши клиенты
Наши клиенты
Наши клиенты
Наши клиенты
Наши клиенты
Наши клиенты
Наши клиенты
Наши клиенты
Наши клиенты
Наши клиенты
Наши клиенты
Наши клиенты
Наши клиенты
Наши клиенты
Наши клиенты
Наши клиенты
Наши клиенты
Наши клиенты
ВК49865