在 Ubuntu 和 Nginx 上將應用程式部署到 Laravel 7

在 Ubuntu 和 Nginx 上將應用程式部署到 Laravel 7

我決定使用 Laravel 7 製作我的作品集。這樣主頁將成為登陸頁面,並且可以使用管理面板更改其上的所有資訊。 不是重點。 到了部署階段。 我發現了一些關於如何在成熟的伺服器上完成此操作的好教程,但遇到了所有的麻煩。 我在部署方面不是很強;我通常比全端更靠前。 而且,如果我仍然可以用 PHP 編寫和測試,那麼在管理伺服器之前等等。 我還沒長大。 但我必須弄清楚。

現在我們將完成所有步驟,從透過 SSH 啟動到工作站點結束。 我們將盡力避免所有陷阱。

您也許可以在網路上找到類似的說明。 畢竟我終於找到了。 確實,不是在一個地方,沒有 StackOverflow 的幫助,而且幾乎沒有俄語。 我吃了苦。 這就是為什麼我決定簡化你的生活。

我們將用 DigitalOcean 上的 Droplet 來完成一切。 當然,這不是必需的;選擇任何託管。 當您到達 Ubuntu 上的工作伺服器時,請返回。 對於那些仍然決定在 DigitalOcean 上操作的人,將會有更多關於設定域的提示。 和 $100 推薦鏈接.

所有 DigitalOcean 特定的步驟都將在腳註中給出,如下所示。

讓我們開始吧。

TL;DR(僅限基本指令)

創建用戶

  • ssh root@[IP-адрес вашего дроплета]
  • adduser laravel
  • usermod -aG sudo laravel
  • su laravel

添加 SSH 到它

  • mkdir ~/.ssh
  • chmod 700 ~/.ssh
  • vim ~/.ssh/authorized_keys
  • 插入公鑰
  • chmod 600 ~/.ssh/authorized_keys

防火牆

  • sudo ufw allow OpenSSH
  • sudo ufw enable
  • sudo ufw status

Nginx的

  • sudo apt update
  • sudo apt install -y nginx
  • sudo ufw allow 'Nginx HTTP'
  • sudo ufw status

MySQL的

  • sudo apt install -y mysql-server
  • sudo mysql_secure_installation, NYNNY
  • sudo mysql
  • ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '<Ваш пароль для MySQL>';
  • SELECT user,authentication_string,plugin,host FROM mysql.user;
  • FLUSH PRIVILEGES;
  • exit

PHP

  • sudo apt update

  • sudo apt install -y curl wget gnupg2 ca-certificates lsb-release apt-transport-https

  • sudo apt-add-repository ppa:ondrej/php

  • sudo apt update

  • 7.3: sudo apt install -y php7.3-fpm php7.3-mysql

  • 7.4: sudo apt install -y php7.4-fpm php7.4-mysql

  • sudo vim /etc/nginx/sites-available/<Ваш домен>

基本設置:

server {
        listen 80;
        root /var/www/html;
        index index.php index.html index.htm index.nginx-debian.html;
        server_name <Ваш домен или IP>;

        location / {
                try_files $uri $uri/ =404;
        }

        location ~ .php$ {
                include snippets/fastcgi-php.conf;
                fastcgi_pass unix:/var/run/php/php7.4-fpm.sock;
        }

        location ~ /.ht {
                deny all;
        }
}

僅適用於 Laravel 的 HTTP 設定:

server {
    listen 80;
    listen [::]:80;

    root /var/www/html/<Имя проекта>/public;
    index index.php index.html index.htm index.nginx-debian.html;

    server_name <Ваш домен или IP>;

    location / {
        try_files $uri $uri/ /index.php?$query_string;
    }

    location ~ .php$ {
        include snippets/fastcgi-php.conf;
        fastcgi_pass unix:/var/run/php/php7.4-fpm.sock;
    }

    location ~ /.ht {
        deny all;
    }
}

Laravel 的 HTTPS 設定:

server {
    listen 80;
    listen [::]:80;

    server_name <Ваш домен> www.<Ваш домен>;
    return 301 https://$server_name$request_uri;
}

