ติดตั้ง Nginx + Laravel 5.4 (PHP 7.1) บน CentOS 7
จุดประสงค์ของเนื้อหานี้ เพื่อใช้จดบันทึกขั้นตอนการ Setup และการ Configure Server เพื่อให้พร้อมต่อการทำงานของ Nginx กับ Laravel 5.4(PHP 7.1) บน CentOS 7
วันที่อัพเดทเนื้อหาล่าสุด: 28 สิงหาคม 2060
ความพร้อมก่อนเข้าเนื้อหา
- มี Server ที่ติดตั้ง CentOS 7 (Clean Install)
- มีพื้นฐานเกี่ยวกับ Laravel มาก่อน
สรุปขั้นตอนก่อนลงมือ
- ติดตั้ง Nginx
- ติดตั้ง PHP 7.1 (PHP-FPM)
- Configure ให้ PHP ทำงานบน Nginx
- ติดตั้ง Laravel 5.4
- Configure Virtual Host ของ Nginx
- Configure Laravel และ SELinux
ติดตั้ง Nginx
ติดตั้ง EPEL repository ก่อน, จากนั้นติดตั้ง Nginx
# sudo yum -y install epel-release
# sudo yum -y install nginxRun และ Enable เพื่อให้ Nginx ทำงานทันทีหากมีการ Reboot Server
# sudo systemctl start nginx
# sudo systemctl enable nginxทดสอบการทำงาน โดยรันคำสั่งต่อไปนี้
# netstat -plntu// หารันแล้วแสดงข้อความว่า
// "-bash: netstat: command not found"
// ให้ติดตั้ง net-tools package ด้วยคำสั่งนี้
// และลองรัน $ netstat -plntu อีกครั้ง# sudo yum -y install net-tools
จะได้ผลลัพธ์ดังรูป

ติดตั้ง PHP 7.1 (PHP-FPM)
ติดตั้ง repository ที่ชื่อว่า webtatic, จากนั้นติดตั้ง PHP+PHP-FPM และ Components พื้นฐานของ PHP ที่ต้องใช้สำหรับ Laravel
# sudo rpm -Uvh https://mirror.webtatic.com/yum/el7/webtatic-release.rpm# sudo yum install -y php71w php71w-curl php71w-common php71w-cli php71w-mysql php71w-mbstring php71w-fpm php71w-xml php71w-pdo php71w-zip
ทดสอบการทำงาน โดยรันคำสั่งต่อไปนี้
# php-fpm -vจะได้ผลลัพธ์ดังรูป

Configure ให้ PHP-FPM ทำงานบน Nginx
เปิดไฟล์ /etc/php.ini ด้วย vi หรือ nano(แล้วแต่ถนัด)โดยหาบรรทัดที่มีค่าว่า
;cgi.fix_pathinfo=1จากนั้นแก้ไขโดย Uncomment (เอา ; ออก) และแก้ค่าเป็น 0 ดังนี้
cgi.fix_pathinfo=0Save และปิดไฟล์
จากนั้นเปิดไฟล์ /etc/php-fpm.d/www.conf ด้วย vi หรือ nano(แล้วแต่ถนัด) และแก้ไขบรรทัดต่อไปนี้
user = apache
group = apache-- แก้ไขให้เป็น --user = nginx
group = nginxlisten = 127.0.0.1:9000-- แก้ไขให้เป็น --listen = /run/php-fpm/php-fpm.sock
และ
;listen.owner = nobody
;listen.group = nobody
;listen.mode = 0660-- แก้ไขให้เป็น --listen.owner = nginx
listen.group = nginx
listen.mode = 0660
จากนั้น Save และปิดไฟล์
Run และ Enable เพื่อให้ php-fpm ทำงานทันทีหากมีการ Reboot Server
# sudo systemctl start php-fpm
# sudo systemctl enable php-fpmทดสอบการทำงาน โดยรันคำสั่งต่อไปนี้
# netstat -pl | grep php-fpm.sockจะได้ผลลัพธ์ดังรูป

ทดสอบการทำงาน PHP-FPM บน Nginx โดยการเปิด Web browser และกรอก URL เป็น IP Address หรือ Domain name ของ Server
หากทำงานได้ปกติ จะแสดงหน้าเว็บ Wellcome Nginx, แต่หากไม่ทำงาน ให้ตรวจสอบ firewall ด้วยคำสั่งต่อไปนี้
# firewall-cmd --list-all
ตรวจสอบที่บรรทัด services จะพบว่ายังไม่มี service http และ https, ให้เพิ่มเข้าไปด้วยคำสั่งต่อไปนี้
# sudo firewall-cmd --permanent --zone=public --add-service=http
# sudo firewall-cmd --permanent --zone=public --add-service=https
# sudo firewall-cmd --reloadเมื่อตรวจสอบ firewall อีกครั้งจะพบว่ามี service http และ https เพิ่มขึ้นมาแล้ว

ทดสอบโดยการ Refresh web browser อีกครั้งจะพบหน้าจอดังรูป

