Laradock 學習筆記

前言

Laradock 的學習筆記, 紀錄所學技術, 本篇專案環境為 GCP instance, OS 為 ubuntu 18.04




安裝




專案配置

已經有一個專案

參考 官方文件


還沒有專案

參考 官方文件


多專案

參考 官方文件




env 檔設定

cp env-example .env




MySQL 設定

修改驗證方式

為避免 MySQL 8 會有一些問題, 我們需要修改驗證方式

vim laradock/mysql/my.cnf

貼上

[mysqld]
default_authentication_plugin= mysql_native_password

如修改無法生效, 需把 MySQL 的檔案刪除重建

rm -rf ~/.laradock/data/mysql


設定編碼為 utf8

my.cnf

  • my.cnf (與 create.sql 擇一即可)

    vim laradock/mysql/my.cnf
  • 加入以下設定

    [client]
    default-character-set=utf8

    [mysql]
    default-character-set=utf8


    [mysqld]
    collation-server = utf8_unicode_ci
    init-connect='SET NAMES utf8'
    character-set-server = utf8


create.sql

  • create.sql (與 my.cnf 擇一即可)

    vim laradock/mysql/docker-entrypoint-initdb.d/createdb.sql
  • 加入以下設定

    SET CHARACTER_SET_CLIENT=utf8mb4;
    SET CHARACTER_SET_RESULTS=utf8mb4;
    SET CHARACTER_SET_database= utf8;
    SET COLLATION_CONNECTION=utf8_unicode_ci;


建立 Database

  • 複製範例檔

    cp laradock/mysql/docker-entrypoint-initdb.d/createdb.sql.example laradock/mysql/docker-entrypoint-initdb.d/createdb.sql
  • 批量新增資料庫
    uncomment 以下的設定檔, 並將 dev_db_1 … 換成自己需要的資料庫名字

    #CREATE DATABASE IF NOT EXISTS `dev_db_1` COLLATE 'utf8_general_ci' ;
    #GRANT ALL ON `dev_db_1`.* TO 'default'@'%' ;

    #CREATE DATABASE IF NOT EXISTS `dev_db_2` COLLATE 'utf8_general_ci' ;
    #GRANT ALL ON `dev_db_2`.* TO 'default'@'%' ;

    #CREATE DATABASE IF NOT EXISTS `dev_db_3` COLLATE 'utf8_general_ci' ;
    #GRANT ALL ON `dev_db_3`.* TO 'default'@'%' ;


更改帳號密碼

vim laradock/.env

搜尋 MySQL 並將 default user 的密碼以及 root 的密碼更改




專案設置

.env

vim yourProject/.env
  • 更改 DB_HOST 為 mysql
  • 更改 DB_DATABASE 為 上面步驟建立的資料庫
  • 更改 DB_USERNAME 為 default (可自定義)
  • 更改 DB_PASSWORD


修改 storage 權限

sudo chmod -R 777 storage bootstrap/cache




Supervisor

當我們有使用 queue 或是 scheduler 的功能時, 會需要在背景起一個 process 用來監聽 queue job, 這時便需要使用程序管理器, 像是 supervisor 或 pm2
Laradock 以內建 supervisor 可以使用, 相當方便。


用法

  1. 切換到 Laradock/php-worker 目錄中, 可依據需求修改 Dockerfile 以及 supervisord.conf, 若無需求不需修改
  2. 建立 config 檔, cp *.conf.example *.conf
  3. 啟動 docker-compose up -d php-worker




設置 NGINX

如果有多專案的話, 需要特別設定 NGINX config 檔, 範例如下:

// 重導 HTTP 到 HTTPS
server {
listen 80;
listen [::]:80;

server_name yourDomainName;
return https://yourDomainName;
}

