Laravel 安裝和 NGINX 設定 for CentOS 8
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-bcmath
和 php-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 目錄權限
伺服器必須要有寫入 storage
和 bootstrap/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 預設畫面。
參考
本著作係採用創用 CC 姓名標示-相同方式分享 3.0 台灣 授權條款授權.