Laravel 安裝和 NGINX 設定 for CentOS 8

Laravel

安裝 Laravel 在 CentOS 8 作業系統使用 NGINX 網頁伺服器搭配 PHP-FPM 的環境,並設定 SELinux 及符合 Laravel 的 NGINX 配置。

Laravel

伺服器需求

Laravel 框架針對不同版本會有一些系統上各別的需求,以 Laravel 5.8 版本為例,必須確保伺服器符合下列 PHP 擴充要求 (其它 Laravel 版本系統需求,可參考 Larave 官網 Installation - Laravel - The PHP Framework For Web Artisans):

  • PHP >= 7.13。
  • BCMath PHP Extension。
  • Ctype PHP Extension。
  • JSON PHP Extension。
  • Mbstring PHP Extension。
  • OpenSSL PHP Extension。
  • PDO PHP Extension。
  • Tokenizer PHP Extension。
  • XML PHP Extension。

查看 PHP 版本:

php -v
PHP 7.2.24 (cli) (built: Oct 22 2019 08:28:36) ( NTS )
Copyright (c) 1997-2018 The PHP Group
Zend Engine v3.2.0, Copyright (c) 1998-2018 Zend Technologies

要確認伺服器是否已安裝 Laravel 版本的 PHP 擴充要求,可使用 php -m 指令列出所有已安裝的 PHP 擴充,並搭配 egrep 指令指定要比對的 PHP 擴充關鍵字,下述為所有必須安裝的 PHP 擴充,通常需自行安裝 php-bcmathphp-xml

php -m | egrep 'bcmath|ctype|json|mbstring|openssl|pdo|tokenizer|xml'
bcmath
ctype
json
libxml
mbstring
openssl
pdo_mysql
pdo_sqlite
tokenizer
xml
xmlreader
xmlwriter

安裝 Laravel

切換到欲建立 Laravel 的專案目錄:

cd /usr/share/nginx/

使用 Composer 執行 create-project 指令來安裝 Laravel 的指定版本 (無指定版本則安裝當前最新版本):

  • 5.8.*:指定安裝 Laravel 5.8 版本。
  • blog:專案名稱 (如果要將 Laravel 安裝在當前目錄可替換成 .)。
composer create-project --prefer-dist laravel/laravel=5.8.* blog
Creating a "laravel/laravel=5.8.*" project at "./blog"
Installing laravel/laravel (v5.8.35)
  - Installing laravel/laravel (v5.8.35): Downloading (100%)         
Created project in /usr/share/nginx/blog

# ... 省略 ...

37 packages you are using are looking for funding.
Use the `composer fund` command to find out more!
> @php artisan key:generate --ansi
Application key set successfully.

切換到安裝的 Laravel 專案目錄:

cd blog/

設定

目錄和檔案權限

遞迴設定網站目錄下,所有【目錄】的權限設定:

find /usr/share/nginx/blog/ -type d -exec chmod 2775 {} \;

遞迴設定網站目錄下,所有【檔案】的權限設定:

find /usr/share/nginx/blog/ -type f -exec chmod 664 {} \;

Laravel 目錄權限

伺服器必須要有寫入 storagebootstrap/cache 目錄的權限,否則 Laravel 就無法執行:

chmod -R 777 storage
chmod -R 777 bootstrap/cache/

NGINX

目錄、檔案擁有者和群組

遞迴設定網站目錄下,所有【目錄、檔案】的擁有者和群組為 NGINX:

chown nginx:nginx -R /usr/share/nginx/blog

設定檔

需要將網站根目錄指向專案目錄內的 public 目錄,並重導所有請求至 index.php 前端控制器,即可讓所有的 HTTP 請求透過它進入應用程式。

針對 Laravel 專案建立的 NGINX 設定如下:

vim /etc/nginx/conf.d/blog.conf
server {
    # 監聽的 port
    listen 8080;
    # 網站伺服器名稱 (網址或 IP)
    server_name localhost;
    # 網站根目錄
    root /usr/share/nginx/blog/public;

    # 調用 PHP FastCGI 設定檔 (NGINX 預設提供)
    include /etc/nginx/default.d/php.conf;

    add_header X-Frame-Options "SAMEORIGIN";
    add_header X-XSS-Protection "1; mode=block";
    add_header X-Content-Type-Options "nosniff";

    index index.html index.htm index.php;

    charset utf-8;

    # 重導所有請求至 index.php
    location / {
        try_files $uri $uri/ /index.php?$query_string;
    }

    location = /favicon.ico { access_log off; log_not_found off; }
    location = /robots.txt  { access_log off; log_not_found off; }

    error_page 404 /index.php;

    location ~ /\.(?!well-known).* {
        deny all;
    }
}

重新載入 NGINX 設定:

systemctl reload nginx

SELinux

由於 CentOS 使用 SELinux 對作業系統進行安全性防護,因此要讓 Laravel 能夠順利作用,還必須設定對應的 SELinux 目錄類型和規則。

http 讀取權限

查看 Laravel 專案目錄 SELinux 目錄類型:

ls -Zd /usr/share/nginx/blog
unconfined_u:object_r:usr_t:s0 /usr/share/nginx/blog

設定能透過 http 讀取 Laravel 專案目錄和所有檔案的 SELinux 目錄類型。

chcon -R -t httpd_sys_content_t /usr/share/nginx/blog
ls -Zd /usr/share/nginx/blog
unconfined_u:object_r:httpd_sys_content_t:s0 /usr/share/nginx/blog

http 寫入權限

Laravel 運行中會使用 storage 目錄記錄 log 及存取本機檔案,因此必須設定 http 寫入的 SELinux 目錄類型:

chcon -R -t httpd_sys_rw_content_t /usr/share/nginx/blog/storage
ls -Zd /usr/share/nginx/blog/storage
unconfined_u:object_r:httpd_sys_rw_content_t:s0 /usr/share/nginx/blog/storage

連結資料庫

預設 SELinux 規則不允許透過 http 連結資料庫:

getsebool -a | grep httpd_can_network_connect_db
httpd_can_network_connect_db --> off

修改 SELinux 規則允許透過 http 連結資料庫:

setsebool -P httpd_can_network_connect_db 1
getsebool -a | grep httpd_can_network_connect_db
httpd_can_network_connect_db --> on

測試

瀏覽器輸入網站伺服器的網址或 IP,順利的話就能看到下圖的 Laravel 預設畫面。

參考

發表留言