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

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

สวัสดีครับ ครั้งนี้ผมจะมาแนะนำการ เรียกใช้ PHP โดยใช้ Nginx บน EC2 (Amazon Linux 2) เนื่องจากการเรียกใช้ PHP โดยใช้ Nginx จะทำงานได้เร็วกว่าการใช้ Apache นั่นเป็นสาเหตุที่ Nginx เป็นที่นิยมในทุกวันนี้ ซึ่งผมก็จะอธิบายวิธีการตั้งค่าสำหรับการใช้งาน Nginx ร่วมกับ EC2 ครับ ! ไปเริ่มกันเลยครับ

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

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

สิ่งที่จะทำในบทความนี้
・Start EC2 Instance
・Install PHP8.0
・Install Nginx
・Install php-fpm

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

ทำการติดตั้ง EC2 Instance สำหรับใช้ในการเชื่อมต่อกับ Nginx โดยทำตามลิงก์ด้านล่างนี้ครับ
! สำหรับผู้ใช้งานที่มีอยู่แล้ว ข้ามขั้นตอนนี้ไปได้เลยครับ

  • ตัวอย่างการตั้งค่า EC2 ในบทความนี้

Create Key pairs

Key pairs:tinnakorn-test

Launch instances

Name and tags

Name:tinnakorn-test

Application and OS Images (Amazon Machine Image)

Amazon Machine Image (AMI):Amazon Linux 2 AMI (HVM) - Kernel 5.10, SSD Volume Type(Default)

Instance type

Instance type:t3a.nano

Key pair (login)

Key pair name - required:tinnakorn-test

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, 0.0.0.0/0)

Type:ssh ▼| Source type:My IP ▼| Source:xxx.xxx.x.xxx/32 ✕

Configure storage

1x:8GiBgp2 ▼Root volume (Default)

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

เมื่อทำการติดตั้ง EC2 Instance เรียบร้อยแล้ว ให้เพิ่ม HTTP ใน Security Group ของ EC2 เพื่อใช้ในการแสดงผลหน้าเว็บไซต์ครับ

เข้ามาที่หน้า Console EC2 Instance ของเรา เลื่อนลงมาประมาณตรงกลาง เลือกหัวข้อSecurityและคลิกที่ Security Group ของเราครับ

มาที่หัวข้อInbound rulesและเลือกEdit inbound rulesครับ

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

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

ติดตั้ง PHP8.0 และ Nginx ใน Amazon Linux 2

ติดตั้ง PHP8.0

รันคำสั่งนี้เพื่อติดตั้ง PHP8.0

amazon-linux-extras install -y php8.0

รันคำสั่งนี้เพื่อตรวจสอบ Version PHP8.0

php -v

Output↓↓↓

root@ip-172-31-27-236:~

[root@ip-172-31-27-236 ~]# php -v
PHP 8.0.18 (cli) (built: May 16 2022 19:07:27) ( NTS )
Copyright (c) The PHP Group
Zend Engine v4.0.18, Copyright (c) Zend Technologies
[root@ip-172-31-27-236 ~]#

ติดตั้ง Nginx

รันคำสั่งนี้เพื่อติดตั้ง Nginx

amazon-linux-extras install -y nginx1

รันคำสั่งนี้เพื่อตรวจสอบ Version Nginx

nginx -v

Output↓↓↓

root@ip-172-31-27-236:~

[root@ip-172-31-27-236 ~]# nginx -v
nginx version: nginx/1.20.0
[root@ip-172-31-27-236 ~]#

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

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

mkdir -p /var/www/html

Output↓↓↓

root@ip-172-31-27-236:~

[root@ip-172-31-27-236 ~]# mkdir -p /var/www/html
[root@ip-172-31-27-236 ~]#


รันคำสั่งนี้เพื่อเปิดโหมดการใช้งานขั้นสูงสุดให้กับโฟลเดอร์ html

chmod 777 /var/www/html

Output↓↓↓

root@ip-172-31-27-236:~

[root@ip-172-31-27-236 ~]# chmod 777 /var/www/html
[root@ip-172-31-27-236 ~]#


รันคำสั่งนี้เพื่อเข้ามาหน้าแก้ไขไฟล์ nginx.conf

vi /etc/nginx/nginx.conf


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

/var/www/html;

root@ip-172-31-27-236:~

"...ตัด 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 {
        }

"...ตัด Code ส่วนล่างออก..."

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


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

root@ip-172-31-27-236:~

"...ตัด 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 {
        }

"...ตัด Code ส่วนล่างออก..."

:x

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

เมื่อเปลี่ยนที่อยู่ root เสร็จแล้วให้ทำการเริ่มต้นระบบ Nginx ตามคำสั่งด้านล่างนี้

systemctl start nginx

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

systemctl enable nginx

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

เมื่อทำการเริ่มต้นระบบ Nginx เสร็จแล้วให้เข้าไปที่ path/var/www/htmlตามคำสั่งด้านล่างนี้

cd /var/www/html

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

vi index.html


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

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

root@ip-172-31-27-236:~

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


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

root@ip-172-31-27-236:~

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


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

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

เมื่อเปิดเว็บเบราว์เซอร์ด้วย Public IPv4 address แล้วจะเห็นข้อความว่าTestตามที่ผมได้สร้างไว้ในไฟล์ index.html เมื่อสักครู่นี้

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

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

vi info.php


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

<?php 
phpinfo();

root@ip-172-31-27-236:~

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


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

root@ip-172-31-27-236:~

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


เมื่อสร้างไฟล์ vi info.php เสร็จแล้วผมจะทดสอบหน้าเว็บไซต์โดยใช้ Public IPv4 address ของ EC2 Instance อีกครั้งครับ

กลับมาที่เว็บเบราว์เซอร์ที่เรา Copy Public IPv4 address ไปวางเมื่อสักครู่นี้ จากนั้นให้เพิ่ม/info.php+ Enter อีกครั้งตามตัวอย่างด้านล่างนี้ครับ

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

เมื่อเพิ่ม/info.phpในเว็บเบราว์เซอร์เสร็จแล้ว จะเห็นเป็นหน้าเว็บไซต์ของ PHP8.0.xx ครับ

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

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

php-fpm -v

Output↓↓↓

root@ip-172-31-27-236:~

[root@ip-172-31-27-236 html]# php-fpm -v
PHP 8.0.18 (fpm-fcgi) (built: May 16 2022 19:09:24)
Copyright (c) The PHP Group
Zend Engine v4.0.18, Copyright (c) Zend Technologies
[root@ip-172-31-27-236 html]#

สรุป

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

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

ดูรายละเอียดเพิ่มเติมได้ที่นี่ สอบถามเพิ่มเติมเกี่ยวกับ AWS คลิกที่นี่