วิธีการกำหนดค่า Apache ให้รัน PHP เป็น FastCGI บน Ubuntu 12.04 ผ่านทางเทอร์มินัล


35

ฉันค่อนข้างใหม่ในโลกของยูนิกซ์บรรทัดคำสั่งการจัดการเว็บเซิร์ฟเวอร์ / การบริหาร

โฮสต์จำนวนมากที่มีตัวเลือกการจัดการแผงควบคุมช่วยให้คุณสามารถเปลี่ยนวิธีการทำงานของ PHP ด้วยตัวเลือกที่เรียบง่าย

ตัวเลือกที่พบบ่อยที่สุดคือ:

  • โมดูล apache
  • แอปพลิเคชั่น CGI
  • แอปพลิเคชัน FastCGI

คำถามของฉันคือง่ายๆคุณจะเปลี่ยนแปลงสิ่งนี้ผ่านทางบรรทัดคำสั่งได้อย่างไร ฉันรู้ว่ามีไฟล์การกำหนดค่ามากมายสำหรับ apache

สิ่งที่ใกล้เคียงที่สุดที่ฉันพบคือคำถามนี้แต่โครงสร้างไดเรกทอรีดูเหมือนจะไม่ตรงกับระบบปฏิบัติการของฉัน (Ubuntu 12.04)

ฉันค่อนข้างสับสนว่าดูเหมือนจะไม่มีคู่มือที่ชัดเจนที่ฉันสามารถค้นหารายละเอียดกระบวนการนี้สำหรับสิ่งที่ดูเหมือนว่าเป็นเรื่องธรรมดามาก ยกโทษให้ฉันถ้ามีอยู่ ... ถ้าเป็นเช่นนั้นโปรดชี้ฉันในทิศทางที่ถูกต้อง


สิ่งที่ใกล้เคียงที่สุดที่ฉันพบคือคำถามนี้ในเว็บไซต์SOนั่นไม่ใช่ Stack Overflow
ta.speot.is

1
นี้ใน fastcgi อธิบายว่ามันสวยดี

1
@ ta.speot.is forgivaness, pleaassuh . ขอบคุณ Matt แน่นอนว่าฉันดูที่ fastcgi.com แต่ฉันพบว่าคำแนะนำเหล่านั้นยากที่จะติดตาม
Evan Mattson

@ ta.speot.is พิมพ์ง่าย เขาหมายถึง "SE" ไม่ใช่ "ดังนั้น"
Pacerier

คำตอบ:


49

ขอบคุณสำหรับคำตอบก่อนหน้าพวกเขาทำให้ฉันได้รับประโยชน์มากที่สุด แต่เพื่อให้ได้สิ่งที่ทำงานฉันต้องรวมคำแนะนำจากที่ต่างๆดังนั้นคิดว่าฉันจะเขียนชุดคำสั่งที่สมบูรณ์

FYI ฉันใช้ Ubuntu 14.04, Apache 2.4 และยังมี modphp ที่ทำงานอยู่ตามค่าเริ่มต้นคำแนะนำก่อนหน้านี้ยังไม่จำเป็นต้องปิดการใช้งาน modphp อีกด้วย

ฉันยังพบhttp://blog.starcklin.com/2013/08/install-mod-fastcgi-and-php5-fpm-on-ubuntu/เพื่อให้ข้อมูลและตรงไปตรงมามาก

เพียงเรียกใช้คำสั่งต่อไปนี้ในเทอร์มินัลหนึ่งหลังจากที่อื่น

ขั้นแรกให้ติดตั้งแพ็คเกจที่จำเป็น (ฉันปล่อย php5 ออกไปเพราะนี่ถือว่ามันติดตั้งไปแล้ว, เพิ่มเข้าไปอีกครั้งในการติดตั้งครั้งแรก) นอกจากนี้ยังทราบจาก Apache 2.4 ขึ้นคุณสามารถใช้เหตุการณ์ MPM แทนคนงานเห็นhttp://www.vps.net/blog/2013/04/08/apache-mpms-prefork-worker-and-event/ ตัวอย่างของฉันแสดงให้เห็นถึงคนทำงาน แต่เพียงแค่แทนที่ word word เป็นเหตุการณ์หากคุณต้องการใช้สิ่งนั้น

sudo apt-get install apache2-mpm-worker

sudo apt-get install libapache2-mod-fastcgi php5-fpm

ตอนนี้เปิดใช้งาน mods ที่คุณต้องการและปิดการใช้งาน mod ที่คุณไม่ต้องการ

sudo a2dismod php5 mpm_prefork

sudo a2enmod actions fastcgi alias mpm_worker

สร้างไฟล์ php5.fcgi และให้สิทธิ์แก่เว็บเซิร์ฟเวอร์ในการใช้งาน

