Ошибки Django и fcgi и mod_fcgid
Хорошо, я исчерпал эту проблему на моем общем сервере в Bluehost, и я не смог найти никаких идей.
Я загрузил свое приложение, и все, кажется, работает нормально, за исключением одной вещи, загрузчик фотографий, который я использую (который является ядром сайта). Я использую приложение stdimage2 Django (форк stdimage), и оно отлично работало на сервере разработки (Ubuntu 10.04). Но сейчас у него серьезные проблемы, и я ищу любые возможные идеи или предположения о вещах, которые мне не хватает.
Вот ошибки, которые выводятся на печать (это связано с тем, что загрузчик отправляет четыре изображения в виде отдельных запросов один за другим):
[Wed Dec 21 09:47:03 2011] [warn] [client 128.187.97.6] (104)Connection reset by peer: mod_fcgid: error reading data from FastCGI server, referer: http://gallery.fernstenfamily.com/backend/upload/1/
[Wed Dec 21 09:47:03 2011] [error] [client 128.187.97.6] Premature end of script headers: mySite.fcgi, referer: http://gallery.fernstenfamily.com/backend/upload/1/
[Wed Dec 21 09:47:03 2011] [warn] RewriteCond: NoCase option for non-regex pattern '-f' is not supported and will be ignored.
[Wed Dec 21 09:47:03 2011] [warn] [client 128.187.97.6] (104)Connection reset by peer: mod_fcgid: error reading data from FastCGI server, referer: http://gallery.fernstenfamily.com/backend/upload/1/
[Wed Dec 21 09:47:03 2011] [error] [client 128.187.97.6] Premature end of script headers: mySite.fcgi, referer: http://gallery.fernstenfamily.com/backend/upload/1/
[Wed Dec 21 09:47:04 2011] [warn] [client 128.187.97.6] (104)Connection reset by peer: mod_fcgid: error reading data from FastCGI server, referer: http://gallery.fernstenfamily.com/backend/upload/1/
[Wed Dec 21 09:47:04 2011] [error] [client 128.187.97.6] Premature end of script headers: mySite.fcgi, referer: http://gallery.fernstenfamily.com/backend/upload/1/
[Wed Dec 21 09:47:05 2011] [error] mod_fcgid: process /home3/fernsten/public_html/ffamily/gallery/mySite.fcgi(22492) exit(communication error), get unexpected signal 11
Вот как выглядит мой fcgi-файл:
#!/home3/fernsten/local/Python-2.7/bin/python
import sys, os
print "sys.path is ", sys.path
#add a custom Python path and pray it works dddd
sys.path.insert(0, "/home3/fernsten/local/lib/python2.7/site-packages")
sys.path.insert(0, "/home3/fernsten/local/lib/python2.7")
sys.path.insert(0, "/home3/fernsten/local/lib/python2.7/site-packages/flup-1.0.2-py2.7.egg")
sys.path.insert(0, "/home3/fernsten/django_projects")
sys.path.insert(0, "/home3/fernsten/django_projects/gallery")
sys.path.insert(0, "/home3/fernsten/local/lib/python2.7/site-packages/MySQL_python-1.2.3- py2.7-linux-x86_64.egg")
os.chdir("/home3/fernsten/django_projects/gallery")
os.environ['DJANGO_SETTINGS_MODULE'] = "gallery.settings"
from django.core.servers.fastcgi import runfastcgi
runfastcgi(method="threaded", daemonize="false")
И, наконец, вот функция, где он умирает:
if request.method == 'POST':
result = []
newform = Photo()
newform.image= request.FILES.get('file')
newform.album=Album.objects.get(pk=album_pk)
newform.save()
result.append({"name":"Uploaded image",
"size":newform.image.size,
"url":MEDIA_URL + newform.image.url,
"thumbnail_url": newform.image.url.replace(".",".thumbnail."),
"delete_url":'/backend/delete_img/' + str(newform.pk)+'/',
"delete_type":"POST",
})
response_data = simplejson.dumps(result)
return HttpResponse(response_data, mimetype='application/json')
return render_to_response('backend/upload_images.html',{'album_pk':album_pk},context_instance=RequestContext(request))
Я вполне уверен, что это происходит в этой области, потому что когда я выполняю newform.save() stdimage2 делает вещи в фоновом режиме, такие как переименование загруженного изображения и создание и присвоение имени миниатюре. Изображение переименовывается, но миниатюра не создается.
Любые идеи были бы потрясающими, так как я не смог найти много о том, что может быть не так.
ОБНОВИТЬ
Я также не могу загрузить изображение с помощью интерфейса администратора в Django. Ну, я могу загрузить изображение, но оно ломается в этот момент. StdImage2 изменяет имя загруженных изображений в соответствии с определением модели, но не создает миниатюру. В базе данных хранится URL-адрес изображения с именем загруженного изображения, а не сгенерированного.
Чтобы покрыть все мои базы, я скопировал файлы с сервера и запустил его локально без каких-либо проблем. Что только вызвало больше путаницы и разочарования.
ОБНОВЛЕНИЕ 2
После использования оболочки Django и такой попытки (по крайней мере, я надеюсь, что я сделал это правильно, я получаю следующую ошибку:
image = Image.open('/home3/fernsten/www/ffamily/media/media/albums/1/image_1.jpeg')
>>> newform.image = image
>>> newform.album = Album.objects.get(pk=1)
>>> newform.save()
Traceback (most recent call last):
File "<console>", line 1, in <module>
File "/home3/fernsten/local/lib/python2.7/site-packages/django/db/models/base.py", line 460, in save self.save_base(using=using, force_insert=force_insert, force_update=force_update)
File "/home3/fernsten/local/lib/python2.7/site-packages/django/db/models/base.py", line 543, in save_base for f in meta.local_fields if not isinstance(f, AutoField)]
File "/home3/fernsten/local/lib/python2.7/site-packages/django/db/models/fields/files.py", line 253, in pre_save
if file and not file._committed:
File "/home3/fernsten/local/lib/python2.7/site-packages/PIL/Image.py", line 512, in __getattr__
raise AttributeError(name)
AttributeError: _committed
1 ответ
Кажется, где-то произошла ошибка сегментации - в соответствии с последней строкой в вашем журнале ошибок. Этого не должно происходить с кодом Python, поэтому я бы начал с просмотра кода stdimage2, чтобы узнать, что там еще есть.
Быстрое изучение исходного кода показывает, что это все Python, и что единственная внешняя библиотека, от которой он зависит, - это PIL. PIL - это библиотека C (по крайней мере, ее часть), поэтому возможно, что именно здесь происходит ошибка, особенно если, как вы говорите, поля переименованы, но изображения с измененным размером не создаются.
Как PIL был установлен на сервере? Если он был установлен через менеджер пакетов или скомпилирован прямо на самом сервере, то может потребоваться его обновить или перекомпилировать. Если вы скопировали модуль со своего компьютера разработчика, то там может возникнуть конфликт (разные библиотеки, другая архитектура процессора и т. Д.)
Другой способ устранения неполадок - это использование оболочки Python, а не через веб-интерфейс. Попробуйте загрузить модель и активировать функцию save(), которая, похоже, не работает. Если оболочка завершается с ошибкой сегментации, попробуйте снова, но на этот раз пошагово с отладчиком. (Я бы на самом деле установил точку останова pdb на StdImageField._resize_image и запускал код, пока он не достигнет этой точки останова.)
Я не думаю, что есть более простой способ отладить это; Кажется, в вашем коде нет ничего очевидного, что могло бы вызвать его, так что это выглядит как-то на самом сервере.