WeHelp
AWS (Amazon Web Services) 是全球最大的雲端運算平台,提供超過 200 種功能完整的隨選即用服務。
  1. 簡介 AWS 雲端服務
  2. AWS 會員帳戶註冊
  3. AWS EC2 伺服器
  4. SSH 遠端管理
  5. FastAPI 網站應用
  6. Node Express 網站應用
  7. PHP Laravel 網站應用
PHP Laravel 網站應用
以下以 **Ubuntu + Nginx + PHP-FPM + MySQL + Composer** 為例,說明透過 SSH 登入後,建置並啟動 Laravel 網站應用。假設網站放在: ```bash /var/www/my-laravel-app ``` 以下指令請依你的 Laravel 版本、PHP 版本與網域名稱調整。 --- ## 1. 透過 SSH 登入 Ubuntu 在本機執行: ```bash ssh username@SERVER_IP ``` 例如: ```bash ssh ubuntu@203.0.113.10 ``` 若使用指定金鑰: ```bash ssh -i ~/.ssh/my-server.pem ubuntu@203.0.113.10 ``` 登入後先更新套件: ```bash sudo apt update sudo apt upgrade -y ``` 建議使用一般帳號操作,不要長期以 `root` 執行 Laravel。 --- ## 2. 安裝必要套件 ### 安裝 Nginx、Git、Unzip、資料庫 ```bash sudo apt install -y nginx git unzip curl mysql-server ``` ### 安裝 PHP 與常用擴充套件 以下以 PHP 8.2 為例: ```bash sudo apt install -y \ php8.2 \ php8.2-fpm \ php8.2-cli \ php8.2-mysql \ php8.2-mbstring \ php8.2-xml \ php8.2-curl \ php8.2-zip \ php8.2-bcmath \ php8.2-intl \ php8.2-gd ``` 確認 PHP 版本: ```bash php -v ``` 確認 PHP-FPM 是否啟動: ```bash sudo systemctl status php8.2-fpm ``` 若未啟動: ```bash sudo systemctl enable --now php8.2-fpm ``` > Laravel 不同版本對 PHP 有不同要求,請先確認 `composer.json` 的 PHP 版本需求。 --- ## 3. 安裝 Composer 建議使用官方安裝方式: ```bash cd /tmp php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');" php composer-setup.php sudo mv composer.phar /usr/local/bin/composer composer --version ``` --- ## 4. 建立網站目錄並取得 Laravel 程式碼 建立目錄: ```bash sudo mkdir -p /var/www/my-laravel-app sudo chown -R $USER:$USER /var/www/my-laravel-app ``` ### 從 Git 儲存庫下載 ```bash cd /var/www git clone https://github.com/your-account/your-laravel-project.git my-laravel-app cd /var/www/my-laravel-app ``` 若是私人 Git 儲存庫,可以使用 SSH 金鑰或部署金鑰: ```bash git clone git@github.com:your-account/your-laravel-project.git ``` 也可以使用既有程式碼上傳方式,例如 `scp` 或 `rsync`。 --- ## 5. 安裝 Laravel PHP 套件 在 Laravel 專案目錄執行: ```bash cd /var/www/my-laravel-app composer install --no-dev --optimize-autoloader ``` 正式環境通常使用: ```bash composer install --no-dev --classmap-authoritative ``` 如果專案沒有 `composer.lock`,建議先在開發環境產生並提交該檔案,再部署到伺服器。 --- ## 6. 設定環境變數 `.env` Laravel 通常不會將 `.env` 放進 Git,因此先建立: ```bash cp .env.example .env ``` 編輯設定: ```bash nano .env ``` 常見設定如下: ```dotenv APP_NAME="My Laravel App" APP_ENV=production APP_KEY= APP_DEBUG=false APP_URL=https://example.com LOG_CHANNEL=stack LOG_LEVEL=error DB_CONNECTION=mysql DB_HOST=127.0.0.1 DB_PORT=3306 DB_DATABASE=laravel DB_USERNAME=laravel_user DB_PASSWORD=strong-password CACHE_STORE=file SESSION_DRIVER=file QUEUE_CONNECTION=database ``` 正式環境務必注意: ```dotenv APP_ENV=production APP_DEBUG=false ``` 不要將 `.env` 提交到公開 Git 儲存庫。 --- ## 7. 建立資料庫與資料庫使用者 登入 MySQL: ```bash sudo mysql ``` 建立資料庫與使用者: ```sql CREATE DATABASE laravel CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; CREATE USER 'laravel_user'@'localhost' IDENTIFIED BY 'strong-password'; GRANT ALL PRIVILEGES ON laravel.* TO 'laravel_user'@'localhost'; FLUSH PRIVILEGES; EXIT; ``` 然後回到 Laravel 專案執行資料庫 migration: ```bash php artisan migrate --force ``` 若專案需要預設資料: ```bash php artisan db:seed --force ``` 或: ```bash php artisan migrate --seed --force ``` --- ## 8. 產生 Laravel Application Key 若 `.env` 中的 `APP_KEY` 尚未設定: ```bash php artisan key:generate ``` 確認: ```bash grep APP_KEY .env ``` 不要在已經有正式資料的環境隨意重新執行 `key:generate`,否則可能導致既有加密資料、Cookie 或登入 Session 無法解密。 --- ## 9. 建立 Storage 符號連結 Laravel 上傳檔案通常存放於: ```text storage/app/public ``` 要讓瀏覽器可以存取,執行: ```bash php artisan storage:link ``` 這會建立: ```text public/storage -> storage/app/public ``` --- ## 10. 設定檔案權限 Nginx/PHP-FPM 通常使用 `www-data` 使用者。 ```bash sudo chown -R www-data:www-data /var/www/my-laravel-app ``` Laravel 需要寫入 `storage` 與 `bootstrap/cache`: ```bash sudo chmod -R 775 /var/www/my-laravel-app/storage sudo chmod -R 775 /var/www/my-laravel-app/bootstrap/cache ``` 不要為了排除權限問題而使用: ```bash chmod -R 777 ``` 這會造成安全風險。 若需要讓部署使用者也能修改程式,可使用群組設定,而不是將所有檔案開放寫入。 --- ## 11. Laravel 正式環境快取 在程式碼與 `.env` 設定完成後執行: ```bash php artisan optimize ``` 也可以分別執行: ```bash php artisan config:cache php artisan route:cache php artisan view:cache ``` 如果修改了 `.env`,要重新建立設定快取: ```bash php artisan config:clear php artisan config:cache ``` 若要清除所有 Laravel 快取: ```bash php artisan optimize:clear ``` --- ## 12. 設定 Nginx 建立網站設定檔: ```bash sudo nano /etc/nginx/sites-available/my-laravel-app ``` 範例內容: ```nginx server { listen 80; listen [::]:80; server_name example.com www.example.com; root /var/www/my-laravel-app/public; index index.php index.html; charset utf-8; 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; } location ~ \.php$ { include snippets/fastcgi-php.conf; fastcgi_pass unix:/run/php/php8.2-fpm.sock; } location ~ /\.(?!well-known).* { deny all; } access_log /var/log/nginx/my-laravel-app-access.log; error_log /var/log/nginx/my-laravel-app-error.log; } ``` 啟用設定: ```bash sudo ln -s /etc/nginx/sites-available/my-laravel-app \ /etc/nginx/sites-enabled/my-laravel-app ``` 若不再使用預設網站: ```bash sudo rm -f /etc/nginx/sites-enabled/default ``` 測試 Nginx 設定: ```bash sudo nginx -t ``` 重新載入: ```bash sudo systemctl reload nginx ``` 確認服務狀態: ```bash sudo systemctl status nginx ``` > `root` 必須指向 Laravel 的 `public` 目錄,不能指向專案根目錄,否則可能暴露 `.env` 或其他敏感檔案。 --- ## 13. 啟用防火牆 若使用 UFW: ```bash sudo ufw allow OpenSSH sudo ufw allow 'Nginx Full' sudo ufw enable sudo ufw status ``` 這會開放: - SSH:22 - HTTP:80 - HTTPS:443 建議限制 SSH 僅使用金鑰登入,並停用密碼登入,需依伺服器管理政策設定 `/etc/ssh/sshd_config`。 --- ## 14. 設定 HTTPS 可使用 Certbot 取得 Let's Encrypt 憑證: ```bash sudo apt install -y certbot python3-certbot-nginx ``` 執行: ```bash sudo certbot --nginx -d example.com -d www.example.com ``` 測試自動續期: ```bash sudo certbot renew --dry-run ``` DNS 必須先將網域指向伺服器 IP,且 80、443 Port 必須可連線。 --- ## 15. 啟動 Laravel Queue Worker 如果 `.env` 使用: ```dotenv QUEUE_CONNECTION=database ``` 需要建立 Queue 資料表: ```bash php artisan queue:table php artisan migrate --force ``` 測試執行 Worker: ```bash php artisan queue:work ``` 正式環境不建議只用 SSH 前景執行,因為登出後程序會停止。可以使用 Supervisor: ```bash sudo apt install -y supervisor ``` 建立設定檔: ```bash sudo nano /etc/supervisor/conf.d/laravel-worker.conf ``` 內容: ```ini [program:laravel-worker] process_name=%(program_name)s_%(process_num)02d command=php /var/www/my-laravel-app/artisan queue:work --sleep=3 --tries=3 --timeout=90 autostart=true autorestart=true stopasgroup=true killasgroup=true user=www-data numprocs=1 redirect_stderr=true stdout_logfile=/var/www/my-laravel-app/storage/logs/worker.log stopwaitsecs=3600 ``` 套用設定: ```bash sudo supervisorctl reread sudo supervisorctl update sudo supervisorctl start laravel-worker:* ``` 查看狀態: ```bash sudo supervisorctl status ``` 部署新版本後,重新啟動 Worker 讓它載入新程式碼: ```bash sudo supervisorctl restart laravel-worker:* ``` --- ## 16. 設定 Laravel Scheduler Laravel Scheduler 通常需要每分鐘執行: ```bash sudo crontab -u www-data -e ``` 加入: ```cron * * * * * cd /var/www/my-laravel-app && php artisan schedule:run >> /dev/null 2>&1 ``` 確認排程內容: ```bash php artisan schedule:list ``` --- ## 17. 常見部署更新流程 日後從 Git 更新程式時,可以使用: ```bash cd /var/www/my-laravel-app git pull origin main composer install --no-dev --optimize-autoloader php artisan migrate --force php artisan storage:link php artisan optimize sudo supervisorctl restart laravel-worker:* sudo systemctl reload php8.2-fpm sudo systemctl reload nginx ``` 若採用更安全的部署方式,建議: 1. 在新目錄下載新版本。 2. 安裝 Composer 套件。 3. 執行 migration。 4. 更新符號連結至新版本。 5. 重新載入 PHP-FPM 與 Queue Worker。 6. 保留上一版,以便快速回滾。 --- ## 18. 問題排查指令 ### 查看 Laravel Log ```bash tail -f /var/www/my-laravel-app/storage/logs/laravel.log ``` ### 查看 Nginx 錯誤 ```bash sudo tail -f /var/log/nginx/my-laravel-app-error.log ``` ### 查看 PHP-FPM Log ```bash sudo journalctl -u php8.2-fpm -f ``` ### 查看 Nginx Log ```bash sudo journalctl -u nginx -f ``` ### 檢查目錄權限 ```bash ls -la /var/www/my-laravel-app ls -la /var/www/my-laravel-app/storage ``` ### 測試 Laravel 基本狀態 ```bash php artisan about php artisan route:list php artisan config:show app ``` ### 常見錯誤處理 若出現 `500 Internal Server Error`,依序檢查: ```bash php artisan optimize:clear php artisan key:generate sudo chown -R www-data:www-data storage bootstrap/cache sudo chmod -R 775 storage bootstrap/cache tail -f storage/logs/laravel.log ``` 若出現資料庫連線錯誤,檢查: ```bash php artisan config:clear grep '^DB_' .env ``` 若出現 `502 Bad Gateway`,通常是 PHP-FPM Socket、PHP-FPM 服務或 Nginx 設定錯誤: ```bash ls -l /run/php/ sudo systemctl status php8.2-fpm sudo nginx -t ``` --- ## 最基本的完整部署順序 可以將整體流程簡化為: ```bash ssh username@SERVER_IP sudo apt update sudo apt install -y nginx git unzip mysql-server cd /var/www git clone <REPOSITORY_URL> my-laravel-app cd my-laravel-app composer install --no-dev --optimize-autoloader cp .env.example .env nano .env php artisan key:generate php artisan migrate --force php artisan storage:link php artisan optimize sudo chown -R www-data:www-data /var/www/my-laravel-app sudo chmod -R 775 storage bootstrap/cache sudo nginx -t sudo systemctl reload nginx ``` 完成後,使用瀏覽器開啟: ```text http://example.com ``` 正式上線時,應額外設定 HTTPS、資料庫備份、Log 監控、Queue Supervisor、Scheduler,以及適當的 SSH 與防火牆安全設定。
相關學習地圖、教學課程
Python 後端工程、資料庫
從 0 開始,成為後端工程師的學習路徑。