ติดตั้งและคอนฟิก PHP-FPM กับ nginx บน Ubuntu 16.04

จากการ ติดตั้ง nginx บน Ubuntu 16.04 เว็บเซิร์ฟเวอร์ที่ได้ จะรองรับไฟล์ html ธรรมดา

ถ้าต้องการรันโปรแกรมเว็บที่พัฒนาด้วย PHP ต้องติดตั้งแพ็คเกจและคอนฟิกเพิ่มเติม

การทำให้ nginx สามารถรัน PHP ได้นั้น มีหลายวิธี ในที่นี้ขอเลือกคอนฟิกแบบ FastCGI Process Manager (FPM) โดยติดตั้งแพ็คเกจ php-fpm แล้วแก้ไขคอนฟิก nginx เพื่อให้เมื่อมีการเรียกไฟล์ .php บนเว็บเซิร์ฟเวอร์ ให้ nginx ส่งไฟล์ .php นั้นไปรันใน FPM โดยผ่านทางไฟล์ socket แล้วรับผลลัพธ์ที่ได้กลับมาแสดงบนเว็บ

ติดตั้งแพ็คเกจ php-fpm

ใช้คำสั่ง apt install ติดตั้งแพ็คเกจชื่อ php-fpm

dev@ubuntu-1604:~$ sudo apt install php-fpm
Reading package lists... Done
Building dependency tree
Reading state information... Done
The following additional packages will be installed:
  php7.0-fpm
Suggested packages:
  php-pear
The following NEW packages will be installed:
  php-fpm php7.0-fpm
0 upgraded, 2 newly installed, 0 to remove and 12 not upgraded.
Need to get 1,290 kB of archives.
After this operation, 4,497 kB of additional disk space will be used.
Do you want to continue? [Y/n] y
...

หลังจากติดตั้งแพ็คเกจเสร็จเรียบร้อย จะมีการรันโปรเซส php-fpm ขึ้นมาโดยอัตโนมัติ

dev@ubuntu-1604:~$ ps -ef | grep php
root     23504     1 0 20:18 ? 00:00:00 php-fpm: master process (/etc/php/7.0/fpm/php-fpm.conf)
www-data 23507 23504 0 20:18 ? 00:00:00 php-fpm: pool www
www-data 23508 23504 0 20:18 ? 00:00:00 php-fpm: pool www

ตอนนี้เว็บเซิร์ฟเวอร์ nginx ยังไม่รองรับ php ต้องแก้ไขคอนฟิกก่อน

แก้ไขคอนฟิก nginx ให้รันไฟล์ .php ใน php-fpm

แก้ไขไฟล์คอนฟิกของ nginx ในส่วนคอนฟิก server เพื่อกำหนดให้ ถ้ามีการเรียกไฟล์ที่ลงท้ายด้วย .php ให้ส่งไฟล์แบบ fastcgi_pass ไปยังไฟล์ unix:/run/php/php7.0-fpm.sock ซึ่งเป็นไฟล์ชนิด socket ที่ไว้สำหรับติดต่อกับโปรเซส php-fpm

ตัวอย่างไฟล์ socket ที่ถูกสร้างโดย php-fpm

dev@ubuntu-1604:~$ ls -l /run/php/php7.0-fpm.sock
srw-rw---- 1 www-data www-data 0 Oct 19 20:18 /run/php/php7.0-fpm.sock

