В хостинге некоторые решения могут показаться вам нестандартными.
Поэтому перед началом работы мы бы рекомендовали ознакомиться с вводной статьей.
1. Запуск Python
2. Смена версий
3. Работа с MySQL
4. Работа с Redis
5. Работа с Memcached
6. Перезапуск сервиса после изменения кода
7. Собственные настройки uwsgi
8. Работа с ошибками приложения
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"]
Изменение версии Python сбрасывает виртуальное окружение. Установленные через pip install
пакеты при смене версии удаляются.
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, а такой способ работать не будет. Поэтому рекомендуется подключение именно через сокет.
На хостинге в 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
.
Пример подключения к 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
.
Откройте настройки сайта в панели управления.
Нажмите кнопку “Перезапустить Python”.
Альтернативный вариант - подключитесь по SSH, и далее в папке с сайтом выполните команду
touch reload
Например
c3087@h2:~/mydomain-py.com$ touch reload
Создайте файл mydomain-py.com/etc/wsgi.ini ( mydomain-py.com следует изменить на имя вашего сайта).
В wsgi.ini укажите нужные вам настройками uwsgi. Стоит писать не весь конфиг целиком, а только дополнительные нужные вам опции.
После этого перезапустите uwsgi. Настройки загрузятся и применятся автоматически.
Если при обращении к сайту вы видите ошибку 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
. Последние ошибки будут в конце файла.