前言
手把手在 GCP 部署 Nginx server 之 Laravel 專案
事前
- 在自己電腦上安裝 gcloud sdk
gcloud init
gcloud auth login
- 查看 project
gcloud config list project
(gcloud projects create
PROJECT_ID)
Step 1 建立執行個體
-
gcloud compute instances create test1023 --zone asia-east1-b --image-project ubuntu-os-cloud --image-family ubuntu-1804-lts
一定要這兩個參數:
--image-project
,--image-family
-
進入
gcloud compute ssh "test1023"
(gcloud compute ssh --zone "asia-east1-b" "test1023"
) -
Enter passphrase for key ‘/Users/sarahcheng/.ssh/google_compute_engine’: 輸入SSH 鑰匙密碼
-
開瀏覽器到 gcloud console 將防火牆打開
如果要刪除 gcloud compute instances delete test1023
Step 2 安裝所需套件
- 看作業系統: 指令
lsb_release -a
及cat /etc/*release
2-1 安裝 php
- 看 php 版本:
php -v
,更新到 7.31
2
3
4sudo apt-get install software-properties-common
sudo add-apt-repository ppa:ondrej/php
sudo apt-get update
sudo apt-get install -y php7.3sudo apt-get install php-mbstring php-gd php-xml zip
// 同時安裝 php-mbstring、php-gd、php-xml、zip- 再看一次確認安裝成功
php -v
2-2 安裝 composer
- 安裝指令:
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
更改有權限或要修改的使用者本身已登入 mysql 的密碼
mysql> SET PASSWORD FOR '目標使用者'@'主機' = PASSWORD('密碼');
查看目前使用者及其身份驗證方式:
SELECT User, Host, plugin FROM mysql.user;
CREATE USER 'sarah'@'localhost' IDENTIFIED WITH mysql_native_password BY '00000';
- 給予新建的使用者存取DB的權限:
GRANT ALL PRIVILEGES ON *.* TO 'sarah'@'localhost';
(*.* 代表所有DB的所有 table) - 查看目前 mysql server的使用者:
select user,plugin,authentication_string from mysql.user;
2-4 安裝 Nginx
- 查看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 install php7.3-fpm
2-5 安裝 git
sudo apt-get update
sudo apt-get upgrade
sudo apt-get install git
Step 3 部署 github 專案
3-1 專案下載
git clone https://github.com/laravel/laravel.git
3-2 Nginx 設定
-
修改 Nginx 設定檔中的讀取路徑為我們要部署的專案
sudo vim /etc/nginx/sites-available/default
- 將專案路徑+/public 寫在 root 後
1
2
3
4#root /var/www/html;
root /home/sarahcheng/laravel/public;
# 加入 index.php
index index.php;如圖:
- location 改成
1
2
3location / {
try_files $uri $uri/ /index.php?$query_string;
}- 拿掉 php 那段的註解,套件改 7.3 版本,
php7.3-fpm.sock;
-
讓 niginx 重新載入修改完的設定檔:
sudo nginx -s reload
PS:若出現下列錯誤 參考連結1
2
3
4nginx: [error] open() "/run/nginx.pid" failed (2: No such file or directory)
// 可輸入下列指令
$ sudo nginx
// 執行該指令之後,會在 /usr/local/var/run/ 路徑下,創建一個名爲 nginx.pid 的文件 ) -
進入專案安裝套件和設定環境:
cd laravel
sudo composer install
mv .env.example .env
- 產生 access key:
sudo php artisan key:generate
3-3 資料庫 Operation
- 進入
mysql -u sarah -p00000
CREATE DATABASE testdb;
show databases;
use testdb;
show tables;
(現在是空的)
- 另外開一個 ssh 連線過去
sudo apt-get install php7.3-mysql
- 進到專案目錄下:
cd laravel
- 修改專案的環境設定 .env 檔:
vim .env
1
2
3
4
5
6DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=testdb
DB_USERNAME=sarah
DB_PASSWORD=00000 - 執行指令建立 tabel:
php artisan migrate
(原本git clone 下來的專案就有寫好的 migration了)
- 回到 mysql
show tables;
(現在多了三個 table)- 離開 mysql
exit
3-4 更改權限
在專案目錄下:
-
先到專案路徑下看擁有者
ls -al
-
修改擁有群組為 www-data
sudo chown -R sarahcheng.www-data .
- “chown” change 擁有者
- “-R” 往下層所有目錄遞迴
- “sarahcheng.www-data” 擁有者.擁有群組
- “.” 代表當前目錄
-
sudo chmod -R 2770 ./storage/
- “chmod” change mode
- “-R” 往下層所有目錄遞迴
- “2770” 2代表 SGID 參考
- 770分別代表:
- 擁有者的存取權限
- 擁有群組的存取權限
- 其他人的存取權限
- 770分別代表:
- “.” 代表當前目錄
到專案路徑下看擁有者是否更改成功
ls -al
P.S.
-
GCP instance 的 IP,可在 GCP GUI 複製
外部 IP
。 -
將舊資料備份
mysqldump --opt -usarahcheng -p laravel_shop > test.sql
-
或這樣備份
mysqldump -u 使用者名稱 -p 要匯出的資料 > 匯出後要叫的檔名.sql
-
透過 ssh 將檔案傳到 GCE instance
gcloud compute scp test.sql test1023: --zone asia-east1-b
-
查看目前機器中所有開放的 Port
1
$ sudo netstat -utlnp
- 基本上不用安裝laravel(不太可能在server上開發),不過還是提供參考指令:
sudo apt-get install php7.3-zip
sudo composer global require laravel/installer
vi ~/.bash_profile
export PATH="$HOME/.composer/vendor/bin:$PATH"
- `source ~/.bash_profile
laravel -V
-
Machine type
f1-micro
只有 600M 的記憶體,但 Composer 據說 會用到 512M 以上,目前聽到的方案:- 直接開足夠規格的機器:n1-standard-1 以上 (3.7G 記憶體)
- 在需要 Composer 時才擴增記憶體,但機器需要進關機狀態
- 本地建置完,再傳到機器內
-
[記錄] 把整個資料夾都修改權限
sudo chmod -R 2770 .
,解決了 502 錯誤 -
[記錄] 後來卡在 404
- 如果是放在 /var/www/larave/public 可以運作
- 需要
sudo chmod 777 -R ./storage/
(來源),但似乎是有點危險的權限 (?)
複製資料庫資料
本地備份資料:
1 | mysqldump -uroot -p 資料庫名 > 備份的檔案名稱.sql |
複製到instance上:
1 | sudo gcloud compute scp 備份的檔案名稱.sql instance名:/home/使用者名稱 |
instance上的mysql 建立database後,匯入資料
1 | mysql -uroot -p 資料庫名 < 備份的檔案名稱.sql |
加入新 ssh 使用者
- 在 Instance 加入你的公鑰,(GCP console)。
- 注意:登入的帳號,就是公鑰最後面顯示的名稱
- 用 ssh 指令連線。
$ ssh name@my_instance_ip
(預設抓 ~/.ssh/id_rsa )
比如說
$ ssh louis@35.XX.230.OO
如果要指定用特定哪一組公私鑰,可加上 -i
$ ssh -i specified_private_key name@my_instance_ip (edited)
Apache2 是在裝 php7.3 時的相依套件
$ sudo apt-get install php7.3
The following additional packages will be installed:
apache2 apache2-bin apache2-data apache2-utils libapache2-mod-php7.3 …