2012-05-11 25 views
8

Đ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> 

Trả lời

9

Nó đã được biết đến với độ tuổi mà nhiều thông số con không chơi tốt dọc theo phần mở rộng C. Tuy nhiên, những gì tôi đã không nhận ra là các thiết lập mặc định là rất đáng tiếc. ModWSGI wiki nêu rõ rằng giá trị mặc định cho thị WSGIApplicationGroup là% {NGUỒN} hiệu quả trong số đó sẽ là

The application group name will be set to the server hostname and port as for the %{SERVER} variable, to which the value of WSGI environment variable SCRIPT_NAME is appended separated by the file separator character.

Điều này có nghĩa rằng đối với mỗi Host: tiêu đề từng gặp phải khi truy cập máy chủ mod_wsgi vui lòng spawns một subinterpreter mới , sau đó các phần mở rộng C sẽ được tải.

Tôi đã vô tình kích hoạt lỗi bằng cách truy cập localhost.invalid: 81 với liên kết trình duyệt trên máy chủ cục bộ này khiến 1 trong số 4 WSGIDaemonProcesses thất bại cho tất cả các yêu cầu đến trong tương lai.

Summa tóm tắt: luôn sử dụng mod_wsgi với kim tự tháp hoặc khung khác sử dụng phần mở rộng C, đảm bảo rằng WSGIApplicationGroup luôn được đặt thành% {GLOBAL}. Nói cách khác, kết quả của việc sử dụng các thiết lập mặc định sẽ khiến bạn tự bắn mình vào chân, sau đó bạn có thể muốn tự bắn mình vào đầu.

+3

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. –

+0

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. –

+1

% {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. –

Các vấn đề liên quan