У меня есть VPS на котором я развернул пока что 2 поекта, используя Pyramid 1.4.5 + Gunicorn + Nginx. Python я поставил в окружение (environment) и все остальные модули туда же. Но вот я хотел добавить третий и увидел ряд непонятных ошибок при попытке запустить очередной раз Pserve:
$ pserve production.ini --reload --log-file=domain3.ru-pserve.log Starting subprocess with file monitor Traceback (most recent call last): File "/var/www/eba/data/gs/env/bin/pserve", line 9, in <module> load_entry_point('pyramid==1.4.5', 'console_scripts', 'pserve')() File "/var/www/eba/data/gs/env/lib/python2.7/site-packages/pkg_resources.py", line 378, in load_entry_point return get_distribution(dist).load_entry_point(group, name) File "/var/www/eba/data/gs/env/lib/python2.7/site-packages/pkg_resources.py", line 2566, in load_entry_point return ep.load() File "/var/www/eba/data/gs/env/lib/python2.7/site-packages/pkg_resources.py", line 2260, in load entry = __import__(self.module_name, globals(),globals(), ['__name__']) File "/var/www/eba/data/gs/env/lib/python2.7/site-packages/pyramid/scripts/pserve.py", line 28, in <module> from pyramid.compat import WIN File "/var/www/eba/data/gs/env/lib/python2.7/site-packages/pyramid/compat.py", line 114, in <module> from urllib2 import urlopen as url_open File "/var/www/eba/data/gs/env/opt/Python-2.7.3/lib/python2.7/urllib2.py", line 94, in <module> import httplib File "/var/www/eba/data/gs/env/opt/Python-2.7.3/lib/python2.7/httplib.py", line 69, in <module> from array import array ImportError: /var/www/eba/data/gs/env/lib/python2.7/lib-dynload/array.so: cannot open shared object file: Too many open files in system
Для предыдущих доменов я запускал Pserve с флагом –daemon, и они отлично висят в процессах не падая. Самое интересное, что если запустить ту же команду 2-й и 3-й раз, то получаю разные ошибки:
File "/var/www/eba/data/gs/env/opt/Python-2.7.3/lib/python2.7/random.py", line 70, in <module>
import _random
ImportError: /var/www/eba/data/gs/env/lib/python2.7/lib-dynload/_random.so: cannot open shared object file: Too many open files in system
и вот такая:
File "/var/www/eba/data/gs/env/lib/python2.7/site-packages/paste/deploy/loadwsgi.py", line 3, in <module>
from __future__ import with_statement
ImportError: No module named __future__
Тоесть каждый раз ему не хватает какого то модуля, либо открыто слишком много каких то там файлов. Посещалка на обоих сайтах 0 человек в сутки. Точнее захожу только я.
Вот пример конфига Nginx для первого домена:
# $ cat cat /etc/nginx/sites-available/domain1.ru upstream domain1.ru { server 0.0.0.0:5000; server 0.0.0.0:5001; } server { listen 80; server_name www.domain1.ru domain1.ru; error_log /var/log/nginx/domain1.ru.error.log; access_log /var/log/nginx/domain1.ru.access.log; location / { try_files $uri @proxy_to_app; } location @proxy_to_app { proxy_set_header Host $http_host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; client_max_body_size 10m; client_body_buffer_size 128k; proxy_connect_timeout 60s; proxy_send_timeout 90s; proxy_read_timeout 90s; proxy_buffering off; proxy_temp_file_write_size 64k; proxy_pass http://127.0.0.1:5000; proxy_redirect off; } }
и кусок из production.ini:
mongo_uri = mongodb://localhost:27017/domain1 [server:main] use = egg:gunicorn host = 0.0.0.0 port = 5000 workers = 1 worder_class = gevent
Тоесть, как я понял Nginx слушает 80 порт и проксирует на 5000 к Gunicorn, а дальше он каким то чудесным образом общается с Pyramid. Почему там вначале два порта точно не знаю. Для второго домена соответственно я использовал такой же конфиг, только порты 5010 и 5011, для 3го - 5015 и 5016. Все эти порты свободны и я не понимаю в чем дело. Pserve просто не запускается и все, выдает каждый раз разные ошибки.
Я потом подумал о том, что для каждого домена нужно свое окружение, но это ведь бред, так как мое окружение сейчас весит 150Мб, а файлы необходимые для сайта пару сотен килобайт.