chuyển apache từ prefork sang sự kiện trong Ubuntu 16, để php 7 hoạt động


11

Apache đã chạy chậm trong sản xuất. Sau khi tìm kiếm câu trả lời một thời gian, cuối cùng tôi đã đến kênh #apache IRC và các chuyên gia đã cho tôi kiểm tra chế độ apache bằng lệnh này:

sudo apachectl -V

và đã được báo động để thấy rằng Máy chủ MPMprefork . Họ dứt khoát nói KHÔNG SỬ DỤNG TRƯỚC KHI TRÊN MÁY CHỦ SẢN XUẤT. Hóa ra, các gói Ubuntu (có lẽ được kế thừa từ Debian?) Khăng khăng chạy apache ở chế độ prefork mặc dù thực tế là phương pháp được đề xuất để chạy PHP với Apache đề xuất rõ ràng proxy_fcgi và php-fpm, sau đó fcgid và cuối cùng nói rằng bạn không nên sử dụng prefork:

Tại sao bạn không nên sử dụng mod_php với mpm prefork nữa

  • mod_php được tải vào mọi tiến trình httpd mọi lúc. Ngay cả khi httpd đang phục vụ nội dung tĩnh / không php, bộ nhớ đó vẫn được sử dụng.
  • mod_php không phải là luồng an toàn và buộc bạn phải gắn bó với mpm prefork (đa tiến trình, không có luồng), đây là cấu hình chậm nhất có thể

Trang đó cũng chứa một số chi tiết về PHP-FPM nhưng điều này có vẻ hơi phức tạp và không rõ ràng và dường như liên quan đến rất nhiều cấu hình thủ công. Tôi thất vọng và ngạc nhiên khi Ubuntu 16 không có tùy chọn gói cho chế độ fastCGI hoặc thứ gì đó.

Tôi đã thử chuyển apache sang chế độ sự kiện bằng cách sử dụng a2enmod và khi tôi cố gắng kích hoạt apache sao lưu, tôi đã gặp một lỗi:

Apache đang chạy MPM theo luồng, nhưng Mô-đun PHP của bạn không được biên dịch thành luồng an toàn. Bạn cần biên dịch lại PHP

Ở mức độ nào, tôi đã tự hỏi liệu có ai có một số hướng dẫn từng bước tối thiểu để có được chế độ fastCGI chạy trên Ubuntu 16 với PHP 7.0 hay không bằng cách dựa vào các trình cài đặt gói càng nhiều càng tốt. Tôi hiện đang xem xét rất nhiều hướng dẫn kém, mơ hồ và tôi lo ngại về việc làm hỏng môi trường sản xuất của mình với những quyết định tồi.

Ngoài ra, ai đó nên thêm sự kiện mpm dưới dạng tùy chọn thẻ. Đó là những gì các chàng trai #apache IRC khuyên dùng.


Lỗi cuối cùng là do bạn đã chuyển sang sự kiện, nhưng vẫn đang sử dụng mod_php. Vô hiệu hóa mod_php và chuyển sang php-fpm và nó sẽ biến mất. Và tôi có thể giới thiệu nginx?
Michael Hampton

@MichaelHampton tiêu đề nên đề cập đến PHP. Không khó để chuyển apache sang sự kiện. Thật khó để chuyển apache sang sự kiện VÀ để php 7 hoạt động.
S. Imp

1
@MichaelHampton chắc chắn bạn nhận ra rằng tôi bối rối về cách "vô hiệu hóa mod_php và chuyển sang php-fpm." Có phải đó không phải là câu hỏi tôi đặt ra trong bài viết của mình? Ngoài ra, câu hỏi không phải là về nginx, mà trình bày một lĩnh vực học tập khác. Chuyển sang nginx không thực tế cho dự án này vì tôi đang làm việc với một nhóm.
S. Imp

Tôi đã không đề cập đến cách vô hiệu hóa các mô-đun Apache vì bạn đã chứng minh rằng bạn đã biết cách thực hiện việc này. Để bật php-fpm, hãy xem câu trả lời cho câu hỏi này, hướng dẫn trực tuyến, v.v.
Michael Hampton

Câu trả lời:


15

ezra-s gợi ý một cách tiếp cận tốt nhưng nó không bao gồm một số chi tiết có thể gây nhầm lẫn cho những người phụ thuộc vào các nhà quản lý gói. LƯU Ý : Tôi không chắc chắn nếu các bước này là chính xác. Nếu bất cứ ai gặp rắc rối hoặc thấy vấn đề thì hãy cho tôi biết và tôi sẽ cập nhật bài viết này.

