เรียกใช้ PHP 8.2 โดยใช้ Nginx ใน EC2 (Amazon Linux 2023) บน AWS

Nginx เป็นเว็บเซิร์ฟเวอร์ที่มีประสิทธิภาพและความเสถียรสูงสุด ซึ่งเราสามารถสร้างเว็บเซิร์ฟเวอร์ที่เร็วที่สุดได้และมีความน่าเชื่อถือมากๆ นอกจากนี้ยังสามารถใช้งานร่วมกับ EC2 ได้อีกด้วยครับ

สวัสดีครับ POP จากบริษัท Classmethod (Thailand) ครับ

การเรียกใช้ PHP โดยใช้ Nginx จะทำงานได้เร็วกว่าการใช้ Apache นั่นเป็นสาเหตุที่ Nginx เป็นที่นิยมในทุกวันนี้ โดยการแนะนำครั้งนี้จะอธิบายวิธีการตั้งค่าสำหรับการใช้งาน Nginx ร่วมกับ EC2 ครับ

เป้าหมายในการทำ

เมื่อ User ทำการเชื่อมต่อจากเว็บเบราว์เซอร์แล้ว Nginx จะดำเนินการ และเมื่อเริ่มต้นระบบ php-fpm ก็จะทำให้สามารถใช้งาน info.php ได้ครับ ! แต่ถ้าไม่มี php-fpm ก็จะไม่สามารถใช้งาน info.php ได้ครับ

สิ่งที่จะทำในบทความนี้

  • Launch instance
  • ติดตั้ง PHP 8.2
  • ติดตั้ง Nginx
  • ตั้งค่าการใช้งาน Nginx
  • ทดสอบหน้าเว็บไซต์

สิ่งที่ต้องมี

Launch instance

※ติดตั้ง EC2 Instance (Amazon Linux 2023) สำหรับใช้กับ Nginx แล้ว

ดูตัวอย่างการสร้าง Amazon Linux 2023 ได้ที่ลิงก์บทความด้านล่างนี้ (ลิงก์บทความด้านล่างนี้เป็นแค่ตัวอย่าง ซึ่งมีการตั้งค่าบางส่วนที่แตกต่างกัน แนะนำให้ดู ตัวอย่างการสร้าง EC2 Instance ประกอบด้วย)

ตัวอย่างการสร้าง EC2 Instance

Region: Singapore

※Launch instances
Name and tags
Name: tinnakorn-test (ตั้งชื่อที่ต้องการ)

Application and OS Images (Amazon Machine Image)
Amazon Machine Image (AMI): Amazon Linux 2023 AMI

Instance type
Instance type: t3a.micro (เลือกสเปคตามต้องการ)

Key pair (login)
Key pair name - required: tinnakorn-test (key pair ที่สร้างขึ้นเมื่อสักครู่นี้)

Network settings
Firewall (security groups)
Security group name - required: tinnakorn-test (ตั้งชื่อที่ต้องการ)
Description - required: tinnakorn-test (ป้อนตามต้องการ)
Inbound security groups rules
Security group rule 1 (TCP, 22, xxx.xxx.xxx.xxx/32)
Type: ssh | Source type: My IP | Source: xxx.xxx.xxx.xxx/32

Configure storage
1x: 8 GiB gp2 Root volume (Default)

เพิ่ม HTTP ใน Security Group ของ EC2

เมื่อติดตั้ง EC2 Instance เรียบร้อยแล้ว ให้เพิ่ม HTTP ใน Security Group ของ EC2 Instance เพื่อใช้ในการสื่อสารระหว่างเว็บเซิร์ฟเวอร์ (web server) และเบราว์เซอร์ (web browser) ครับ

เข้ามาที่หน้าจอ EC2 Instance แล้วเลือก Instance ของเรา แล้วเลือกแท็บ Security และคลิกที่ Security Groups

เลือกแท็บ Inbound rules และเลือก Edit inbound rules

เมื่อเข้ามาที่ Edit inbound rules แล้วทำการตั้งค่าดังนี้:
・คลิกปุ่ม Add rule แล้วจะมี Security group rule เพิ่มขึ้นมา
・เลือก Type: HTTP ▼
・เลือก Source: Anywhere-IPv4 ▼
・คลิก Save rules

จะเห็นว่ามี Security group rule ที่เป็นโปรโตคอล HTTP เพิ่มขึ้นมาแล้ว การตั้งค่าในส่วนนี้ก็เสร็จเรียบร้อยแล้วครับ

เตรียมการเชื่อมต่อกับ EC2 Instance

ก่อนติดตั้งคำสั่งที่ต้องใช้สิทธิ์ root ควรติดตั้งคำสั่งตามด้านล่างนี้ก่อน

คำสั่งเข้าสู่ระบบผู้ใช้ระดับสูงสุดหรือ root (Superuser)

sudo su -


คำสั่งอัปเดตโปรแกรมและแพคเกจต่าง ๆ ในระบบ

yum update -y