server {
# For https
listen 443 ssl;
# listen [::]:443 ssl ipv6only=on;
// 這個資料夾預設會跟 host 的 laradock/nginx/ssl/ 資料夾同步, 所以在外面放入正確的 SSL 憑證即可啟動 HTTPS
ssl_certificate /etc/nginx/ssl/fullchain.pem;
ssl_certificate_key /etc/nginx/ssl/privkey.pem;

server_name yourDomainName;
// 當使用多專案模式時, /var/www 會與 laradock 同層資料夾同步, 所以與 laradock 資料夾同層的專案都會被同步到這個資料夾內
root /var/www/yourProjectName/public;
index index.php index.html index.htm;

location / {
try_files $uri $uri/ /index.php$is_args$args;
}

location ~ \.php$ {
try_files $uri /index.php =404;
fastcgi_pass php-upstream;
fastcgi_index index.php;
fastcgi_buffers 16 16k;
fastcgi_buffer_size 32k;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
#fixes timeouts
fastcgi_read_timeout 600;
include fastcgi_params;
}

location ~ /\.ht {
deny all;
}

location /.well-known/acme-challenge/ {
root /var/www/letsencrypt/;
log_not_found off;
}

// 此層資料夾會跟 laradock/logs/nginx 資料夾同步, 所以需要更名為你的專案名稱, 否則要是有多專案的話, 每個專案的 log 就重疊了
error_log /var/log/nginx/yourProjectName_error.log;
access_log /var/log/nginx/yourProjectName_access.log;
}




啟動專案

視需求啟動容器

docker-compose up -d mysql nginx workspace redis php-worker

執行專案前設置

docker-compose exec workspace php artisan key:generate
docker-compose exec workspace php artisan migrate
docker-compose exec workspace php artisan db:seed




Add Swap Space

當部署的機器 Memory 較低時, 常常會把 RAM 耗光, 這時我們可以通過切割一部分沒用到的硬碟給 RAM


  • 作業系統
    ubuntu 18.04

  • 確認目前 swap 大小, 如果沒有輸出, 代表目前 server 沒有劃分這一塊, 可以加了

    sudo swapon --show
  • 建立 Swap 檔案

    • fallocate: 切割硬碟給檔案
    • -l: length, 檔案大小
    • /swapfile: 檔案
      sudo fallocate -l 1G /swapfile
  • 設定正確的權限

    sudo chmod 600 /swapfile
  • 設定 Swap Space

    • mkswap: 建立 swap 區域, 可以是 disk partition, 也可以是一個檔案
      sudo mkswap /swapfile
  • 輸出:

    Output
    Setting up swapspace version 1, size = 1024 MiB (1073737728 bytes)
    no label, UUID=f59595fb-754b-47ae-af6b-8dd6e98654d8
  • 啟用 Swap Space

    sudo swapon /swapfile
  • 確認 swap 是否已可被使用

    sudo swapon --show
  • 輸出

    Output
    NAME TYPE SIZE USED PRIO
    /swapfile file 1024M 0B -2
  • 確認可用使用量

    free -h
  • 輸出

    Output
    total used free shared buff/cache available
    Mem: 581M 275M 62M 103M 243M 110M
    Swap: 1.0G 0B 1.0G
  • 使 Swap 永久有效

    sudo vim /etc/fstab
  • 增加以下代碼到檔案中

    /swapfile swap swap defaults 0 0
  • 設定 swappiness
    swappiness 為 0 時, kernel 將不會將 data 換到 disk 除非真的有必要, 值越高時 kernel 會盡可能地將 data 放到 swap, 讓 RAM 更空一點
    所以, 告訴系統盡量不要依賴 swap 可以讓系統運行的快一點

  • 查看目前的 swappiness

    cat /proc/sys/vm/swappiness
  • 輸出

    Output
    60
  • 將 swappiness 設定為 10

    sudo sysctl vm.swappiness=10
  • 輸出

    Output
    vm.swappiness = 10
  • 持久化 swappiness

    sudo vim /etc/sysctl.conf
  • 加入下面這一行

    vm.swappiness=10
  • 移除 Swap Space

    sudo swapoff -v /swapfile
  • 從 /etc/fstab 移除上面加入的代碼 /swapfile swap swap defaults 0 0

  • 最後, 刪除 swap 檔案

    sudo rm /swapfile




Jenkins

設定

簡易個人 side project 用的 CD 可參考 這篇文章