server {
    listen 443 ssl http2;
    listen [::]:443 ssl http2;
    server_name <Ваш домен> www.<Ваш домен>;
    root /var/www/html/<Имя проекта>/public;

    ssl_certificate /etc/letsencrypt/live/<Ваш домен>/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/<Ваш домен>/privkey.pem;

    ssl_protocols TLSv1.2;
    ssl_ciphers ECDHE-RSA-AES256-GCM-SHA512:DHE-RSA-AES256-GCM-SHA512:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-SHA384;
    ssl_prefer_server_ciphers on;

    add_header X-Frame-Options "SAMEORIGIN";
    add_header X-XSS-Protection "1; mode=block";
    add_header X-Content-Type-Options "nosniff";

    index index.php index.html index.htm index.nginx-debian.html;

    charset utf-8;

    location / {
            try_files $uri $uri/ /index.php?$query_string;
    }

    location ~ .php$ {
        include snippets/fastcgi-php.conf;
        fastcgi_pass unix:/var/run/php/php7.4-fpm.sock;
    }

    location ~ /.ht {
            deny all;
    }

    location ~ /.well-known {
            allow all;
    }
}

  • sudo ln -s /etc/nginx/sites-available/<Ваш домен> /etc/nginx/sites-enabled/
  • sudo unlink /etc/nginx/sites-enabled/default
  • sudo nginx -t
  • sudo systemctl reload nginx

Laravel

  • 7.3: sudo apt install -y php7.3-mbstring php7.3-xml composer unzip

  • 7.4: sudo apt install -y php7.4-mbstring php7.4-xml composer unzip

  • mysql -u root -p

  • CREATE DATABASE laravel DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci;

  • GRANT ALL ON laravel.* TO 'root'@'localhost' IDENTIFIED BY '<Ваш пароль от MySQL>';

  • FLUSH PRIVILEGES;

  • exit

  • cd /var/www/html

  • sudo mkdir -p <Имя проекта>

  • sudo chown laravel:laravel <Имя проекта>

  • cd ./<Имя проекта>

  • git clone <ссылка на проект> . / git clone -b <имя ветки> --single-branch <ссылка на проект> .

  • composer install

  • vim .env

APP_NAME=Laravel
APP_ENV=production
APP_KEY=
APP_DEBUG=false
APP_URL=http://<Ваш домен>

LOG_CHANNEL=stack

DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=laravel
DB_USERNAME=root
DB_PASSWORD=<Ваш пароль от MySQL>

  • php artisan migrate

  • php artisan key:generate

  • sudo chown -R $USER:www-data storage

  • sudo chown -R $USER:www-data bootstrap/cache

  • chmod -R 775 storage

  • chmod -R 775 bootstrap/cache

HTTPS

  • sudo add-apt-repository ppa:certbot/certbot

  • sudo apt install -y python-certbot-nginx

  • sudo certbot certonly --webroot --webroot-path=/var/www/html/<Имя проекта>/public -d <Ваш домен> -d www.<Ваш домен>

  • sudo nginx -t

  • sudo ufw allow 'Nginx HTTPS'

  • sudo ufw status

  • sudo systemctl reload nginx

在 DigitalOcean 上建立 Droplet 並註冊新的 SSH 金鑰

我堅信您會自己弄清楚如何在 DigitalOcean 註冊。 這並不容易,有很多驗證和其他事情。 如果您在使用文件驗證時不斷出現網路錯誤,請嘗試透過 VPN 進行所有操作,這應該會有所幫助。

在頂部的選單中,點擊 創建->飛沫。 選擇 Ubuntu.

註冊後,您的帳戶將收到 100 美元。 但別被愚弄了。 你只有 60 天的時間來度過。 而且這個數量非常少。 您可能會像我一樣想要使用更昂貴的計劃,以便稍後當真正的資金開始流動時,您可以切換到更便宜的計劃。 我會立即告訴你這是行不通的。 你可以增加它,但你不能減少它。 就這樣。 我選擇 標準->$5.

我選擇離我們最近的地區 法蘭克福. 專有網絡網絡->預設-fra1

我們將立即透過 SSH 執行身份驗證。 點選 新的 SSH 金鑰。 如果您沒有 SSH,右側有非常簡單的說明。 打開 bash 終端機並貼上 ssh-keygen。 然後我們用公鑰去文件 /Users/<Ваше имя пользователя>/.ssh/id_rsa.pub (或簡單地說 cat ~/.ssh/id_rsa.pub),複製內容並將其貼上到左側視窗中。 任何名字。

我們為 Droplet 設計了一個主機名稱。

點擊 創造水滴