ติดตั้ง PHP 8.2 ใน Amazon Linux 2023

คำสั่งติดตั้ง PHP 8.2

yum install -y php8.2


ตรวจสอบ Version PHP

php -v

root@ip-xx-xx-xx-xx:~

[root@ip-xx-xx-xx-xx ~]# php -v
PHP 8.2.15 (cli) (built: Jan 16 2024 12:19:32) (NTS gcc x86_64)
Copyright (c) The PHP Group
Zend Engine v4.2.15, Copyright (c) Zend Technologies
    with Zend OPcache v8.2.15, Copyright (c), by Zend Technologies
[root@ip-xx-xx-xx-xx ~]#

ติดตั้ง Nginx ใน Amazon Linux 2023

คำสั่งติดตั้ง Nginx

yum install -y nginx


ตรวจสอบ Version Nginx

nginx -v

root@ip-xx-xx-xx-xx:~

[root@ip-xx-xx-xx-xx ~]# nginx -v
nginx version: nginx/1.24.0
[root@ip-xx-xx-xx-xx ~]#

ตั้งค่าการใช้งาน Nginx

รันคำสั่งสร้างโฟลเดอร์ html

mkdir -p /var/www/html


รันคำสั่งเปลี่ยนแปลงสิทธิ์การเข้าถึงไฟล์หรือไดเรกทอรีที่ต้องการ เช่น โฟลเดอร์ html

chmod 777 /var/www/html


รันคำสั่งแก้ไขไฟล์ nginx.conf

vi /etc/nginx/nginx.conf


เมื่อเข้ามาที่ไฟล์ nginx.conf แล้วทำการแก้ไขดังนี้:
・กดปุ่ม i ให้คำว่า "/etc/nginx/nginx.conf" ที่อยู่ด้านล่างซ้ายเปลี่ยนเป็น -- INSERT --
・เลื่อนลงมาด้านล่างจนเจอคำว่า server
・ค้นหา root ใน server และลบ /usr/share/nginx/html; ออกไป
・คัดลอก Path [/var/www/html;] นี้ แล้ววางใน root แทนที่คำว่า /usr/share/nginx/html; ที่ลบไปเมื่อสักครู่นี้

root@ip-xx-xx-xx-xx:~