sudo touch /usr/lib/cgi-bin/php5.fcgi

sudo chown -R www-data:www-data /usr/lib/cgi-bin

สร้างการตั้งค่าส่วนกลางสำหรับ php5-fpm

sudo nano /etc/apache2/conf-available/php5-fpm.conf

วางต่อไปนี้ (เราจะใช้ซ็อกเก็ตแทนที่อยู่ IP)

<IfModule mod_fastcgi.c> 
   AddHandler php5.fcgi .php 
   Action php5.fcgi /php5.fcgi 
   Alias /php5.fcgi /usr/lib/cgi-bin/php5.fcgi 
   FastCgiExternalServer /usr/lib/cgi-bin/php5.fcgi -socket /var/run/php5-fpm.sock -pass-header Authorization -idle-timeout 3600 
   <Directory /usr/lib/cgi-bin>
       Require all granted
   </Directory> 
</IfModule>

เปิดใช้งาน php5-fpm conf

sudo a2enconf php5-fpm

รีสตาร์ท apache และ fpm

sudo service apache2 restart && sudo service php5-fpm restart

ตามคำแนะนำอื่น ๆ ให้วางสิ่งต่อไปนี้ลงในไฟล์ php ที่สามารถเรียกค้นได้ใหม่บนเว็บเซิร์ฟเวอร์ของคุณ

<?php phpinfo();

เปิดไฟล์ที่คุณเพิ่งแก้ไขในเว็บเบราว์เซอร์ถ้าคุณเห็น "FPM / FastCGI" ถัดจาก Server API ตอนนี้คุณกำลังแสดง PHP ด้วย FastCGI!


4
นี่คือผู้ช่วยชีวิต คำแนะนำสำหรับ apache รุ่นเก่าไม่ทำงานบน Ubuntu 14.04 และ apache 2.4; แต่อันนี้ทำงานเหมือนมีเสน่ห์ +100 !!
Bhavin Doshi

ฉันติดตามสิ่งนี้อย่างแน่นอน แต่ฉันได้รับข้อผิดพลาด 'คุณไม่ได้รับอนุญาตให้เข้าถึง /php5.fcgi/index' ... และในบันทึกข้อผิดพลาด 'ไคลเอนต์ถูกปฏิเสธโดยการกำหนดค่าเซิร์ฟเวอร์: / usr / lib / cgi-bin /php5.fcgi '... ความคิดใด ๆ
เพียงแค่โชคดีจริงๆ

คิดออก ... ฉันใช้ 'ปฏิเสธคำสั่งอนุญาต' การกำหนดค่าสำหรับรูทด้วยเหตุผลบางอย่าง ... ทุกอย่างได้รับการแก้ไขแล้ว: D
แค่โชคดีจริงๆ

ฉันได้รับข้อผิดพลาดต่อไปนี้หลังจากการติดตั้งแพ็กเกจและการตั้งค่า "apache2: ข้อผิดพลาดทางไวยากรณ์ที่บรรทัด 216 ของ /etc/apache2/apache2.conf: ข้อผิดพลาดทางไวยากรณ์ในบรรทัด 9 ของ /etc/apache2/conf-enabled/php5-fpm.conf: คาดว่า </Directory> แต่เห็น </IfModule> "
Farooq

ทำ GitHub สรุปสาระสำคัญนี้gist.github.com/efarem/4a8fc03dc69d81998f6e518620f63421
แฟรงค์มาร์ติน

20

ในที่สุดฉันก็พบว่ามีการสอนที่ดีที่มุ่งทำสิ่งนี้ ผมจะร่างขั้นตอนที่ผมเข้ามาเป็นฉันแล้วได้โคมไฟกองของฉันติดตั้ง แต่กวดวิชาเต็มสามารถพบได้ที่นี่

หมายเหตุสำหรับใหม่:

ในบทช่วยสอนมันเริ่มต้นด้วยการสลับเป็นผู้ใช้รูทด้วย:

sudo su

ในกรณีของฉันฉันนำหน้าคำสั่งเหล่านั้นsudoแทนที่จะสลับผู้ใช้ดังนั้นฉันจะทำเอกสารขั้นตอนของฉันในลักษณะนั้น

เริ่ม

ขั้นตอนที่หนึ่ง: ติดตั้ง Apache Worker MPM (โมดูลแบบ Multi-Procesing)

sudo apt-get install apache2-mpm-worker

สิ่งนี้แทนที่ prefork ที่ฉันติดตั้งซึ่งเป็นค่าเริ่มต้นเมื่อติดตั้ง Apache

ขั้นตอนที่ 2: ติดตั้ง PHP5 และโมดูลที่จำเป็น

