У меня есть приложение Python 3 bottle.py, которое я устанавливаю в виртуальную среду (позволяя pip автоматически получать зависимости). Я пытаюсь заставить его работать под nginx и uwsgi на моем raspberry pi.
Когда у меня запущены nginx и uwsgi, посещение http://localhost/icecrate
приводит к "uWSGI Error Python application not found". Я предполагаю, что это означает, что nginx правильно подключается к uwsgi, и именно uwsgi не может найти приложение.
Однако, если я запустил приложение с uwsgi --http 0.0.0.0:8080 /etc/uwsgi/apps-enabled/icecrate.ini
затем http://localhost:8080
дает мне приложение, которое предполагает, что конфигурация uwsgi по крайней мере адекватна.
Я несколько часов искал в Google и документах решение. Я не знаю, что я здесь делаю не так.
server {
listen 80;
server_name raspberrypi;
access_log /home/icecrate/logs/access.log;
error_log /home/icecrate/logs/error.log;
location /icecrate {
uwsgi_pass unix:///tmp/icecrate.sock;
include uwsgi_params;
}
}
[uwsgi]
vhost = true
plugins = python3
socket = /tmp/icecrate.sock
master = true
enable-threads = false
processes = 1
# this just imports the app callable and renames it to application
wsgi-file = /home/icecrate/nginx.py
# I get the same results using this method
#module = icecrate.web
#callable = app
virtualenv = /home/icecrate/env
touch-reload = /home/icecrate/reload
Я закончил тем, что уничтожил попытку и все конфиги и начал все заново, но я думаю, что понял это. я честно уверен, что это проблема с разрешениями.
По умолчанию указан nginx.conf www-data
как пользователь, от имени которого он работает, и предыдущая попытка не предприняла никаких усилий для решения этой проблемы. Все файлы принадлежали мне. Вместо того, чтобы менять пользователя по умолчанию, я создал домашнюю папку для www-data
, который теперь содержит файл icecrate virtualenv. При настройке приложения я использовал sudo -s -u www-data
для создания всего файла, чтобы у всех файлов был правильный владелец и разрешения.
Конфигурация Nginx практически такая же, за исключением того, что папка virtualenv теперь играет главную роль в сокете и регистрирует:
server {
listen 80;
server_name = raspberrypi;
access_log /home/www-data/icecrate/logs/access.log;
error_log /home/www-data/icecrate/logs/error.log;
location /icecrate {
uwsgi_pass unix:///home/www-data/icecrate/icecrate.sock;
include uwsgi_params;
}
}
Я пропустил некоторые вещи, которые казались не важными для проблемы при восстановлении ini приложения uwsgi, но это тоже по сути то же самое:
[uwsgi]
plugins = python3
socket = /home/www-data/icecrate/icecrate.sock
module = icecrate.web:app
virtualenv = /home/www-data/icecrate
touch-reload = /home/www-data/icecrate/reload
# like ngnix, uwsgi should be www-data.
uid = www-data
gid = www-data
# don't think this works, though
logto = /home/www-data/icecrate/logs/uwsgi.log
После помещения файлов конфигурации в sites-enabled
и apps-enabled
соответственно я начал nginx
и uwsgi
и указал в моем браузере на http://localhost/icecrate
и получил ошибку 404 bottle.py. Не думаю, что когда-либо в жизни был так счастлив увидеть 404-ю.