"...ไม่ได้แสดง Code ส่วนบน..."

    # for more information.
    include /etc/nginx/conf.d/*.conf;

    server {
        listen       80;
        listen       [::]:80;
        server_name  _;
        root         /var/www/html;    # เปลี่ยนที่อยู่ root ที่นี่

        # Load configuration files for the default server block.
        include /etc/nginx/default.d/*.conf;

        error_page 404 /404.html;
        location = /404.html {
        }

        error_page 500 502 503 504 /50x.html;
        location = /50x.html {
        }
    }

# Settings for a TLS enabled server.

"...ไม่ได้แสดง Code ส่วนล่าง..."

-- INSERT --                                         48,31         40%    # กดปุ่ม i ที่แป้นพิมพ์


เมื่อเปลี่ยน path root เสร็จแล้ว ให้ Save ตามนี้:
・กดปุ่ม Esc ให้คำว่า -- INSERT -- ที่อยู่ด้านล่างซ้ายหายไป
・พิมพ์ :x หรือ :wq + Enter เพื่อบันทึก

root@ip-xx-xx-xx-xx:~

"...ไม่ได้แสดง Code ส่วนบน..."

    # for more information.
    include /etc/nginx/conf.d/*.conf;

    server {
        listen       80;
        listen       [::]:80;
        server_name  _;
        root         /var/www/html;

        # Load configuration files for the default server block.
        include /etc/nginx/default.d/*.conf;

        error_page 404 /404.html;
        location = /404.html {
        }

        error_page 500 502 503 504 /50x.html;
        location = /50x.html {
        }
    }

# Settings for a TLS enabled server.

"...ไม่ได้แสดง Code ส่วนล่าง..."

:x

เริ่มต้นระบบ Nginx

ต่อไปรันคำสั่งตามด้านล่างนี้เพื่อเริ่มต้นระบบ Nginx

รันคำสั่งเริ่มต้นระบบ Nginx

systemctl start nginx


รันคำสั่งเปิดการใช้งาน Nginx

systemctl enable nginx

ทดสอบหน้าเว็บไซต์โดยรัน Server ผ่าน Nginx

ต่อไปรันคำสั่งเข้าไปที่ path /var/www/html

cd /var/www/html


แล้วรันคำสั่งสร้างไฟล์ index.html เพื่อใช้ในการทดสอบหน้าเว็บไซต์

vi index.html


เมื่อเข้ามาที่ไฟล์ index.html แล้วทำการแก้ไขดังนี้:
・กดปุ่ม i ให้คำว่า "index.html" ที่อยู่ด้านล่างซ้ายเปลี่ยนเป็น -- INSERT --
・คัดลอก Code ด้านล่างนี้ และนำไปวางในไฟล์ index.html ที่เรากำลังแก้ไขอยู่โดยคลิกขวาเพื่อวางได้เลย

<html><body>Test</body></html>

root@ip-xx-xx-xx-xx:~

<html><body>Test</body></html>    // วาง Code ที่นี่
~
~
~
~
~
~
-- INSERT --                                          1,31          All    // กดปุ่ม i ที่แป้นพิมพ์


เมื่อวาง Code เสร็จแล้ว กดปุ่ม Esc ให้ --INSERT-- หายไป
แล้วพิมพ์ :x หรือ :wq เพื่อทำการ Save

root@ip-xx-xx-xx-xx:~

<html><body>Test</body></html>    // วาง Code ที่นี่
~
~
~
~
~
~
:x


ต่อไปจะใช้ไฟล์ index.html ในการทดสอบหน้าเว็บไซต์ผ่าน Public IPv4 address ของ EC2 Instance

ไปที่หน้าจอ EC2 Instance ของเรา แล้วคัดลอก Public IPv4 address และนำไปเปิดที่เว็บเบราว์เซอร์ที่เราใช้งาน

แล้วจะเห็นข้อความคำว่า Test ตามที่ได้สร้างไว้ในไฟล์ index.html เมื่อสักครู่นี้

ทดสอบหน้าเว็บไซต์โดยรัน Server ผ่าน PHP 8.2

รันคำสั่งเพื่อสร้างไฟล์ info.php และใช้ในการทดสอบหน้าเว็บไซต์

vi info.php


เมื่อเข้ามาที่ไฟล์ info.php แล้วทำการแก้ไขดังนี้:
・กดปุ่ม i ให้คำว่า "info.php" ที่อยู่ด้านล่างซ้ายเปลี่ยนเป็น -- INSERT --
・คัดลอก Code ด้านล่างนี้ และนำไปวางในไฟล์ info.php ที่เรากำลังแก้ไขอยู่โดยคลิกขวาเพื่อวางได้เลย

<?php 
phpinfo();

root@ip-xx-xx-xx-xx:~

<?php
phpinfo();
~
~
~
~
~
-- INSERT --                                         2,11          All    // กดปุ่ม i ที่แป้นพิมพ์


เมื่อวาง Code เสร็จแล้ว กดปุ่ม Esc ให้ --INSERT-- หายไป
แล้วพิมพ์ :x หรือ :wq เพื่อทำการ Save

root@ip-xx-xx-xx-xx:~

<?php
phpinfo();
~
~
~
~
~
:x


ต่อไปจะใช้ไฟล์ info.php ในการทดสอบหน้าเว็บไซต์ผ่าน Public IPv4 address ของ EC2 Instance

กลับมาที่เว็บเบราว์เซอร์ที่เราทดสอบเมื่อสักครู่นี้ แล้วเพิ่ม /info.php + Enter อีกครั้งตามตัวอย่างด้านล่างนี้ครับ

http://[IP Address]/info.php

แล้วจะเห็นหน้าจอเว็บไซต์ของ "PHP Version 8.2.xx" แบบนี้ครับ

แล้วสังเกตที่ Server API: FPM/FastCGI คือเมื่อรัน PHP โดยใช้ Nginx ก็จะเป็นการรันจาก library ที่เรียกว่า FPM / FastCGI นั่นเอง

สุดท้ายนี้เราจะมาตรวจสอบสถานะ FPM/FastCGI โดยรันคำสั่งตามด้านล่างนี้

php-fpm -v

root@ip-xx-xx-xx-xx:~

[root@ip-xx-xx-xx-xx html]# php-fpm -v
PHP 8.2.15 (fpm-fcgi) (built: Jan 16 2024 12:19:32)
Copyright (c) The PHP Group
Zend Engine v4.2.15, Copyright (c) Zend Technologies
    with Zend OPcache v8.2.15, Copyright (c), by Zend Technologies
[root@ip-xx-xx-xx-xx html]#

เพียงเท่านี้ก็สามารถเรียกใช้ PHP 8.2 โดยใช้ Nginx ใน EC2 (Amazon Linux 2023) บน AWS ได้อย่างมีประสิทธิภาพครับ

สรุป

เมื่อผู้ใช้งานทำการเชื่อมต่อจากเว็บเบราว์เซอร์แล้ว Nginx ก็จะดำเนินการ และเมื่อเริ่มต้นระบบ php-fpm ก็จะทำให้สามารถใช้งาน info.php ได้ ! แต่ถ้าไม่มี php-fpm ก็จะไม่สามารถใช้งาน info.php ได้ ดังนั้นถ้าเราติดตั้ง Nginx แล้วเราต้องติดตั้ง PHP8.0 และเปิดใช้งาน php-fpm ไว้ด้วยจึงจะสามารถใช้งานได้ครับ

ผมหวังว่าบทความนี้จะเป็นประโยชน์ให้กับผู้อ่านได้นะครับ

POP (Tinnakorn Maneewong) จากบริษัท Classmethod (Thailand) ครับ !

บทความที่เกี่ยวข้อง