Điều này bắt đầu cắn ass của chúng tôi trên máy chủ sản xuất của chúng tôi thực sự khó khăn. Chúng tôi thấy điều này thỉnh thoảng (đối với 1 yêu cầu mỗi tuần). Quay lại sau đó chúng tôi phát hiện ra nó là do mod_wsgi làm một số công cụ sôi nổi trong một số cấu hình. Vì chúng tôi không thể theo dõi lý do của lỗi, chúng tôi quyết định rằng nó không yêu cầu sự chú ý ngay lập tức.lỗi mod_wsgi - lớp .__ dict__ không thể truy cập trong chế độ hạn chế
Tuy nhiên hôm nay, trên 1 máy chủ sản xuất của chúng tôi, điều này thực sự xảy ra với 10% tất cả các yêu cầu máy chủ; đó là 10% của tất cả các yêu cầu máy chủ thất bại với lỗi này rất giống nhau:
mod_wsgi (pid=1718): Target WSGI script '/installation/dir/our-program/prod-dispatch.wsgi' cannot be loaded as Python module.
mod_wsgi (pid=1718): Exception occurred processing WSGI script '/installation/dir/our-program/prod-dispatch.wsgi'.
Traceback (most recent call last):
File "/installation/dir/our-program/prod-dispatch.wsgi", line 7, in <module>
from pyramid.paster import get_app
File "/installation/dir/venv/local/lib/python2.7/site-packages/pyramid-1.3a6-py2.7.egg/pyramid/paster.py", line 12, in <module>
from pyramid.scripting import prepare
File "/installation/dir/venv/local/lib/python2.7/site-packages/pyramid-1.3a6-py2.7.egg/pyramid/scripting.py", line 1, in <module>
from pyramid.config import global_registries
File "/installation/dir/venv/local/lib/python2.7/site-packages/pyramid-1.3a6-py2.7.egg/pyramid/config/__init__.py", line 61, in <module>
from pyramid.config.assets import AssetsConfiguratorMixin
File "/installation/dir/venv/local/lib/python2.7/site-packages/pyramid-1.3a6-py2.7.egg/pyramid/config/assets.py", line 83, in <module>
@implementer(IPackageOverrides)
File "/installation/dir/venv/local/lib/python2.7/site-packages/zope.interface-3.8.0-py2.7-linux-x86_64.egg/zope/interface/declarations.py", line 480, in __
classImplements(ob, *self.interfaces)
File "/installation/dir/venv/local/lib/python2.7/site-packages/zope.interface-3.8.0-py2.7-linux-x86_64.egg/zope/interface/declarations.py", line 445, in cl
spec = implementedBy(cls)
File "/installation/dir/venv/local/lib/python2.7/site-packages/zope.interface-3.8.0-py2.7-linux-x86_64.egg/zope/interface/declarations.py", line 285, in im
spec = cls.__dict__.get('__implemented__')
RuntimeError: class.__dict__ not accessible in restricted mode
Ubuntu Precise, 64bit, với mới nhất Apache, mod_wsgi, Python 2.7, sử dụng mpm_worker + mod_wsgi trong daemon chế độ. Đây là chương trình duy nhất chạy trên máy chủ và chỉ có một trình thông dịch wsgi trong cấu hình. Đây có phải là do mpm_worker sinh ra chủ đề mới hay không? Quan trọng hơn - làm cách nào để khắc phục nó.
Chúng tôi có những điều sau đây để chia nhỏ các yêu cầu cho 4 quy trình daemon dựa trên cookie.
WSGIPythonOptimize 1
WSGIDaemonProcess sticky01 processes=1 threads=16 display-name=%{GROUP}
WSGIDaemonProcess sticky02 processes=1 threads=16 display-name=%{GROUP}
WSGIDaemonProcess sticky03 processes=1 threads=16 display-name=%{GROUP}
WSGIDaemonProcess sticky04 processes=1 threads=16 display-name=%{GROUP}
<VirtualHost *:81>
...
WSGIRestrictProcess sticky01 sticky02 sticky03 sticky04
WSGIProcessGroup %{ENV:PROCESS}
...
WSGIScriptAlias//installation/dir/our-program/prod-dispatch.wsgi
</VirtualHost>
Nó không phải là tất cả các phần mở rộng C có vấn đề, chỉ có một số phần mở rộng nhất định. Đôi khi điều này là do mã hóa xấu trong các phần mở rộng C, lần khác vấn đề là họ sử dụng API đơn giản để xử lý các trạng thái luồng trong Python. Vì vậy, mặc dù sử dụng một nhóm quá trình daemon và buộc sử dụng trình thông dịch chính là một nguyên tắc tốt, không phải lúc nào cũng cần thiết. –
OK, cảm ơn bạn đã làm rõ. Tuy nhiên, tôi vẫn nghĩ mặc định% {RESOURCE} là không may vì nó tạo ra 2 thông số con cho cùng một tập lệnh wsgi trong cùng một máy chủ ảo ngay cả khi truy cập nó với cả http://127.0.0.1 và http: // localhost. Nó quá ma thuật. –
% {RESOURCE} nên sử dụng giá trị của Tên máy chủ từ VirtualHost mà nó khớp. Nếu không thì có một số vấn đề với cấu hình Apache được định nghĩa. –