Đầu tiên, kể từ khi viết bài này, các gói apache2 của Ubuntu nhấn mạnh vào prefork nếu bạn muốn cài đặt PHP. Tuy nhiên, đừng tuyệt vọng vì bạn vẫn có thể sử dụng các trình cài đặt gói để cài đặt và cập nhật PHP apache2 và vẫn giúp cấu hình của bạn hoạt động với Apache trong chế độ sự kiện bằng cách sử dụng PHP-FPM theo khuyến nghị của wiki Apache và được mô tả chi tiết hơn trong High- thực hiện PHP trên apache httpd 2.4.x bằng mod_proxy_fcgi và php-fpm . Ý tưởng cơ bản là apache2 và PHP-FPM giao tiếp qua socket chứ không phải PHP chạy như một mô-đun Apache.

1) Xóa hoặc vô hiệu hóa mô-đun Apache Apache

Vì các gói Ubuntu nhấn mạnh vào prefork Apache khi cài đặt PHP, chúng tôi phải tách chúng ra. Tôi đã làm điều này bằng cách sử dụng apt để gỡ cài đặt libapache2-mod-php7.0 vì tôi không còn cần gói:

sudo apt-get remove libapache2-mod-php7.0

Ngoài ra, thay vào đó, bạn có thể vô hiệu hóa mô-đun php7.0 Apache, nhưng điều này sẽ không xóa gói apt khỏi hệ thống của bạn, điều này khiến cho hệ thống trở nên khó chịu.

sudo a2dismod php7.0

2) Chuyển Apache sang chế độ sự kiện và bật fcgid

Tôi tin rằng các lệnh này nên thực hiện các mẹo:

sudo a2dismod mpm_prefork
sudo a2enmod mpm_event
sudo a2enmod proxy_fcgi

3) Cài đặt PHP-FPM

Tôi đã cài đặt PHP 7 với các mô-đun khác nhau, vì vậy tôi chỉ cài đặt PHP-FPM bằng lệnh này:

sudo apt-get install php7.0-fpm

4) Chỉnh sửa cấu hình Virtualhost của bạn để xử lý các tệp PHP bằng PHP-FPM:

Trong trường hợp của tôi, tôi đã chỉnh sửa máy chủ SSL mặc định, /etc/apache2/sites-av Available / default- ssl.conf và thêm dòng này ngay gần đầu trang:

ProxyPassMatch ^/(.*\.php(/.*)?)$ unix:/run/php/php7.0-fpm.sock|fcgi://localhost/var/www/html/

QUAN TRỌNG Điều này hướng dẫn Apache xử lý các yêu cầu tệp PHP bằng PHP-FPRM và đường dẫn trong lệnh này ( /run/php/php7.0-fpm.sock ) phải khớp với đường dẫn được chỉ định bởi lệnh nghe trong tệp / etc / php /7.0/fpm/pool.d/www.conf

5) Khởi động lại Apache

sudo service apache2 restart

Để kiểm tra xem chế độ sự kiện có được bật hay không, hãy sử dụng lệnh này:

sudo apachectl -V

Trong đầu ra, bạn sẽ thấy điều này:

Server MPM:     event

Hãy thử tạo một trang phpinfo và truy cập nó trong trình duyệt của bạn. Bạn sẽ thấy Server API: FPM/FastCGItrong đầu ra.


5
Tôi đề nghị không sử dụng ProxyPassMatch, vì nó sẽ không cho phép sử dụng .htaccess trong thư mục. Sử dụng cái này thay thế: proxy <FilesMatch \ .php $> SetHandler ": unix: /run/php/php7.0-fpm.sock | fcgi: // localhost /" </ FilesMatch>
waza123

Điều này cũng đang hoạt động gist.github.com/GAS85/990b46a3a9c2a16c0ece4e48ebce7300
user5858

Điều gì sẽ xảy ra nếu tôi không chạm vào tệp này không giống như bạn đã nói: /etc/apache2/sites-av Available / default-ssl.conf ,? Của tôi https & http đều hoạt động tốt
user5858

Tôi đã làm theo câu trả lời ngoại trừ ProxyPassMatch, đã thêm dòng Filesmatch từ nhận xét của @ waza123 vào đầu 000-default.conf và khởi động lại apache2 và mọi thứ đều hoạt động hoàn hảo. Cảm ơn cả hai bạn, VPS nhỏ của tôi đã tiết kiệm được TON bộ nhớ và CPU qua mpm_prefork
dw1

