วิธีติดตั้ง Linux, Nginx, MySQL, PHP (LEMP stack) บน Ubuntu
บทนำ
สแตกซอฟต์แวร์ LEMP ใช้สำหรับให้บริการหน้าเว็บไดนามิกและเว็บแอปพลิเคชันที่เขียนด้วย PHP นี่คือคำย่อที่อธิบายระบบปฏิบัติการ Linux พร้อมเซิร์ฟเวอร์เว็บ Nginx (ออกเสียงว่า “Engine-X”) ข้อมูลแบ็กเอนด์ถูกเก็บในฐานข้อมูล MySQL และการประมวลผลแบบไดนามิกถูกจัดการโดย PHP.
คู่มือนี้สาธิตวิธีการติดตั้งสแต็ก LEMP บนเซิร์ฟเวอร์ Ubuntu ระบบปฏิบัติการ Ubuntu จะดูแลส่วนของ Linux ของสแต็ก เราจะอธิบายวิธีการติดตั้งและทำให้ส่วนประกอบที่เหลือทำงานได้
หมายเหตุ: บทช่วยสอนนี้เน้นไปที่ Ubuntu 22.04 LTS พร้อม PHP 8.1 เป็นหลัก สำหรับผู้ใช้ Ubuntu 24.04 LTS ให้ปรับอ้างอิงเวอร์ชัน PHP จาก
php8.1-fpmเป็นphp8.3-fpmในทุกคำสั่ง และอย่าลืมอัปเดตเส้นทางซ็อกเก็ต PHP-FPM ในการตั้งค่า Nginx ของคุณด้วย (เช่น ใช้/run/php/php8.3-fpm.sockสำหรับ Ubuntu 24.04)
วิธีติดตั้ง Linux, Nginx, MySQL, PHP (สแต็ก LEMP) บน Ubuntu
- การติดตั้งเว็บเซิร์ฟเวอร์ Nginx
- การติดตั้ง MySQL
- การติดตั้ง PHP
- การตั้งค่า Nginx ให้ใช้ตัวประมวลผล PHP
- การทดสอบ PHP กับ Nginx
- ทดสอบการเชื่อมต่อฐานข้อมูลจาก PHP
คุณสมบัติพื้นฐาน
ใช้ผู้ใช้ sudo ที่ไม่ใช่ root บน Ubuntu พร้อมเปิดใช้งานไฟร์วอลล์ UFW ตามคู่มือการติดตั้งเซิร์ฟเวอร์เริ่มต้นของเราสำหรับ Ubuntu เพื่อทำการตั้งค่านี้
ขั้นตอนที่ 1 – การติดตั้งเซิร์ฟเวอร์เว็บ Nginx
เพื่อแสดงหน้าเว็บให้ผู้เข้าชมเว็บไซต์ คุณจะใช้ Nginx ซึ่งเป็นเว็บเซิร์ฟเวอร์ประสิทธิภาพสูง คุณจะใช้ตัวจัดการแพ็กเกจ APT ในการติดตั้งซอฟต์แวร์นี้
อัปเดตดัชนีแพ็กเกจของเซิร์ฟเวอร์ของคุณ จากนั้นติดตั้ง Nginx:
sudo apt updateหลังจากนั้น ให้รัน apt install เพื่อติดตั้ง Nginx:
sudo apt install nginxเมื่อมีข้อความแจ้ง ให้กด Y และ ENTER เพื่อยืนยันว่าคุณต้องการติดตั้ง Nginx เมื่อการติดตั้งเสร็จสิ้น เว็บเซิร์ฟเวอร์ Nginx จะทำงานอยู่บนเซิร์ฟเวอร์ Ubuntu ของคุณ
ตรวจสอบว่า Nginx กำลังทำงานอยู่:
sudo systemctl status nginxคุณควรเห็นผลลัพธ์ที่แสดงว่า Nginx กำลังทำงานอยู่:
● nginx.service - A high performance web server and a reverse proxy server
Loaded: loaded (/lib/systemd/system/nginx.service; enabled; vendor preset: enabled)
Active: active (running) since...บน Ubuntu, Nginx ถูกตั้งค่าให้เริ่มทำงานทันทีหลังจากติดตั้ง
อนุญาตให้มีการรับส่งข้อมูล HTTP ผ่านไฟร์วอลล์ ufw Nginx จะลงทะเบียนโปรไฟล์แอปพลิเคชัน UFW หลายตัวเมื่อทำการติดตั้ง ตรวจสอบโปรไฟล์ที่มีอยู่:
sudo ufw app listAvailable applications:
Nginx Full
Nginx HTTP
Nginx HTTPS
OpenSSHเปิดใช้งานโปรไฟล์ที่เข้มงวดที่สุดที่อนุญาตให้มีการจราจรที่ต้องการ เนื่องจากยังไม่ได้ตั้งค่า SSL จึงอนุญาตให้มีเฉพาะการจราจร HTTP บนพอร์ต 80:
เปิดใช้งานสิ่งนี้โดยการรันคำสั่งต่อไปนี้:
sudo ufw allow 'Nginx HTTP'
ตรวจสอบการเปลี่ยนแปลงไฟร์วอลล์:
sudo ufw statusผลลัพธ์นี้แสดงให้เห็นว่าการรับส่งข้อมูล HTTP ได้รับอนุญาตแล้ว:
Status: active
To Action From
-- ------ ----
OpenSSH ALLOW Anywhere
Nginx HTTP ALLOW Anywhere
OpenSSH (v6) ALLOW Anywhere (v6)
Nginx HTTP (v6) ALLOW Anywhere (v6)ในการทดสอบฟังก์ชันของโดเมนของเซิร์ฟเวอร์ Nginx ให้ไปที่ http://your_domain โดยใช้เว็บเบราว์เซอร์ที่คุณชื่นชอบ
หากคุณยังไม่มีชื่อโดเมนที่ชี้ไปยังเซิร์ฟเวอร์ของคุณ และคุณไม่ทราบที่อยู่ IP สาธารณะของเซิร์ฟเวอร์ คุณสามารถค้นหามันได้โดยการรันคำสั่งใดคำสั่งหนึ่งต่อไปนี้:
ip addr showhostname -Iนี่จะแสดงที่อยู่ IP สองสามอัน คุณสามารถลองแต่ละอันตามลำดับในเว็บเบราว์เซอร์ของคุณได้
เป็นทางเลือกอีกหนึ่งวิธี คุณสามารถตรวจสอบว่า IP ใดสามารถเข้าถึงได้ จากมุมมองของสถานที่อื่น ๆ บนอินเทอร์เน็ต:
curl -4 icanhazip.comพิมพ์ที่อยู่ที่คุณได้รับในเว็บเบราว์เซอร์ของคุณ และมันจะพาคุณไปยังหน้าหลักเริ่มต้นของ Nginx:
http://<server_domain_or_IP>หากคุณได้รับหน้านี้ หมายความว่าคุณได้ติดตั้ง Nginx สำเร็จแล้วและเปิดใช้งานการรับส่งข้อมูล HTTP สำหรับเว็บเซิร์ฟเวอร์ของคุณ
ขั้นตอนที่ 2 — การติดตั้ง MySQL
ติดตั้ง MySQL เพื่อจัดเก็บและจัดการข้อมูลของเว็บไซต์ MySQL คือระบบจัดการฐานข้อมูลมาตรฐานสำหรับสภาพแวดล้อม PHP
อีกครั้ง ใช้ apt เพื่อดาวน์โหลดและติดตั้งซอฟต์แวร์นี้:
sudo apt install mysql-serverเมื่อมีการแจ้งเตือน ยืนยันการติดตั้งโดยกด Y จากนั้นกด ENTER
หลังจากติดตั้งแล้ว ให้รันสคริปต์ความปลอดภัยเพื่อเอาค่าตั้งต้นที่ไม่ปลอดภัยออกและล็อกการเข้าถึงฐานข้อมูล:
sudo mysql_secure_installationคุณจะได้รับข้อความถามว่าต้องการกำหนดค่า VALIDATE PASSWORD PLUGIN หรือไม่
หมายเหตุ: การเปิดใช้งานฟีเจอร์นี้ขึ้นอยู่กับการตัดสินใจส่วนบุคคล หากเปิดใช้งาน รหัสผ่านที่ไม่ตรงตามเกณฑ์ที่กำหนดจะถูก MySQL ปฏิเสธและแสดงข้อผิดพลาด การปล่อยให้การตรวจสอบถูกปิดก็ปลอดภัย แต่คุณควรใช้รหัสผ่านที่แข็งแรงและไม่ซ้ำกันสำหรับข้อมูลประจำตัวของฐานข้อมูลเสมอ
ตอบ Y สำหรับใช่ หรือพิมพ์อย่างอื่นเพื่อดำเนินการต่อโดยไม่เปิดใช้งาน:
VALIDATE PASSWORD COMPONENT can be used to test passwords
and improve security. It checks the strength of password
and allows the users to set only those passwords which are
secure enough. Would you like to setup VALIDATE PASSWORD component?
Press y|Y for Yes, any other key for No: หากคุณตอบ “ใช่” คุณจะถูกขอให้เลือกระดับการตรวจสอบรหัสผ่าน โปรดทราบว่าหากคุณป้อน 2 สำหรับระดับที่เข้มงวดที่สุด คุณจะได้รับข้อผิดพลาดเมื่อพยายามตั้งค่ารหัสผ่านใด ๆ ที่ไม่มีตัวเลข ตัวอักษรใหญ่และเล็ก และอักขระพิเศษ:
There are three levels of password validation policy:
LOW Length >= 8
MEDIUM Length >= 8, numeric, mixed case, and special characters
STRONG Length >= 8, numeric, mixed case, special characters and dictionary file
Please enter 0 = LOW, 1 = MEDIUM and 2 = STRONG: 1ไม่ว่าคุณจะเลือกตั้งค่า VALIDATE PASSWORD PLUGIN หรือไม่ เซิร์ฟเวอร์ของคุณจะขอให้คุณเลือกและยืนยันรหัสผ่านสำหรับผู้ใช้ MySQL root ซึ่งไม่ควรสับสนกับ system root ผู้ใช้ database root เป็นผู้ดูแลระบบที่มีสิทธิ์เต็มรูปแบบในการจัดการระบบฐานข้อมูล แม้ว่าวิธีการตรวจสอบสิทธิ์เริ่มต้นสำหรับผู้ใช้ MySQL root จะไม่จำเป็นต้องใช้รหัสผ่าน แม้ว่าจะตั้งค่าแล้วก็ตาม คุณควรกำหนดรหัสผ่านที่เข้มแข็งที่นี่เป็นมาตรการความปลอดภัยเพิ่มเติม เราจะพูดถึงเรื่องนี้ต่อไปในอีกสักครู่
หากคุณเปิดใช้งานการตรวจสอบรหัสผ่าน คุณจะเห็นความแข็งแรงของรหัสผ่านสำหรับรหัสผ่าน root ที่คุณป้อน และเซิร์ฟเวอร์ของคุณจะถามว่าคุณต้องการดำเนินการต่อด้วยรหัสผ่านนั้นหรือไม่ หากคุณพอใจกับรหัสผ่านปัจจุบันของคุณ ให้กด Y สำหรับ “ใช่” ที่พรอมป์:
Estimated strength of the password: 100
Do you wish to continue with the password provided?(Press y|Y for Yes, any other key for No) : yสำหรับคำถามที่เหลือ ให้กด Y แล้วกดปุ่ม ENTER ที่แต่ละคำถาม ซึ่งจะเป็นการลบผู้ใช้งานที่ไม่ระบุชื่อบางส่วนและฐานข้อมูลทดสอบ ปิดการเข้าสู่ระบบ root จากระยะไกล และโหลดกฎใหม่เหล่านี้เพื่อให้ MySQL นำการเปลี่ยนแปลงที่คุณทำไปใช้ทันที
เมื่อคุณเสร็จแล้ว ให้ทดสอบว่าคุณสามารถเข้าสู่ระบบคอนโซล MySQL ได้หรือไม่:
sudo mysqlนี่จะเชื่อมต่อกับเซิร์ฟเวอร์ MySQL ในฐานะผู้ใช้ฐานข้อมูลระดับผู้ดูแลระบบ root ซึ่งสามารถสันนิษฐานได้จากการใช้ sudo เมื่อรันคำสั่งนี้ คุณควรได้รับผลลัพธ์ดังต่อไปนี้:
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 10
Server version: 8.0.28-0ubuntu4 (Ubuntu)
Copyright (c) 2000, 2022, Oracle and/or its affiliates.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql>เพื่อออกจากคอนโซล MySQL ให้พิมพ์ดังนี้:
exitสังเกตว่าคุณไม่จำเป็นต้องใส่รหัสผ่านเพื่อเชื่อมต่อในฐานะผู้ใช้ root แม้ว่าคุณจะได้กำหนดรหัสผ่านไว้เมื่อรันสคริปต์ mysql_secure_installation นั่นเป็นเพราะเมื่อติดตั้งบน Ubuntu วิธีการตรวจสอบตัวตนเริ่มต้นสำหรับผู้ดูแลระบบ MySQL คือ auth_socket แทนที่จะใช้วิธีที่ต้องใช้รหัสผ่าน ซึ่งในตอนแรกอาจดูเหมือนเป็นปัญหาด้านความปลอดภัย แต่จริง ๆ แล้วทำให้เซิร์ฟเวอร์ฐานข้อมูลปลอดภัยมากขึ้น เนื่องจากผู้ใช้ที่อนุญาตให้เข้าสู่ระบบในฐานะผู้ใช้ MySQL root จะเป็นเพียงผู้ใช้ระบบที่มีสิทธิ์ sudo เท่านั้น ที่เชื่อมต่อจากคอนโซลหรือผ่านแอปพลิเคชันที่รันด้วยสิทธิ์เดียวกัน ในทางปฏิบัติ หมายความว่าคุณจะไม่สามารถใช้ผู้ดูแลระบบฐานข้อมูล root เพื่อเชื่อมต่อจากแอปพลิเคชัน PHP ของคุณได้
เพื่อความปลอดภัยที่เพิ่มขึ้น ควรมีบัญชีผู้ใช้เฉพาะที่มีสิทธิ์น้อยสำหรับแต่ละฐานข้อมูล โดยเฉพาะหากคุณวางแผนที่จะมีหลายฐานข้อมูลโฮสต์บนเซิร์ฟเวอร์ของคุณ
หมายเหตุ: เวอร์ชันเก่าบางตัวของไลบรารี MySQL PHP เอง mysqlnd ไม่รองรับ caching_sha2_authentication ซึ่งเป็นวิธีการยืนยันตัวตนเริ่มต้นสำหรับผู้ใช้ที่สร้างใน MySQL 8 ด้วยเหตุนี้ เมื่อสร้างผู้ใช้ฐานข้อมูลสำหรับแอปพลิเคชัน PHP บน MySQL 8 คุณอาจจำเป็นต้องตรวจสอบให้แน่ใจว่าพวกเขาถูกตั้งค่าให้ใช้ mysql_native_password แทน เราจะแสดงวิธีทำใน ขั้นตอนที่ 6
ตอนนี้เซิร์ฟเวอร์ MySQL ของคุณได้ติดตั้งและตั้งค่าความปลอดภัยเรียบร้อยแล้ว ต่อไปคุณจะติดตั้ง PHP ซึ่งเป็นส่วนสุดท้ายของสแตก LEMP
ขั้นตอนที่ 3 – การติดตั้ง PHP
ติดตั้ง PHP เพื่อประมวลผลโค้ดและสร้างเนื้อหาแบบไดนามิก Nginx ต้องใช้โปรแกรมภายนอกในการประมวลผล PHP
PHP-FPM ("ตัวจัดการกระบวนการ fastCGI") จัดการการประมวลผล PHP อย่างมีประสิทธิภาพพร้อมคุณสมบัติด้านความปลอดภัยเพิ่มเติม ทำให้เว็บไซต์ที่ใช้ PHP มีประสิทธิภาพดีขึ้น ติดตั้ง php-fpm เพื่อนำคำขอ PHP จาก Nginx และ php-mysql เพื่อเปิดใช้งานการสื่อสารระหว่าง PHP กับ MySQL แพ็กเกจ PHP หลักจะถูกติดตั้งโดยอัตโนมัติเป็นส่วนประกอบที่จำเป็น
ในการติดตั้งแพ็กเกจ php8.1-fpm และ php-mysql ให้รันคำสั่งต่อไปนี้:
sudo apt install php8.1-fpm php-mysqlเมื่อมีการแจ้งเตือน ให้กด Y และ ENTER เพื่อยืนยันการติดตั้ง
ตรวจสอบว่า PHP-FPM กำลังทำงานอยู่:
sudo systemctl status php8.1-fpmคุณควรเห็นผลลัพธ์ที่แสดงว่า PHP-FPM กำลังทำงานอยู่:
● php8.1-fpm.service - The PHP 8.1 FastCGI Process Manager
Loaded: loaded
Active: active (running)คุณสามารถตรวจสอบเวอร์ชันของ PHP ได้เช่นกัน:
php -vPHP 8.1.x (cli) (built: ...)
Copyright (c) The PHP Group
Zend Engine v4.1.xตั้งค่า Nginx ให้ใช้ส่วนประกอบ PHP เหล่านี้
ขั้นตอนที่ 4 — การกำหนดค่า Nginx ให้ใช้ตัวประมวลผล PHP
สร้าง server blocks ของ Nginx (คล้ายกับ Apache virtual hosts) เพื่อเก็บการตั้งค่าและโฮสต์หลายโดเมนบนเซิร์ฟเวอร์เดียว คู่มือนี้ใช้ your_domain เป็นตัวอย่างชื่อโดเมน
ข้อมูล: หากต้องการทราบข้อมูลเพิ่มเติมเกี่ยวกับการตั้งชื่อโดเมนกับ Linux-Console.net อ่านบทนำเกี่ยวกับ DNS ของ Linux-Console.net ของเรา
บน Ubuntu 22.04, Nginx จะเปิดใช้งานบล็อกเซิร์ฟเวอร์เริ่มต้นหนึ่งบล็อกที่ให้บริการเอกสารจาก /var/www/html สำหรับหลายเว็บไซต์ ให้สร้างโครงสร้างไดเรกทอรีภายใน /var/www สำหรับ your_domain โดยทิ้ง /var/www/html ไว้เป็นไดเรกทอรีสำรองเริ่มต้น
สร้างไดเรกทอรีเว็บหลักสำหรับ your_domain ดังนี้:
sudo mkdir /var/www/your_domainต่อไป กำหนดเจ้าของของไดเรกทอรีด้วยตัวแปรสภาพแวดล้อม $USER ซึ่งจะอ้างอิงไปยังผู้ใช้ระบบปัจจุบันของคุณ:
sudo chown -R $USER:$USER /var/www/your_domainจากนั้น ให้เปิดไฟล์การกำหนดค่าใหม่ในไดเรกทอรี sites-available ของ Nginx โดยใช้ตัวแก้ไขคำสั่งที่คุณชอบ ที่นี่ เราจะใช้ nano:
sudo nano /etc/nginx/sites-available/your_domainนี่จะสร้างไฟล์ว่างใหม่ ใส่การกำหนดค่าพื้นฐานดังต่อไปนี้:
server {
listen 80;
server_name your_domain www.your_domain;
root /var/www/your_domain;
index index.html index.htm index.php;
location / {
try_files $uri $uri/ =404;
}
location ~ \.php$ {
include snippets/fastcgi-php.conf;
fastcgi_pass unix:/run/php/php8.1-fpm.sock;
}
location ~ /\.ht {
deny all;
}
}นี่คือสิ่งที่แต่ละคำสั่งและบล็อกตำแหน่งเหล่านี้ทำ:
listen— กำหนดพอร์ตที่ Nginx จะฟัง ในกรณีนี้ มันจะฟังที่พอร์ต80ซึ่งเป็นพอร์ตเริ่มต้นสำหรับ HTTProot— กำหนดรากเอกสารที่เก็บไฟล์ซึ่งเว็บไซต์นี้ให้บริการindex— กำหนดลำดับที่ Nginx จะให้ความสำคัญกับไฟล์ index สำหรับเว็บไซต์นี้ โดยทั่วไปมักจะจัดลำดับไฟล์index.htmlไว้ก่อนไฟล์index.phpเพื่อให้สามารถตั้งค่าหน้า landing page สำหรับการบำรุงรักษาในแอปพลิเคชัน PHP ได้อย่างรวดเร็ว คุณสามารถปรับการตั้งค่าเหล่านี้ให้เหมาะสมกับความต้องการของแอปพลิเคชันของคุณได้server_name— กำหนดชื่อโดเมนและ/หรือที่อยู่ IP ที่บล็อกเซิร์ฟเวอร์นี้ควรตอบสนอง ชี้คำสั่งนี้ไปยังชื่อโดเมนของเซิร์ฟเวอร์ของคุณหรือที่อยู่ IP สาธารณะlocation /— บล็อก location แรกมีคำสั่งtry_filesซึ่งจะตรวจสอบการมีอยู่ของไฟล์หรือไดเรกทอรีที่ตรงกับคำขอ URL หาก Nginx ไม่พบทรัพยากรที่เหมาะสม มันจะแสดงข้อผิดพลาด 404location ~ \.php$— บล็อก location นี้จัดการการประมวลผล PHP จริงโดยการชี้ Nginx ไปยังไฟล์การกำหนดค่าfastcgi-php.confและไฟล์php8.1-fpm.sockซึ่งระบุว่าโซเก็ตใดที่เชื่อมโยงกับphp8.1-fpmlocation ~ /\.ht— บล็อก location สุดท้ายจะจัดการกับไฟล์.htaccessซึ่ง Nginx ไม่ได้ประมวลผล หากเพิ่มคำสั่งdeny allไฟล์.htaccessใด ๆ ที่อาจถูกวางใน root ของเอกสารก็จะไม่ถูกให้บริการแก่ผู้เข้าชม
เมื่อคุณแก้ไขเสร็จแล้ว ให้บันทึกและปิดไฟล์ หากคุณใช้ nano คุณสามารถทำได้โดยกด CTRL+X แล้วกด Y และ ENTER เพื่อยืนยัน
เปิดใช้งานการตั้งค่าของคุณโดยการลิงก์ไปยังไฟล์การตั้งค่าจากไดเรกทอรี sites-enabled ของ Nginx:
sudo ln -s /etc/nginx/sites-available/your_domain /etc/nginx/sites-enabled/จากนั้น ให้ยกเลิกการเชื่อมโยงไฟล์การตั้งค่าเริ่มต้นจากไดเร็กทอรี /sites-enabled/:
sudo unlink /etc/nginx/sites-enabled/defaultหมายเหตุ: หากคุณจำเป็นต้องคืนค่าการตั้งค่าเริ่มต้น คุณสามารถทำได้โดยการสร้างลิงก์สัญลักษณ์ใหม่ เช่น ตัวอย่างต่อไปนี้:
sudo ln -s /etc/nginx/sites-available/default /etc/nginx/sites-enabled/สิ่งนี้จะสั่งให้ Nginx ใช้การตั้งค่าเมื่อมีการโหลดใหม่ครั้งถัดไป คุณสามารถทดสอบการตั้งค่าของคุณเพื่อหาข้อผิดพลาดทางไวยากรณ์โดยการรันคำสั่งต่อไปนี้:
sudo nginx -tหากมีการรายงานข้อผิดพลาดใด ๆ ให้กลับไปตรวจสอบไฟล์การตั้งค่าของคุณก่อนที่จะดำเนินการต่อ
เมื่อคุณพร้อม ให้รีโหลด Nginx เพื่อใช้การเปลี่ยนแปลง:
sudo systemctl reload nginxเว็บไซต์ใหม่ของคุณเปิดใช้งานแล้ว แต่รากเว็บ /var/www/your_domain ยังว่างอยู่ สร้างไฟล์ index.html ในตำแหน่งนั้นเพื่อให้คุณสามารถทดสอบว่าเซิร์ฟเวอร์บล็อกใหม่ของคุณทำงานตามที่คาดไว้:
nano /var/www/your_domain/index.htmlรวมเนื้อหาดังต่อไปนี้ไว้ในไฟล์นี้:
<html>
<head>
<title>your_domain website</title>
</head>
<body>
<h1>Hello World!</h1>
<p>This is the landing page of <strong>your_domain</strong>.</p>
</body>
</html>ตอนนี้ไปที่เบราว์เซอร์ของคุณและเข้าถึงชื่อโดเมนหรือที่อยู่ IP ของเซิร์ฟเวอร์ของคุณ ตามที่ระบุไว้ในคำสั่ง server_name ภายในไฟล์การกำหนดค่าเซิร์ฟเวอร์ของคุณ:
http://server_domain_or_IPคุณจะได้รับหน้าจอดังต่อไปนี้:
หากคุณได้รับหน้านี้ แสดงว่าเซิร์ฟเวอร์บล็อก Nginx ของคุณทำงานตามที่คาดไว้
คุณสามารถปล่อยไฟล์นี้ไว้เป็นหน้าเริ่มต้นชั่วคราวสำหรับแอปพลิเคชันของคุณได้จนกว่าคุณจะสร้างไฟล์ index.php ขึ้นมาแทนที่
คำเตือน: หลังจากเพิ่มไฟล์ index.php ของคุณแล้ว โปรดตรวจสอบให้แน่ใจว่าได้ลบหรือเปลี่ยนชื่อไฟล์ index.html ออกจากไดเรกทอรีหลักของคุณแล้ว หากไฟล์ทั้งสองอยู่พร้อมกัน Nginx จะทำการให้บริการ index.html เป็นค่าเริ่มต้น และหน้าของ PHP ของคุณจะไม่ถูกแสดง—นี่เป็นสาเหตุทั่วไปของความสับสนสำหรับผู้ใช้ใหม่
สแต็ก LEMP ของคุณได้รับการตั้งค่าเรียบร้อยแล้ว ในขั้นตอนต่อไป คุณจะสร้างสคริปต์ PHP เพื่อทดสอบว่า Nginx สามารถจัดการไฟล์ .php ภายในเว็บไซต์ที่คุณตั้งค่าใหม่ได้จริงหรือไม่
ขั้นตอนที่ 5 – การทดสอบ PHP กับ Nginx
ตอนนี้ชุด LEMP ของคุณควรติดตั้งเสร็จสมบูรณ์แล้ว คุณสามารถทดสอบเพื่อยืนยันว่า Nginx สามารถส่งไฟล์ .php ให้กับโปรเซสเซอร์ PHP ของคุณได้อย่างถูกต้อง
คุณสามารถทำได้โดยการสร้างไฟล์ทดสอบ PHP ในโฟลเดอร์หลักของเอกสารของคุณ เปิดไฟล์ใหม่ชื่อ info.php ภายในโฟลเดอร์หลักของเอกสารของคุณในโปรแกรมแก้ไขข้อความที่คุณชื่นชอบ:
nano /var/www/your_domain/info.phpเพิ่มบรรทัดต่อไปนี้ลงในไฟล์ใหม่ นี่คือโค้ด PHP ที่ถูกต้องซึ่งจะแสดงข้อมูลเกี่ยวกับเซิร์ฟเวอร์ของคุณ:
<?php
phpinfo();เมื่อคุณทำเสร็จแล้ว ให้บันทึกและปิดไฟล์
คุณสามารถเข้าถึงหน้่านี้ได้ในเว็บเบราว์เซอร์ของคุณโดยไปที่ชื่อโดเมนหรือที่อยู่ IP สาธารณะที่คุณตั้งค่าไว้ในไฟล์การกำหนดค่า Nginx ของคุณ ตามด้วย /info.php:
http://server_domain_or_IP/info.phpคุณจะได้รับหน้าเว็บที่มีข้อมูลรายละเอียดเกี่ยวกับเซิร์ฟเวอร์ของคุณ:
หลังจากตรวจสอบข้อมูลที่เกี่ยวข้องเกี่ยวกับเซิร์ฟเวอร์ PHP ของคุณผ่านหน้านั้นแล้ว ควรลบไฟล์ที่คุณสร้างขึ้นเพราะไฟล์นั้นมีข้อมูลที่ละเอียดอ่อนเกี่ยวกับสภาพแวดล้อม PHP ของคุณและเซิร์ฟเวอร์ Ubuntu ของคุณ คุณสามารถใช้ rm เพื่อลบไฟล์นั้นได้:
sudo rm /var/www/your_domain/info.phpคุณสามารถสร้างไฟล์นี้ขึ้นมาใหม่ได้เสมอหากต้องการใช้ในภายหลัง
ขั้นตอนที่ 6 — ทดสอบการเชื่อมต่อฐานข้อมูลจาก PHP (ไม่บังคับ)
ถ้าคุณต้องการทดสอบว่า PHP สามารถเชื่อมต่อกับ MySQL และรันคำสั่งฐานข้อมูลได้หรือไม่ คุณสามารถสร้างตารางทดสอบพร้อมข้อมูลตัวอย่างและเรียกดูเนื้อหาของมันจากสคริปต์ PHP ก่อนทำเช่นนั้น คุณจำเป็นต้องสร้างฐานข้อมูลทดสอบและผู้ใช้ MySQL ใหม่ที่ตั้งค่าอย่างเหมาะสมเพื่อเข้าถึงฐานข้อมูลนั้น
หมายเหตุ: บางเวอร์ชันเก่าของไลบรารี PHP ของ MySQL แบบ native mysqlnd อาจไม่รองรับ caching_sha2_authentication วิธีการยืนยันตัวตนเริ่มต้นสำหรับ MySQL 8 คุณอาจต้องตรวจสอบให้แน่ใจว่ามีการตั้งค่าให้ใช้ mysql_native_password แทน
เราจะสร้างฐานข้อมูลชื่อ example_database และผู้ใช้ชื่อ example_user แต่คุณสามารถเปลี่ยนชื่อเหล่านี้เป็นค่าที่ต่างออกไปได้
ก่อนอื่น ให้เชื่อมต่อกับคอนโซล MySQL โดยใช้บัญชี root:
sudo mysqlในการสร้างฐานข้อมูลใหม่ ให้รันคำสั่งต่อไปนี้จากคอนโซล MySQL ของคุณ:
CREATE DATABASE example_database;ตอนนี้คุณสามารถสร้างผู้ใช้ใหม่และมอบสิทธิ์เต็มรูปแบบให้กับฐานข้อมูลที่คุณสร้างขึ้นได้
คำสั่งต่อไปนี้สร้างผู้ใช้ใหม่ชื่อ example_user โดยใช้ mysql_native_password เป็นวิธีการตรวจสอบเริ่มต้น เรากำหนดรหัสผ่านของผู้ใช้นี้เป็น password แต่คุณควรเปลี่ยนค่าเป็นรหัสผ่านที่ปลอดภัยที่คุณเลือกเอง
CREATE USER 'example_user'@'%' IDENTIFIED WITH mysql_native_password BY 'password';ตอนนี้เราจำเป็นต้องให้สิทธิ์ผู้ใช้นี้กับฐานข้อมูล example_database:
GRANT ALL ON example_database.* TO 'example_user'@'%';นี่จะให้ผู้ใช้ example_user มีสิทธิ์เต็มที่เหนือฐานข้อมูล example_database ในขณะที่ป้องกันไม่ให้ผู้ใช้นี้สร้างหรือแก้ไขฐานข้อมูลอื่น ๆ บนเซิร์ฟเวอร์ของคุณ
ตอนนี้ออกจากเชลล์ MySQL ด้วยคำสั่งต่อไปนี้:
exitคุณสามารถทดสอบว่าผู้ใช้ใหม่มีสิทธิ์ที่เหมาะสมหรือไม่โดยการเข้าสู่ระบบคอนโซล MySQL อีกครั้ง คราวนี้ใช้ข้อมูลรับรองผู้ใช้ที่กำหนดเอง สังเกตธง -p ในคำสั่งนี้ ซึ่งจะให้คุณกรอกรหัสผ่านที่ใช้เมื่อสร้างผู้ใช้ example_user:
mysql -u example_user -pหลังจากเข้าสู่ระบบคอนโซล MySQL แล้ว ให้ยืนยันว่าคุณสามารถเข้าถึงฐานข้อมูล example_database ได้:
SHOW DATABASES;ซึ่งจะได้ผลลัพธ์ดังต่อไปนี้:
+--------------------+
| Database |
+--------------------+
| example_database |
| information_schema |
+--------------------+
2 rows in set (0.000 sec)ต่อไป เราจะสร้างตารางทดสอบชื่อ todo_list จากคอนโซล MySQL ให้รันคำสั่งต่อไปนี้:
CREATE TABLE example_database.todo_list (
item_id INT AUTO_INCREMENT,
content VARCHAR(255),
PRIMARY KEY(item_id)
);แทรกเนื้อหาสองสามแถวในตารางทดสอบ คุณอาจต้องการทำคำสั่งต่อไปนี้ซ้ำหลายครั้ง โดยใช้ค่าที่ต่างกัน:
INSERT INTO example_database.todo_list (content) VALUES ("My first important item");เพื่อยืนยันว่าข้อมูลถูกบันทึกลงในตารางของคุณเรียบร้อยแล้ว ให้รัน:
SELECT * FROM example_database.todo_list;ผลลัพธ์ของคุณควรแสดงดังนี้:
+---------+--------------------------+
| item_id | content |
+---------+--------------------------+
| 1 | My first important item |
| 2 | My second important item |
| 3 | My third important item |
| 4 | and this one more thing |
+---------+--------------------------+
4 rows in set (0.000 sec)หลังจากยืนยันว่าคุณมีข้อมูลที่ถูกต้องในตารางทดสอบของคุณแล้ว คุณสามารถออกจากคอนโซล MySQL ได้:
exitตอนนี้คุณสามารถสร้างสคริปต์ PHP ที่จะเชื่อมต่อกับ MySQL และดึงข้อมูลเนื้อหาของคุณได้ สร้างไฟล์ PHP ใหม่ในไดเรกทอรีรากเว็บที่คุณกำหนดเองโดยใช้โปรแกรมแก้ไขที่คุณชื่นชอบ เราจะใช้ nano สำหรับขั้นตอนนี้:
nano /var/www/your_domain/todo_list.phpสคริปต์ PHP ต่อไปนี้เชื่อมต่อกับฐานข้อมูล MySQL และดึงข้อมูลจากตาราง todo_list โดยจะแสดงผลลัพธ์เป็นรายการ หากมีปัญหาในการเชื่อมต่อฐานข้อมูล จะเกิดข้อยกเว้น
เพิ่มเนื้อหาต่อไปนี้ลงในสคริปต์ todo_list.php ของคุณ:
<?php
$user = "example_user";
$password = "password";
$database = "example_database";
$table = "todo_list";
try {
$db = new PDO("mysql:host=localhost;dbname=$database", $user, $password);
echo "<h2>TODO</h2><ol>";
foreach($db->query("SELECT content FROM $table") as $row) {
echo "<li>" . $row['content'] . "</li>";
}
echo "</ol>";
} catch (PDOException $e) {
print "Error!: " . $e->getMessage() . "<br/>";
die();
}
บันทึกและปิดไฟล์เมื่อคุณแก้ไขเสร็จแล้ว
คุณสามารถเข้าถึงหน้าดังกล่าวนี้ในเว็บเบราว์เซอร์ของคุณได้แล้วโดยไปที่ชื่อโดเมนหรือที่อยู่ IP สาธารณะที่กำหนดสำหรับเว็บไซต์ของคุณ ตามด้วย /todo_list.php:
http://server_domain_or_IP/todo_list.phpคุณควรจะได้รับหน้าจอแบบดังต่อไปนี้ ซึ่งแสดงเนื้อหาที่คุณได้ใส่ลงในตารางทดสอบของคุณ:
นั่นหมายความว่าสภาพแวดล้อม PHP ของคุณพร้อมที่จะเชื่อมต่อและโต้ตอบกับเซิร์ฟเวอร์ MySQL ของคุณแล้ว
คำถามที่พบบ่อย
สแตก LEMP ใช้ทำอะไร?
สแตก LEMP ใช้โฮสต์เว็บไซต์และแอปพลิเคชันแบบไดนามิกที่เขียนด้วย PHP รวมถึง WordPress, Laravel, Magento, Drupal และโปรเจกต์ PHP แบบกำหนดเอง เหมาะอย่างยิ่งสำหรับเว็บไซต์ที่มีการเข้าชมสูงซึ่งต้องการการจัดการการเชื่อมต่อพร้อมกันอย่างมีประสิทธิภาพ
ความแตกต่างระหว่างสแตก LEMP และ LAMP คืออะไร?
LEMP ใช้ Nginx ซึ่งจัดการการเชื่อมต่อแบบอะซิงโครนัสด้วยสถาปัตยกรรมแบบขับเคลื่อนด้วยเหตุการณ์—มีประสิทธิภาพสำหรับผู้ใช้จำนวนมากพร้อมกัน LAMP ใช้ Apache ซึ่งโดยทั่วไปจะสร้างเธรดต่อคำขอ (แม้ว่า Apache รุ่นใหม่จะรองรับโหมดขับเคลื่อนด้วยเหตุการณ์) โดยรวม LEMP มักให้ประสิทธิภาพที่ดีขึ้นสำหรับเนื้อหาคงที่และสถานการณ์ที่มีความพร้อมใช้งานสูง ในขณะที่ LAMP ให้การกำหนดค่า .htaccess ที่ง่ายกว่าและการสนับสนุนโมดูลที่กว้างกว่า
ฉันควรใช้เวอร์ชัน Ubuntu ใดสำหรับ LEMP?
Ubuntu 22.04 LTS เป็นเป้าหมายหลักสำหรับคู่มือนี้ มาพร้อมกับ PHP 8.1, MySQL 8.0 และ Nginx ที่มีการสนับสนุนระยะยาว Ubuntu 24.04 LTS (เวอร์ชันล่าสุด) มาพร้อมกับ PHP 8.3 โดยค่าเริ่มต้น และสามารถใช้งานร่วมกับคู่มือนี้ได้โดยการปรับเส้นทางซ็อกเก็ต PHP-FPM และหมายเลขรุ่นให้เหมาะสม
ฉันติดตั้ง LEMP stack บน Ubuntu 24.04 ได้อย่างไร?
ทำตามขั้นตอนหลักเหล่านี้:
- ติดตั้ง Nginx:
sudo apt install nginx - ติดตั้ง MySQL:
sudo apt install mysql-server - รันสคริปต์ความปลอดภัย MySQL:
sudo mysql_secure_installation - ติดตั้ง PHP-FPM:
sudo apt install php-fpm php-mysql - กำหนดค่าบล็อกเซิร์ฟเวอร์ Nginx พร้อมการเชื่อมต่อ PHP-FPM
- ทดสอบกับ
info.phpและการเชื่อมต่อฐานข้อมูล
ดูขั้นตอนการทำทั้งหมดในขั้นตอนที่ 1-6 ข้างต้น
ฉันควรติดตั้ง PHP เวอร์ชันใดกับ Nginx และ MySQL?
ใช้ PHP เวอร์ชันเริ่มต้นของ Ubuntu ของคุณเพื่อความเข้ากันได้ดีที่สุด:
- Ubuntu 22.04: PHP 8.1 (ติดตั้งผ่าน
php8.1-fpm) - Ubuntu 24.04: PHP 8.3 (ปรับคำสั่งเป็น
php8.3-fpmสำหรับเวอร์ชันนี้)
ทั้งสองเวอร์ชันทำงานได้อย่างยอดเยี่ยมกับ Nginx และ MySQL 8.0 รองรับเฟรมเวิร์กสมัยใหม่ และได้รับการอัปเดตความปลอดภัยอย่างต่อเนื่อง
ฉันจะตั้งค่า Nginx ให้ประมวลผลไฟล์ PHP ได้อย่างไร?
เพิ่มบล็อก location ~ \.php$ ในการตั้งค่าเซิร์ฟเวอร์ Nginx ของคุณเพื่อส่งคำขอ PHP ไปยัง PHP-FPM ผ่าน Unix socket:
location ~ \.php$ {
include snippets/fastcgi-php.conf;
fastcgi_pass unix:/run/php/php8.1-fpm.sock;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}ปรับเส้นทางซ็อกเก็ตตามเวอร์ชัน PHP ของคุณ ทดสอบด้วย sudo nginx -t และรีโหลดด้วย sudo systemctl reload nginx
ทำไมฉันถึงได้รับข้อผิดพลาด “502 Bad Gateway” หลังจากติดตั้ง PHP-FPM?
ข้อผิดพลาด 502 แสดงว่า Nginx ไม่สามารถสื่อสารกับ PHP-FPM ได้ สาเหตุทั่วไป:
- PHP-FPM ไม่ทำงาน: ตรวจสอบด้วย
sudo systemctl status php8.1-fpmและเริ่มต้นหากจำเป็น - เส้นทางซ็อกเก็ตผิด: ตรวจสอบว่า
/run/php/php8.1-fpm.sockมีอยู่จริงและตรงกับการตั้งค่า Nginx ของคุณ - ปัญหาการอนุญาต: ตรวจสอบให้แน่ใจว่าผู้ใช้ Nginx (www-data) สามารถเข้าถึงซ็อกเก็ตได้
- ข้อผิดพลาดในการกำหนดค่า PHP-FPM: ตรวจสอบบันทึกที่
/var/log/php8.1-fpm.log
วิธีแก้ปัญหา: รีสตาร์ทบริการทั้งสอง:
sudo systemctl restart php8.1-fpm nginxฉันจะป้องกัน MySQL หลังติดตั้งได้อย่างไร?
เรียกใช้สคริปต์ความปลอดภัยที่มีอยู่ในตัว:
sudo mysql_secure_installationทำตามคำแนะนำเพื่อ:
- เปิดใช้งานปลั๊กอินตรวจสอบรหัสผ่าน
- ตั้งรหัสผ่านรูทที่แข็งแรง
- ลบผู้ใช้ที่ไม่ระบุชื่อ
- ปิดการเข้าสู่ระบบ root ระยะไกล
- ลบฐานข้อมูลทดสอบ
- โหลดสิทธิ์ใหม่
สำหรับฐานข้อมูลแอปพลิเคชัน ให้สร้างผู้ใช้เฉพาะที่มีสิทธิ์จำกัดแทนการใช้บัญชี root
ฉันสามารถรันหลายเว็บไซต์บนเซิร์ฟเวอร์ LEMP เครื่องเดียวได้หรือไม่?
ใช่ สร้างบล็อกเซิร์ฟเวอร์ Nginx แยกสำหรับแต่ละโดเมน:
- สร้างไดเร็กทอรี:
sudo mkdir -p /var/www/second_domain - สร้างบล็อกเซิร์ฟเวอร์:
sudo nano /etc/nginx/sites-available/second_domain - กำหนดค่าด้วย
server_nameและrootที่ไม่ซ้ำกัน - เปิดใช้งาน:
sudo ln -s /etc/nginx/sites-available/second_domain /etc/nginx/sites-enabled/ - ทดสอบและโหลดใหม่:
sudo nginx -t && sudo systemctl reload nginx
แต่ละไซต์สามารถมีการตั้งค่า PHP และผู้ใช้ฐานข้อมูลที่แยกกันได้
ฉันจะอัปเกรด PHP เป็นเวอร์ชันใหม่ได้อย่างไร?
การอัปเกรดแพ็กเกจของ Ubuntu จะจัดการเวอร์ชันย่อยโดยอัตโนมัติ สำหรับการอัปเกรดเวอร์ชันหลัก:
เพิ่ม PHP PPA ของOndřej (พื้นที่เก็บข้อมูลบุคคลที่สามที่เชื่อถือได้):
sudo add-apt-repository ppa:ondrej/php sudo apt updateติดตั้งเวอร์ชัน PHP-FPM ใหม่:
sudo apt install php8.3-fpm php8.3-mysql -yอัปเดตเส้นทางซ็อกเก็ตของการตั้งค่า Nginx เป็น
/run/php/php8.3-fpm.sockทดสอบและโหลด Nginx ใหม่
สามารถลบเวอร์ชันเก่าได้ตามต้องการ:
sudo apt purge php8.1-fpm
ควรทดสอบในสภาพแวดล้อมจำลองก่อนอัปเกรดระบบจริงเสมอ
การแก้ไขปัญหาที่พบบ่อย
ข้อผิดพลาด 502 เกตเวย์ไม่ถูกต้อง
ปัญหาที่พบบ่อยที่สุดของสแต็ก LEMP เกิดขึ้นเมื่อ Nginx ไม่สามารถสื่อสารกับ PHP-FPM ได้:
ตรวจสอบสถานะ PHP-FPM:
sudo systemctl status php8.1-fpmตรวจสอบเส้นทางซ็อกเก็ต:
ls -la /run/php/ผลลัพธ์ที่คาดหวังควรแสดงไฟล์ php8.1-fpm.sock
การแก้ไขทั่วไป:
- รีสตาร์ท PHP-FPM:
sudo systemctl restart php8.1-fpm - ตรวจสอบว่าเส้นทางซ็อกเก็ตของบล็อกเซิร์ฟเวอร์ Nginx ตรงกับซ็อกเก็ต PHP-FPM จริงหรือไม่
- ตรวจสอบสิทธิ์ไฟล์:
sudo chown www-data:www-data /run/php/php8.1-fpm.sock
ข้อผิดพลาดการปฏิเสธสิทธิ์
แก้ไขสิทธิ์ไดเร็กทอรีเว็บ:
sudo chown -R www-data:www-data /var/www/your_domain
sudo chmod -R 755 /var/www/your_domainปัญหาการเชื่อมต่อ MySQL
รีเซ็ตรหัสผ่าน root ของ MySQL:
sudo mysql
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'new_password';
FLUSH PRIVILEGES;
EXIT;ตรวจสอบบริการ MySQL:
sudo systemctl status mysqlPHP ไม่ทำงาน
ตรวจสอบโมดูล PHP:
php -m | grep -E 'mysql|fpm'ตรวจสอบการตั้งค่า PHP-FPM:
sudo nginx -t
sudo php-fpm8.1 -tแก้ไขข้อผิดพลาด 404:
- ตรวจสอบว่า
index.phpอยู่ในคำสั่งindexของ Nginx หรือไม่ - ตรวจสอบว่ามีไฟล์หรือไม่:
ls -la /var/www/your_domain/ - ตรวจสอบบันทึกข้อผิดพลาดของ Nginx:
sudo tail -f /var/log/nginx/error.log
บทสรุป
ในคู่มือนี้ คุณได้สร้างพื้นฐานที่ยืดหยุ่นสำหรับการให้บริการเว็บไซต์และแอปพลิเคชัน PHP แก่ผู้เข้าชมของคุณ โดยใช้ Nginx เป็นเว็บเซิร์ฟเวอร์และ MySQL เป็นระบบฐานข้อมูล คุณสามารถทำสิ่งนี้ด้วยเว็บเซิร์ฟเวอร์ Apache ได้เช่นกัน ดูบทเรียนของเราเกี่ยวกับวิธีติดตั้ง Linux, Apache, MySQL, PHP (LAMP) บน Ubuntu คุณยังสามารถรักษาความปลอดภัยให้กับเว็บไซต์ของคุณด้วย Let’s Encrypt ซึ่งให้ใบรับรองที่เชื่อถือได้และฟรี เรียนรู้วิธีการทำสิ่งนี้กับคู่มือของเราเกี่ยวกับ Let’s Encrypt สำหรับ Apache
ขอบคุณที่เรียนรู้ร่วมกับชุมชน Linux-Console.net