sudo apt-get install libapache2-mod-fastcgi php5-fpm php5

ณ จุดนี้คุณอาจได้รับข้อผิดพลาดในการติดตั้ง 'libapache2-mod-fastcgi':

Reading package lists... Done
Building dependency tree       
Reading state information... Done
Package libapache2-mod-fastcgi is not available, but is referred to by another package.
This may mean that the package is missing, has been obsoleted, or is only available from another source

E: Package 'libapache2-mod-fastcgi' has no installation candidate

ส่วนนี้ไม่ได้อยู่ในบทช่วยสอนด้านบน

หากต้องการกระทบยอดนี้multiverseต้องมีการเพิ่มที่เก็บข้อมูลลงในแหล่งข้อมูล apt

เพื่อทำสิ่งนี้:

sudo nano /etc/apt/sources.list

ที่ฉันต่อท้ายบรรทัดต่อไปนี้:

deb http://archive.ubuntu.com/ubuntu precise multiverse
deb http://archive.ubuntu.com/ubuntu precise-updates multiverse
deb http://security.ubuntu.com/ubuntu precise-security multiverse

preciseในกรณีนี้อ้างถึง Ubuntu " Precise Pangolin " เวอร์ชั่นของฉัน

ดังนั้นตอนนี้บันทึกการเปลี่ยนแปลงเหล่านั้นและกลับไปที่เทอร์มินัล:

sudo apt-get update

และอีกครั้ง:

sudo apt-get install libapache2-mod-fastcgi php5-fpm php5

ซึ่งจะ (ควร) ตอนนี้ทำงาน

ตอนนี้เปิดใช้งานโมดูล Apache เหล่านี้:

sudo a2enmod actions fastcgi alias

รีสตาร์ท apache

sudo service apache2 restart

ขั้นตอนที่ 3: การกำหนดค่า Apache

เพื่อให้ Apache ทำงานกับ PHP-FPM เราจำเป็นต้องมีการกำหนดค่าต่อไปนี้:

<IfModule mod_fastcgi.c>
    AddHandler php5-fcgi .php
    Action php5-fcgi /php5-fcgi
    Alias /php5-fcgi /usr/lib/cgi-bin/php5-fcgi
    FastCgiExternalServer /usr/lib/cgi-bin/php5-fcgi -host 127.0.0.1:9000 -pass-header Authorization
    <Directory /usr/lib/cgi-bin>
        Require all granted 
    </Directory>
    #directory statement mult be on multiple lines
</IfModule>

บันทึก:

หากคุณใช้ Apache เวอร์ชันที่เก่ากว่า (2.3.x หรือเก่ากว่า) ให้เว้นบรรทัดไว้

   <Directory /usr/lib/cgi-bin> Require all granted </Directory>

คุณสามารถตรวจสอบเวอร์ชั่นที่ติดตั้งของคุณด้วยคำสั่ง

apache2 -version

คุณสามารถวางไว้ในการกำหนดค่า Apache ทั่วโลก (ดังนั้นจึงเปิดใช้งานสำหรับ vhosts ทั้งหมด) ตัวอย่างเช่นใน/etc/apache2/conf.d/php5-fpm.conf(ไฟล์นี้ไม่มีอยู่ดังนั้นคุณต้องสร้างมันขึ้นมา) หรือคุณสามารถวางไว้ในแต่ละ vhost ที่ควรใช้ PHP-FPM

ฉันเลือกที่จะไปเส้นทางทั่วโลกดังนั้น:

sudo nano /etc/apache2/conf.d/php5-fpm.conf

วางในบล็อกรหัสด้านบนและบันทึกออก ไฟล์ใหม่นี้จะถูกโหลดโดยอัตโนมัติโดยการกำหนดค่าเริ่มต้นของ Apache ซึ่งโหลดไฟล์ทั้งหมดใน/etc/apache2/conf.d/ไดเรกทอรี

รีสตาร์ท Apache:

sudo service apache2 restart

ตอนนี้สร้างไฟล์ PHP ต่อไปนี้ในรูทเอกสาร/var/www:

sudo nano /var/www/info.php

เพิ่ม:

<?php phpinfo();

บันทึก & ออก