Tôi không phải thực hiện ProxyPass hoặc chỉnh sửa tệp với Ubuntu Server 19.10. Sau bước 3 (cài đặt PHP-FPM), tôi mới thực hiện a2enconf /etc/apache2/conf-available/php7.3-fpm.conf; systemctl reload apachevà khi tôi tạo tệp phpinfo.php với <?php phpinfo();bên trong, dòng API máy chủ cho biết FPM / FastCGI. BTW, tôi đã cài đặt php7.3 vì tại thời điểm viết bài đăng này, ít nhất một phiên bản nên có trên phiên bản đó, nếu không cao hơn và các kho lưu trữ Ubuntu apt cho Ubuntu Server 19.10 hiện đang đi lên php7.3.
ServerChecker

6

Các bản phân phối cung cấp phương thức "mod_php" để thuận tiện.

Trong khi cách hiệu quả nhất là apache w / event + mod_proxy_fcgi -> php-fpm.

Có lẽ họ nên nâng cấp theo thời gian nhưng thật khó cho họ khi có rất nhiều khung công tác đi kèm với cấu hình .htaccess mod_php theo kiểu "plug & play". Cuối cùng, quản trị viên là người duy nhất chịu trách nhiệm quản trị và định cấu hình trang web của họ một cách chính xác.

Nếu bạn đang sản xuất, tôi sẽ đề nghị bạn sử dụng máy chủ thử nghiệm để thực hành nâng cấp và thay đổi.

Về wiki tôi thích hoặc sẽ gợi ý cho bạn phương pháp "xử lý". https://wiki.apache.org/httpd/PHP-FPM#Proxy_via_handler .

Đó là, định cấu hình php-fpm để sẵn sàng một ổ cắm và có đủ quyền cho người dùng Apache gửi yêu cầu tới nó và định cấu hình Apache để sử dụng nó.

Một ví dụ nhanh:

# needed modules for reverse proxying to php-fpm
LoadModule proxy_module modules/mod_proxy.so
LoadModule proxy_fcgi_module modules/mod_proxy_fcgi.so


<Virtualhost *:443>
    ServerName whatever.example.com
    #other typical directives here
    <Directory /var/www/php-app>
        <FilesMatch \.php>
            SetHandler "proxy:unix:/path/to/app.sock|fcgi://localhost/"
        <FilesMatch>
    </Directory>
</VirtualHost>

Biên tập:

Với cách này, việc bạn sử dụng phiên bản PHP nào không quan trọng vì Apache không quan tâm, nó sẽ chỉ đảo ngược các yêu cầu thích hợp thành php-fpm.

Ngoài ra, đừng quên dỡ bỏ mod_php để có thể sử dụng mpm_event.

Chỉnh sửa 2:

Theo yêu cầu, bạn không cần gỡ cài đặt các gói mod_php khỏi debian / ubfox, Apache chỉ quan tâm đến cấu hình của nó, vì vậy việc dỡ bỏ mô-đun sẽ làm.


Cám ơn phản hồi của bạn. Tôi đã làm rất nhiều thử nghiệm và sai sót và đây là cách tiếp cận dường như đang hoạt động. Quá trình thực tế có liên quan nhiều hơn một chút vì bạn phải nhận apache từ prefork đến sự kiện, gỡ cài đặt libapache2-mod-php7.0, v.v. Tôi hy vọng sẽ tạo ra một câu trả lời đầy đủ hơn ở đây một chút.
S. Imp

không cần "gỡ cài đặt" từ quan điểm apache httpd, chỉ cần dỡ mô-đun. Tương tự với sự kiện / prefork, mpm's cũng là các mô-đun trong 2.4, do đó, một lần dỡ tải prefork và tải sự kiện.
ezra-s

ok vì vậy có lẽ bạn không phải gỡ cài đặt gói, nhưng ít nhất bạn phải vô hiệu hóa mô-đun php cho apache - và tôi lo ngại về việc nâng cấp apt-get phá vỡ thiết lập. Những chi tiết này bị thiếu trong câu trả lời của bạn. Tôi sẽ rất vui nếu bạn thêm chúng bởi vì tôi không đặc biệt tin tưởng vào khả năng của mình để có được thông tin chi tiết về chính xác những gì tôi đã làm.
S. Imp

Có lẽ tôi giả định chúng, Apache cũng không quan tâm đến các gói debian, chỉ là cấu hình chức năng của nó.
ezra-s

Apache sẽ quan tâm nếu một bản cập nhật gói apt thay đổi cấu hình của nó, đây là vấn đề tôi gặp phải tại một thời điểm. Theo tinh thần của bài viết gốc của tôi, tôi muốn cung cấp hướng dẫn chi tiết cho những người khác dựa vào trình cài đặt gói (và cập nhật) như tôi làm.
S. Imp
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.