Shell Script

  • 從容器連到欲部署的 Server
    ssh -i /var/jenkins_home/yourDeployKey root@yourServerIP \
    "cd /yourProjectLocation/ && \\
    git reset @^ --hard && git pull \\
    && cd /laradockProjectLocation/ \\
    && /usr/bin/docker-compose exec -T workspace php /var/www/yourProjectName/artisan migrate --force \\
    && /usr/bin/docker-compose exec -T workspace composer install -d /var/www/yourProjectName \\
    && /usr/bin/docker-compose exec -T workspace php /var/www/yourProjectName/artisan queue:restart \\
    && /usr/bin/docker-compose exec -T workspace php /var/www/yourProjectName/artisan db:seed"




非正規設置法

以下是個人配置, 旨在利用 Let’s Encrypt Certbot 自動每三個月續簽 SSL 憑證, 並自動套用到每個專案
所以會在 Host 處安裝 NGINX + CertBot, 因為自動續簽 SSL 憑證會用到 NGINX 80 port, 所以容器外的 NGINX 會監聽 80 port, 並把符合條件的請求都導向由容器直接監聽的 443 port, 所以會在容器內外都安裝 NGINX

NGINX 配置

因為 Let’s Encrypt 在自動續簽的過程中, CertBot 會 restart NGINX, 所以 NGINX 會分成容器內跟容器外


容器內 NGINX

// 容器外的 NGINX 會將指定 server_name 的流量導向 443 port, 所以這邊不需監聽 80 port
server {
# For https
listen 443 ssl;
# listen [::]:443 ssl ipv6only=on;
// 這個資料夾預設會跟 host 的 laradock/nginx/ssl/ 資料夾同步, 所以在外面放入正確的 SSL 憑證即可啟動 HTTPS
ssl_certificate /etc/nginx/ssl/fullchain.pem;
ssl_certificate_key /etc/nginx/ssl/privkey.pem;

server_name yourDomainName;
// 當使用多專案模式時, /var/www 會與 laradock 同層資料夾同步, 所以與 laradock 資料夾同層的專案都會被同步到這個資料夾內
root /var/www/yourProjectName/public;
index index.php index.html index.htm;

location / {
try_files $uri $uri/ /index.php$is_args$args;
}

location ~ \.php$ {
try_files $uri /index.php =404;
fastcgi_pass php-upstream;
fastcgi_index index.php;
fastcgi_buffers 16 16k;
fastcgi_buffer_size 32k;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
#fixes timeouts
fastcgi_read_timeout 600;
include fastcgi_params;
}

location ~ /\.ht {
deny all;
}

// 此層資料夾會跟 laradock/logs/nginx 資料夾同步, 所以需要更名為你的專案名稱, 否則要是有多專案的話, 每個專案的 log 就重疊了
error_log /var/log/nginx/yourProjectName_error.log;
access_log /var/log/nginx/yourProjectName_access.log;
}


容器外 NGINX

// 容器外相當簡單, 將來自 80 port 的請求導向 443 即可

server {
listen 80;
server_name *.yourDomainName;

return https://$host$request_uri;
}


Let’s Encrypt

安裝可參考 取得 wildcard SSL 憑證


其他配置檔

docker-compose.yaml

取拿掉 80 port 對應, 因為 80 port 會由容器外的 NGINX 監聽

ports:
- "${NGINX_HOST_HTTPS_PORT}:443"


Laradock 的 .env

// 因為 80 port 沒開, 所以參數也不需設定
### NGINX #################################################

NGINX_HOST_HTTP_PORT=
NGINX_HOST_HTTPS_PORT=443
NGINX_HOST_LOG_PATH=./logs/nginx/
NGINX_SITES_PATH=./nginx/sites/
NGINX_PHP_UPSTREAM_CONTAINER=php-fpm
NGINX_PHP_UPSTREAM_PORT=9000
NGINX_SSL_PATH=./nginx/ssl/






Docker 實戰入門 <未完成>利用 Stackdriver APM 來增進網站可靠性以及排除錯誤

留言

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×