創建一個新用戶

  • ssh root@[IP-адрес вашего дроплета]
  • 您確定要繼續連接嗎(是/否/[指紋])? yes
  • 輸入您的 SSH 密碼
  • 創建用戶 laravel: adduser laravel
  • 輸入您的密碼和其他資訊(我只輸入全名)
  • 將使用者新增至 sudo 群組: usermod -aG sudo laravel

新用戶的 SSH

  • 切換到新用戶: su laravel

我們代表 Laravel 用戶進一步執行所有操作,直到文章結束。 因此,如果您突然中斷,請重新登入並輸入 su laravel

  • mkdir ~/.ssh
  • chmod 700 ~/.ssh
  • vim ~/.ssh/authorized_keys

我們在 Vim 中開啟該檔案。 如果你完全不熟悉,你可以在 Nano 工作,你的權利.

最基本的 Vim 指令

為了在整篇文章中使用 Vim 編輯器,您只需要了解以下內容。

  • Vim 有不同的模式: 正常模式,您可以在其中輸入指令並選擇模式等。
  • 要退出任何模式並返回正常模式,只需按 Esc
  • 四處移動:您可以只使用箭頭
  • 退出而不保存 <Normal mode>: :q!
  • 退出並保存 <Normal mode>: :wq
  • 切換到文字輸入模式 <Normal mode>: i (來自英語。 )
  • 我們插入我們的公鑰(我們上面做的)
  • 我們防止變化: chmod 600 ~/.ssh/authorized_keys

安裝防火牆

  • 讓我們看看所有可用的設定: sudo ufw app list
  • 允許 OpenSSH(否則它會鎖定我們): sudo ufw allow OpenSSH
  • 讓我們啟動防火牆: sudo ufw enable, y
  • 我們檢查: sudo ufw status

Status: active

To                         Action      From
--                         ------      ----
OpenSSH                    ALLOW       Anywhere
OpenSSH (v6)               ALLOW       Anywhere (v6)

一切都好。

安裝 Nginx

在安裝過程中有時會詢問“您確定嗎?” 回答 y (好吧,只有當你確定的時候)。

  • sudo apt update
  • sudo apt install nginx

將 Nginx 新增到防火牆設置

  • sudo ufw app list
  • sudo ufw allow 'Nginx HTTP'
  • sudo ufw status

Status: active

To                         Action      From
--                         ------      ----
OpenSSH                    ALLOW       Anywhere
Nginx HTTP                 ALLOW       Anywhere
OpenSSH (v6)               ALLOW       Anywhere (v6)
Nginx HTTP (v6)            ALLOW       Anywhere (v6)

轉到您的 IP。 如果一切順利,您應該會看到以下內容。

在 Ubuntu 和 Nginx 上將應用程式部署到 Laravel 7

安裝MySQL

  • sudo apt install mysql-server
  • 啟動自動保護腳本 sudo mysql_secure_installation

回答所提出的問題。 如果您不知道如何回答,這裡有一些建議的選項:

  • 驗證密碼插件 - N

  • 刪除匿名用戶? — Y

  • 禁止遠端root登入? — N

  • 刪除測試資料庫並存取它? — N

  • 現在重新載入權限表? — Y

  • 我們去MySQL: sudo mysql

  • 我們來看看訪問方法: SELECT user,authentication_string,plugin,host FROM mysql.user;

  • 設定root密碼: ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '<Ваш пароль для MySQL>';

  • 我們再看看訪問方法: SELECT user,authentication_string,plugin,host FROM mysql.user;

  • 應用程式變更並退出 MySQL: FLUSH PRIVILEGES; и exit

  • 現在,要登入 MySQL,您需要使用 mysql -u root -p 並輸入密碼

安裝PHP

讓我們使用第三方儲存庫 翁德熱·蘇里

  • sudo apt update
  • sudo apt install -y curl wget gnupg2 ca-certificates lsb-release apt-transport-https
  • sudo apt-add-repository ppa:ondrej/php
  • sudo apt update

現在我們來選擇一下。 對於 Laravel 7,您可以選擇 PHP 7.3 或 7.4。 唯一的差別在於數字 3 和 4。

  • 7.3: sudo apt install -y php7.3-fpm php7.3-mysql
  • 7.4: sudo apt install -y php7.4-fpm php7.4-mysql

PHP FastCGI 進程管理器 (fpm) 處理 PHP 請求。 mysql,當然是為了使用MySQL。

