Ass assError sử dụng Apache2 và libapache2-mod-wsgi-py3 trên Ubuntu 14.04 (Python 3.4)


10

Trên Ubuntu 14.04, sử dụng Apache2 với gói libapache2-mod-wsgi-py3 được cài đặt sẽ gây ra lỗi trong /var/log/apache2/error.log

Cách tái tạo rất đơn giản:

sudo apt-get install apache2
sudo service apache2 restart
# /var/log/apache2/error.log is "clean"
sudo apt-get install libapache2-mod-wsgi-py3
sudo service apache2 restart

/var/log/apache2/error.log đưa ra lỗi sau:

[Mon Jan 05 16:51:53.641332 2015] [:error] [pid 3141:tid 140703516379008] Exception ignored in: <module 'threading' from '/usr/lib/python3.4/threading.py'>
[Mon Jan 05 16:51:53.643563 2015] [:error] [pid 3141:tid 140703516379008] Traceback (most recent call last):
[Mon Jan 05 16:51:53.643633 2015] [:error] [pid 3141:tid 140703516379008]   File "/usr/lib/python3.4/threading.py", line 1288, in _shutdown
[Mon Jan 05 16:51:53.644350 2015] [:error] [pid 3141:tid 140703516379008]     assert tlock is not None
[Mon Jan 05 16:51:53.643449 2015] [:error] [pid 3140:tid 140703516379008] Exception ignored in: <module 'threading' from '/usr/lib/python3.4/threading.py'>
[Mon Jan 05 16:51:53.644456 2015] [:error] [pid 3140:tid 140703516379008] Traceback (most recent call last):
[Mon Jan 05 16:51:53.644514 2015] [:error] [pid 3140:tid 140703516379008]   File "/usr/lib/python3.4/threading.py", line 1288, in _shutdown
[Mon Jan 05 16:51:53.645052 2015] [:error] [pid 3140:tid 140703516379008]     assert tlock is not None
[Mon Jan 05 16:51:53.645119 2015] [:error] [pid 3141:tid 140703516379008] AssertionError: 
[Mon Jan 05 16:51:53.647513 2015] [:error] [pid 3140:tid 140703516379008] AssertionError: 

Làm thế nào để nó hoạt động không có lỗi?

Câu trả lời:


15

Ubuntu 14.04 đi kèm với mod_wsgi 3.4. Theo https://code.djangoproject.com/ticket/22948#comment:2 chúng ta cần sử dụng mod_wsgi phiên bản 4.2+ cho Python 3.4.

Cách tốt nhất để cài đặt mod_wsgi lên phiên bản mới nhất là tải nó bằng pip (có thể ở virtualenv) và sau đó cài đặt mô-đun của nó vào hệ thống apache. Trong trường hợp của tôi, tôi sử dụng virtualenv thiết lập /venv_path.

1) Hủy bỏ gói có vấn đề và cài đặt phụ thuộc

sudo apt-get remove libapache2-mod-wsgi-py3
sudo apt-get install apache2-dev

2) Cài đặt mod_wsgi trong virtualenv với pip

. /venv_path/bin/activate
pip install mod_wsgi

3) Cài đặt vào Apache (toàn hệ thống)

sudo /venv_path/bin/mod_wsgi-express install-module
sudo vi /etc/apache2/mods-available/wsgi_express.load /etc/apache2/mods-available/wsgi_express.conf

Nội dung của /etc/apache2/mods-available/wsgi_express.load

LoadModule wsgi_module /usr/lib/apache2/modules/mod_wsgi-py34.cpython-34m.so

Nội dung của /etc/apache2/mods-available/wsgi_express.conf

WSGIPythonHome /venv_path

4) Kích hoạt mô-đun và khởi động lại Apache.

sudo a2enmod wsgi_express
sudo service apache2 restart

5) Kiểm tra rằng không có lỗi trong /var/log/apache2/error.log


1
Bạn có thể muốn đề cập rằng lệnh để tạo một virtualenv là virtualenv -p python3.4 DIRECTORY, hoặc cho 3,4+, tốt hơn : pyvenv-3.4 DIRECTORY.
nyuszika7h

1
Điều đó đúng ... nhưng tôi đã không đề cập đến nó để tập trung vào câu hỏi mod_wsgi.
samb

1
Nhưng vì bạn đã sử dụng virtualenv trong ví dụ của mình, tại sao không đề cập đến cách tạo nó?
nyuszika7h

Nếu người khác gặp lỗi ( cannot open shared object file: No such file or directory) khi cố gắng thực hiện việc này, hãy nhớ chuyển đổi phiên bản ở bước 3. Tôi đang sử dụng Python 3.5, 64-bit. mod_wsgi-py35.cpython-35m-x86_64-linux-gnu.so. Nếu bạn không biết bạn có phiên bản nào, hãy vào thư mục ( /usr/lib/apache2/modules/) và xem. Câu trả lời này dường như dựa trên python 32 bit 3.4.
Deleet

phương pháp này là python-version-agnellect và đã làm việc với tôi với python3.6 sudo /venv_path/bin/mod_wsgi-express install-moduleở bước 3 sẽ in các đường dẫn mà bạn cần đặt vào các wsgi_expresstệp
gevra

0

Chỉ muốn thêm một cái gì đó vào câu trả lời được chấp nhận được cung cấp bởi samb.

Các dòng cấu hình thực tế mà bạn cần thêm vào cấu hình mô-đun là những dòng được xuất ra bởi mod_wsgi-express install-modulelệnh (điều này không rõ ràng trong câu trả lời được chấp nhận).

Ngoài ra, trong trường hợp của tôi (và theo tài liệu pkg của mod_wsgi - có lẽ đây không phải là trường hợp khi câu trả lời được chấp nhận được viết) Tôi chỉ không nhận được bất kỳ wsgi_express.*tệp nào trong đó mods-available, nhưng chỉ wsgi.*đủ để thay thế wsgi.loadtệp bằng cấu hình mới bằng cách chạy

mod_wsgi-express install-module > /etc/apache2/mods-available/wsgi.load

Tất nhiên, điều này sẽ ghi đè lên toàn bộ tập tin, vì vậy hãy coi chừng trong trường hợp bạn có thêm bất kỳ chỉ thị nào trong đó.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.