0%

GCP_deploy_php_nginx_mysql

前言

手把手在 GCP 部署 Nginx server 之 Laravel 專案

事前

  1. 在自己電腦上安裝 gcloud sdk
  2. gcloud init
  3. gcloud auth login
  4. 查看 project gcloud config list project
    gcloud projects createPROJECT_ID

Step 1 建立執行個體

  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 instances create test1023即可
    • 查看可用映像檔
      查詢:gcloud compute images list
    • 查看可用區域
      查詢:gcloud compute zones list
    • 查詢目前VM個體:gcloud compute instances list
  2. 進入 gcloud compute ssh "test1023"
    (gcloud compute ssh --zone "asia-east1-b" "test1023")

  3. Enter passphrase for key ‘/Users/sarahcheng/.ssh/google_compute_engine’: 輸入SSH 鑰匙密碼

  4. 開瀏覽器到 gcloud console 將防火牆打開

如果要刪除 gcloud compute instances delete test1023

Step 2 安裝所需套件

  • 看作業系統: 指令lsb_release -acat /etc/*release

2-1 安裝 php

  1. 看 php 版本:php -v,更新到 7.3
    1
    2
    3
    4
    sudo apt-get install software-properties-common
    sudo add-apt-repository ppa:ondrej/php
    sudo apt-get update
    sudo apt-get install -y php7.3
    • sudo 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

  1. sudo apt-get install mysql-server

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

  2. 啟動 mysql-server:
    sudo systemctl start mysql

  3. 查看是否成功啟動:
    systemctl |grep mysql

  4. 進入 mysql server:
    sudo mysql -u root
    更改有權限或要修改的使用者本身已登入 mysql 的密碼
    mysql> SET PASSWORD FOR '目標使用者'@'主機' = PASSWORD('密碼');

    查看目前使用者及其身份驗證方式:
    SELECT User, Host, plugin FROM mysql.user;

    1. CREATE USER 'sarah'@'localhost' IDENTIFIED WITH mysql_native_password BY '00000';
    2. 給予新建的使用者存取DB的權限:
      GRANT ALL PRIVILEGES ON *.* TO 'sarah'@'localhost';
      (*.* 代表所有DB的所有 table)
    3. 查看目前 mysql server的使用者:
      select user,plugin,authentication_string from mysql.user;

2-4 安裝 Nginx

  1. 查看Port 80 是否被佔用:sudo netstat -utlnp | grep 80
    (參數意義 udp, tcp, listen, numeric, process)

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

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

2-5 安裝 git

  1. sudo apt-get update
  2. sudo apt-get upgrade
  3. sudo apt-get install git

Step 3 部署 github 專案

3-1 專案下載

  • git clone https://github.com/laravel/laravel.git

3-2 Nginx 設定

  1. 修改 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
    3
    location / {
    try_files $uri $uri/ /index.php?$query_string;
    }
    • 拿掉 php 那段的註解,套件改 7.3 版本,php7.3-fpm.sock;
  2. 讓 niginx 重新載入修改完的設定檔:
    sudo nginx -s reload
    PS:若出現下列錯誤 參考連結

    1
    2
    3
    4
    nginx: [error] open() "/run/nginx.pid" failed (2: No such file or directory)
    // 可輸入下列指令
    $ sudo nginx
    // 執行該指令之後,會在 /usr/local/var/run/ 路徑下,創建一個名爲 nginx.pid 的文件 )
  3. 進入專案安裝套件和設定環境:
    cd laravel

    1. sudo composer install
    2. mv .env.example .env
    3. 產生 access key:
      sudo php artisan key:generate

3-3 資料庫 Operation

  1. 進入 mysql -u sarah -p00000
    • CREATE DATABASE testdb;
    • show databases;
    • use testdb;
    • show tables; (現在是空的)
  2. 另外開一個 ssh 連線過去
    1. sudo apt-get install php7.3-mysql
    2. 進到專案目錄下:cd laravel
    3. 修改專案的環境設定 .env 檔: vim .env
      1
      2
      3
      4
      5
      6
      DB_CONNECTION=mysql
      DB_HOST=127.0.0.1
      DB_PORT=3306
      DB_DATABASE=testdb
      DB_USERNAME=sarah
      DB_PASSWORD=00000
    4. 執行指令建立 tabel: php artisan migrate (原本git clone 下來的專案就有寫好的 migration了)
  3. 回到 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分別代表:
        • 擁有者的存取權限
        • 擁有群組的存取權限
        • 其他人的存取權限
    • “.” 代表當前目錄

    到專案路徑下看擁有者是否更改成功 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上開發),不過還是提供參考指令:
    1. sudo apt-get install php7.3-zip
    2. sudo composer global require laravel/installer
    3. vi ~/.bash_profile
      • export PATH="$HOME/.composer/vendor/bin:$PATH"
    4. `source ~/.bash_profile
    5. laravel -V
  • Machine type f1-micro 只有 600M 的記憶體,但 Composer 據說 會用到 512M 以上,目前聽到的方案:

    1. 直接開足夠規格的機器:n1-standard-1 以上 (3.7G 記憶體)
    2. 在需要 Composer 時才擴增記憶體,但機器需要進關機狀態
    3. 本地建置完,再傳到機器內
  • [記錄] 把整個資料夾都修改權限 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 使用者

  1. 在 Instance 加入你的公鑰,(GCP console)。
  2. 注意:登入的帳號,就是公鑰最後面顯示的名稱
  3. 用 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 …