從現在開始我將在7.4上做所有事情。

設定 Nginx

  • sudo vim /etc/nginx/sites-available/<Ваш домен>

輸入域而不是“<您的域>”(例如, mysite.ru)您將來想使用的。 如果您還沒有,請編寫一個,然後在選擇您的網域時重複本章中的步驟。

輸入以下內容:

server {
        listen 80;
        root /var/www/html;
        index index.php index.html index.htm index.nginx-debian.html;
        server_name <Ваш домен или IP>;

        location / {
                try_files $uri $uri/ =404;
        }

        location ~ .php$ {
                include snippets/fastcgi-php.conf;
                fastcgi_pass unix:/var/run/php/php7.4-fpm.sock;
        }

        location ~ /.ht {
                deny all;
        }
}

如果您選擇版本 7.3 php7.4-fpm.sock 寫進 php7.4-fpm.sock.

監聽80端口 server_name當我們到達根請求時 /var/www/html 取得索引檔。 如果之後 server_name 有東西,我們正在尋找這樣的文件。 如果我們沒有找到它,我們就會拋出 404。如果它以 .php, 跑過,匆匆處理 fpm... 如果有 .ht,禁止(403)。

  • 建立連結自 sites-available в sites-enabled: sudo ln -s /etc/nginx/sites-available/<Ваш домен> /etc/nginx/sites-enabled/
  • 刪除連結至 default: sudo unlink /etc/nginx/sites-enabled/default
  • 檢查錯誤: sudo nginx -t
  • 重啟: sudo systemctl reload nginx

檢查工作:

  • sudo vim /var/www/html/info.php
  • 我們寫: <?php phpinfo();
  • 讓我們去 <Ваш IP>/info.php

你應該看到這樣的東西:

在 Ubuntu 和 Nginx 上將應用程式部署到 Laravel 7

現在可以刪除該檔案: sudo rm /var/www/html/info.php

安裝 Laravel

  • 7.3: sudo apt install php7.3-mbstring php7.3-xml composer unzip

  • 7.4: sudo apt install php7.4-mbstring php7.4-xml composer unzip

  • 我們去MySQL: mysql -u root -p

  • 建立一個資料庫,名稱為 laravel: CREATE DATABASE laravel DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci;

  • 我們提供 root 存取權限 laravel: GRANT ALL ON laravel.* TO 'root'@'localhost' IDENTIFIED BY '<Ваш пароль от MySQL>';

  • FLUSH PRIVILEGES;

  • exit

  • cd /var/www/html

  • 為專案建立一個資料夾: sudo mkdir -p <Имя проекта>

  • 我們為用戶提供 laravel 專案權利: sudo chown laravel:laravel <Имя проекта>

接下來您需要轉移項目。 例如,從 Github 克隆。

  • cd ./<Имя проекта>
  • git clone <ссылка на проект> .

值得考慮的是,如果您沒有保存靜態文件(例如,來自 /public)在Github上,那麼你自然不會有它們。 例如,我創建了一個單獨的線程來解決這個問題 deploy,我已經從中克隆了: git clone -b <имя ветки> --single-branch <ссылка на проект> ..

  • 安裝依賴項: composer install
  • 創建.env: vim .env

它的基本版本如下所示:

APP_NAME=Laravel
APP_ENV=production
APP_KEY=
APP_DEBUG=false
APP_URL=http://<Ваш домен>

LOG_CHANNEL=stack

DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=laravel
DB_USERNAME=root
DB_PASSWORD=<Ваш пароль от MySQL>

如果複製 .env,請將 APP_ENV 替換為 Production,將 APP_DEBUG 替換為 false,並輸入正確的 MySQL 設定。

  • 遷移資料庫: php artisan migrate
  • 產生程式碼: php artisan key:generate

更改權限:

  • sudo chown -R $USER:www-data storage
  • sudo chown -R $USER:www-data bootstrap/cache
  • chmod -R 775 storage
  • chmod -R 775 bootstrap/cache

最後剩下的事情是為 Laravel 重新配置 Nginx:

sudo vim /etc/nginx/sites-available/<Ваш домен>

server {
    listen 80;
    listen [::]:80;

    root /var/www/html/<Имя проекта>/public;
    index index.php index.html index.htm index.nginx-debian.html;

    server_name <Ваш домен или IP>;

    location / {
        try_files $uri $uri/ /index.php?$query_string;
    }

    location ~ .php$ {
        include snippets/fastcgi-php.conf;
        fastcgi_pass unix:/var/run/php/php7.4-fpm.sock;
    }

    location ~ /.ht {
        deny all;
    }
}