ในไฟล์คอนฟิก nginx ลบเครื่องหมาย # ที่นำหน้าบรรทัดดังต่อไปนี้ เพื่อเปิดคอนฟิก

  • location ~ \.php$ {
  • include snippets/fastcgi-php.conf;
  • fastcgi_pass unix:/run/php/php7.0-fpm.sock;
dev@ubuntu-1604:~$ sudo vi /etc/nginx/sites-available/default
...
server {
        ...
        # pass the PHP scripts to FastCGI server listening on 
        #
        location ~ \.php$ {
                include snippets/fastcgi-php.conf;
        #
        #       # With php7.0-cgi alone:
        #       fastcgi_pass 127.0.0.1:9000;
        # With php7.0-fpm:
                fastcgi_pass unix:/run/php/php7.0-fpm.sock;
        }
....

รีสตาร์ตเซอร์วิส nginx เพื่อให้คอนฟิกที่แก้ไขมีผล

dev@ubuntu-1604:~$ sudo systemctl restart nginx

ทดลองสร้างไฟล์ test.php

dev@ubuntu-1604:~$ sudo vi /var/www/html/test.php
<?php

phpinfo();

ตัวอย่างการรันบนหน้าเว็บ
01-php-fpm-on-ubuntu-16-04

เพิ่ม index.php เข้าไปในคอนฟิก index

ลองสร้างไฟล์ index.php

dev@ubuntu-1604:~$ sudo vi /var/www/html/index.php
<?php

echo 'index.php';

แล้วลองเข้าเว็บแบบไม่ได้ระบุชื่อไฟล์
02-403-forbidden

ไม่สามารถเข้าได้ เพราะ nginx ไม่สามารถหาไฟล์ที่ใช้เป็น index ของพาธที่เรียกได้

dev@ubuntu-1604:~$ sudo vi /etc/nginx/sites-available/default
...
server {
         ...
         index index.html index.htm index.nginx-debian.html;

ตอนนี้ในคอนฟิกพาธ root ไม่มีไฟล์ที่ใช้ทำเป็น index

dev@ubuntu-1604:~$ ls -l /var/www/html/
total 8
-rw-r--r-- 1 root root  25 Oct 19 20:22 index.php
-rw-r--r-- 1 root root  17 Oct 19 20:20 test.php

หากต้องการให้ไฟล์ index.php อยู่ในรายชื่อไฟล์ที่ใช้ทำเป็น index ของพาธด้วย ก็ต้องเพิ่มชื่อไฟล์เข้าไปในคอนฟิก index

ตัวอย่างการเพิ่ม index.php เข้าไปในคอนฟิก index

dev@ubuntu-1604:~$ sudo vi /etc/nginx/sites-available/default
...
server {
         ...

         # Add index.php to the list if you are using PHP
         index index.php index.html index.htm index.nginx-debian.html;

รีสตาร์ตเซอร์วิส nginx เพื่อให้คอนฟิกที่แก้ไขมีผล

dev@ubuntu-1604:~$ sudo systemctl restart nginx

ทดลองเรียกเว็บ แบบไม่ระบุชื่อไฟล์อีกครั้ง จะสามารถรันได้
03-index-pnp

ติดตั้ง PHP Module เพิ่มเติม

หากต้องการให้ php สามารถเรียกใช้ฟังก์ชันได้เพิ่มเติม ก็สามารถทำได้โดยติดตั้งแพ็คเกจโมดูล php ที่ต้องการ

ตัวอย่างการติดตั้งโมดูล gd เพื่อให้สามารถเรียกใช้ฟังก์ชัน gd ใน php ได้

dev@ubuntu-1604:~$ sudo apt install php-gd
Reading package lists... Done
Building dependency tree
Reading state information... Done
The following additional packages will be installed:
  php7.0-gd
The following NEW packages will be installed:
  php-gd php7.0-gd
0 upgraded, 2 newly installed, 0 to remove and 12 not upgraded.
Need to get 29.0 kB of archives.
After this operation, 145 kB of additional disk space will be used.
Do you want to continue? [Y/n] y

...
Creating config file /etc/php/7.0/mods-available/gd.ini with new version
Setting up php-gd (1:7.0+35ubuntu6) ...
Processing triggers for php7.0-fpm (7.0.8-0ubuntu0.16.04.3) ...

จริงๆ แล้ว การติดตั้งโมดูล php ใน php-fpm เพิ่มเติม จำเป็นต้องรีสตาร์ตเซอร์วิส php-fpm เพื่อให้สามารถเรียกใช้ฟังก์ชันในโมดลูที่ติดตั้งใหม่ได้

แต่จากคำสั่ง apt install โมดูล php จะมีการรีสตาร์ตเซอร์วิส php-fpm ให้โดยอัตโนมัติ สังเกตจากเวลาที่โปรเซสรัน จะเปลี่ยนไป

dev@ubuntu-1604:~$ ps -ef | grep php
root     24032     1 0 20:26 ? 00:00:00 php-fpm: master process (/etc/php/7.0/fpm/php-fpm.conf)
www-data 24035 24032 0 20:26 ? 00:00:00 php-fpm: pool www
www-data 24036 24032 0 20:26 ? 00:00:00 php-fpm: pool www

แต่ถ้าโมดูล php ที่เพิ่งติดตั้งยังใช้งานไม่ได้ ก็อาจลองรีสตาร์ตด้วยตัวเอง

ตัวอย่างการใช้ systemctl restart เพื่อรีสตาร์ตเซอร์วิส php-fpm

สังเกตชื่อเซอร์วิสจะเป็น php7.0-fpm

dev@ubuntu-1604:~$ sudo systemctl restart php7.0-fpm

ตัวอย่างผลลัพธ์ของ phpinfo() แสดงค่าคอนฟิกโมดูล gd ที่เพิ่งติดตั้งใหม่
04-php-gd

แก้ไขคอนฟิก php.ini ของ php-fpm

ถ้าต้องการแก้ไขค่าคอนฟิกของ php ที่รันใน php-fpm สามารถทำได้โดยแก้ไขไฟล์ /etc/php/7.0/fpm/php.ini

ตัวอย่างการแก้ไขค่าคอนฟิก upload_max_filesize เพื่อให้สามารถอัพโหลดไฟล์ได้ขนาดใหญ่มากขึ้น

dev@ubuntu-1604:~$ sudo vi /etc/php/7.0/fpm/php.ini
...
; Maximum allowed size for uploaded files.
; http://php.net/upload-max-filesize
upload_max_filesize = 32M

รีสตาร์ตเซอร์วิส php-fpm เพื่อให้ไฟล์คอนฟิก php.ino ที่แก้ไขมีผล

dev@ubuntu-1604:~$ sudo systemctl restart php7.0-fpm

ตัวอย่างผลลัพธ์ที่ได้จาก phpinfo()
05-change-upload-max

หมายเหตุ การติดตั้งโมดูล php เพิ่มเติม หรือการแก้ไขคอนฟิก php.ini ไม่จำเป็นต้องรีสตาร์ตเซอร์วิส nginx

ข้อมูลอ้างอิง

Leave a Reply

Your email address will not be published.