ติดตั้ง Laravel 5.4
ติดตั้ง Composer, Unzip และ Laravel ตามลำดับ
# curl -sS https://getcomposer.org/installer | sudo php -- --install-dir=/usr/bin --filename=composer# sudo yum -y install unzip# composer create-project laravel/laravel /var/www/laravel
Configure Virtual Host ของ Nginx
สร้าง Virtual Host, โดยการสร้างไฟล์ laravel.conf ไว้ใน /etc/nginx/conf.d/
# nano /etc/nginx/conf.d/laravel.confจากนั้นใส่ configuration ดังนี้
server {
listen 80;
#listen [::]:80 ipv6only=on;
# Log files for Debugging
access_log /var/log/nginx/laravel-access.log;
error_log /var/log/nginx/laravel-error.log;
# Webroot Directory for Laravel project
root /var/www/laravel/public;
index index.php index.html index.htm;
# Your Domain Name
server_name 192.168.99.100;
location / {
try_files $uri $uri/ /index.php?$query_string;
}
# PHP-FPM Configuration Nginx
location ~ \.php$ {
try_files $uri =404;
fastcgi_split_path_info ^(.+\.php)(/.+)$;
fastcgi_pass unix:/run/php-fpm/php-fpm.sock;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
}โดยบรรทัดที่เป็น server_name 192.168.99.100; ให้แก้ไขให้ตรงกับ IP Address ของ server หรือใส่เป็น Domain name
จากนั้น Save และปิดไฟล์
ทดสอบ Nginx configuration และ Restart Nginx ด้วยคำสั่งต่อไปนี้
# nginx -t
# sudo systemctl restart nginxConfigure Laravel และ SELinux
ก่อนจะทำการ Configure ค่าใดๆ หากเราลองทดสอบด้วยการใช้ web browser ชี้ URL ไปที่ IP address ของ Server, จะพบว่ายังไม่สามารถแสดงผลได้, โดยจะมีข้อความแจ้งว่า “403 Forbidden”
ลองรันคำสั่งดังนี้
# sestatusจะได้ผลลัพธ์ดังนี้

ซึ่งหมายความว่า SELinux อยู่ใน mode enforcing, ซึ่งการปรับตั้งค่าของ SELinux เพื่อให้สามารถรัน Laravel ได้ สามารถทำได้ 2 วิธีดังนี้
วิธีที่ 1 (แนะนำ)
ติดตั้ง SELinux management tools สำหรับ CentOS 7 ด้วยคำสั่ง
# sudo yum -y install policycoreutils-pythonจากนั้นรันคำสั่งต่อไปนี้
# semanage fcontext -a -t httpd_sys_rw_content_t '/var/www/laravel(/.*)?'# semanage fcontext -a -t httpd_sys_rw_content_t '/var/www/laravel/public(/.*)?'# semanage fcontext -a -t httpd_sys_rw_content_t '/var/www/laravel/storage(/.*)?'# semanage fcontext -a -t httpd_sys_rw_content_t '/var/www/laravel/app(/.*)?'# semanage fcontext -a -t httpd_sys_rw_content_t '/var/www/laravel/bootstrap(/.*)?'# semanage fcontext -a -t httpd_sys_rw_content_t '/var/www/laravel/config(/.*)?'# semanage fcontext -a -t httpd_sys_rw_content_t '/var/www/laravel/database(/.*)?'# semanage fcontext -a -t httpd_sys_rw_content_t '/var/www/laravel/resources(/.*)?'# semanage fcontext -a -t httpd_sys_rw_content_t '/var/www/laravel/routes(/.*)?'# semanage fcontext -a -t httpd_sys_rw_content_t '/var/www/laravel/vendor(/.*)?'# semanage fcontext -a -t httpd_sys_rw_content_t '/var/www/laravel/tests(/.*)?'# restorecon -Rv '/var/www/laravel/'
จากนั้นให้ทดลองใช้ web browser ชี้ URL ไปที่ IP address ของ Server, จะพบ error ดังรูปนี้

แก้ไขโดยรันคำสั่งต่อไปนี้
# chown -R nginx:root /var/www/laravel# chmod 755 /var/www/laravel/storage
ลอง Refresh web browser จะพบหน้า Laravel ดังรูป

วิธีที่ 2 (ไม่แนะนำ)
วิธีนี้เราจะทำการ disable SELinux โดยเปิดไฟล์ /etc/sysconfig/selinux และแก้ไขบรรทัดต่อไปนี้
SELINUX=enforcing-- แก้ไขเป็น --SELINUX=disabled
Save และปิดไฟล์, และให้ทำการ reboot server
จากนั้นให้ตรวจสอบผลการตั้งค่าโดย โดยพิมพ์คำสั่งนี้
# sestatusจะได้ผลลัพธ์ดังรูป

จากนั้นให้ทดลองใช้ web browser ชี้ URL ไปที่ IP address ของ Server, จะพบ error ดังรูปนี้

แก้ไขโดยรันคำสั่งต่อไปนี้
# chmod -R 777 /var/www/laravel/storageลอง Refresh web browser จะพบหน้า Laravel (จบแล้ว)
