จะเปิดใช้งานเหตุการณ์ MPM Apache 2.4 บน Ubuntu 14.04 ด้วย PHP safe thread ได้อย่างไร?


25

ฉันอัปเกรดเป็น Ubuntu Server 14.04 คาดหวังว่าการติดตั้ง apache เริ่มต้นจะใช้ MPM ของเหตุการณ์ใหม่ แต่ฉันกลับพบ prefork ที่กินหน่วยความจำแบบเก่าแทน

ฉันตั้งค่าเหตุการณ์ MPM ใน Arch Linux ได้สำเร็จ แต่ฉันไม่สามารถทำเช่นนั้นบน Ubuntu ฉันได้รับ:

Apache is running a threaded MPM, but your PHP Module is not compiled to be threadsafe. You need to recompile PHP

ฉันได้ติดตั้งแล้วphp-fpmและกำหนดค่า apache2 ให้ใช้ แต่เนื่องจากไฟล์กำหนดค่าสำหรับ apache2 นั้นแตกต่างกันใน Ubuntu ฉันไม่แน่ใจว่าฉันทำถูกที่แล้วหรือไม่

มีความคิดเกี่ยวกับวิธีทำให้เธรด PHP ปลอดภัยหรือไม่ดังนั้นฉันจึงสามารถใช้ apache2 event-mpm (โดยไม่ต้องทำการคอมไพล์ PHP ด้วยตนเองอีกครั้งแน่นอน)

คำตอบ:


39

เพื่อปิดการใช้งานevent MPMที่คุณสามารถทำได้sudo a2dismod mpm_eventและหลังจากนั้นจะเปิดใช้งานคุณควรจะทำอย่างไรpreforksudo a2enmod mpm_prefork

ในที่สุดรีสตาร์ท apache:

sudo service apache2 restart

3
คุณต้องอยู่ที่นั่น ... ไม่อยู่ที่นี่ .. ที่นั่น ... ด้านบนของรายการคำตอบ
กรรม

2
นี่ควรเป็นคำตอบที่ยอมรับได้! อย่าลืมรีสตาร์ท apache หลังจากทำสิ่งนี้:sudo service apache2 restart
Reeno

4
สิ่งนี้จะตอบคำถามว่าจะเปิดใช้งาน MPM ได้อย่างไรเช่น OP ถาม คุณกำลังอธิบายถึงวิธีการทำสิ่งที่ตรงกันข้ามกับที่ OP ร้องขอ
Craig

2
@ Mehraban, OP ถามคำสำหรับคำว่า "จะเปิดใช้งานเหตุการณ์ MPM ได้อย่างไร" และคำตอบของคุณคือ "เพียงแค่ปิดการใช้งานเหตุการณ์ MPM" นี่เป็นคำตอบที่ยอมรับได้อย่างไร
Nicolas Bouliane

1
@ Mehraban นั่นไม่ใช่คำถามที่ถูกถามดังนั้นการรับส่งข้อมูลทั้งหมดที่มาจาก Google จะได้รับการบอกว่า "วิธีที่ดีที่สุดในการทำ X ไม่ใช่เพื่อ X" ถ้าฉันถามวิธีทำคุกกี้ช็อคโกแลตฉันคาดว่าจะมีสูตรคุกกี้ช็อกโกแลต
Nicolas Bouliane

13

สิ่งนี้ใช้ได้สำหรับฉัน

ตรวจสอบก่อนว่าคุณได้ติดตั้งแพ็คเกจนี้หรือไม่:

dpkg -l | grep libapache2-mod-php5

หากคุณมีเพียงแค่ลบมัน:

apt-get remove libapache2-mod-php5

นี่คือคำตอบที่ถูกต้อง!
DrSvanHay

6

คุณสามารถติดตั้งได้หลายวิธีเพื่อให้ Apache สื่อสารกับ PHP แบบขนาน บางทีคุณอาจเคยติดตั้ง mod_php ตัวเก่าเพิ่มเติมไปจาก fastcgi / php-fpm

คุณสามารถดูว่าโมดูลใดที่ Apache โหลดไว้ตอนรันไทม์

apache2ctl -M

หากจำเป็นให้ใช้sudoเพื่อรับสิทธิ์รูท ถ้าคุณเห็นphp5_module (shared)ในหมู่โมดูลของ Apache กำลังใช้ที่ mod_php เก่ายังคงติดตั้งและบล็อกคุณจากการใช้หรือmpm_workermpm_event


5
ไม่สามารถเรียกใช้เพื่อรับ mods หากเซิร์ฟเวอร์ไม่เริ่มทำงานให้ลองsudo a2dismodจากนั้นกดอักขระแท็บสองครั้งเพื่อดูรายการหาก mods ที่สามารถปิดการใช้งานได้ ถ้าคุณเห็นphp5มัน
pferrel

2

สำหรับฉันที่ติดตามเดเบียนอย่างเต็มที่:

  1. ปิดใช้งาน prefork เปิดใช้งานเหตุการณ์: a2dismod mpm_prefork && a2enmod mpm_event
  2. ลบ mod-php5: aptitude remove libapache2-mod-php5
  3. โปรดระวังว่าคุณมีphp_ตัวเลือกแต่ละตัวใน VHost encapsulate โดย<IfModule mod_php5.c></IfModule>มิฉะนั้น apache จะไม่รีสตาร์ท
  4. ทำ service apache2 restart

1

ค้นหาสิ่งต่อไปนี้ในส่วนโหลดโมดูลของไฟล์กำหนดค่า apache ของคุณ:

LoadModule mpm_event_module modules/mod_mpm_event.so

และแทนที่ด้วยโมดูลต่อไปนี้:

LoadModule mpm_prefork_module modules/mod_mpm_prefork.so

ไม่อย่าทำอย่างนี้! Apache คือบิวด์โมดูลดังนั้นคุณไม่ต้องเปลี่ยน LoadModule-Lines ใด ๆ ให้เป็น configs ของคุณ เพียง a2dismod mpm_prefork && a2enmod mpm_eventแต่ทำ จากนั้นรีสตาร์ท apache ของคุณและคุณทำเสร็จแล้ว
suther

0

โมดูล php5 ต้องการ prefork mpm และหากต้องการปิดใช้งาน prefork เราต้องปิดใช้งาน php5

ภายใต้เดเบียนฉันทำดังต่อไปนี้เป็นราก:

ปิดใช้งาน prefork mpm

a2dismod mpm_prefork

เปิดใช้งานเหตุการณ์ mpm หรืออะไรก็ตามที่คุณต้องการ ทราบว่าฉันพบเหตุการณ์ mpm ไม่แนะนำสำหรับ apache 2.2 หรือเร็วกว่า

a2enmod mpm_event

เพื่อปิดการโหลดโมดูล php5 แต่ไม่มีการถอนการติดตั้ง

a2dismod php5

เพื่อทดสอบความถูกต้องโดยรวมของการกำหนดค่า apache ที่เกิดขึ้น ข้อผิดพลาดจะต้องจัดการกับตามคำตอบของ@sultherข้างต้น

apache2ctl -t

รีสตาร์ท apache

systemctl restart apache2

ในกรณีที่ยังคงต้องการ php เวอร์ชั่นของเธรดที่ปลอดภัยควรได้รับการติดตั้ง ดู: https://www.digitalocean.com/community/tutorials/how-to-configure-apache-http-with-mpm-event-and-php-fpm-on-freebsd-12-0

โชคดี

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.