和上次一樣,如果您選擇版本 7.3 php7.4-fpm.sock 寫進 php7.4-fpm.sock.

在 DigitalOcean 上設定域

一切其實都很簡單。 您購買網域(任何地方),切換到 DigitalOcean 創建->域名/DNS... 在現場 添加域 您輸入該網域並按一下“新增”。 然後轉到域設定和字段 主機名 進入 @。 選擇一個項目並點擊 創建記錄.
現在前往您購買網域的網站,在那裡找到「DNS 伺服器」(或類似的東西)並輸入 DigitalOcean 伺服器(即 ns1.digitalocean.com, ns2.digitalocean.com, ns3.digitalocean.com)。 現在您需要等待一段時間(或一段時間),直到這些設定被接受。 準備好!
唯一的問題是您的網站只能以 HTTP 方式開啟。 若要使用 HTTPS,請繼續下一部分。

設定 HTTPS

安裝 certbot 並向其傳遞網域(格式 mysite.ru) 和帶有 www (www.mysite.ru).

  • sudo add-apt-repository ppa:certbot/certbot
  • sudo apt install python-certbot-nginx
  • sudo certbot certonly --webroot --webroot-path=/var/www/html/<Имя проекта>/public -d <Ваш домен> -d www.<Ваш домен>

現在您需要重新設定 Nginx(不要忘記替換您的值):

server {
    listen 80;
    listen [::]:80;

    server_name <Ваш домен> www.<Ваш домен>;
    return 301 https://$server_name$request_uri;
}

server {
    listen 443 ssl http2;
    listen [::]:443 ssl http2;
    server_name <Ваш домен> www.<Ваш домен>;
    root /var/www/html/<Имя проекта>/public;

    ssl_certificate /etc/letsencrypt/live/<Ваш домен>/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/<Ваш домен>/privkey.pem;

    ssl_protocols TLSv1.2;
    ssl_ciphers ECDHE-RSA-AES256-GCM-SHA512:DHE-RSA-AES256-GCM-SHA512:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-SHA384;
    ssl_prefer_server_ciphers on;

    add_header X-Frame-Options "SAMEORIGIN";
    add_header X-XSS-Protection "1; mode=block";
    add_header X-Content-Type-Options "nosniff";

    index index.php index.html index.htm index.nginx-debian.html;

    charset utf-8;

    location / {
            try_files $uri $uri/ /index.php?$query_string;
    }

    location ~ .php$ {
        include snippets/fastcgi-php.conf;
        fastcgi_pass unix:/var/run/php/php7.4-fpm.sock;
    }

    location ~ /.ht {
            deny all;
    }

    location ~ /.well-known {
            allow all;
    }
}

我想您已經了解 PHP 7.3 需要更改哪些內容。

事實上,這裡一切都很簡單。 我們只需將所有請求從 HTTP(連接埠 80)重新導向到 HTTPS(連接埠 443)。 我們所做的一切與以前相同,但採用了加密。

剩下的就是在防火牆中設定權限:

  • sudo nginx -t
  • sudo ufw app list
  • sudo ufw allow 'Nginx HTTPS'
  • sudo ufw status
  • sudo systemctl reload nginx

現在一切都應該正常進行。

[進階]安裝Node.js

如果突然需要在伺服器上直接執行npm指令,則需要安裝Node.js。

  • sudo apt update
  • sudo apt install -y nodejs npm
  • nodejs -v

就這樣,我就停在這個階段了。 原則上,我對結果感到滿意。 也許我會從 DigitalOcean 轉向離俄羅斯更近、更便宜的地方。 但由於我已經完成了網站上的所有驗證並完成了所有操作,因此我透過範例向他們展示了它們。 此外,他們的起價為 100 美元是一個很好的培訓跳板。

PS 特別感謝作者 這個要點,作為上述所有行動的基礎。 在某些情況下,它不適用於 Laravel 7,我修復了它。

PPS 如果您碰巧是一位用 bash 命令思考的頂級工程師,請不要嚴厲評判。 你可能會覺得這篇文章水平很低,但當我需要的時候我會很高興找到一篇。 如果有改進的建議,我完全贊成。

來源: www.habr.com

添加評論