Try   HackMD

GCP Ubuntu Nginx 部署 Laravel 8 專案

tags: deploy gcp nginx laravel database

前言

這次部署踩了不少雷,像是因為專案是用 Laravel 8 寫的,所以機器也要升到 PHP7.4,但怎麼升、要裝哪些東西也是卡很久;裝好後那個權限問題也是折騰了一番,為了下次不再崩潰,紀錄個部署流程

準備

  • GCP Compute Engine: Ubuntu 18.04
  • 要部署的專案

步驟

  1. local 安裝 gcloud SDK
  2. remote 安裝 PHP7.4、composer、mysql
  3. remote 安裝 git、下載專案、權限設定
  4. remote 安裝 Nginx、設定 nginx conf

1. GCP Compute Engine

GCP 全名 Google Cloud Platform,Compute Engine 是 GCP 開虛擬機的服務

1-1 安裝 gcloud SDK

開好機器

1-2 連線到遠端機器

Make sure you are authenticated with the correct account:

gcloud auth list
  • account 1
    account 2
    Change to the project's account if not:

gcloud config set account ACCOUNT
Depending on the account, the project list will be different:

gcloud projects list
  • project 1
  • project 2
    Switch to intended project:
gcloud config set project PROJECT ID
  • instance_zone: 開機器時選的位置,例如 asia-east1-b
  • instance_name: 機器名稱
gcloud compute ssh --zone [instance_zone] [instance_name]
  • 偷懶寫法
gcloud compute ssh [instance_name]

2-1 安裝 PHP7.4

sudo apt-get install software-properties-common
sudo add-apt-repository ppa:ondrej/php
sudo apt-get update
sudo apt -y --allow-unauthenticated install php7.4
sudo apt-get install -y --allow-unauthenticated  \
php7.4-{bcmath,bz2,intl,gd,mbstring,mysql,zip,xml}
  • 查看本版,檢查是否安裝成功
php -v

2-2 安裝 Composer

  • 安裝且設定 $PATH
curl -sS https://getcomposer.org/installer \
| sudo php -- --install-dir=/usr/local/bin --filename=composer
  • 查看本版,檢查是否安裝成功
composer -v

2-3 安裝 MySQL

sudo apt-get install mysql-server

若要安裝特定版本sudo apt-get install mysql-server-5.7
若要設密碼:$sudo mysql_secure_installation

啟動 mysql-server:

sudo systemctl start mysql

查看是否成功啟動:

systemctl |grep mysql

進入 mysql server:

sudo mysql -u root

查看目前使用者及其身份驗證方式:

SELECT User, Host, plugin FROM mysql.user;
CREATE USER 'liang'@'localhost' IDENTIFIED WITH mysql_native_password BY '00000';

給予新建的使用者存取DB的權限:

GRANT ALL PRIVILEGES ON *.* TO 'liang'@'localhost';

(*.* 代表所有DB的所有 table)
查看目前 mysql server的使用者:

select user,plugin,authentication_string from mysql.user;

建立 DB

CREATE DATABASE database_name;

3-1 安裝 git

sudo apt-get update
sudo apt-get upgrade -y --allow-unauthenticated
sudo apt-get install git

3-2 下載專案

git clone

安裝相關套件

composer install

環境檔設置

cp .env.example .env
php artisan key:generate

其他環境變數設置,例如 API KEY、AUTH TOKEN

vi .env

3-3 設置專案權限

這邊很重要!三顆星!

移動到專案目錄

cd /var/www/project

專案擁有者改為自己、全組改為 www-data

sudo chown -R $USER:www-data .

權限設定,讓自己和 server 都能存取

sudo find . -type f -exec chmod 664 {} \;   
sudo find . -type d -exec chmod 775 {} \;

變更三個路徑的權限

sudo chgrp -R www-data storage bootstrap/cache public
sudo chmod -R ug+rwx storage bootstrap/cache public

其他方式請見 How to set up file permissions for Laravel

Nginx

4-1 安裝

查看Port 80 是否被佔用:

sudo netstat -utlnp | grep 80

(參數意義 udp, tcp, listen, numeric, process)
numeric 的意思是將名稱數字化(IP),例:原本的 localhost 會變成 127.0.0.1

Ubuntu 的映像檔已內建 Apache2,預設是開啟聽著 80 port, 查看 apache2 狀態:sudo systemctl status apache2
我們要改用 Nginx, 但是因為安裝 Nginx 後它也會自動聽 80 port,所以先把 apache2 停掉:sudo systemctl stop apache2
安裝 Nginx:sudo apt-get install nginx -y
安裝 Nginx 與 PHP溝通之套件 sudo apt-get -y --allow-unauthenticated install php7.4-fpm

4-3 設定 conf

以下是只 host 一個網站的方式,所以直接改 default

修改預設 config

sudo vi /etc/nginx/sites-available/default

內容可參考以下

  • root 指到 Laravel 專案的 public/
  • index 加入或改為 index.php
  • 修改 try_files
  • fastcgi pass 到 php7.4-fpm
server {
	listen 80 default_server;
	listen [::]:80 default_server;

	# SSL configuration
	#
	# listen 443 ssl default_server;
	# listen [::]:443 ssl default_server;
	#
	# Note: You should disable gzip for SSL traffic.
	# See: https://bugs.debian.org/773332
	#
	# Read up on ssl_ciphers to ensure a secure configuration.
	# See: https://bugs.debian.org/765782
	#
	# Self signed certs generated by the ssl-cert package
	# Don't use them in a production server!
	#
	# include snippets/snakeoil.conf;

	root /var/www/project/public;

	# Add index.php to the list if you are using PHP
	index index.php;

	server_name _;

	location / {
		# First attempt to serve request as file, then
		# as directory, then fall back to displaying a 404.
		try_files $uri $uri/ /index.php?$query_string;
	}

	# pass PHP scripts to FastCGI server
	#
	location ~ \.php$ {
		include snippets/fastcgi-php.conf;
	#
	#	# With php-fpm (or other unix sockets):
		fastcgi_pass unix:/var/run/php/php7.4-fpm.sock;

	}
}

改好儲存後重新載入設定

sudo nginx -s reload

reload 成功的話 /var/log/nginx/error.log 會有紀錄

去網址查看是否成功!

如果錯誤,例如 500 可去看 nginx 或 Laravel 專案的 log /var/log/nginx/error.log debug、project/storage/logs/
如果誤刪 error.log 只要在執行一次 reload 就會再產生

Domain and SSL

5-1

Set up domain

5-2

SSL
https://xenby.com/b/101-教學-申請lets-encrypt憑證與啟用https-nginx

自動更新憑證的指令要新增排成在 root

登入 root 使用者

sudo -s

編輯 crontab

crontab -e

參考