ตอนนี้เราเรียกไฟล์นั้นในเบราว์เซอร์ (เช่นhttp://your-server-ip/info.php)

ภายใต้เซิร์ฟเวอร์ APIFPM/FastCGIที่ด้านบนคุณจะเห็น

ที่ประสบความสำเร็จ!

สำหรับข้อมูลเพิ่มเติมเช่นวิธีการเปลี่ยน PHP-FPM ให้ใช้ซ็อกเก็ต unix แทนพอร์ต TCP เริ่มต้นหรือวิธีกำหนดค่านี้สำหรับโฮสต์เสมือนแต่ละรายการแทนที่จะเป็นโฮสต์เสมือนทั้งหมดดูที่บทช่วยสอนแหล่งข้อมูลที่เชื่อมโยงที่ด้านบน


ฉันต้องเพิ่มสิ่งนี้ก่อน </IfModule>: <Directory / usr / lib / cgi-bin> ต้องได้รับสิทธิ์ทั้งหมด </Directory>
Rimu Atkinson

@RimuAtkinson ถูกต้องโดยค่าเริ่มต้นไดเรกทอรีทั้งหมดจะถูกห้ามในรุ่นที่ใหม่กว่าดังนั้นคุณจะต้องให้สิทธิ์การเข้าถึงไดเรกทอรี cgi-bin โดยเฉพาะ สิ่งนี้ควรถูกเพิ่มเข้าไปในคำตอบเนื่องจากคุณจะได้รับ 403
johnrom

ขอบคุณสำหรับวิธีนี้! โปรดทราบว่าRequire all grantedจำเป็นต้องใช้สิ่งนี้ตั้งแต่ Apache 2.4 ถ้าฉันวางไว้ในไฟล์กำหนดค่าด้วย Apache 2.2 มันล้มเหลว
leemes

ฉันได้เพิ่มบันทึก (รู้สึกอิสระที่จะแก้ไขมันเป็นโพสต์ของคุณ;)) สำหรับรายละเอียดดูstackoverflow.com/a/22040167/592323
leemes

1
คำตอบนี้ไม่ทำงานบน Ubuntu 14.04 อ้างถึงคำตอบโดย JDawgg เพื่อทำใน 14.04
Bhavin Doshi

1

ใน Ubuntu 14.04 หลังจากทำตามขั้นตอนของคำตอบที่ยอมรับแล้วให้แก้ไข/etc/apache2/conf-available/php5-fpm.conf

<IfModule mod_fastcgi.c>
    AddHandler php5-fcgi .php
    Action php5-fcgi /php5-fcgi
    Alias /php5-fcgi /usr/lib/cgi-bin/php5-fcgi
    FastCgiExternalServer /usr/lib/cgi-bin/php5-fcgi -socket /var/run/php5-fpm.sock -pass-header Authorization -idle-timeout 3600
    <Directory /usr/lib/cgi-bin>
        Require all granted
    </Directory>
</IfModule>

จากนั้นดำเนินการ

#sudo a2enconf php5-fpm
#sudo apache2 restart

0

ในกรณีที่มีใครบางคนกำลังทำสิ่งนี้บน Ubuntu 16.04 และได้ลดระดับจาก php 7 เป็น php 5.6 (Ondrej) คุณต้องแทนที่บางบรรทัด (ตามคำตอบของ JDawgg):

sudo apt-get install libapache2-mod-fastcgi php5-fpm ถึง:

sudo apt-get install libapache2-mod-fastcgi php5.6-fpm 

sudo a2dismod php5 mpm_prefork ไปที่:

sudo a2dismod php5.6 mpm_prefork

sudo nano /etc/apache2/conf-available/php5-fpm.conf ถึง:

sudo vim /etc/apache2/conf-available/php5.6-fpm.conf

กระบวนการติดตั้ง php5.6-fpm ได้สร้างไฟล์ขึ้นแล้วดังนั้นจึงไม่จำเป็นต้องสร้างไฟล์ขึ้นมา อย่างไรก็ตามฉันลบข้อความที่มีอยู่ทั้งหมดในไฟล์นั้นเนื่องจากมันมีความหมายสำหรับ mod_php5

<IfModule mod_fastcgi.c> 
   AddHandler php5.fcgi .php 
   Action php5.fcgi /php5.fcgi 
   Alias /php5.fcgi /usr/lib/cgi-bin/php5.fcgi 
   FastCgiExternalServer /usr/lib/cgi-bin/php5.fcgi -socket /var/run/php/php5.6-fpm.sock -pass-header Authorization -idle-timeout 3600 
   <Directory /usr/lib/cgi-bin>
       Require all granted
   </Directory> 
</IfModule>

ฉันเปลี่ยนพา ธ จาก /var/run/php5-fpm.sock เป็น /var/run/php/php5.6-fpm.sock เนื่องจากมีไฟล์อยู่

sudo a2enconf php5-fpm ถึง:

sudo a2enconf php5.6-fpm

sudo service apache2 เริ่มใหม่ && sudo service php5-fpm รีสตาร์ทเป็น:

sudo service apache2 restart && sudo service php5.6-fpm restart

ฉันหวังว่านี่จะช่วยมือใหม่คนอื่น ๆ เช่นฉัน :)

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