จากการ ติดตั้ง 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();
ตัวอย่างการรันบนหน้าเว็บ
เพิ่ม index.php เข้าไปในคอนฟิก index
ลองสร้างไฟล์ index.php
dev@ubuntu-1604:~$ sudo vi /var/www/html/index.php <?php echo 'index.php';
แล้วลองเข้าเว็บแบบไม่ได้ระบุชื่อไฟล์
ไม่สามารถเข้าได้ เพราะ 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
ทดลองเรียกเว็บ แบบไม่ระบุชื่อไฟล์อีกครั้ง จะสามารถรันได้
ติดตั้ง 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 ที่เพิ่งติดตั้งใหม่
แก้ไขคอนฟิก 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()
หมายเหตุ การติดตั้งโมดูล php เพิ่มเติม หรือการแก้ไขคอนฟิก php.ini ไม่จำเป็นต้องรีสตาร์ตเซอร์วิส nginx